From e8ce3afb940b9d8f23ea56e5698015b3b3dc27d8 Mon Sep 17 00:00:00 2001 From: sungahChooo <170587664+sungahChooo@users.noreply.github.com> Date: Wed, 24 Sep 2025 16:40:50 +0900 Subject: [PATCH 01/60] =?UTF-8?q?chore:=20=EA=B0=9C=EB=B0=9C=20=ED=99=98?= =?UTF-8?q?=EA=B2=BD=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 24 + .prettierrc | 12 + README.md | 142 +- eslint.config.js | 23 + index.html | 12 + package-lock.json | 4138 +++++++++++++++++++++++++++++++++++++++++++ package.json | 35 + src/.prettierignore | 3 + src/App.tsx | 11 + src/index.css | 3 + src/main.tsx | 10 + tsconfig.app.json | 28 + tsconfig.json | 7 + tsconfig.node.json | 26 + vite.config.ts | 8 + 15 files changed, 4413 insertions(+), 69 deletions(-) create mode 100644 .gitignore create mode 100644 .prettierrc create mode 100644 eslint.config.js create mode 100644 index.html create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 src/.prettierignore create mode 100644 src/App.tsx create mode 100644 src/index.css create mode 100644 src/main.tsx create mode 100644 tsconfig.app.json create mode 100644 tsconfig.json create mode 100644 tsconfig.node.json create mode 100644 vite.config.ts diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..a547bf36 --- /dev/null +++ b/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 00000000..958d068c --- /dev/null +++ b/.prettierrc @@ -0,0 +1,12 @@ +{ + "arrowParens": "always", + "bracketSpacing": true, + "endOfLine": "lf", + "printWidth": 120, + "semi": true, + "singleQuote": true, + "tabWidth": 2, + "trailingComma": "all", + "useTabs": false, + "plugins": ["prettier-plugin-tailwindcss"] +} diff --git a/README.md b/README.md index 3363b5e5..4866cf0f 100644 --- a/README.md +++ b/README.md @@ -1,69 +1,73 @@ -# 3주차 과제: React Messenger - -# 서론 - -안녕하세요 🙌🏻 22기 프론트엔트 운영진 **권동욱**입니다. 이번에는 드디어 투두리스트에서 벗어나 새로운 프로젝트인 **messenger** 만들기를 진행합니다. - -이번 주는 특별하게 **디자이너와의 협업**으로 진행되는 과제입니다. 디자이너분께서 열심히 리디자인 한 메신저 프로젝트를 여러분들께서 구현해주시면 됩니다. - -동시에, 이번 주부터는 **필수** **TypeScript** 와 **tailwind CSS**를 적용해보려고 합니다. - -프로젝트의 규모가 커지게 될수록, 컴포넌트가 가지는 props의 종류 또한 다양해지게 됩니다. 무지성 코딩을 하다 보면 가끔 이 props의 구성과 이름, 어떤 타입이 들어가야 하는지 헷갈리기 마련이죠. 보통 그럴 때 다시 컴포넌트 정의 부분으로 돌아가 props의 구성을 보고 오곤 합니다. - -하지만 이럴 때, typescript를 적용한다면 컴포넌트의 구성과 그 이름, 심지어 타입까지 한번에 자동완성으로 편리하게 관리할 수 있고, 생산성이 증대되겠죠. - -또한, **React Hooks**에 조금 더 익숙해지는 것을 목표로 합니다. 여러 Hook들이 있지만 그 중에서도 `useState`, `useEffect`, `useRef`를 중점적으로 사용해 보는 과제인데요, React를 사용하면서 굉장히 자주 쓰이는 Hook들이기 때문에 이 부분을 집중적으로 공부해 보아요! - -그럼 이번 과제도 파이팅입니다!!🎉 - -# 과제 - -## 목표 - -- TypeScript를 사용해봅시다. -- useState로 컴포넌트의 상태를 관리합니다. -- useEffect와 useRef의 사용법을 이해합니다. -- tailwind CSS의 사용법에 익숙해집니다. - -## 기한 - -- 2025년 9월 27일 토요일 23:59까지 - -## Review Questions - -- 디자이너로부터 전달받은 피그마 링크, 피그마 캡처본, 디자이너와의 소통 tmi 등 -- JSX, JS, TSX, TS 각각의 확장자 개념 사용이유와 차이점. -- TypeScript를 사용하는 이유. -- SSR과 CSR 특성 및 차이점. - -## 필수 구현 기능 - -- 피그마를 보고 [결과화면](https://react-messenger-21th-kwondu.vercel.app/)과 같이 구현합니다. -- 디자인 시스템을 구축합니다. -- tailwind CSS를 사용합니다. -- 메세지를 보내면 채팅방 하단으로 스크롤을 이동시킵니다. -- 메세지에 유저 정보(프로필 사진, 이름)를 표시합니다. -- user와 message 데이터를 json 파일에 저장합니다. -- UI는 **반응형을 제외**하고 피그마파일을 따라서 진행합니다. - -### 추가 구현 기능 - -- 채팅방 상단의 프로필을 클릭하면 사용자를 변경할 수 있습니다. -- 더블 클릭 하면 감정표현을 추가합니다. -- 그 외 추가하고 싶은 기능이 있다면 마음껏 추가해 주세요! - -참고로 이번 과제는 다음 과제까지 이어지는 과제이므로 **확장성**을 충분히 고려해 주세요. 참고로 **4주차 과제에서는 유저 및 기능 추가와 Routing을** 진행합니다. 이를 위해 [zustand](https://zustand.docs.pmnd.rs/getting-started/introduction)를 이용한 상태관리를 미리 해보시는 것을 추천합니다!! - -## 링크 및 참고자료 - -- [React docs - Hook](https://ko.reactjs.org/docs/hooks-intro.html) -- [React의 Hooks 완벽 정복하기](https://velog.io/@velopert/react-hooks#1-usestate) -- [useEffect 완벽 가이드](https://overreacted.io/ko/a-complete-guide-to-useeffect/) -- [코딩 컨벤션](https://ui.toast.com/fe-guide/ko_CODING-CONVENTION) -- [타입스크립트 핸드북](https://joshua1988.github.io/ts/intro.html) -- [리액트 프로젝트에서 타입스크립트 사용하기 (시리즈)](https://velog.io/@velopert/series/react-with-typescript) -- [디자인 시스템 구축기](https://yozm.wishket.com/magazine/detail/1830/) -- [[영상] : 컴포넌트에 대한 이해](https://www.youtube.com/watch?v=21eiJc90ggo) -- [Styled Component로 디자인 시스템 구축하기](https://zaat.dev/blog/building-a-design-system-in-react-with-styled-components/) -- [Tailwind CSS 장단점, 사용법](https://wonny.space/writing/dev/hello-tailwind-css) -- [ts 절대경로 설정하기](https://tesseractjh.tistory.com/232) +# React + TypeScript + Vite + +This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. + +Currently, two official plugins are available: + +- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Babel](https://babeljs.io/) for Fast Refresh +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh + +## React Compiler + +The React Compiler is not enabled on this template because of its impact on dev & build performances. To add it, see [this documentation](https://react.dev/learn/react-compiler/installation). + +## Expanding the ESLint configuration + +If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules: + +```js +export default defineConfig([ + globalIgnores(['dist']), + { + files: ['**/*.{ts,tsx}'], + extends: [ + // Other configs... + + // Remove tseslint.configs.recommended and replace with this + tseslint.configs.recommendedTypeChecked, + // Alternatively, use this for stricter rules + tseslint.configs.strictTypeChecked, + // Optionally, add this for stylistic rules + tseslint.configs.stylisticTypeChecked, + + // Other configs... + ], + languageOptions: { + parserOptions: { + project: ['./tsconfig.node.json', './tsconfig.app.json'], + tsconfigRootDir: import.meta.dirname, + }, + // other options... + }, + }, +]) +``` + +You can also install [eslint-plugin-react-x](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-x) and [eslint-plugin-react-dom](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-dom) for React-specific lint rules: + +```js +// eslint.config.js +import reactX from 'eslint-plugin-react-x' +import reactDom from 'eslint-plugin-react-dom' + +export default defineConfig([ + globalIgnores(['dist']), + { + files: ['**/*.{ts,tsx}'], + extends: [ + // Other configs... + // Enable lint rules for React + reactX.configs['recommended-typescript'], + // Enable lint rules for React DOM + reactDom.configs.recommended, + ], + languageOptions: { + parserOptions: { + project: ['./tsconfig.node.json', './tsconfig.app.json'], + tsconfigRootDir: import.meta.dirname, + }, + // other options... + }, + }, +]) +``` diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 00000000..b19330b1 --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,23 @@ +import js from '@eslint/js' +import globals from 'globals' +import reactHooks from 'eslint-plugin-react-hooks' +import reactRefresh from 'eslint-plugin-react-refresh' +import tseslint from 'typescript-eslint' +import { defineConfig, globalIgnores } from 'eslint/config' + +export default defineConfig([ + globalIgnores(['dist']), + { + files: ['**/*.{ts,tsx}'], + extends: [ + js.configs.recommended, + tseslint.configs.recommended, + reactHooks.configs['recommended-latest'], + reactRefresh.configs.vite, + ], + languageOptions: { + ecmaVersion: 2020, + globals: globals.browser, + }, + }, +]) diff --git a/index.html b/index.html new file mode 100644 index 00000000..ac1f50e1 --- /dev/null +++ b/index.html @@ -0,0 +1,12 @@ + + + + + + whats app + + +
+ + + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..87c5b512 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,4138 @@ +{ + "name": "react-messenger-22nd", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "react-messenger-22nd", + "version": "0.0.0", + "dependencies": { + "@tailwindcss/vite": "^4.1.13", + "react": "^19.1.1", + "react-dom": "^19.1.1" + }, + "devDependencies": { + "@eslint/js": "^9.36.0", + "@types/react": "^19.1.13", + "@types/react-dom": "^19.1.9", + "@vitejs/plugin-react": "^5.0.3", + "autoprefixer": "^10.4.21", + "eslint": "^9.36.0", + "eslint-plugin-react-hooks": "^5.2.0", + "eslint-plugin-react-refresh": "^0.4.20", + "globals": "^16.4.0", + "postcss": "^8.5.6", + "prettier": "^3.6.2", + "prettier-plugin-tailwindcss": "^0.6.14", + "tailwindcss": "^4.1.13", + "typescript": "~5.8.3", + "typescript-eslint": "^8.44.0", + "vite": "^7.1.7" + } + }, + "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.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.4.tgz", + "integrity": "sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.4.tgz", + "integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.4", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.4", + "@babel/types": "^7.28.4", + "@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.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz", + "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.3", + "@babel/types": "^7.28.2", + "@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-plugin-utils": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.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.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "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.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz", + "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.4" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", + "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", + "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.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.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz", + "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.4", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz", + "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.10.tgz", + "integrity": "sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.10.tgz", + "integrity": "sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.10.tgz", + "integrity": "sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.10.tgz", + "integrity": "sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.10.tgz", + "integrity": "sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.10.tgz", + "integrity": "sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.10.tgz", + "integrity": "sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.10.tgz", + "integrity": "sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.10.tgz", + "integrity": "sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.10.tgz", + "integrity": "sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.10.tgz", + "integrity": "sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.10.tgz", + "integrity": "sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.10.tgz", + "integrity": "sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.10.tgz", + "integrity": "sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.10.tgz", + "integrity": "sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.10.tgz", + "integrity": "sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.10.tgz", + "integrity": "sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.10.tgz", + "integrity": "sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.10.tgz", + "integrity": "sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.10.tgz", + "integrity": "sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.10.tgz", + "integrity": "sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.10.tgz", + "integrity": "sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.10.tgz", + "integrity": "sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.10.tgz", + "integrity": "sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.10.tgz", + "integrity": "sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.10.tgz", + "integrity": "sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "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.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz", + "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.6", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.1.tgz", + "integrity": "sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.2.tgz", + "integrity": "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==", + "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/eslintrc/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/@eslint/js": { + "version": "9.36.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.36.0.tgz", + "integrity": "sha512-uhCbYtYynH30iZErszX78U+nR3pJU3RHGQ57NXy5QupD4SBVwDeU8TNBy+MjMngc1UyIW9noKqsRqfjQTBU2dw==", + "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.6", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", + "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz", + "integrity": "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.15.2", + "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/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "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==", + "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==", + "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==", + "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==", + "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==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "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/@rolldown/pluginutils": { + "version": "1.0.0-beta.35", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.35.tgz", + "integrity": "sha512-slYrCpoxJUqzFDDNlvrOYRazQUNRvWPjXA17dAOISY3rDMxX6k8K4cj2H+hEYMHF81HO3uNd5rHVigAWRM5dSg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.2.tgz", + "integrity": "sha512-o3pcKzJgSGt4d74lSZ+OCnHwkKBeAbFDmbEm5gg70eA8VkyCuC/zV9TwBnmw6VjDlRdF4Pshfb+WE9E6XY1PoQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.2.tgz", + "integrity": "sha512-cqFSWO5tX2vhC9hJTK8WAiPIm4Q8q/cU8j2HQA0L3E1uXvBYbOZMhE2oFL8n2pKB5sOCHY6bBuHaRwG7TkfJyw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.2.tgz", + "integrity": "sha512-vngduywkkv8Fkh3wIZf5nFPXzWsNsVu1kvtLETWxTFf/5opZmflgVSeLgdHR56RQh71xhPhWoOkEBvbehwTlVA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.2.tgz", + "integrity": "sha512-h11KikYrUCYTrDj6h939hhMNlqU2fo/X4NB0OZcys3fya49o1hmFaczAiJWVAFgrM1NCP6RrO7lQKeVYSKBPSQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.2.tgz", + "integrity": "sha512-/eg4CI61ZUkLXxMHyVlmlGrSQZ34xqWlZNW43IAU4RmdzWEx0mQJ2mN/Cx4IHLVZFL6UBGAh+/GXhgvGb+nVxw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.2.tgz", + "integrity": "sha512-QOWgFH5X9+p+S1NAfOqc0z8qEpJIoUHf7OWjNUGOeW18Mx22lAUOiA9b6r2/vpzLdfxi/f+VWsYjUOMCcYh0Ng==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.2.tgz", + "integrity": "sha512-kDWSPafToDd8LcBYd1t5jw7bD5Ojcu12S3uT372e5HKPzQt532vW+rGFFOaiR0opxePyUkHrwz8iWYEyH1IIQA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.2.tgz", + "integrity": "sha512-gKm7Mk9wCv6/rkzwCiUC4KnevYhlf8ztBrDRT9g/u//1fZLapSRc+eDZj2Eu2wpJ+0RzUKgtNijnVIB4ZxyL+w==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.2.tgz", + "integrity": "sha512-66lA8vnj5mB/rtDNwPgrrKUOtCLVQypkyDa2gMfOefXK6rcZAxKLO9Fy3GkW8VkPnENv9hBkNOFfGLf6rNKGUg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.2.tgz", + "integrity": "sha512-s+OPucLNdJHvuZHuIz2WwncJ+SfWHFEmlC5nKMUgAelUeBUnlB4wt7rXWiyG4Zn07uY2Dd+SGyVa9oyLkVGOjA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.2.tgz", + "integrity": "sha512-8wTRM3+gVMDLLDdaT6tKmOE3lJyRy9NpJUS/ZRWmLCmOPIJhVyXwjBo+XbrrwtV33Em1/eCTd5TuGJm4+DmYjw==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.2.tgz", + "integrity": "sha512-6yqEfgJ1anIeuP2P/zhtfBlDpXUb80t8DpbYwXQ3bQd95JMvUaqiX+fKqYqUwZXqdJDd8xdilNtsHM2N0cFm6A==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.2.tgz", + "integrity": "sha512-sshYUiYVSEI2B6dp4jMncwxbrUqRdNApF2c3bhtLAU0qA8Lrri0p0NauOsTWh3yCCCDyBOjESHMExonp7Nzc0w==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.2.tgz", + "integrity": "sha512-duBLgd+3pqC4MMwBrKkFxaZerUxZcYApQVC5SdbF5/e/589GwVvlRUnyqMFbM8iUSb1BaoX/3fRL7hB9m2Pj8Q==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.2.tgz", + "integrity": "sha512-tzhYJJidDUVGMgVyE+PmxENPHlvvqm1KILjjZhB8/xHYqAGeizh3GBGf9u6WdJpZrz1aCpIIHG0LgJgH9rVjHQ==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.2.tgz", + "integrity": "sha512-opH8GSUuVcCSSyHHcl5hELrmnk4waZoVpgn/4FDao9iyE4WpQhyWJ5ryl5M3ocp4qkRuHfyXnGqg8M9oKCEKRA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.2.tgz", + "integrity": "sha512-LSeBHnGli1pPKVJ79ZVJgeZWWZXkEe/5o8kcn23M8eMKCUANejchJbF/JqzM4RRjOJfNRhKJk8FuqL1GKjF5oQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.2.tgz", + "integrity": "sha512-uPj7MQ6/s+/GOpolavm6BPo+6CbhbKYyZHUDvZ/SmJM7pfDBgdGisFX3bY/CBDMg2ZO4utfhlApkSfZ92yXw7Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.2.tgz", + "integrity": "sha512-Z9MUCrSgIaUeeHAiNkm3cQyst2UhzjPraR3gYYfOjAuZI7tcFRTOD+4cHLPoS/3qinchth+V56vtqz1Tv+6KPA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.2.tgz", + "integrity": "sha512-+GnYBmpjldD3XQd+HMejo+0gJGwYIOfFeoBQv32xF/RUIvccUz20/V6Otdv+57NE70D5pa8W/jVGDoGq0oON4A==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.2.tgz", + "integrity": "sha512-ApXFKluSB6kDQkAqZOKXBjiaqdF1BlKi+/eqnYe9Ee7U2K3pUDKsIyr8EYm/QDHTJIM+4X+lI0gJc3TTRhd+dA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.2.tgz", + "integrity": "sha512-ARz+Bs8kY6FtitYM96PqPEVvPXqEZmPZsSkXvyX19YzDqkCaIlhCieLLMI5hxO9SRZ2XtCtm8wxhy0iJ2jxNfw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@tailwindcss/node": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.13.tgz", + "integrity": "sha512-eq3ouolC1oEFOAvOMOBAmfCIqZBJuvWvvYWh5h5iOYfe1HFC6+GZ6EIL0JdM3/niGRJmnrOc+8gl9/HGUaaptw==", + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.4", + "enhanced-resolve": "^5.18.3", + "jiti": "^2.5.1", + "lightningcss": "1.30.1", + "magic-string": "^0.30.18", + "source-map-js": "^1.2.1", + "tailwindcss": "4.1.13" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.13.tgz", + "integrity": "sha512-CPgsM1IpGRa880sMbYmG1s4xhAy3xEt1QULgTJGQmZUeNgXFR7s1YxYygmJyBGtou4SyEosGAGEeYqY7R53bIA==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "detect-libc": "^2.0.4", + "tar": "^7.4.3" + }, + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.1.13", + "@tailwindcss/oxide-darwin-arm64": "4.1.13", + "@tailwindcss/oxide-darwin-x64": "4.1.13", + "@tailwindcss/oxide-freebsd-x64": "4.1.13", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.13", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.13", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.13", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.13", + "@tailwindcss/oxide-linux-x64-musl": "4.1.13", + "@tailwindcss/oxide-wasm32-wasi": "4.1.13", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.13", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.13" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.13.tgz", + "integrity": "sha512-BrpTrVYyejbgGo57yc8ieE+D6VT9GOgnNdmh5Sac6+t0m+v+sKQevpFVpwX3pBrM2qKrQwJ0c5eDbtjouY/+ew==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.13.tgz", + "integrity": "sha512-YP+Jksc4U0KHcu76UhRDHq9bx4qtBftp9ShK/7UGfq0wpaP96YVnnjFnj3ZFrUAjc5iECzODl/Ts0AN7ZPOANQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.13.tgz", + "integrity": "sha512-aAJ3bbwrn/PQHDxCto9sxwQfT30PzyYJFG0u/BWZGeVXi5Hx6uuUOQEI2Fa43qvmUjTRQNZnGqe9t0Zntexeuw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.13.tgz", + "integrity": "sha512-Wt8KvASHwSXhKE/dJLCCWcTSVmBj3xhVhp/aF3RpAhGeZ3sVo7+NTfgiN8Vey/Fi8prRClDs6/f0KXPDTZE6nQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.13.tgz", + "integrity": "sha512-mbVbcAsW3Gkm2MGwA93eLtWrwajz91aXZCNSkGTx/R5eb6KpKD5q8Ueckkh9YNboU8RH7jiv+ol/I7ZyQ9H7Bw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.13.tgz", + "integrity": "sha512-wdtfkmpXiwej/yoAkrCP2DNzRXCALq9NVLgLELgLim1QpSfhQM5+ZxQQF8fkOiEpuNoKLp4nKZ6RC4kmeFH0HQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.13.tgz", + "integrity": "sha512-hZQrmtLdhyqzXHB7mkXfq0IYbxegaqTmfa1p9MBj72WPoDD3oNOh1Lnxf6xZLY9C3OV6qiCYkO1i/LrzEdW2mg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.13.tgz", + "integrity": "sha512-uaZTYWxSXyMWDJZNY1Ul7XkJTCBRFZ5Fo6wtjrgBKzZLoJNrG+WderJwAjPzuNZOnmdrVg260DKwXCFtJ/hWRQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.13.tgz", + "integrity": "sha512-oXiPj5mi4Hdn50v5RdnuuIms0PVPI/EG4fxAfFiIKQh5TgQgX7oSuDWntHW7WNIi/yVLAiS+CRGW4RkoGSSgVQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.13.tgz", + "integrity": "sha512-+LC2nNtPovtrDwBc/nqnIKYh/W2+R69FA0hgoeOn64BdCX522u19ryLh3Vf3F8W49XBcMIxSe665kwy21FkhvA==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.5", + "@emnapi/runtime": "^1.4.5", + "@emnapi/wasi-threads": "^1.0.4", + "@napi-rs/wasm-runtime": "^0.2.12", + "@tybys/wasm-util": "^0.10.0", + "tslib": "^2.8.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.13.tgz", + "integrity": "sha512-dziTNeQXtoQ2KBXmrjCxsuPk3F3CQ/yb7ZNZNA+UkNTeiTGgfeh+gH5Pi7mRncVgcPD2xgHvkFCh/MhZWSgyQg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.13.tgz", + "integrity": "sha512-3+LKesjXydTkHk5zXX01b5KMzLV1xl2mcktBJkje7rhFUpUlYJy7IMOLqjIRQncLTa1WZZiFY/foAeB5nmaiTw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/vite": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.1.13.tgz", + "integrity": "sha512-0PmqLQ010N58SbMTJ7BVJ4I2xopiQn/5i6nlb4JmxzQf8zcS5+m2Cv6tqh+sfDwtIdjoEnOvwsGQ1hkUi8QEHQ==", + "license": "MIT", + "dependencies": { + "@tailwindcss/node": "4.1.13", + "@tailwindcss/oxide": "4.1.13", + "tailwindcss": "4.1.13" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6 || ^7" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "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==", + "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/react": { + "version": "19.1.13", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.13.tgz", + "integrity": "sha512-hHkbU/eoO3EG5/MZkuFSKmYqPbSVk5byPFa3e7y/8TybHiLMACgI8seVYlicwk7H5K/rI2px9xrQp/C+AUDTiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.1.9", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.9.tgz", + "integrity": "sha512-qXRuZaOsAdXKFyOhRBg6Lqqc0yay13vN7KrIg4L7N4aaHN68ma9OK3NE1BoDFgFOTfM7zg+3/8+2n8rLUH3OKQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.44.1.tgz", + "integrity": "sha512-molgphGqOBT7t4YKCSkbasmu1tb1MgrZ2szGzHbclF7PNmOkSTQVHy+2jXOSnxvR3+Xe1yySHFZoqMpz3TfQsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.44.1", + "@typescript-eslint/type-utils": "8.44.1", + "@typescript-eslint/utils": "8.44.1", + "@typescript-eslint/visitor-keys": "8.44.1", + "graphemer": "^1.4.0", + "ignore": "^7.0.0", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.44.1", + "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.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.44.1.tgz", + "integrity": "sha512-EHrrEsyhOhxYt8MTg4zTF+DJMuNBzWwgvvOYNj/zm1vnaD/IC5zCXFehZv94Piqa2cRFfXrTFxIvO95L7Qc/cw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.44.1", + "@typescript-eslint/types": "8.44.1", + "@typescript-eslint/typescript-estree": "8.44.1", + "@typescript-eslint/visitor-keys": "8.44.1", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.44.1.tgz", + "integrity": "sha512-ycSa60eGg8GWAkVsKV4E6Nz33h+HjTXbsDT4FILyL8Obk5/mx4tbvCNsLf9zret3ipSumAOG89UcCs/KRaKYrA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.44.1", + "@typescript-eslint/types": "^8.44.1", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.44.1.tgz", + "integrity": "sha512-NdhWHgmynpSvyhchGLXh+w12OMT308Gm25JoRIyTZqEbApiBiQHD/8xgb6LqCWCFcxFtWwaVdFsLPQI3jvhywg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.44.1", + "@typescript-eslint/visitor-keys": "8.44.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.44.1.tgz", + "integrity": "sha512-B5OyACouEjuIvof3o86lRMvyDsFwZm+4fBOqFHccIctYgBjqR3qT39FBYGN87khcgf0ExpdCBeGKpKRhSFTjKQ==", + "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.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.44.1.tgz", + "integrity": "sha512-KdEerZqHWXsRNKjF9NYswNISnFzXfXNDfPxoTh7tqohU/PRIbwTmsjGK6V9/RTYWau7NZvfo52lgVk+sJh0K3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.44.1", + "@typescript-eslint/typescript-estree": "8.44.1", + "@typescript-eslint/utils": "8.44.1", + "debug": "^4.3.4", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.44.1.tgz", + "integrity": "sha512-Lk7uj7y9uQUOEguiDIDLYLJOrYHQa7oBiURYVFqIpGxclAFQ78f6VUOM8lI2XEuNOKNB7XuvM2+2cMXAoq4ALQ==", + "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.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.44.1.tgz", + "integrity": "sha512-qnQJ+mVa7szevdEyvfItbO5Vo+GfZ4/GZWWDRRLjrxYPkhM+6zYB2vRYwCsoJLzqFCdZT4mEqyJoyzkunsZ96A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.44.1", + "@typescript-eslint/tsconfig-utils": "8.44.1", + "@typescript-eslint/types": "8.44.1", + "@typescript-eslint/visitor-keys": "8.44.1", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <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/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.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.44.1.tgz", + "integrity": "sha512-DpX5Fp6edTlocMCwA+mHY8Mra+pPjRZ0TfHkXI8QFelIKcbADQz1LUPNtzOFUriBB2UYqw4Pi9+xV4w9ZczHFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.44.1", + "@typescript-eslint/types": "8.44.1", + "@typescript-eslint/typescript-estree": "8.44.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.44.1.tgz", + "integrity": "sha512-576+u0QD+Jp3tZzvfRfxon0EA2lzcDt3lhUbsC6Lgzy9x2VR4E+JUiNyGHi5T8vk0TV+fpJ5GLG1JsJuWCaKhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.44.1", + "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/@vitejs/plugin-react": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.0.3.tgz", + "integrity": "sha512-PFVHhosKkofGH0Yzrw1BipSedTH68BFF8ZWy1kfUpCtJcouXXY0+racG8sExw7hw0HoX36813ga5o3LTWZ4FUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.28.4", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.35", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.17.0" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "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/autoprefixer": { + "version": "10.4.21", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", + "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.24.4", + "caniuse-lite": "^1.0.30001702", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.8.6", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.6.tgz", + "integrity": "sha512-wrH5NNqren/QMtKUEEJf7z86YjfqW/2uw3IL3/xpqZUC95SSVIFXYQeeGjL6FT/X68IROu6RMehZQS5foy2BXw==", + "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.26.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.26.2.tgz", + "integrity": "sha512-ECFzp6uFOSB+dcZ5BK/IBaGWssbSYBHvuMeMt3MMFyhI0Z8SqGgEkBLARgpRH3hutIgPVsALcMwbDrJqPxQ65A==", + "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.3", + "caniuse-lite": "^1.0.30001741", + "electron-to-chromium": "^1.5.218", + "node-releases": "^2.0.21", + "update-browserslist-db": "^1.1.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "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.30001743", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001743.tgz", + "integrity": "sha512-e6Ojr7RV14Un7dz6ASD0aZDmQPT/A+eZU+nuTNfjqmRrmkmQlnTNWH0SKmqagx9PeW87UVqapSurtAXifmtdmw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "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/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "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/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/detect-libc": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.0.tgz", + "integrity": "sha512-vEtk+OcP7VBRtQZ1EJ3bdgzSfBjgnEalLTp5zjJrS+2Z1w2KZly4SBdac/WDU3hhsNAZ9E8SC96ME4Ey8MZ7cg==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.223", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.223.tgz", + "integrity": "sha512-qKm55ic6nbEmagFlTFczML33rF90aU+WtrJ9MdTCThrcvDNdUHN4p6QfVN78U06ZmguqXIyMPyYhw2TrbDUwPQ==", + "dev": true, + "license": "ISC" + }, + "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==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/esbuild": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.10.tgz", + "integrity": "sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.10", + "@esbuild/android-arm": "0.25.10", + "@esbuild/android-arm64": "0.25.10", + "@esbuild/android-x64": "0.25.10", + "@esbuild/darwin-arm64": "0.25.10", + "@esbuild/darwin-x64": "0.25.10", + "@esbuild/freebsd-arm64": "0.25.10", + "@esbuild/freebsd-x64": "0.25.10", + "@esbuild/linux-arm": "0.25.10", + "@esbuild/linux-arm64": "0.25.10", + "@esbuild/linux-ia32": "0.25.10", + "@esbuild/linux-loong64": "0.25.10", + "@esbuild/linux-mips64el": "0.25.10", + "@esbuild/linux-ppc64": "0.25.10", + "@esbuild/linux-riscv64": "0.25.10", + "@esbuild/linux-s390x": "0.25.10", + "@esbuild/linux-x64": "0.25.10", + "@esbuild/netbsd-arm64": "0.25.10", + "@esbuild/netbsd-x64": "0.25.10", + "@esbuild/openbsd-arm64": "0.25.10", + "@esbuild/openbsd-x64": "0.25.10", + "@esbuild/openharmony-arm64": "0.25.10", + "@esbuild/sunos-x64": "0.25.10", + "@esbuild/win32-arm64": "0.25.10", + "@esbuild/win32-ia32": "0.25.10", + "@esbuild/win32-x64": "0.25.10" + } + }, + "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.36.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.36.0.tgz", + "integrity": "sha512-hB4FIzXovouYzwzECDcUkJ4OcfOEkXTv2zRY6B9bkwjx/cprAq0uvm1nl7zvQ0/TsUk0zQiN4uPfJpB9m+rPMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.0", + "@eslint/config-helpers": "^0.3.1", + "@eslint/core": "^0.15.2", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.36.0", + "@eslint/plugin-kit": "^0.3.5", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.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-plugin-react-hooks": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz", + "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.4.21", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.21.tgz", + "integrity": "sha512-MWDWTtNC4voTcWDxXbdmBNe8b/TxfxRFUL6hXgKWJjN9c1AagYEmpiFWBWzDw+5H3SulWUe1pJKTnoSdmk88UA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": ">=8.40" + } + }, + "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.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/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/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "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/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": "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/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==", + "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-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/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/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-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-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/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/jiti": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.0.tgz", + "integrity": "sha512-VXe6RjJkBPj0ohtqaO8vSWP3ZhAKo66fKrFNCll4BTcwljPLz03pCbaNKfzGP5MbrCYcbJ7v0nOYYwUzTEIdXQ==", + "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/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/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.1", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.1.tgz", + "integrity": "sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==", + "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-darwin-arm64": "1.30.1", + "lightningcss-darwin-x64": "1.30.1", + "lightningcss-freebsd-x64": "1.30.1", + "lightningcss-linux-arm-gnueabihf": "1.30.1", + "lightningcss-linux-arm64-gnu": "1.30.1", + "lightningcss-linux-arm64-musl": "1.30.1", + "lightningcss-linux-x64-gnu": "1.30.1", + "lightningcss-linux-x64-musl": "1.30.1", + "lightningcss-win32-arm64-msvc": "1.30.1", + "lightningcss-win32-x64-msvc": "1.30.1" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.1.tgz", + "integrity": "sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==", + "cpu": [ + "arm64" + ], + "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.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.1.tgz", + "integrity": "sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==", + "cpu": [ + "x64" + ], + "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.1", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.1.tgz", + "integrity": "sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==", + "cpu": [ + "x64" + ], + "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.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.1.tgz", + "integrity": "sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==", + "cpu": [ + "arm" + ], + "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.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.1.tgz", + "integrity": "sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==", + "cpu": [ + "arm64" + ], + "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.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.1.tgz", + "integrity": "sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==", + "cpu": [ + "arm64" + ], + "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.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.1.tgz", + "integrity": "sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==", + "cpu": [ + "x64" + ], + "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.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.1.tgz", + "integrity": "sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==", + "cpu": [ + "x64" + ], + "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.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.1.tgz", + "integrity": "sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==", + "cpu": [ + "arm64" + ], + "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.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.1.tgz", + "integrity": "sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==", + "cpu": [ + "x64" + ], + "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/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.19", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.19.tgz", + "integrity": "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "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/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minizlib": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.21", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.21.tgz", + "integrity": "sha512-5b0pgg78U3hwXkCM8Z9b2FJdPZlr9Psr9V2gQPESdGHqbntyFJKFW4r5TeWGFzafGY3hzs1JC62VEQMbl1JFkw==", + "dev": true, + "license": "MIT" + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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/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/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/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "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/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, + "license": "MIT" + }, + "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/prettier": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz", + "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-plugin-tailwindcss": { + "version": "0.6.14", + "resolved": "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.6.14.tgz", + "integrity": "sha512-pi2e/+ZygeIqntN+vC573BcW5Cve8zUB0SSAGxqpB4f96boZF4M3phPVoOFCeypwkpRYdi7+jQ5YJJUwrkGUAg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.21.3" + }, + "peerDependencies": { + "@ianvs/prettier-plugin-sort-imports": "*", + "@prettier/plugin-hermes": "*", + "@prettier/plugin-oxc": "*", + "@prettier/plugin-pug": "*", + "@shopify/prettier-plugin-liquid": "*", + "@trivago/prettier-plugin-sort-imports": "*", + "@zackad/prettier-plugin-twig": "*", + "prettier": "^3.0", + "prettier-plugin-astro": "*", + "prettier-plugin-css-order": "*", + "prettier-plugin-import-sort": "*", + "prettier-plugin-jsdoc": "*", + "prettier-plugin-marko": "*", + "prettier-plugin-multiline-arrays": "*", + "prettier-plugin-organize-attributes": "*", + "prettier-plugin-organize-imports": "*", + "prettier-plugin-sort-imports": "*", + "prettier-plugin-style-order": "*", + "prettier-plugin-svelte": "*" + }, + "peerDependenciesMeta": { + "@ianvs/prettier-plugin-sort-imports": { + "optional": true + }, + "@prettier/plugin-hermes": { + "optional": true + }, + "@prettier/plugin-oxc": { + "optional": true + }, + "@prettier/plugin-pug": { + "optional": true + }, + "@shopify/prettier-plugin-liquid": { + "optional": true + }, + "@trivago/prettier-plugin-sort-imports": { + "optional": true + }, + "@zackad/prettier-plugin-twig": { + "optional": true + }, + "prettier-plugin-astro": { + "optional": true + }, + "prettier-plugin-css-order": { + "optional": true + }, + "prettier-plugin-import-sort": { + "optional": true + }, + "prettier-plugin-jsdoc": { + "optional": true + }, + "prettier-plugin-marko": { + "optional": true + }, + "prettier-plugin-multiline-arrays": { + "optional": true + }, + "prettier-plugin-organize-attributes": { + "optional": true + }, + "prettier-plugin-organize-imports": { + "optional": true + }, + "prettier-plugin-sort-imports": { + "optional": true + }, + "prettier-plugin-style-order": { + "optional": true + }, + "prettier-plugin-svelte": { + "optional": true + } + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/react": { + "version": "19.1.1", + "resolved": "https://registry.npmjs.org/react/-/react-19.1.1.tgz", + "integrity": "sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.1.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.1.tgz", + "integrity": "sha512-Dlq/5LAZgF0Gaz6yiqZCf6VCcZs1ghAJyrsu84Q/GT0gV+mCxbfmKNoGRKBYMJ8IEdGPqu49YWXD02GCknEDkw==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.26.0" + }, + "peerDependencies": { + "react": "^19.1.1" + } + }, + "node_modules/react-refresh": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", + "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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/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/rollup": { + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.52.2.tgz", + "integrity": "sha512-I25/2QgoROE1vYV+NQ1En9T9UFB9Cmfm2CJ83zZOlaDpvz29wGQSZXWKw7MiNXau7wYgB/T9fVIdIuEQ+KbiiA==", + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.52.2", + "@rollup/rollup-android-arm64": "4.52.2", + "@rollup/rollup-darwin-arm64": "4.52.2", + "@rollup/rollup-darwin-x64": "4.52.2", + "@rollup/rollup-freebsd-arm64": "4.52.2", + "@rollup/rollup-freebsd-x64": "4.52.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.52.2", + "@rollup/rollup-linux-arm-musleabihf": "4.52.2", + "@rollup/rollup-linux-arm64-gnu": "4.52.2", + "@rollup/rollup-linux-arm64-musl": "4.52.2", + "@rollup/rollup-linux-loong64-gnu": "4.52.2", + "@rollup/rollup-linux-ppc64-gnu": "4.52.2", + "@rollup/rollup-linux-riscv64-gnu": "4.52.2", + "@rollup/rollup-linux-riscv64-musl": "4.52.2", + "@rollup/rollup-linux-s390x-gnu": "4.52.2", + "@rollup/rollup-linux-x64-gnu": "4.52.2", + "@rollup/rollup-linux-x64-musl": "4.52.2", + "@rollup/rollup-openharmony-arm64": "4.52.2", + "@rollup/rollup-win32-arm64-msvc": "4.52.2", + "@rollup/rollup-win32-ia32-msvc": "4.52.2", + "@rollup/rollup-win32-x64-gnu": "4.52.2", + "@rollup/rollup-win32-x64-msvc": "4.52.2", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/scheduler": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", + "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "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/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/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/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/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/tailwindcss": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.13.tgz", + "integrity": "sha512-i+zidfmTqtwquj4hMEwdjshYYgMbOrPzb9a0M3ZgNa0JMoZeFC6bxZvO8yr8ozS6ix2SDz0+mvryPeBs2TFE+w==", + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.3.tgz", + "integrity": "sha512-ZL6DDuAlRlLGghwcfmSn9sK3Hr6ArtyudlSAiCqQ6IfE+b+HHbydbYDIG15IfS5do+7XQQBdBiubF/cV2dnDzg==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tar": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.1.tgz", + "integrity": "sha512-nlGpxf+hv0v7GkWBK2V9spgactGOp0qvfWRxUMjqHyzrt3SgwE48DIv/FhqPHJYLHpgW1opq3nERbz5Anq7n1g==", + "license": "ISC", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "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==", + "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==", + "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/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/typescript": { + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", + "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.44.1.tgz", + "integrity": "sha512-0ws8uWGrUVTjEeN2OM4K1pLKHK/4NiNP/vz6ns+LjT/6sqpaYzIVFajZb1fj/IDwpsrrHb3Jy0Qm5u9CPcKaeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.44.1", + "@typescript-eslint/parser": "8.44.1", + "@typescript-eslint/typescript-estree": "8.44.1", + "@typescript-eslint/utils": "8.44.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "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/vite": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.7.tgz", + "integrity": "sha512-VbA8ScMvAISJNJVbRDTJdCwqQoAareR/wutevKanhR2/1EkoXVZVkkORaYm/tNVCjP/UDTKtcw3bAkwOUdedmA==", + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "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/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" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 00000000..e349eb2c --- /dev/null +++ b/package.json @@ -0,0 +1,35 @@ +{ + "name": "react-messenger-22nd", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "lint": "eslint .", + "preview": "vite preview" + }, + "dependencies": { + "@tailwindcss/vite": "^4.1.13", + "react": "^19.1.1", + "react-dom": "^19.1.1" + }, + "devDependencies": { + "@eslint/js": "^9.36.0", + "@types/react": "^19.1.13", + "@types/react-dom": "^19.1.9", + "@vitejs/plugin-react": "^5.0.3", + "autoprefixer": "^10.4.21", + "eslint": "^9.36.0", + "eslint-plugin-react-hooks": "^5.2.0", + "eslint-plugin-react-refresh": "^0.4.20", + "globals": "^16.4.0", + "postcss": "^8.5.6", + "prettier": "^3.6.2", + "prettier-plugin-tailwindcss": "^0.6.14", + "tailwindcss": "^4.1.13", + "typescript": "~5.8.3", + "typescript-eslint": "^8.44.0", + "vite": "^7.1.7" + } +} diff --git a/src/.prettierignore b/src/.prettierignore new file mode 100644 index 00000000..63520da7 --- /dev/null +++ b/src/.prettierignore @@ -0,0 +1,3 @@ +node_modules +dist +build diff --git a/src/App.tsx b/src/App.tsx new file mode 100644 index 00000000..5db5764b --- /dev/null +++ b/src/App.tsx @@ -0,0 +1,11 @@ +import { useState } from 'react'; + +function App() { + return ( +
+

Hello React + Tailwind + TS 🚀

+
+ ); +} + +export default App; diff --git a/src/index.css b/src/index.css new file mode 100644 index 00000000..b5c61c95 --- /dev/null +++ b/src/index.css @@ -0,0 +1,3 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/src/main.tsx b/src/main.tsx new file mode 100644 index 00000000..dcf08c3d --- /dev/null +++ b/src/main.tsx @@ -0,0 +1,10 @@ +import { StrictMode } from 'react'; +import { createRoot } from 'react-dom/client'; +import App from './App.tsx'; +import './index.css'; + +createRoot(document.getElementById('root')!).render( + + + , +); diff --git a/tsconfig.app.json b/tsconfig.app.json new file mode 100644 index 00000000..a9b5a59c --- /dev/null +++ b/tsconfig.app.json @@ -0,0 +1,28 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "target": "ES2022", + "useDefineForClassFields": true, + "lib": ["ES2022", "DOM", "DOM.Iterable"], + "module": "ESNext", + "types": ["vite/client"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["src"] +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 00000000..1ffef600 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,7 @@ +{ + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ] +} diff --git a/tsconfig.node.json b/tsconfig.node.json new file mode 100644 index 00000000..7a77bab3 --- /dev/null +++ b/tsconfig.node.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "target": "ES2023", + "lib": ["ES2023"], + "module": "ESNext", + "types": [], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 00000000..4ff4f8fe --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,8 @@ +import { defineConfig } from "vite"; +import react from "@vitejs/plugin-react"; +import tailwindcss from "@tailwindcss/vite"; + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [react(), tailwindcss()], +}); From 8a323b9cfee38b15e2edfdcbc0ae17d12e67aa3e Mon Sep 17 00:00:00 2001 From: sungahChooo <170587664+sungahChooo@users.noreply.github.com> Date: Wed, 24 Sep 2025 16:41:37 +0900 Subject: [PATCH 02/60] =?UTF-8?q?chore:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=ED=8C=8C=EC=9D=BC=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 73 ------------------------------------------------------- 1 file changed, 73 deletions(-) delete mode 100644 README.md diff --git a/README.md b/README.md deleted file mode 100644 index 4866cf0f..00000000 --- a/README.md +++ /dev/null @@ -1,73 +0,0 @@ -# React + TypeScript + Vite - -This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. - -Currently, two official plugins are available: - -- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Babel](https://babeljs.io/) for Fast Refresh -- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh - -## React Compiler - -The React Compiler is not enabled on this template because of its impact on dev & build performances. To add it, see [this documentation](https://react.dev/learn/react-compiler/installation). - -## Expanding the ESLint configuration - -If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules: - -```js -export default defineConfig([ - globalIgnores(['dist']), - { - files: ['**/*.{ts,tsx}'], - extends: [ - // Other configs... - - // Remove tseslint.configs.recommended and replace with this - tseslint.configs.recommendedTypeChecked, - // Alternatively, use this for stricter rules - tseslint.configs.strictTypeChecked, - // Optionally, add this for stylistic rules - tseslint.configs.stylisticTypeChecked, - - // Other configs... - ], - languageOptions: { - parserOptions: { - project: ['./tsconfig.node.json', './tsconfig.app.json'], - tsconfigRootDir: import.meta.dirname, - }, - // other options... - }, - }, -]) -``` - -You can also install [eslint-plugin-react-x](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-x) and [eslint-plugin-react-dom](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-dom) for React-specific lint rules: - -```js -// eslint.config.js -import reactX from 'eslint-plugin-react-x' -import reactDom from 'eslint-plugin-react-dom' - -export default defineConfig([ - globalIgnores(['dist']), - { - files: ['**/*.{ts,tsx}'], - extends: [ - // Other configs... - // Enable lint rules for React - reactX.configs['recommended-typescript'], - // Enable lint rules for React DOM - reactDom.configs.recommended, - ], - languageOptions: { - parserOptions: { - project: ['./tsconfig.node.json', './tsconfig.app.json'], - tsconfigRootDir: import.meta.dirname, - }, - // other options... - }, - }, -]) -``` From c313efbce9d83f52166065c1bdef349bd29ece25 Mon Sep 17 00:00:00 2001 From: sungahChooo <170587664+sungahChooo@users.noreply.github.com> Date: Wed, 24 Sep 2025 17:10:14 +0900 Subject: [PATCH 03/60] =?UTF-8?q?chore:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=ED=8C=8C=EC=9D=BC=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index 5db5764b..5d3c1d71 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,5 +1,3 @@ -import { useState } from 'react'; - function App() { return (
From 77a5070ee0940898ad44da3d10feaf2325112646 Mon Sep 17 00:00:00 2001 From: sungahChooo <170587664+sungahChooo@users.noreply.github.com> Date: Fri, 26 Sep 2025 23:17:10 +0900 Subject: [PATCH 04/60] =?UTF-8?q?feat:=20friendList=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=A7=80=20=EA=B5=AC=ED=98=84,=20=EC=82=AC=EC=9D=B4=EB=93=9C?= =?UTF-8?q?=EB=B0=94=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/.prettierignore => .prettierignore | 0 index.html | 2 + package-lock.json | 653 +++++++++++++++++++++++-- package.json | 8 +- postcss.config.cjs | 6 + src/App.css | 0 src/App.tsx | 24 +- src/assets/addFriend.png | Bin 0 -> 433 bytes src/assets/call.svg | 3 + src/assets/callG.png | Bin 0 -> 476 bytes src/assets/chatIcon.svg | 3 + src/assets/chatIconG.svg | 3 + src/assets/community.svg | 3 + src/assets/communityG.png | Bin 0 -> 659 bytes src/assets/find.png | Bin 0 -> 405 bytes src/assets/friend.svg | 4 + src/assets/friendIconG.svg | 4 + src/assets/profileImage.png | Bin 0 -> 2063 bytes src/assets/setting.svg | 3 + src/assets/settingG.png | Bin 0 -> 536 bytes src/assets/text-navigation.png | Bin 0 -> 537 bytes src/custom.d.ts | 7 + src/index.css | 9 + src/pages/calls/Call.tsx | 8 + src/pages/chat/Chatting.tsx | 8 + src/pages/community/Community.tsx | 8 + src/pages/friendList/FriendList.tsx | 44 ++ src/pages/settings/Setting.tsx | 8 + src/pages/sidebar/Sidebar.tsx | 87 ++++ tailwind.config.js | 15 + vite.config.ts | 10 +- 31 files changed, 867 insertions(+), 53 deletions(-) rename src/.prettierignore => .prettierignore (100%) create mode 100644 postcss.config.cjs create mode 100644 src/App.css create mode 100644 src/assets/addFriend.png create mode 100644 src/assets/call.svg create mode 100644 src/assets/callG.png create mode 100644 src/assets/chatIcon.svg create mode 100644 src/assets/chatIconG.svg create mode 100644 src/assets/community.svg create mode 100644 src/assets/communityG.png create mode 100644 src/assets/find.png create mode 100644 src/assets/friend.svg create mode 100644 src/assets/friendIconG.svg create mode 100644 src/assets/profileImage.png create mode 100644 src/assets/setting.svg create mode 100644 src/assets/settingG.png create mode 100644 src/assets/text-navigation.png create mode 100644 src/custom.d.ts create mode 100644 src/pages/calls/Call.tsx create mode 100644 src/pages/chat/Chatting.tsx create mode 100644 src/pages/community/Community.tsx create mode 100644 src/pages/friendList/FriendList.tsx create mode 100644 src/pages/settings/Setting.tsx create mode 100644 src/pages/sidebar/Sidebar.tsx create mode 100644 tailwind.config.js diff --git a/src/.prettierignore b/.prettierignore similarity index 100% rename from src/.prettierignore rename to .prettierignore diff --git a/index.html b/index.html index ac1f50e1..23677463 100644 --- a/index.html +++ b/index.html @@ -4,6 +4,8 @@ whats app + +
diff --git a/package-lock.json b/package-lock.json index 87c5b512..dc1a9e84 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,12 +10,15 @@ "dependencies": { "@tailwindcss/vite": "^4.1.13", "react": "^19.1.1", - "react-dom": "^19.1.1" + "react-dom": "^19.1.1", + "react-router-dom": "^7.9.2" }, "devDependencies": { "@eslint/js": "^9.36.0", + "@tailwindcss/postcss": "^4.1.13", "@types/react": "^19.1.13", "@types/react-dom": "^19.1.9", + "@types/react-router-dom": "^5.3.3", "@vitejs/plugin-react": "^5.0.3", "autoprefixer": "^10.4.21", "eslint": "^9.36.0", @@ -28,7 +31,21 @@ "tailwindcss": "^4.1.13", "typescript": "~5.8.3", "typescript-eslint": "^8.44.0", - "vite": "^7.1.7" + "vite": "^7.1.7", + "vite-plugin-svgr": "^4.5.0" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@babel/code-frame": { @@ -713,22 +730,6 @@ "node": ">=18" } }, - "node_modules/@esbuild/win32-x64": { - "version": "0.25.10", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.10.tgz", - "integrity": "sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, "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", @@ -1037,6 +1038,42 @@ "dev": true, "license": "MIT" }, + "node_modules/@rollup/pluginutils": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", + "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils/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/@rollup/rollup-android-arm-eabi": { "version": "4.52.2", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.2.tgz", @@ -1310,18 +1347,230 @@ "win32" ] }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.52.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.2.tgz", - "integrity": "sha512-ARz+Bs8kY6FtitYM96PqPEVvPXqEZmPZsSkXvyX19YzDqkCaIlhCieLLMI5hxO9SRZ2XtCtm8wxhy0iJ2jxNfw==", - "cpu": [ - "x64" - ], + "node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "win32" - ] + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz", + "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz", + "integrity": "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz", + "integrity": "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz", + "integrity": "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz", + "integrity": "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz", + "integrity": "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-preset": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz", + "integrity": "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0", + "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", + "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", + "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", + "@svgr/babel-plugin-transform-react-native-svg": "8.1.0", + "@svgr/babel-plugin-transform-svg-component": "8.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/core": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", + "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^8.1.3", + "snake-case": "^3.0.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/hast-util-to-babel-ast": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz", + "integrity": "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.21.3", + "entities": "^4.4.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-jsx": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz", + "integrity": "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "@svgr/hast-util-to-babel-ast": "8.0.0", + "svg-parser": "^2.0.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" + } }, "node_modules/@tailwindcss/node": { "version": "4.1.13", @@ -1555,7 +1804,7 @@ "node": ">= 10" } }, - "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "node_modules/@tailwindcss/oxide/node_modules/@tailwindcss/oxide-win32-x64-msvc": { "version": "4.1.13", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.13.tgz", "integrity": "sha512-3+LKesjXydTkHk5zXX01b5KMzLV1xl2mcktBJkje7rhFUpUlYJy7IMOLqjIRQncLTa1WZZiFY/foAeB5nmaiTw==", @@ -1571,6 +1820,20 @@ "node": ">= 10" } }, + "node_modules/@tailwindcss/postcss": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.13.tgz", + "integrity": "sha512-HLgx6YSFKJT7rJqh9oJs/TkBFhxuMOfUKSBEPYwV+t78POOBsdQ7crhZLzwcH3T0UyUuOzU/GK5pk5eKr3wCiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "@tailwindcss/node": "4.1.13", + "@tailwindcss/oxide": "4.1.13", + "postcss": "^8.4.41", + "tailwindcss": "4.1.13" + } + }, "node_modules/@tailwindcss/vite": { "version": "4.1.13", "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.1.13.tgz", @@ -1636,6 +1899,13 @@ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "license": "MIT" }, + "node_modules/@types/history": { + "version": "4.7.11", + "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", + "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==", + "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", @@ -1663,6 +1933,29 @@ "@types/react": "^19.0.0" } }, + "node_modules/@types/react-router": { + "version": "5.1.20", + "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz", + "integrity": "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*" + } + }, + "node_modules/@types/react-router-dom": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz", + "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router": "*" + } + }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "8.44.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.44.1.tgz", @@ -2064,9 +2357,9 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.8.6", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.6.tgz", - "integrity": "sha512-wrH5NNqren/QMtKUEEJf7z86YjfqW/2uw3IL3/xpqZUC95SSVIFXYQeeGjL6FT/X68IROu6RMehZQS5foy2BXw==", + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.7.tgz", + "integrity": "sha512-bxxN2M3a4d1CRoQC//IqsR5XrLh0IJ8TCv2x6Y9N0nckNz/rTjZB3//GGscZziZOxmjP55rzxg/ze7usFI9FqQ==", "dev": true, "license": "Apache-2.0", "bin": { @@ -2141,10 +2434,23 @@ "node": ">=6" } }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/caniuse-lite": { - "version": "1.0.30001743", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001743.tgz", - "integrity": "sha512-e6Ojr7RV14Un7dz6ASD0aZDmQPT/A+eZU+nuTNfjqmRrmkmQlnTNWH0SKmqagx9PeW87UVqapSurtAXifmtdmw==", + "version": "1.0.30001745", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001745.tgz", + "integrity": "sha512-ywt6i8FzvdgrrrGbr1jZVObnVv6adj+0if2/omv9cmR2oiZs30zL4DIyaptKcbOrBdOIc74QTMoJvSE2QHh5UQ==", "dev": true, "funding": [ { @@ -2222,6 +2528,42 @@ "dev": true, "license": "MIT" }, + "node_modules/cookie": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz", + "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -2270,14 +2612,25 @@ "license": "MIT" }, "node_modules/detect-libc": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.0.tgz", - "integrity": "sha512-vEtk+OcP7VBRtQZ1EJ3bdgzSfBjgnEalLTp5zjJrS+2Z1w2KZly4SBdac/WDU3hhsNAZ9E8SC96ME4Ey8MZ7cg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.1.tgz", + "integrity": "sha512-ecqj/sy1jcK1uWrwpR67UhYrIFQ+5WlGxth34WquCbamhFA6hkkwiu37o6J5xCHdo1oixJRfVRw+ywV+Hq/0Aw==", "license": "Apache-2.0", "engines": { "node": ">=8" } }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/electron-to-chromium": { "version": "1.5.223", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.223.tgz", @@ -2298,6 +2651,29 @@ "node": ">=10.13.0" } }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, "node_modules/esbuild": { "version": "0.25.10", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.10.tgz", @@ -2339,6 +2715,22 @@ "@esbuild/win32-x64": "0.25.10" } }, + "node_modules/esbuild/node_modules/@esbuild/win32-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.10.tgz", + "integrity": "sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -2437,9 +2829,9 @@ } }, "node_modules/eslint-plugin-react-refresh": { - "version": "0.4.21", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.21.tgz", - "integrity": "sha512-MWDWTtNC4voTcWDxXbdmBNe8b/TxfxRFUL6hXgKWJjN9c1AagYEmpiFWBWzDw+5H3SulWUe1pJKTnoSdmk88UA==", + "version": "0.4.22", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.22.tgz", + "integrity": "sha512-atkAG6QaJMGoTLc4MDAP+rqZcfwQuTIh2IqHWFLy2TEjxr0MOK+5BSG4RzL2564AAPpZkDRsZXAUz68kjnU6Ug==", "dev": true, "license": "MIT", "peerDependencies": { @@ -2530,6 +2922,13 @@ "node": ">=4.0" } }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true, + "license": "MIT" + }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -2789,6 +3188,13 @@ "node": ">=0.8.19" } }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -2878,6 +3284,13 @@ "dev": true, "license": "MIT" }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "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", @@ -3137,7 +3550,7 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/lightningcss-win32-x64-msvc": { + "node_modules/lightningcss/node_modules/lightningcss-win32-x64-msvc": { "version": "1.30.1", "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.1.tgz", "integrity": "sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==", @@ -3157,6 +3570,13 @@ "url": "https://opencollective.com/parcel" } }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -3180,6 +3600,16 @@ "dev": true, "license": "MIT" }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -3289,6 +3719,17 @@ "dev": true, "license": "MIT" }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, "node_modules/node-releases": { "version": "2.0.21", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.21.tgz", @@ -3369,6 +3810,25 @@ "node": ">=6" } }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -3389,6 +3849,16 @@ "node": ">=8" } }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -3618,6 +4088,44 @@ "node": ">=0.10.0" } }, + "node_modules/react-router": { + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.9.2.tgz", + "integrity": "sha512-i2TPp4dgaqrOqiRGLZmqh2WXmbdFknUyiCRmSKs0hf6fWXkTKg5h56b+9F22NbGRAMxjYfqQnpi63egzD2SuZA==", + "license": "MIT", + "dependencies": { + "cookie": "^1.0.1", + "set-cookie-parser": "^2.6.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/react-router-dom": { + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.9.2.tgz", + "integrity": "sha512-pagqpVJnjZOfb+vIM23eTp7Sp/AAJjOgaowhP1f1TWOdk5/W8Uk8d/M/0wfleqx7SgjitjNPPsKeCZE1hTSp3w==", + "license": "MIT", + "dependencies": { + "react-router": "7.9.2" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } + }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -3680,6 +4188,19 @@ "fsevents": "~2.3.2" } }, + "node_modules/rollup/node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.2.tgz", + "integrity": "sha512-ARz+Bs8kY6FtitYM96PqPEVvPXqEZmPZsSkXvyX19YzDqkCaIlhCieLLMI5hxO9SRZ2XtCtm8wxhy0iJ2jxNfw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -3720,6 +4241,12 @@ "semver": "bin/semver.js" } }, + "node_modules/set-cookie-parser": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", + "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==", + "license": "MIT" + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -3743,6 +4270,17 @@ "node": ">=8" } }, + "node_modules/snake-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", + "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", + "dev": true, + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", @@ -3778,6 +4316,13 @@ "node": ">=8" } }, + "node_modules/svg-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", + "dev": true, + "license": "MIT" + }, "node_modules/tailwindcss": { "version": "4.1.13", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.13.tgz", @@ -3893,6 +4438,13 @@ "typescript": ">=4.8.4" } }, + "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==", + "devOptional": true, + "license": "0BSD" + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -4059,6 +4611,21 @@ } } }, + "node_modules/vite-plugin-svgr": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/vite-plugin-svgr/-/vite-plugin-svgr-4.5.0.tgz", + "integrity": "sha512-W+uoSpmVkSmNOGPSsDCWVW/DDAyv+9fap9AZXBvWiQqrboJ08j2vh0tFxTD/LjwqwAd3yYSVJgm54S/1GhbdnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.2.0", + "@svgr/core": "^8.1.0", + "@svgr/plugin-jsx": "^8.1.0" + }, + "peerDependencies": { + "vite": ">=2.6.0" + } + }, "node_modules/vite/node_modules/fdir": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", diff --git a/package.json b/package.json index e349eb2c..6c818e50 100644 --- a/package.json +++ b/package.json @@ -12,12 +12,15 @@ "dependencies": { "@tailwindcss/vite": "^4.1.13", "react": "^19.1.1", - "react-dom": "^19.1.1" + "react-dom": "^19.1.1", + "react-router-dom": "^7.9.2" }, "devDependencies": { "@eslint/js": "^9.36.0", + "@tailwindcss/postcss": "^4.1.13", "@types/react": "^19.1.13", "@types/react-dom": "^19.1.9", + "@types/react-router-dom": "^5.3.3", "@vitejs/plugin-react": "^5.0.3", "autoprefixer": "^10.4.21", "eslint": "^9.36.0", @@ -30,6 +33,7 @@ "tailwindcss": "^4.1.13", "typescript": "~5.8.3", "typescript-eslint": "^8.44.0", - "vite": "^7.1.7" + "vite": "^7.1.7", + "vite-plugin-svgr": "^4.5.0" } } diff --git a/postcss.config.cjs b/postcss.config.cjs new file mode 100644 index 00000000..b4bee663 --- /dev/null +++ b/postcss.config.cjs @@ -0,0 +1,6 @@ +module.exports = { + plugins: { + '@tailwindcss/postcss': {}, + autoprefixer: {}, + }, +}; diff --git a/src/App.css b/src/App.css new file mode 100644 index 00000000..e69de29b diff --git a/src/App.tsx b/src/App.tsx index 5d3c1d71..09dc25c8 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,8 +1,26 @@ +import Call from './pages/calls/Call'; +import Chatting from './pages/chat/Chatting'; +import Community from './pages/community/Community'; +import FriendList from './pages/friendList/FriendList'; +import Setting from './pages/settings/Setting.tsx'; +import Sidebar from './pages/sidebar/Sidebar'; +import { BrowserRouter as Router, Routes, Route } from 'react-router-dom'; + function App() { return ( -
-

Hello React + Tailwind + TS 🚀

-
+ +
+ + } /> + } /> + } /> + } /> + } /> + } /> + + {/* 하단 고정 */} +
+
); } diff --git a/src/assets/addFriend.png b/src/assets/addFriend.png new file mode 100644 index 0000000000000000000000000000000000000000..4e80bc080ceaaf19d22e8671a4545732f4ce532d GIT binary patch literal 433 zcmV;i0Z#sjP)X1^@s6D=Y3@00009a7bBm000XU z000XU0RWnu7ytkO0drDELIAGL9O(c600d`2O+f$vv5yP}sM^-uX zWCaFt8a-!dO5{mjhW$#eC2XdB0TkD>zBTr4NpEOM+{r7NGR&g&3~jTm@>R082p7)` zLodc9DJR{K?nsZM3(}nQ9N6E>ekr!hmAw0b1U1@bhl-D%!yacrkg>sQ8PH=YA(S?ExRFlIZh9 zX3C}5=3;-1MAk|XWHiBWQs2uCHH_vAKoeVc8S$?|Yv!>ZT1M9w;9ubYUhX~iV=M10 babyfXoLpj^LoIkQ00000NkvXXu0mjf^dhbr literal 0 HcmV?d00001 diff --git a/src/assets/call.svg b/src/assets/call.svg new file mode 100644 index 00000000..c28d56a4 --- /dev/null +++ b/src/assets/call.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/callG.png b/src/assets/callG.png new file mode 100644 index 0000000000000000000000000000000000000000..99191a2738185b8860b9e54a9fd05dfd46745d6a GIT binary patch literal 476 zcmV<20VDp2P)P000;W1^@s654Bdt00009a7bBm000XU z000XU0RWnu7ytkO0drDELIAGL9O(c600d`2O+f$vv5yP(|W8(1XzmpK_#bU9i zHXsb>cDtXLsu@4e_x-W1>mEr+NiO>Re$gT7a5#J;Nu?l~rZHrf=g28LpU)4}6cQhH zDRM@wnx~6}0)KEvW$jTE8T0x4o7#Y|0MT=7DoH9Ag4(zkwi&Z=I-TyQEy&-7qVNTD z6DE$tkpYRaP0O-IVHjrbjf-!JSK!AqO?5CBydafdtJP{R1!38?eIEpYlL2uf>@Z9K zn8fP~<_5!SL&`vT;x0r~?@60N6~wKJ=VnUj8s!SnZ1K20*M?j{XoklsAozJw5Ei#K zaz4g%Qv!2)y`Cctxr+ZUaa6nP9@4d$&1R|MS1Np&xXn>)emD(`9H~Y(HPJ8e9(ATH Sz!o?F0000 + + diff --git a/src/assets/chatIconG.svg b/src/assets/chatIconG.svg new file mode 100644 index 00000000..08776ffe --- /dev/null +++ b/src/assets/chatIconG.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/community.svg b/src/assets/community.svg new file mode 100644 index 00000000..f21290d5 --- /dev/null +++ b/src/assets/community.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/communityG.png b/src/assets/communityG.png new file mode 100644 index 0000000000000000000000000000000000000000..a6a03a5704a87fab4d3589cc9e566a9f4897afc1 GIT binary patch literal 659 zcmV;E0&M+>P)P000;W1^@s654Bdt00009a7bBm000XU z000XU0RWnu7ytkO0drDELIAGL9O(c600d`2O+f$vv5yP^9S+qoFLpFlM{?tv*6Em@Ck-F0iGKqC&05p0*P@J?8ym+IRTy<7$Fu&eDYpm zNMoCrL|LY!R@>E8^{T30wGf~322n0G9FND}cDvoJq9|YY`~3{dXti4Rm-t=;G8hbs zi9}-Vb5<0sUavod`Nza*w%5qkz-JL_wp=cM>bma4h`rLJDKEWkU`kdL24!xPvQ?%9bhYop@9JK?_M=OS~ea zH{Uv0hr~{NA|8i3aav6ml)Mj^=qI6`=Lp)B)OIWu`*jwC&j)}?Zbdehn$PEdxKD^7 tUJ~GLP|tJm{IIgE2K;XrM|{eAX1^@s6D=Y3@00009a7bBm000XU z000XU0RWnu7ytkO0drDELIAGL9O(c600d`2O+f$vv5yP~8tKK3 z)BGWNcfJgs0jpqT=5S2?yG)@>`O!JqksTB? zcx0BdaI%=`zBGF>oB@r#i(<#$A)r*8lpruy1H%kg2;eaR9k}Y7WJLEnKlUDkzy-X% zZ<0X9`coB*seTJIPbIOUlic{B*D|B}<@*q>` + + + diff --git a/src/assets/friendIconG.svg b/src/assets/friendIconG.svg new file mode 100644 index 00000000..fcc53e2f --- /dev/null +++ b/src/assets/friendIconG.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/profileImage.png b/src/assets/profileImage.png new file mode 100644 index 0000000000000000000000000000000000000000..1607b4f3a0c364fa1a57373303ed94b34e239ae8 GIT binary patch literal 2063 zcmV+q2=MobP)XFK+R9{jQ&4FLqyaG~q!=8Cz4RRnBVYg?I9fuz zP%2IXroqn|tZPUxDZ0^vLL&9~`o7}`m_UWlGyM8CRd5nC@NO7F3q;|-z^1-05DE^hqg%Cgb+8z|d zLHG=J<`HcWBB}4U+9RsjiBCvjDS>5%5=bOB?B091{Vpqn&*RbmJoV|UhhQ>%;3-I494=~ zobQ8`alCL5r*dPMRs}N+jtaQgwF+{^xVE@&R7v~*K!NN$+Hi&T z0dC2vX{@J6k|lF81wEFnY!Y&A%nTB0kHaSCrr<5y*}{goK*^kRK8=7Sp-%tFEh!uueSO`i*VUQ-# zfKSH0L%WPreGF^P&)Jjsl{PmH)eAz&s1%S<7^KZwg?In@3M2V3G?HppqYtZPGoC*2 z9!aOP}NfbtdvBT5Q4Qui6u{Ur!pP|$^vY=`3Hxb!LX3&V8L;Yxy4ff| z;^in~yjaLm7CC`yN!70mcTx-xI5T|?N2f+~y4+z$YNP>|uu&uQz$keNlbUzQ4&+e4 z(BvsST#Fnb7fwu`_ADcfcNdD-be)U|lVGpT#S_;Kouu+>X^_s`ot8)+%Ke9oa{*m; zyFu+x8A{1ShMfZfgiGLb_B0;qxD$_bbYorUfAqB7KUHq5{4ntgUisrAthSoTTufw; zB4bnWlrF6y3Ir~dPfVS`$LpWRhHw|goN=uUUf?Kl%c_m|dQ(3hP47phZ~?0*i3(N_ zB28u|(g+Av;WP>0vkfnzE7Xp^3+LhIj*BKWg|p5CK3)F;+9|wpVHG4wI3xs#K?DRR zMBGAKLm_WcDHU*+MShEK&?o#wY?4LYLj4dx+zO$-vWHKHqs~67NNy z#PQsj;Lh(jN2rR-9nlfOC#R>+;;H{XpzT%&Gog+965OBI(Rv%Q2&T`F-1KrvCS!>V zH9382L$lS0JDRVV>EXj{t+qux7g0L{I%M1P9EE+k*ZH?y6U5! zHK7*V8QDyoD+j)?oP+#P>S<5=S_^p2xrncz#}b`&9zbwpq8}TtMuj> z%Q;Z~b*6ygDXI8Sf67bexmouC!f2%8s8(=s)g-;O-jqN(8N0MLdR7&wwV~kNEZ7x3 zcx)d~;}W#kKK~Gx#E17qh2tFJDMr*890oZGEae0j!gB|N7lGH?+iWpx%(}rRkzXZH3`~@H1yZfW(JhjSE;$lX7;$7{LvG z=8Q0aHWR3AH1WL4w?OoSu^3dAN^&pMi_KsD5;Y+H`>Wls{sC;%2BW@c2UY+8002ovPDHLkV1ksS#jpSX literal 0 HcmV?d00001 diff --git a/src/assets/setting.svg b/src/assets/setting.svg new file mode 100644 index 00000000..9fd1e096 --- /dev/null +++ b/src/assets/setting.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/settingG.png b/src/assets/settingG.png new file mode 100644 index 0000000000000000000000000000000000000000..95588ec4ca248bf2db14592f1d73bcc9d5bad9a8 GIT binary patch literal 536 zcmV+z0_XjSP)9m?or>}KdS2V!ka2Rl#<2ZvRT4R9SZuhX= zZtv(hiXsorh6dVD=WI5cXOl0-;QSHgztJ=9X_l!c%#h&7JOR3o$K%h+3LrSIbtbeq zC-{1Ge4k1IvNC;P0i5k|r4`=?@UgT8a9ww95~8Yor_=FK{ynY$ygu248FOm@WUw#^ zyWQ^7Xf*oH-@`DJtyU|ebK)}IUl)NJ z>$V&H1sfNedN~U!vF0fStU4yJY;i%$34G%&gq%z!{X#%d&R}(p{y$Vw*rD{nL-nhY zKW?D21fn^$TsBmJC5WVf%Lfn6gV}8M&Pk2_2iV|9un7fXEXSfw+vtCQ3`^5paa3G! a8GZqJt+1C5FMtgI0000e9HWdZ`g5J4-IYE?`CT3`W;gh!>JFyu| znrLQ6tJT}5{Yh2)wOlUq>-BnL7=}BW&G_kbdfINc3(ooT<#MqrmC8!Fv*6Pt919Hl z{ocxEvo_Q&gsZA*<#IW(+wEEay0EP#lZgpkgo)1QbGy-KIM_WL8;{3L*h@G(Vi!2; zh^`O9TY>1X+i)HPhGa4+!vLmfnsYoJH;F_-;7l(q7-L^}K#5sIDuP3~TrP$$HPq%E zAzKtK$Rz1-_@v9j;ZUOVuLx~myMbK4=GAaG914(7%B~WvkFNX?A=NdVPV1=kFJUT` zqE0$QI-O1nFnJLI*aFZFoPlZMk)McxmnfA)CL7WrE&~CPbs$AtKEPoP>D+2ctyY_x zrpYl4)W{b<3wlUGwQ#>+GzO4Xyw{F>=`yDVVmdy6^-6;*^Ry#F&SIRXIUV{rNH1~$C#vHsR0j>=euNTR4-+#` b{(F4`Hsk|FcfDHf00000NkvXXu0mjfwtd?W literal 0 HcmV?d00001 diff --git a/src/custom.d.ts b/src/custom.d.ts new file mode 100644 index 00000000..385160c5 --- /dev/null +++ b/src/custom.d.ts @@ -0,0 +1,7 @@ +declare module '*.svg' { + import * as React from 'react'; + const ReactComponent: React.FunctionComponent>; + export { ReactComponent }; + const src: string; + export default src; +} diff --git a/src/index.css b/src/index.css index b5c61c95..5d095837 100644 --- a/src/index.css +++ b/src/index.css @@ -1,3 +1,12 @@ +@import url('https://cdn.jsdelivr.net/gh/orioncactus/pretendard/dist/web/static/pretendard.css'); +@import 'tailwindcss'; @tailwind base; @tailwind components; @tailwind utilities; + +html, +body, +#root { + height: 100%; + background-color: black; +} diff --git a/src/pages/calls/Call.tsx b/src/pages/calls/Call.tsx new file mode 100644 index 00000000..865c69ea --- /dev/null +++ b/src/pages/calls/Call.tsx @@ -0,0 +1,8 @@ +function Call() { + return ( +
+

Call

+
+ ); +} +export default Call; diff --git a/src/pages/chat/Chatting.tsx b/src/pages/chat/Chatting.tsx new file mode 100644 index 00000000..34683ce7 --- /dev/null +++ b/src/pages/chat/Chatting.tsx @@ -0,0 +1,8 @@ +function Chatting() { + return ( +
+

Chatting

+
+ ); +} +export default Chatting; diff --git a/src/pages/community/Community.tsx b/src/pages/community/Community.tsx new file mode 100644 index 00000000..636c9e18 --- /dev/null +++ b/src/pages/community/Community.tsx @@ -0,0 +1,8 @@ +function Community() { + return ( +
+

Community

+
+ ); +} +export default Community; diff --git a/src/pages/friendList/FriendList.tsx b/src/pages/friendList/FriendList.tsx new file mode 100644 index 00000000..27316124 --- /dev/null +++ b/src/pages/friendList/FriendList.tsx @@ -0,0 +1,44 @@ +import profile from '../../assets/profileImage.png'; +import findIcon from '../../assets/find.png'; +import addFriendIcon from '../../assets/addFriend.png'; + +function FriendList() { + return ( +
+ {/* 상단 헤더 */} +
+ 친구 +
+ + +
+
+ {/* 내 프로필 */} +
+ 프로필 이미지 +
+
내이름
+
상태메시지 있는 경우입니다.
+
+
+ {/* 친구 리스트 */} +
    +

    + {[1, 2, 3, 4, 5, 6, 7].map((i) => ( +
  • + +
    +
    친구이름
    +
    상태메시지 있는 경우입니다.
    +
    +
  • + ))} +
+
+ ); +} +export default FriendList; diff --git a/src/pages/settings/Setting.tsx b/src/pages/settings/Setting.tsx new file mode 100644 index 00000000..1d5e98f5 --- /dev/null +++ b/src/pages/settings/Setting.tsx @@ -0,0 +1,8 @@ +function Setting() { + return ( +
+

Setting

+
+ ); +} +export default Setting; diff --git a/src/pages/sidebar/Sidebar.tsx b/src/pages/sidebar/Sidebar.tsx new file mode 100644 index 00000000..3e41a6cf --- /dev/null +++ b/src/pages/sidebar/Sidebar.tsx @@ -0,0 +1,87 @@ +import FriendIcon from '../../assets/friend.svg'; +import FriendIconG from '../../assets/friendIconG.svg'; +import chatIcon from '../../assets/chatIcon.svg'; +import chatIconG from '../../assets/chatIconG.svg'; +import communityIconG from '../../assets/communityG.png'; +import communityIcon from '../../assets/community.svg'; +import callIconG from '../../assets/callG.png'; +import callIcon from '../../assets/call.svg'; +import settingIconG from '../../assets/settingG.png'; +import settingsIcon from '../../assets/setting.svg'; +import { Link, useLocation } from 'react-router-dom'; + +function Sidebar() { + const { pathname } = useLocation(); + + return ( + + ); +} + +export default Sidebar; diff --git a/tailwind.config.js b/tailwind.config.js new file mode 100644 index 00000000..961b08b2 --- /dev/null +++ b/tailwind.config.js @@ -0,0 +1,15 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + content: ['./index.html', './src/**/*.{js,ts,jsx,tsx}'], + theme: { + extend: { + colors: { + 'light-gray': '#D9D9D9', + }, + fontFamily: { + pretendard: ['Pretendard', 'Noto Sans KR', 'sans-serif'], + }, + }, + }, + plugins: [], +}; diff --git a/vite.config.ts b/vite.config.ts index 4ff4f8fe..aec31999 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,8 +1,8 @@ -import { defineConfig } from "vite"; -import react from "@vitejs/plugin-react"; -import tailwindcss from "@tailwindcss/vite"; +import svgr from 'vite-plugin-svgr'; +import { defineConfig } from 'vite'; +import react from '@vitejs/plugin-react'; +import tailwindcss from '@tailwindcss/vite'; -// https://vite.dev/config/ export default defineConfig({ - plugins: [react(), tailwindcss()], + plugins: [react(), tailwindcss(), svgr()], }); From 7e5fce4224652b1fcc8ecd0e184ea60e9c9cc8a3 Mon Sep 17 00:00:00 2001 From: sungahChooo <170587664+sungahChooo@users.noreply.github.com> Date: Sat, 27 Sep 2025 00:31:18 +0900 Subject: [PATCH 05/60] =?UTF-8?q?fix:=20sidebar=20=EB=B2=84=EA=B7=B8=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/pages/sidebar/Sidebar.tsx | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/pages/sidebar/Sidebar.tsx b/src/pages/sidebar/Sidebar.tsx index 3e41a6cf..f9e49140 100644 --- a/src/pages/sidebar/Sidebar.tsx +++ b/src/pages/sidebar/Sidebar.tsx @@ -17,11 +17,15 @@ function Sidebar() {
diff --git a/src/assets/banner.svg b/src/assets/banner.svg new file mode 100644 index 00000000..92ec0701 --- /dev/null +++ b/src/assets/banner.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/assets/camera.svg b/src/assets/camera.svg new file mode 100644 index 00000000..15274907 --- /dev/null +++ b/src/assets/camera.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/chattingRoom.svg b/src/assets/chattingRoom.svg new file mode 100644 index 00000000..965aebe7 --- /dev/null +++ b/src/assets/chattingRoom.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/header/Header.tsx b/src/header/Header.tsx new file mode 100644 index 00000000..2a613827 --- /dev/null +++ b/src/header/Header.tsx @@ -0,0 +1,15 @@ +import type { ReactNode } from 'react'; + +interface HeaderProps { + title: string; + right?: ReactNode; +} + +export default function Header({ title, right }: HeaderProps) { + return ( +
+ {title} +
{right}
+
+ ); +} diff --git a/src/pages/chat/Chatting.tsx b/src/pages/chat/Chatting.tsx index 34683ce7..9044463c 100644 --- a/src/pages/chat/Chatting.tsx +++ b/src/pages/chat/Chatting.tsx @@ -1,7 +1,52 @@ +import banner from '../../assets/banner.svg'; +import Header from '../../header/Header'; +import searchIcon from '../../assets/find.png'; +import camerIcon from '../../assets/camera.svg'; +import chattingRoomIcon from '../../assets/chattingRoom.svg'; +import profile from '../../assets/profileImage.png'; +import { useNavigate } from 'react-router-dom'; + function Chatting() { + const navigate = useNavigate(); return (
-

Chatting

+ {/* 상단 헤더 재사용*/} +
+ + + +
+ } + /> + + {/* 배너 */} +
+ +
+ + {/* 채팅방 리스트 */} +
+ +
); } diff --git a/src/pages/chat/ChattingRoom.tsx b/src/pages/chat/ChattingRoom.tsx new file mode 100644 index 00000000..ee010dfd --- /dev/null +++ b/src/pages/chat/ChattingRoom.tsx @@ -0,0 +1,8 @@ +function ChattingRoom() { + return ( +
+

chattingRoom

+
+ ); +} +export default ChattingRoom; From e6585b3f6c8ac3f1d946589b7fa884e9d3237d66 Mon Sep 17 00:00:00 2001 From: sungahChooo <170587664+sungahChooo@users.noreply.github.com> Date: Sat, 27 Sep 2025 03:25:25 +0900 Subject: [PATCH 07/60] =?UTF-8?q?feat:=20=EC=B1=84=ED=8C=85=EB=B0=A9=20?= =?UTF-8?q?=EC=8A=A4=ED=83=80=EC=9D=BC=EB=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.tsx | 29 +++++++---- src/assets/before.svg | 3 ++ src/assets/callChattingRoom.svg | 3 ++ src/assets/facetimeIcon.svg | 4 ++ src/assets/microphone.svg | 4 ++ src/assets/plus.svg | 3 ++ src/{header => components}/Header.tsx | 4 +- src/index.css | 14 ++++++ src/pages/chat/Chatting.tsx | 4 +- src/pages/chat/ChattingRoom.tsx | 72 ++++++++++++++++++++++++++- src/pages/sidebar/Sidebar.tsx | 2 +- 11 files changed, 126 insertions(+), 16 deletions(-) create mode 100644 src/assets/before.svg create mode 100644 src/assets/callChattingRoom.svg create mode 100644 src/assets/facetimeIcon.svg create mode 100644 src/assets/microphone.svg create mode 100644 src/assets/plus.svg rename src/{header => components}/Header.tsx (80%) diff --git a/src/App.tsx b/src/App.tsx index f1a9eb4a..917a7642 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -2,16 +2,29 @@ import Call from './pages/calls/Call'; import Chatting from './pages/chat/Chatting'; import Community from './pages/community/Community'; import FriendList from './pages/friendList/FriendList'; -import Setting from './pages/settings/Setting.tsx'; +import Setting from './pages/settings/Setting'; import Sidebar from './pages/sidebar/Sidebar'; -import ChattingRoom from './pages/chat/ChattingRoom.tsx'; +import ChattingRoom from './pages/chat/ChattingRoom'; -import { BrowserRouter as Router, Routes, Route } from 'react-router-dom'; +import { BrowserRouter as Router, Routes, Route, useLocation } from 'react-router-dom'; -function App() { +function AppLayout({ children }: { children: React.ReactNode }) { + const location = useLocation(); + const hideSidebarPaths = ['/chattingroom']; // 숨기고 싶은 페이지 경로 + const showSidebar = !hideSidebarPaths.includes(location.pathname); + + return ( +
+ {showSidebar && } +
{children}
+
+ ); +} + +export default function App() { return ( -
+ } /> } /> @@ -21,10 +34,8 @@ function App() { } /> } /> - {/* 하단 고정 */} -
+ + {/* 하단 고정 */}
); } - -export default App; diff --git a/src/assets/before.svg b/src/assets/before.svg new file mode 100644 index 00000000..b3ab57dc --- /dev/null +++ b/src/assets/before.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/callChattingRoom.svg b/src/assets/callChattingRoom.svg new file mode 100644 index 00000000..7f7dcde6 --- /dev/null +++ b/src/assets/callChattingRoom.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/facetimeIcon.svg b/src/assets/facetimeIcon.svg new file mode 100644 index 00000000..590438cd --- /dev/null +++ b/src/assets/facetimeIcon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/microphone.svg b/src/assets/microphone.svg new file mode 100644 index 00000000..18172222 --- /dev/null +++ b/src/assets/microphone.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/plus.svg b/src/assets/plus.svg new file mode 100644 index 00000000..434e90d0 --- /dev/null +++ b/src/assets/plus.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/header/Header.tsx b/src/components/Header.tsx similarity index 80% rename from src/header/Header.tsx rename to src/components/Header.tsx index 2a613827..bf94c5a4 100644 --- a/src/header/Header.tsx +++ b/src/components/Header.tsx @@ -1,13 +1,13 @@ import type { ReactNode } from 'react'; interface HeaderProps { - title: string; + title?: ReactNode; right?: ReactNode; } export default function Header({ title, right }: HeaderProps) { return ( -
+
{title}
{right}
diff --git a/src/index.css b/src/index.css index 5d095837..1b6290ab 100644 --- a/src/index.css +++ b/src/index.css @@ -10,3 +10,17 @@ body, height: 100%; background-color: black; } + +@theme { + --color-*: initial; + --color-white: #fff; + --color-purple: #3f3cbb; + --color-midnight: #121063; + --color-tahiti: #3ab7bf; + --color-bermuda: #78dcca; + --color-light-gray: #d9d9d9; + --color-gray-50: #f3f3f3; +} +@theme { + --font-pretendard: 'Pretendard', pretendard; +} diff --git a/src/pages/chat/Chatting.tsx b/src/pages/chat/Chatting.tsx index 9044463c..14f1680d 100644 --- a/src/pages/chat/Chatting.tsx +++ b/src/pages/chat/Chatting.tsx @@ -1,5 +1,5 @@ import banner from '../../assets/banner.svg'; -import Header from '../../header/Header'; +import Header from '../../components/Header'; import searchIcon from '../../assets/find.png'; import camerIcon from '../../assets/camera.svg'; import chattingRoomIcon from '../../assets/chattingRoom.svg'; @@ -37,7 +37,7 @@ function Chatting() {
+ + ); +} From 139922ff395844c6ba410d815d46680101476979 Mon Sep 17 00:00:00 2001 From: sungahChooo <170587664+sungahChooo@users.noreply.github.com> Date: Sat, 27 Sep 2025 17:24:15 +0900 Subject: [PATCH 10/60] =?UTF-8?q?fix:=20=EC=B9=9C=EA=B5=AC=20=ED=94=84?= =?UTF-8?q?=EB=A1=9C=ED=95=84=20=EC=8A=A4=ED=83=80=EC=9D=BC=20=EC=88=98?= =?UTF-8?q?=EC=A0=95,=20=EC=B1=84=ED=8C=85=EB=B0=A9=20=EB=AA=A9=EB=A1=9D?= =?UTF-8?q?=20=EC=8A=A4=ED=83=80=EC=9D=BC=20=EB=B3=B4=EC=99=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/chat/Chatting.tsx | 7 +++++-- src/pages/friendList/Profile.tsx | 14 ++++++++++++-- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/pages/chat/Chatting.tsx b/src/pages/chat/Chatting.tsx index 78d5f32f..92a4e6f7 100644 --- a/src/pages/chat/Chatting.tsx +++ b/src/pages/chat/Chatting.tsx @@ -39,8 +39,11 @@ function Chatting() { {[1, 2, 3, 4, 5, 6, 7].map((i) => (
  • navigate('/chattingroom')}> {/* 채팅방 이미지 */} -
    -
    채팅방 이름
    {/* 채팅방 이름 */} +
    +

    + 채팅방 이름 {/* 채팅방 이름 */} + 11:59 AM +

    마지막 메시지 내용
    {/* 마지막 메시지 내용 */}
  • diff --git a/src/pages/friendList/Profile.tsx b/src/pages/friendList/Profile.tsx index 1c7f57cb..ea2dd4a6 100644 --- a/src/pages/friendList/Profile.tsx +++ b/src/pages/friendList/Profile.tsx @@ -40,7 +40,12 @@ export default function Profile({ mode }: ProfileProps) { 프로필 편집 - @@ -51,7 +56,12 @@ export default function Profile({ mode }: ProfileProps) { 채팅하기 - From 88cb8dc303d9173059ba6901b53787d7ccf2c000 Mon Sep 17 00:00:00 2001 From: sungahChooo <170587664+sungahChooo@users.noreply.github.com> Date: Sat, 27 Sep 2025 20:49:07 +0900 Subject: [PATCH 11/60] =?UTF-8?q?feat:=EC=B1=84=ED=8C=85=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/assets/groupChat.svg | 21 ++++ src/components/Header.tsx | 2 +- src/data.json | 17 +++ src/index.css | 1 + src/pages/chat/ChattingRoom.tsx | 187 ++++++++++++++++++++++++-------- 5 files changed, 183 insertions(+), 45 deletions(-) create mode 100644 src/assets/groupChat.svg create mode 100644 src/data.json diff --git a/src/assets/groupChat.svg b/src/assets/groupChat.svg new file mode 100644 index 00000000..c0d63333 --- /dev/null +++ b/src/assets/groupChat.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/src/components/Header.tsx b/src/components/Header.tsx index bf94c5a4..e38c0a95 100644 --- a/src/components/Header.tsx +++ b/src/components/Header.tsx @@ -7,7 +7,7 @@ interface HeaderProps { export default function Header({ title, right }: HeaderProps) { return ( -
    +
    {title}
    {right}
    diff --git a/src/data.json b/src/data.json new file mode 100644 index 00000000..0d5ba521 --- /dev/null +++ b/src/data.json @@ -0,0 +1,17 @@ +[ + { + "sender": "friend", + "message": "안녕하세요!", + "time": "10:00 AM" + }, + { + "sender": "me", + "message": "안녕하세요. 반가워요!", + "time": "10:00 AM" + }, + { + "sender": "friend", + "message": "오늘 뭐해요?", + "time": "10:00 AM" + } +] diff --git a/src/index.css b/src/index.css index 1b023c8d..0ca751ad 100644 --- a/src/index.css +++ b/src/index.css @@ -19,6 +19,7 @@ body, --color-gray-50: #f3f3f3; --color-gray-400: #9e9e9e; --color-green-600: #22c05d; + --color-green-50: #e9fbf0; --font-pretendard: 'Pretendard', pretendard; --color-light-yellow: #fcfef9b2; } diff --git a/src/pages/chat/ChattingRoom.tsx b/src/pages/chat/ChattingRoom.tsx index 14ca457e..ce3ef6c5 100644 --- a/src/pages/chat/ChattingRoom.tsx +++ b/src/pages/chat/ChattingRoom.tsx @@ -1,37 +1,91 @@ +import { useState, useEffect, useRef } from 'react'; +import { useNavigate } from 'react-router-dom'; import Header from '../../components/Header'; +import beforeIcon from '../../assets/before.svg'; +import profileIcon from '../../assets/profileImage.png'; import searchIcon from '../../assets/find.png'; +import callChattingRoomIcon from '../../assets/call.svg'; import faceTimeIcon from '../../assets/facetimeIcon.svg'; -import callchattingRoomIcon from '../../assets/callChattingRoom.svg'; -import profileIcon from '../../assets/profileImage.png'; -import beforeIcon from '../../assets/before.svg'; +import plusIcon from '../../assets/plus.svg'; import cameraIcon from '../../assets/camera.svg'; import microphoneIcon from '../../assets/microphone.svg'; -import plusIcon from '../../assets/plus.svg'; -import { useNavigate } from 'react-router-dom'; +import sendIcon from '../../assets/sendIcon.svg'; +import chatData from '../../data.json'; + +interface Message { + sender: string; + message: string; + time?: string; +} -function ChattingRoom() { +export default function ChattingRoom() { const navigate = useNavigate(); + const [messages, setMessages] = useState(() => { + const stored = localStorage.getItem('chatMessages'); + return stored ? JSON.parse(stored) : []; + }); + const [input, setInput] = useState(''); + + useEffect(() => { + setMessages(chatData); + }, []); + + // 스크롤 끝부분 참조 + const messagesEndRef = useRef(null); + + // 처음 로드될 때 localStorage 확인 + useEffect(() => { + const stored = localStorage.getItem('chatMessages'); + if (stored) { + setMessages(JSON.parse(stored)); // localStorage 우선 + } else { + setMessages(chatData); // 없으면 data.json fallback + } + }, []); + + const handleSend = () => { + if (!input.trim()) return; + + // 메시지 보낼때마다 현재 시간 가져오기 + const now = new Date(); + const hours = now.getHours(); + const minutes = now.getMinutes(); + const ampm = hours >= 12 ? 'PM' : 'AM'; + const formattedHour = hours % 12 === 0 ? 12 : hours % 12; + const formattedMinutes = minutes < 10 ? `0${minutes}` : minutes; + const currentTime = `${formattedHour}:${formattedMinutes} ${ampm}`; // 예: 3:05 PM형태로 저장 + + const newMessage: Message = { + sender: 'me', + message: input, + time: currentTime, + }; + + // 상태 업데이트 + setMessages((prev) => { + const updated = [...prev, newMessage]; + // localStorage에 저장 + localStorage.setItem('chatMessages', JSON.stringify(updated)); + return updated; + }); + setInput(''); + }; + + const handleKeyDown = (e: React.KeyboardEvent) => { + if (e.key === 'Enter') handleSend(); + }; + return (
    - {/* 상단 헤더 재사용*/} + {/* 상단 헤더 */}
    - { - navigate('/chat'); - }} - className="cursor-pointer" - > - before +
    + navigate('/chat')} className="cursor-pointer"> + before - -
    - profile - -

    친구이름

    -
    -
    + profile +

    친구 이름

    } right={ @@ -40,37 +94,82 @@ function ChattingRoom() { search
    } /> - {/* 채팅방 내용 */} -
    채팅방 내용
    - {/* 하단 입력창 */} -
    -

    - - + {/* 채팅 메시지 */} +

    +
    + + 2024년 6월 19일{' '} - - - - - - - -

    +
    + {messages.map((msg, index) => ( +
    +
    + {msg.sender === 'me' ? ( + <> +
    {msg.message}
    + + ) : ( + <> +
    {msg.message}
    + + )} +
    + {/* 시간 */} + + {msg.time} + +
    + ))} + {/* 스크롤 위치 표시용 */} +
    +
    + + {/* 하단 입력창 */} +
    + + plus + + + setInput(e.target.value)} + onKeyDown={handleKeyDown} + className="flex h-10 w-[263px] rounded-full bg-gray-50 px-4 py-2 focus:outline-none" + /> + + {input.trim() ? ( + + ) : ( + <> + + + + )}
    ); } -export default ChattingRoom; From f5c5a5a64ead0ff83fd7ee03c72e4ee0823c3052 Mon Sep 17 00:00:00 2001 From: sungahChooo <170587664+sungahChooo@users.noreply.github.com> Date: Sat, 27 Sep 2025 21:13:18 +0900 Subject: [PATCH 12/60] =?UTF-8?q?fix:=20=EB=B0=B0=ED=8F=AC=20=EC=98=A4?= =?UTF-8?q?=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.tsx | 5 ++--- src/pages/chat/Chatting.tsx | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index 21cf9ff3..39a41906 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -5,9 +5,8 @@ import FriendList from './pages/friendList/FriendList'; import Setting from './pages/settings/Setting'; import Sidebar from './pages/sidebar/Sidebar'; import ChattingRoom from './pages/chat/ChattingRoom'; - -import { BrowserRouter as Router, Routes, Route, useLocation } from 'react-router-dom'; import Profile from './pages/friendList/profile'; +import { BrowserRouter as Router, Routes, Route, useLocation } from 'react-router-dom'; function AppLayout({ children }: { children: React.ReactNode }) { const location = useLocation(); @@ -33,7 +32,7 @@ export default function App() { } /> } /> } /> - } /> + } /> } /> } /> diff --git a/src/pages/chat/Chatting.tsx b/src/pages/chat/Chatting.tsx index 92a4e6f7..ed5df740 100644 --- a/src/pages/chat/Chatting.tsx +++ b/src/pages/chat/Chatting.tsx @@ -37,7 +37,7 @@ function Chatting() {
    ); diff --git a/src/components/warning.tsx b/src/components/warning.tsx new file mode 100644 index 00000000..054a9fd5 --- /dev/null +++ b/src/components/warning.tsx @@ -0,0 +1,15 @@ +import warningIcon from '@/assets/warning.svg'; + +export default function Warning() { + return ( +
    + 경고아이콘 +

    페이지 준비중입니다.

    +

    + 이용에 불편을 드려 죄송합니다. +
    보다 나은 서비스 제공을 위하여 페이지 개발 중에 있습니다. +
    빠른 시일 내에 준비하여 찾아뵙겠습니다. +

    +
    + ); +} diff --git a/src/pages/calls/Call.tsx b/src/pages/calls/Call.tsx index 865c69ea..be348ffb 100644 --- a/src/pages/calls/Call.tsx +++ b/src/pages/calls/Call.tsx @@ -1,7 +1,28 @@ +import searchIcon from '@/assets/search.svg'; +import Header from '@/components/Header'; +import settingIcon from '@/assets/settingHeader.svg'; +import Warning from '@/components/warning'; function Call() { return (
    -

    Call

    + {/* 상단 헤더 재사용*/} +
    + + +
    + } + /> + {/*경고 화면 */} +
    + +
    ); } diff --git a/src/pages/community/Community.tsx b/src/pages/community/Community.tsx index 636c9e18..62459544 100644 --- a/src/pages/community/Community.tsx +++ b/src/pages/community/Community.tsx @@ -1,7 +1,28 @@ +import searchIcon from '@/assets/search.svg'; +import Header from '@/components/Header'; +import settingIcon from '@/assets/settingHeader.svg'; +import Warning from '@/components/warning'; function Community() { return (
    -

    Community

    + {/* 상단 헤더 재사용*/} +
    + + +
    + } + /> + {/*경고 화면 */} +
    + +
    ); } diff --git a/src/pages/friendList/FriendList.tsx b/src/pages/friendList/FriendList.tsx index 2f910811..4867addf 100644 --- a/src/pages/friendList/FriendList.tsx +++ b/src/pages/friendList/FriendList.tsx @@ -1,6 +1,7 @@ import profile from '@/assets/profile.svg'; import findIcon from '@/assets/search.svg'; import addFriendIcon from '@/assets/addFriend.svg'; +import Header from '@/components/Header'; import { useNavigate } from 'react-router-dom'; function FriendList() { @@ -8,17 +9,20 @@ function FriendList() { return (
    {/* 상단 헤더 */} -
    - 친구 -
    - - -
    -
    +
    + + +
    + } + /> + {/* 내 프로필 */}
    -

    Setting

    + {/* 상단 헤더 재사용*/} +
    + + + + } + /> + {/*경고 화면 */} +
    + +
    ); } From e8e6f3608cf8a0dd36874201d9fa11cf6294f64d Mon Sep 17 00:00:00 2001 From: sungahChooo <170587664+sungahChooo@users.noreply.github.com> Date: Tue, 7 Oct 2025 16:09:56 +0900 Subject: [PATCH 27/60] =?UTF-8?q?feat:=20=EC=83=81=EB=8B=A8=EB=B0=94=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.tsx | 6 ++- src/assets/battery.svg | 7 +++ src/assets/data.svg | 6 +++ src/assets/wifi.svg | 3 ++ src/components/Header.tsx | 2 +- src/{pages/navbar => components}/Navbar.tsx | 2 +- src/components/Statusbar.tsx | 41 ++++++++++++++ src/pages/chat/Chatting.tsx | 43 +++++++-------- src/pages/chat/ChattingRoom.tsx | 14 ++--- src/pages/friendList/FriendList.tsx | 59 +++++++++++---------- src/pages/friendList/Profile.tsx | 2 +- 11 files changed, 126 insertions(+), 59 deletions(-) create mode 100644 src/assets/battery.svg create mode 100644 src/assets/data.svg create mode 100644 src/assets/wifi.svg rename src/{pages/navbar => components}/Navbar.tsx (98%) create mode 100644 src/components/Statusbar.tsx diff --git a/src/App.tsx b/src/App.tsx index afb5ee30..864a1e0a 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -3,11 +3,12 @@ import Chatting from './pages/chat/Chatting'; import Community from './pages/community/Community'; import FriendList from './pages/friendList/FriendList'; import Setting from './pages/settings/Setting'; -import Sidebar from './pages/navbar/Navbar'; +import NavBar from './components/Navbar'; import ChattingRoom from './pages/chat/ChattingRoom'; import { BrowserRouter as Router, Routes, Route, useLocation } from 'react-router-dom'; import Profile from './pages/friendList/Profile'; +import Statusbar from './components/Statusbar'; function AppLayout({ children }: { children: React.ReactNode }) { const location = useLocation(); @@ -16,7 +17,8 @@ function AppLayout({ children }: { children: React.ReactNode }) { return (
    - {showSidebar && } + + {showSidebar && }
    {children}
    ); diff --git a/src/assets/battery.svg b/src/assets/battery.svg new file mode 100644 index 00000000..9c40f86e --- /dev/null +++ b/src/assets/battery.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/assets/data.svg b/src/assets/data.svg new file mode 100644 index 00000000..b0c3a701 --- /dev/null +++ b/src/assets/data.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/assets/wifi.svg b/src/assets/wifi.svg new file mode 100644 index 00000000..450b9e27 --- /dev/null +++ b/src/assets/wifi.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/components/Header.tsx b/src/components/Header.tsx index c633035e..2435014a 100644 --- a/src/components/Header.tsx +++ b/src/components/Header.tsx @@ -7,7 +7,7 @@ interface HeaderProps { export default function Header({ title, right }: HeaderProps) { return ( -
    +
    {title}
    {right}
    diff --git a/src/pages/navbar/Navbar.tsx b/src/components/Navbar.tsx similarity index 98% rename from src/pages/navbar/Navbar.tsx rename to src/components/Navbar.tsx index 5a797ffb..7a53264b 100644 --- a/src/pages/navbar/Navbar.tsx +++ b/src/components/Navbar.tsx @@ -10,7 +10,7 @@ function Sidebar() { const { pathname } = useLocation(); return ( -
    {/* 친구 리스트 */} -
      -

      - {[1, 2, 3, 4, 5, 6, 7].map((i) => ( +
        + {friendsData.map((friend) => (
      • navigate(`/profile/${i}`)} + key={friend.id} + className="flex cursor-pointer items-center gap-3 px-4 py-2" + onClick={() => navigate(`/profile/${friend.id}`)} > - + 프로필
        -
        친구이름
        -
        상태메시지 있는 경우입니다.
        +
        {friend.name}
        + {friend.statusMessage &&
        {friend.statusMessage}
        }
      • ))} diff --git a/src/pages/friendList/FriendProfile.tsx b/src/pages/friendList/FriendProfile.tsx new file mode 100644 index 00000000..50bbfa1f --- /dev/null +++ b/src/pages/friendList/FriendProfile.tsx @@ -0,0 +1,75 @@ +// src/pages/Profile.tsx +import xIcon from '@/assets/xIcon.svg'; +import profileImage from '@/assets/profile.svg'; +import profileChatIcon from '@/assets/profileChat.svg'; +import callIcon from '@/assets/callChattingRoom.svg'; +import facetimeIcon from '@/assets/facetimeIcon.svg'; +import friendsData from '@/data/friend.json'; +import { useParams } from 'react-router-dom'; +import profile1 from '@/assets/profile1.jpg'; +import profile2 from '@/assets/profile2.svg'; +import profile3 from '@/assets/profile3.jpg'; +import profile4 from '@/assets/profile4.jpg'; + +// 이미지 매핑 +const images: Record = { + 'profile1.jpg': profile1, + 'profile2.jpg': profile2, + 'profile3.jpg': profile3, + 'profile4.jpg': profile4, +}; + +function FriendProfile() { + const { id } = useParams<{ id: string }>(); + const friend = friendsData.find((f) => f.id === Number(id)); + if (!friend) { + return ( +
        + 친구 정보를 불러올 수 없습니다 😢 +
        + ); + } + const profileSrc = friend.profileImage ? images[friend.profileImage] : profileImage; + return ( +
        + {/*배경 레이어 */} +
        + {/* x버튼 */} +
        + window.history.back()} + /> +
        + {/* 프로필 박스 + 버튼 영역이 화면 하단에 오도록 정렬 */} +
        + {/* 프로필 박스 */} +
        + profile +

        + {friend.name} + {friend.number} +

        +
        + + {/* 버튼 영역 */} +
        + + + +
        +
        +
        + ); +} +export default FriendProfile; diff --git a/src/pages/friendList/Profile.tsx b/src/pages/friendList/Profile.tsx index 3495a92c..abacd546 100644 --- a/src/pages/friendList/Profile.tsx +++ b/src/pages/friendList/Profile.tsx @@ -1,22 +1,17 @@ // src/pages/Profile.tsx -import { useParams } from 'react-router-dom'; import xIcon from '@/assets/xIcon.svg'; import profileImage from '@/assets/profile.svg'; import instagramIcon from '@/assets/instagram.svg'; import editIcon from '@/assets/edit.svg'; import profileChatIcon from '@/assets/profileChat.svg'; -interface ProfileProps { - mode: 'my' | 'friend'; -} - -export default function Profile({ mode }: ProfileProps) { - const { id } = useParams(); // 친구 id 같은 것 ("/profile/:id"에서 가져옴) - +export default function Profile() { return ( -
        +
        + {/*배경 레이어 */} +
        {/* x버튼 */} -
        +
        {/* 프로필 박스 + 버튼 영역이 화면 하단에 오도록 정렬 */} -
        +
        {/* 프로필 박스 */}
        - profile + profile

        - {mode === 'my' ? '내 이름' : `친구 ${id}`} - {mode === 'my' ? '010 1234 5678' : '010 0000 0000'} + 정해인 + 010 8992 0743

        {/* 버튼 영역 */}
        - {mode === 'my' ? ( - <> - - - - - ) : ( - <> - - - - )} + + +
        From 46c991d860e5d619074b5009aa84646e4670591e Mon Sep 17 00:00:00 2001 From: sungahChooo <170587664+sungahChooo@users.noreply.github.com> Date: Wed, 8 Oct 2025 18:48:38 +0900 Subject: [PATCH 29/60] =?UTF-8?q?fix:=20=EC=B9=9C=EA=B5=AC=20=EB=AA=A9?= =?UTF-8?q?=EB=A1=9D=20=EC=A1=B0=ED=9A=8C=20=EC=98=A4=EB=A5=98=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/assets/pin.svg | 5 +++ src/assets/profile2.jpg | Bin 0 -> 22024 bytes src/assets/profile2.svg | 1 - src/data/chat.json | 39 ++++++++++++------- src/pages/chat/Chatting.tsx | 4 +- src/pages/friendList/FriendList.tsx | 50 +++++++++++++++---------- src/pages/friendList/FriendProfile.tsx | 2 +- 7 files changed, 66 insertions(+), 35 deletions(-) create mode 100644 src/assets/pin.svg create mode 100644 src/assets/profile2.jpg delete mode 100644 src/assets/profile2.svg diff --git a/src/assets/pin.svg b/src/assets/pin.svg new file mode 100644 index 00000000..aee52635 --- /dev/null +++ b/src/assets/pin.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/profile2.jpg b/src/assets/profile2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e1cb5c98b126d88760f44dd29962cb3ce122aa54 GIT binary patch literal 22024 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 literal 0 HcmV?d00001 diff --git a/src/assets/profile2.svg b/src/assets/profile2.svg deleted file mode 100644 index b1c642c8..00000000 --- a/src/assets/profile2.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/data/chat.json b/src/data/chat.json index cac9f11f..0bce65d2 100644 --- a/src/data/chat.json +++ b/src/data/chat.json @@ -5,7 +5,8 @@ "message": "안녕하세요! Room 1입니다.", "time": "3:00 PM", "likes": 0, - "likedByMe": false + "likedByMe": false, + "isPinned": false }, { "roomId": "1", @@ -13,7 +14,8 @@ "message": "반갑습니다!", "time": "3:01 PM", "likes": 0, - "likedByMe": false + "likedByMe": false, + "isPinned": false }, { "roomId": "2", @@ -21,7 +23,8 @@ "message": "Room 2에 오신 걸 환영합니다.", "time": "4:00 PM", "likes": 0, - "likedByMe": false + "likedByMe": false, + "isPinned": false }, { "roomId": "2", @@ -29,7 +32,8 @@ "message": "잘 부탁드립니다.", "time": "4:01 PM", "likes": 0, - "likedByMe": false + "likedByMe": false, + "isPinned": false }, { "roomId": "3", @@ -37,7 +41,8 @@ "message": "Room 3에서 새로운 소식이 있어요.", "time": "2:15 PM", "likes": 0, - "likedByMe": false + "likedByMe": false, + "isPinned": false }, { "roomId": "3", @@ -45,7 +50,8 @@ "message": "좋아요, 확인할게요.", "time": "2:17 PM", "likes": 0, - "likedByMe": false + "likedByMe": false, + "isPinned": false }, { "roomId": "4", @@ -53,7 +59,8 @@ "message": "Room 4 채팅 시작합니다.", "time": "1:00 PM", "likes": 0, - "likedByMe": false + "likedByMe": false, + "isPinned": false }, { "roomId": "4", @@ -61,7 +68,8 @@ "message": "알겠습니다!", "time": "1:02 PM", "likes": 0, - "likedByMe": false + "likedByMe": false, + "isPinned": false }, { "roomId": "5", @@ -69,7 +77,8 @@ "message": "Room 5의 공지사항입니다.", "time": "5:30 PM", "likes": 0, - "likedByMe": false + "likedByMe": false, + "isPinned": false }, { "roomId": "5", @@ -77,7 +86,8 @@ "message": "확인했습니다.", "time": "5:32 PM", "likes": 0, - "likedByMe": false + "likedByMe": false, + "isPinned": false }, { "roomId": "6", @@ -93,7 +103,8 @@ "message": "안녕하세요~", "time": "6:05 PM", "likes": 0, - "likedByMe": false + "likedByMe": false, + "isPinned": false }, { "roomId": "7", @@ -101,7 +112,8 @@ "message": "Room 7 마지막 테스트 메시지입니다.", "time": "7:00 PM", "likes": 0, - "likedByMe": false + "likedByMe": false, + "isPinned": false }, { "roomId": "7", @@ -109,6 +121,7 @@ "message": "좋아요, 테스트 완료!", "time": "7:02 PM", "likes": 0, - "likedByMe": false + "likedByMe": false, + "isPinned": false } ] diff --git a/src/pages/chat/Chatting.tsx b/src/pages/chat/Chatting.tsx index 2ce06283..f27a2dbc 100644 --- a/src/pages/chat/Chatting.tsx +++ b/src/pages/chat/Chatting.tsx @@ -5,9 +5,11 @@ import camerIcon from '@/assets/camera.svg'; import chattingRoomIcon from '@/assets/chattingRoom.svg'; import profileICon from '@/assets/profile.svg'; import { useNavigate } from 'react-router-dom'; +import chatDataJson from '@/data/chat.json'; function Chatting() { const navigate = useNavigate(); + const chatData = [...chatDataJson]; return (
        {/* 상단 헤더 재사용*/} @@ -36,7 +38,7 @@ function Chatting() { {/* 채팅방 리스트 */}
          - {[1, 2, 3, 4, 5, 6, 7].map((i) => ( + {chatData.map((data, i) => (
        • navigate(`/chattingroom/${i}`)}> {/* 채팅방 이미지 */}
          diff --git a/src/pages/friendList/FriendList.tsx b/src/pages/friendList/FriendList.tsx index 1b29532c..cc2ae7c0 100644 --- a/src/pages/friendList/FriendList.tsx +++ b/src/pages/friendList/FriendList.tsx @@ -5,7 +5,7 @@ import Header from '@/components/Header'; import { useNavigate } from 'react-router-dom'; import friendsData from '@/data/friend.json'; import profile1 from '@/assets/profile1.jpg'; -import profile2 from '@/assets/profile2.svg'; +import profile2 from '@/assets/profile2.jpg'; import profile3 from '@/assets/profile3.jpg'; import profile4 from '@/assets/profile4.jpg'; // 이미지 매핑 객체 @@ -18,6 +18,7 @@ const images: Record = { function FriendList() { const navigate = useNavigate(); + const sectionHeaders = ['ㄱ', 'ㄴ', 'ㄷ']; return (
          {/* 상단 헤더 */} @@ -49,24 +50,35 @@ function FriendList() {
          {/* 친구 리스트 */} -
            - {friendsData.map((friend) => ( -
          • navigate(`/profile/${friend.id}`)} - > - 프로필 -
            -
            {friend.name}
            - {friend.statusMessage &&
            {friend.statusMessage}
            } -
            -
          • - ))} +
              + {friendsData.map((friend, index) => { + const sectionIndex = Math.floor(index / 3); + const showHeader = index % 3 === 0; + return ( +
            • + {showHeader && ( +

              + {sectionHeaders[sectionIndex] || ''} +

              + )} + +
              navigate(`/profile/${friend.id}`)} + > + 프로필 +

              + {friend.name} + {friend.statusMessage &&

              {friend.statusMessage}
              } +

              +
              +
            • + ); + })}
        diff --git a/src/pages/friendList/FriendProfile.tsx b/src/pages/friendList/FriendProfile.tsx index 50bbfa1f..81a1674c 100644 --- a/src/pages/friendList/FriendProfile.tsx +++ b/src/pages/friendList/FriendProfile.tsx @@ -7,7 +7,7 @@ import facetimeIcon from '@/assets/facetimeIcon.svg'; import friendsData from '@/data/friend.json'; import { useParams } from 'react-router-dom'; import profile1 from '@/assets/profile1.jpg'; -import profile2 from '@/assets/profile2.svg'; +import profile2 from '@/assets/profile2.jpg'; import profile3 from '@/assets/profile3.jpg'; import profile4 from '@/assets/profile4.jpg'; From 98ed5e0628e4fab191daf26af20a43cf9a742fd8 Mon Sep 17 00:00:00 2001 From: sungahChooo <170587664+sungahChooo@users.noreply.github.com> Date: Wed, 8 Oct 2025 19:02:31 +0900 Subject: [PATCH 30/60] =?UTF-8?q?fix:=20=EB=B0=B0=ED=8F=AC=EB=A5=BC=20?= =?UTF-8?q?=EC=9C=84=ED=95=9C=20=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/chat/Chatting.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/chat/Chatting.tsx b/src/pages/chat/Chatting.tsx index f27a2dbc..65df6f7f 100644 --- a/src/pages/chat/Chatting.tsx +++ b/src/pages/chat/Chatting.tsx @@ -46,7 +46,7 @@ function Chatting() { 채팅방 이름 {/* 채팅방 이름 */} 11:59 AM

        -
        마지막 메시지 내용
        {/* 마지막 메시지 내용 */} +
        {data.message}
        {/* 마지막 메시지 내용 */}
        ))} From 297191934e33d90ef5b506b3c5f15ada3822a12c Mon Sep 17 00:00:00 2001 From: sungahChooo <170587664+sungahChooo@users.noreply.github.com> Date: Thu, 9 Oct 2025 17:40:39 +0900 Subject: [PATCH 31/60] =?UTF-8?q?feat:=20=EC=B1=84=ED=8C=85=EB=B0=A9=20?= =?UTF-8?q?=EC=83=81=EB=8B=A8=20=EA=B3=A0=EC=A0=95,=20=EC=95=88=EC=9D=BD?= =?UTF-8?q?=EC=9D=80=20=EB=A9=94=EC=8B=9C=EC=A7=80=20=ED=91=9C=EC=8B=9C,?= =?UTF-8?q?=20=EC=B1=84=ED=8C=85=20=EC=83=81=EB=8C=80=20=EC=9D=B4=EB=A6=84?= =?UTF-8?q?=20=ED=91=9C=EC=8B=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/assets/pin.svg | 6 +- src/data/chat.json | 76 +++++++++++++------ src/pages/chat/Chatting.tsx | 110 ++++++++++++++++++++++++---- src/pages/friendList/FriendList.tsx | 12 +-- 4 files changed, 162 insertions(+), 42 deletions(-) diff --git a/src/assets/pin.svg b/src/assets/pin.svg index aee52635..eb48b215 100644 --- a/src/assets/pin.svg +++ b/src/assets/pin.svg @@ -1,5 +1,5 @@ - - - + + + diff --git a/src/data/chat.json b/src/data/chat.json index 0bce65d2..6d2140eb 100644 --- a/src/data/chat.json +++ b/src/data/chat.json @@ -1,12 +1,13 @@ [ { "roomId": "1", - "sender": "friend", + "sender": "강민수", "message": "안녕하세요! Room 1입니다.", "time": "3:00 PM", "likes": 0, "likedByMe": false, - "isPinned": false + "isPinned": true, + "unread": 0 }, { "roomId": "1", @@ -15,16 +16,28 @@ "time": "3:01 PM", "likes": 0, "likedByMe": false, - "isPinned": false + "isPinned": false, + "unread": 0 }, { "roomId": "2", - "sender": "friend", + "sender": "김다연", "message": "Room 2에 오신 걸 환영합니다.", "time": "4:00 PM", "likes": 0, "likedByMe": false, - "isPinned": false + "isPinned": true, + "unread": 0 + }, + { + "roomId": "2", + "sender": "도현", + "message": "반갑습니다.", + "time": "4:00 PM", + "likes": 0, + "likedByMe": false, + "isPinned": false, + "unread": 0 }, { "roomId": "2", @@ -33,16 +46,18 @@ "time": "4:01 PM", "likes": 0, "likedByMe": false, - "isPinned": false + "isPinned": false, + "unread": 0 }, { "roomId": "3", - "sender": "friend", + "sender": "김채연", "message": "Room 3에서 새로운 소식이 있어요.", "time": "2:15 PM", "likes": 0, "likedByMe": false, - "isPinned": false + "isPinned": false, + "unread": 0 }, { "roomId": "3", @@ -51,16 +66,18 @@ "time": "2:17 PM", "likes": 0, "likedByMe": false, - "isPinned": false + "isPinned": false, + "unread": 0 }, { "roomId": "4", - "sender": "friend", + "sender": "나연", "message": "Room 4 채팅 시작합니다.", "time": "1:00 PM", "likes": 0, "likedByMe": false, - "isPinned": false + "isPinned": false, + "unread": 0 }, { "roomId": "4", @@ -69,16 +86,28 @@ "time": "1:02 PM", "likes": 0, "likedByMe": false, - "isPinned": false + "isPinned": false, + "unread": 0 + }, + { + "roomId": "4", + "sender": "도경수", + "message": "ㅎㅎ", + "time": "1:04 PM", + "likes": 0, + "likedByMe": false, + "isPinned": false, + "unread": 0 }, { "roomId": "5", - "sender": "friend", + "sender": "남궁민", "message": "Room 5의 공지사항입니다.", "time": "5:30 PM", "likes": 0, "likedByMe": false, - "isPinned": false + "isPinned": false, + "unread": 0 }, { "roomId": "5", @@ -87,15 +116,17 @@ "time": "5:32 PM", "likes": 0, "likedByMe": false, - "isPinned": false + "isPinned": false, + "unread": 0 }, { "roomId": "6", - "sender": "friend", + "sender": "나채연", "message": "Room 6에 오신 걸 환영합니다!", "time": "6:00 PM", "likes": 0, - "likedByMe": false + "likedByMe": false, + "unread": 0 }, { "roomId": "6", @@ -104,16 +135,18 @@ "time": "6:05 PM", "likes": 0, "likedByMe": false, - "isPinned": false + "isPinned": false, + "unread": 0 }, { "roomId": "7", - "sender": "friend", + "sender": "도영", "message": "Room 7 마지막 테스트 메시지입니다.", "time": "7:00 PM", "likes": 0, "likedByMe": false, - "isPinned": false + "isPinned": false, + "unread": 0 }, { "roomId": "7", @@ -122,6 +155,7 @@ "time": "7:02 PM", "likes": 0, "likedByMe": false, - "isPinned": false + "isPinned": false, + "unread": 0 } ] diff --git a/src/pages/chat/Chatting.tsx b/src/pages/chat/Chatting.tsx index 65df6f7f..a14167d2 100644 --- a/src/pages/chat/Chatting.tsx +++ b/src/pages/chat/Chatting.tsx @@ -4,12 +4,71 @@ import searchIcon from '@/assets/search.svg'; import camerIcon from '@/assets/camera.svg'; import chattingRoomIcon from '@/assets/chattingRoom.svg'; import profileICon from '@/assets/profile.svg'; +import PinIcon from '@/assets/pin.svg?react'; import { useNavigate } from 'react-router-dom'; import chatDataJson from '@/data/chat.json'; +import { useState } from 'react'; + +interface ChatMessage { + roomId: string; + sender: string; + message: string; + time: string; + likes: number; + likedByMe: boolean; + isPinned?: boolean; + unread?: number; +} + +interface ChatRoom { + roomId: string; + messages: ChatMessage[]; + isPinned: boolean; + unread?: number; +} function Chatting() { const navigate = useNavigate(); - const chatData = [...chatDataJson]; + const myName = '나'; // + // const chatData = [...chatDataJson]; + + // 1️⃣ room 단위로 묶기 + const roomsMap: Record = {}; + chatDataJson.forEach((msg: ChatMessage) => { + if (!roomsMap[msg.roomId]) { + roomsMap[msg.roomId] = { roomId: msg.roomId, messages: [], isPinned: false }; + } + roomsMap[msg.roomId].messages.push(msg); + // room 단위 pinned = 하나라도 메시지가 pinned면 true + if (msg.isPinned) roomsMap[msg.roomId].isPinned = true; + }); + + // 2️⃣ useState로 상태 관리 + const [chatRooms, setChatRooms] = useState( + Object.values(roomsMap).sort((a, b) => { + if (a.isPinned && !b.isPinned) return -1; + if (!a.isPinned && b.isPinned) return 1; + const aLast = new Date(a.messages[a.messages.length - 1].time).getTime(); + const bLast = new Date(b.messages[b.messages.length - 1].time).getTime(); + return bLast - aLast; + }), + ); + // 3️⃣ 고정 토글 함수 + const togglePin = (roomId: string) => { + setChatRooms((prev) => { + const updated = prev.map((room) => (room.roomId === roomId ? { ...room, isPinned: !room.isPinned } : room)); + + // 다시 정렬 + return updated.sort((a, b) => { + if (a.isPinned && !b.isPinned) return -1; + if (!a.isPinned && b.isPinned) return 1; + const aLast = new Date(a.messages[a.messages.length - 1].time).getTime(); + const bLast = new Date(b.messages[b.messages.length - 1].time).getTime(); + return bLast - aLast; + }); + }); + }; + return (
        {/* 상단 헤더 재사용*/} @@ -38,18 +97,43 @@ function Chatting() { {/* 채팅방 리스트 */}
          - {chatData.map((data, i) => ( -
        • navigate(`/chattingroom/${i}`)}> - {/* 채팅방 이미지 */} -
          -

          - 채팅방 이름 {/* 채팅방 이름 */} - 11:59 AM -

          -
          {data.message}
          {/* 마지막 메시지 내용 */} -
          -
        • - ))} + {chatRooms.map((room, i) => { + const lastMessage = room.messages[room.messages.length - 1]; + const partnerName = room.messages.find((msg) => msg.sender !== myName)?.sender || '알 수 없음'; + return ( +
        • navigate(`/chattingroom/${room.roomId}`)} + > + {/* 채팅방 이미지 */} +
          +

          + + {partnerName} + + + {lastMessage.time} +

          +
          + {lastMessage.message} + + {room.unread}f + +
          + {/* 마지막 메시지 내용 */} +
          +
        • + ); + })}
        diff --git a/src/pages/friendList/FriendList.tsx b/src/pages/friendList/FriendList.tsx index cc2ae7c0..1104f0c0 100644 --- a/src/pages/friendList/FriendList.tsx +++ b/src/pages/friendList/FriendList.tsx @@ -45,8 +45,8 @@ function FriendList() { > 프로필 이미지
        -
        정해인
        -
        상태메시지 있는 경우입니다.
        +
        정해인
        +
        상태메시지 있는 경우입니다.
        {/* 친구 리스트 */} @@ -63,7 +63,7 @@ function FriendList() { )}
        navigate(`/profile/${friend.id}`)} >

        - {friend.name} - {friend.statusMessage &&

        {friend.statusMessage}
        } + {friend.name} + {friend.statusMessage && ( +
        {friend.statusMessage}
        + )}

        From 7c106235ea7e8ecfa40168a7a33e0b9449bf647a Mon Sep 17 00:00:00 2001 From: sungahChooo <170587664+sungahChooo@users.noreply.github.com> Date: Thu, 9 Oct 2025 18:41:33 +0900 Subject: [PATCH 32/60] =?UTF-8?q?fix:=20=EC=B1=84=ED=8C=85=EB=B0=A9=20?= =?UTF-8?q?=EB=AA=A9=EB=A1=9D=20=ED=8E=98=EC=9D=B4=EC=A7=80=20=EB=B0=B0?= =?UTF-8?q?=EC=97=B4=20=EC=A1=B0=EC=A0=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/calls/Call.tsx | 2 +- src/pages/chat/Chatting.tsx | 5 ++--- src/pages/friendList/FriendList.tsx | 18 +++++++----------- 3 files changed, 10 insertions(+), 15 deletions(-) diff --git a/src/pages/calls/Call.tsx b/src/pages/calls/Call.tsx index be348ffb..8d0a59ff 100644 --- a/src/pages/calls/Call.tsx +++ b/src/pages/calls/Call.tsx @@ -4,7 +4,7 @@ import settingIcon from '@/assets/settingHeader.svg'; import Warning from '@/components/warning'; function Call() { return ( -
        +
        {/* 상단 헤더 재사용*/}
        +
        {/* 상단 헤더 재사용*/}
        {/* 채팅방 이미지 */}

        - + {partnerName}

        - {/* 마지막 메시지 내용 */}
        ); diff --git a/src/pages/friendList/FriendList.tsx b/src/pages/friendList/FriendList.tsx index 1104f0c0..00b4a1b0 100644 --- a/src/pages/friendList/FriendList.tsx +++ b/src/pages/friendList/FriendList.tsx @@ -26,19 +26,15 @@ function FriendList() { title="친구" right={
        - - + search + camera
        } /> -
        +
        {/* 내 프로필 */}
        { navigate('/profile/me'); }} @@ -50,7 +46,7 @@ function FriendList() {
        {/* 친구 리스트 */} -
          +
            {friendsData.map((friend, index) => { const sectionIndex = Math.floor(index / 3); const showHeader = index % 3 === 0; @@ -71,10 +67,10 @@ function FriendList() { alt="프로필" className="h-[46px] w-[46px] rounded-full" /> -

            +

            {friend.name} {friend.statusMessage && ( -

            {friend.statusMessage}
            + {friend.statusMessage} )}

        From 4ba4421658caf04a66013f86058f3aad31ae4e6f Mon Sep 17 00:00:00 2001 From: sungahChooo <170587664+sungahChooo@users.noreply.github.com> Date: Fri, 10 Oct 2025 17:56:59 +0900 Subject: [PATCH 33/60] =?UTF-8?q?fix:=20status=20bar=20=ED=88=AC=EB=AA=85?= =?UTF-8?q?=EB=8F=84=20=EC=A1=B0=EC=A0=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.tsx | 4 +++- src/components/Header.tsx | 4 ++-- src/components/Navbar.tsx | 2 +- src/components/Statusbar.tsx | 8 ++++++-- src/pages/chat/Chatting.tsx | 2 +- src/pages/friendList/FriendList.tsx | 2 +- 6 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index 8570ad66..a3d3bcfb 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -15,10 +15,12 @@ function AppLayout({ children }: { children: React.ReactNode }) { const location = useLocation(); const hideSidebarPaths = ['/chattingroom', '/profile']; // 숨기고 싶은 페이지 경로 const showSidebar = !hideSidebarPaths.some((path) => location.pathname.startsWith(path)); //pathname이 /myprofile/123 이런식이어도 적용됨 + const isChatRoom = location.pathname.startsWith('/chattingroom'); + const isProfile = location.pathname.startsWith('/profile'); return (
        - + {showSidebar && }
        {children}
        diff --git a/src/components/Header.tsx b/src/components/Header.tsx index 2435014a..278185b8 100644 --- a/src/components/Header.tsx +++ b/src/components/Header.tsx @@ -7,9 +7,9 @@ interface HeaderProps { export default function Header({ title, right }: HeaderProps) { return ( -
        +
        {title} -
        {right}
        + {right}
        ); } diff --git a/src/components/Navbar.tsx b/src/components/Navbar.tsx index 7a53264b..75c86902 100644 --- a/src/components/Navbar.tsx +++ b/src/components/Navbar.tsx @@ -10,7 +10,7 @@ function Sidebar() { const { pathname } = useLocation(); return ( -