diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 00000000..d5ad81f5 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,16 @@ +module.exports = { + env: { browser: true, es2020: true, node: true }, + extends: [ + 'eslint:recommended', + 'plugin:@typescript-eslint/recommended', + 'plugin:react-hooks/recommended', + ], + parser: '@typescript-eslint/parser', + parserOptions: { ecmaVersion: 'latest', sourceType: 'module' }, + plugins: ['react-refresh'], + rules: { + 'react-refresh/only-export-components': 'warn', + 'no-console': ['warn'], + 'no-unused-vars': ['warn'], + }, +}; diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..3c3629e6 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +node_modules diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 00000000..56644609 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,8 @@ +{ + "tabWidth": 2, + "useTabs": false, + "trailingComma": "all", + "semi": true, + "printWidth": 80, + "singleQuote": true +} diff --git a/README.md b/README.md index d154b304..058929c4 100644 --- a/README.md +++ b/README.md @@ -1,230 +1,166 @@ -# KDT5-M6 -๐Ÿค ๊ฒ€์ƒ‰์–ด ์ž๋™์™„์„ฑ ์‚ฌ์ดํŠธ ๋ฐ ์†Œ๋น„ํŒจํ„ด ๊ธฐ๋ก ์„œ๋น„์Šค ๊ตฌํ˜„, ํŒ€ ํ”„๋กœ์ ํŠธ +# 7์กฐ - ๐Ÿ’ต This-is-money (์ด๊ฒŒ๋จธ๋‹ˆ) + +## ๋ฐฐํฌ์‚ฌ์ดํŠธ + +[์ด๊ฒŒ๋จธ๋‹ˆ]('https://thisismoney.netlify.app/') + +## ํ”„๋กœ์ ํŠธ ํŒ€์› + + + + + + + + + + + + + + + +
+ + 1017yu
+ ์œ ํฌํƒœ
+
+
+ + BearHumanS
+ ๋‚จ๊ธฐํ›ˆ
+
+
+ + fronttemp
+ ์ด์ •ํ™˜
+
+
+ + Tteum00
+ ์ •์Šน์›
+
+
+ ๋ฉ”์ธ ์บ˜๋ฆฐ๋” ํŽ˜์ด์ง€
์ผ์ž ๋ฐ ํƒœ๊ทธ ๋ณ„ ์ง€์ถœ ๋‚ด์—ญ
๊นƒ ๊ด€๋ฆฌ, ํ”„๋กœ์ ํŠธ ํŒ€์žฅ

+
+
+ ์ž…/์ง€์ถœ ๋‚ด์—ญ ์ƒ์„ฑ ๋ชจ๋‹ฌ ์ž‘์—…
๋‚ด์—ญ ์ˆ˜์ •/์‚ญ์ œ ๋ชจ๋‹ฌ ์ž‘์—…
+ ๋‚ด์—ญ ์ƒ์„ธ ์ •๋ณด ๋ชจ๋‹ฌ ์ž‘์—…

+
+
+ detail ์ฐจํŠธ ์ƒ์„ฑ ์ž‘์—…
+ detail ๋ฆฌ์ŠคํŠธ ์ถ”๊ฐ€ ์ž‘์—…
+ ๊ธฐ๊ฐ„+์นดํ…Œ๊ณ ๋ฆฌ ํ•„ํ„ฐ ๊ธฐ๋Šฅ ์ž‘์—…

+
+ graph ์ฐจํŠธ ์ƒ์„ฑ ์ž‘์—…
+ ์ฃผ๊ฐ„ ๋ถ„์„ ๊ธฐ๋Šฅ ์ž‘์—… +

+
+ +
+
+ +## ๊ธฐ์ˆ  ์Šคํƒ + +### Development + +

+ + + +
+ + + + +

+ +## Config + +

+ +

+ +### Deployment + + + +### Environment + +

+ + + +

+ +### Cowork Tools + +

+ + + + + +

+ +
+ +## Commit Convention + +- `feat` : ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ์ถ”๊ฐ€ +- `fix` : ๋ฒ„๊ทธ ์ˆ˜์ • +- `docs` : ๋ฌธ์„œ ์ˆ˜์ • +- `style` : ์ฝ”๋“œ ํฌ๋งทํŒ…, ์„ธ๋ฏธ์ฝœ๋ก  ๋ˆ„๋ฝ, ์ฝ”๋“œ ๋ณ€๊ฒฝ์ด ์—†๋Š” ๊ฒฝ์šฐ +- `refactor` : ์ฝ”๋“œ ๋ฆฌํŽ™ํ† ๋ง +- `test` : ํ…Œ์ŠคํŠธ ์ฝ”๋“œ, ๋ฆฌํŽ™ํ† ๋ง ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ถ”๊ฐ€ +- `chore` : ๋นŒ๋“œ ์—…๋ฌด ์ˆ˜์ •, ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ € ์ˆ˜์ • + +``` +์˜ˆ์‹œ] [feat] ์ง€์ถœ ๋‚ด์—ญ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ ๊ตฌํ˜„ +``` + +
+
+ +## Pull Request Convention + +1. ์ž‘์—…๋‹จ์œ„ ๋ณ„ ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ ํ›„ ์ž‘์—… +2. ์ตœ์†Œ ์ธ์› PR Review๋ฅผ ํ†ตํ•ด Merge ์Šน์ธ +3. Github Project์™€ ์—ฐ๊ฒฐํ•˜์—ฌ issue ๊ด€๋ฆฌ + +
+
+
+ +## ํ”„๋กœ์ ํŠธ ๊ตฌ์„ฑ -Calendar & List ๋“ฑ ๋‚ด๊ฐ€ ์†Œ๋น„ํ•œ ๊ธˆ์•ก ๋ฐ ํ’ˆ๋ชฉ๋“ค์„ ๊ธฐ์ž…ํ•˜๊ณ , ์›”๋‹จ์œ„๋กœ ์–ผ๋งˆ๋ฅผ ์ผ๋Š”์ง€, ์–ด๋–ค ํ•ญ๋ชฉ์— ๋น„์ค‘์„ ๋‘์—ˆ๋Š”์ง€ ๋“ฑ์„ ๊ธฐ๋กํ•˜๋Š” +| **๋ฉ”์ธ ํ™”๋ฉด(๋กœ๊ทธ์ธ ์ „)** | **๋ฉ”์ธ ํ™”๋ฉด(๋กœ๊ทธ์ธ ํ›„)** | +| :------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------: | +| image | image | +| | -์›น ์„œ๋น„์Šค๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. +| **๊ฑฐ๋ž˜ ๋‚ด์—ญ ์ถ”๊ฐ€ ๋ชจ๋‹ฌ I** | **๊ฑฐ๋ž˜ ๋‚ด์—ญ ์ถ”๊ฐ€ ๋ชจ๋‹ฌ II** | +| :------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------: | +| image | image | +| **ํƒœ๊ทธ๋ณ„ ๊ฒ€์ƒ‰ ๋ชจ๋‹ฌ** | **ํƒœ๊ทธ๋ณ„ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ** | +| :------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------: | +| image | image | +| **ํŠน์ • ์ผ์ž ์ƒ์„ธ ์กฐํšŒ** | **ํŠน์ • ๊ฑฐ๋ž˜ ๋‚ด์—ญ ์ƒ์„ธ ์กฐํšŒ** | +| :------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------: | +| image | image | -์›น/๋ชจ๋ฐ”์ผ์›น ๊ตฌํ˜„ ๋ชจ๋‘ ๋ฌด๋ฐฉํ•˜๋ฉฐ, ๋‹ค์–‘ํ•œ ์ฐจํŠธ๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +| **ํŠน์ • ๊ฑฐ๋ž˜ ๋‚ด์—ญ ์ˆ˜์ • ๋ชจ๋‹ฌ** | **ํŠน์ • ๊ฑฐ๋ž˜ ๋‚ด์—ญ ์ˆ˜์ • ์™„๋ฃŒ** | +| :------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------: | +| image | image | +| **๊ฑฐ๋ž˜ ์ƒ์„ธ ์กฐํšŒ(์›”๊ฐ„ I)** | **๊ฑฐ๋ž˜ ์ƒ์„ธ ์กฐํšŒ (์›”๊ฐ„ II)** | +| :------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------: | +| image | image | -react๋ฅผ ํ•„์ˆ˜๋กœ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. -๊ณผ์ œ ์ˆ˜ํ–‰ ๋ฐ ๋ฆฌ๋ทฐ ๊ธฐ๊ฐ„์€ ๋ณ„๋„ ๊ณต์ง€๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”! - - - -๊ณผ์ œ ์ˆ˜ํ–‰ ๋ฐ ์ œ์ถœ ๋ฐฉ๋ฒ• - -KDT๊ธฐ์ˆ˜๋ฒˆํ˜ธ_์ด๋ฆ„ - - - -E.g, KDT0_BaeJinHo - -ํ˜„์žฌ ์ €์žฅ์†Œ๋ฅผ ๋กœ์ปฌ์— ํด๋ก (Clone)ํ•ฉ๋‹ˆ๋‹ค. -์ž์‹ ์˜ ๋ณธ๋ช…์œผ๋กœ ๋ธŒ๋žœ์น˜๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.(๊ตฌ๋ถ„ ๊ฐ€๋Šฅํ•˜๋„๋ก ๋ณธ๋ช…์„ ๊ผญ ํŒŒ์Šค์นผ์ผ€์ด์Šค๋กœ ํ‘œ์‹œํ•˜์„ธ์š”, git branch KDTX_BaeJinHo) -์ž์‹ ์˜ ๋ณธ๋ช… ๋ธŒ๋žœ์น˜์—์„œ ๊ณผ์ œ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. -๊ณผ์ œ ์ˆ˜ํ–‰์ด ์™„๋ฃŒ๋˜๋ฉด, ์ž์‹ ์˜ ๋ณธ๋ช… ๋ธŒ๋žœ์น˜๋ฅผ ์›๊ฒฉ ์ €์žฅ์†Œ์— ํ‘ธ์‹œ(Push)ํ•ฉ๋‹ˆ๋‹ค.(main ๋ธŒ๋žœ์น˜์— ํ‘ธ์‹œํ•˜์ง€ ์•Š๋„๋ก ๊ผญ ์ฃผ์˜ํ•˜์„ธ์š”, git push origin KDTX_BaeJinHo) -์ €์žฅ์†Œ์—์„œ main ๋ธŒ๋žœ์น˜๋ฅผ ๋Œ€์ƒ์œผ๋กœ Pull Request ์ƒ์„ฑํ•˜๋ฉด, ๊ณผ์ œ ์ œ์ถœ์ด ์™„๋ฃŒ๋ฉ๋‹ˆ๋‹ค!(E.g, main <== KDTX_BaeJinHo) -main ํ˜น์€ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ๋ธŒ๋žœ์น˜๋กœ ์ ˆ๋Œ€ ๋ณ‘ํ•ฉํ•˜์ง€ ์•Š๋„๋ก ์ฃผ์˜ํ•˜์„ธ์š”! -Pull Request์—์„œ ๋ณด์ด๋Š” ์„ค๋ช…์„ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋„๋ก ๊ผผ๊ผผํ•˜๊ฒŒ ์ž‘์„ฑํ•˜์„ธ์š”! -Pull Request์—์„œ ๊ณผ์ œ ์ œ์ถœ ํ›„ ์ ˆ๋Œ€ ๋ณ‘ํ•ฉ(Merge)ํ•˜์ง€ ์•Š๋„๋ก ์ฃผ์˜ํ•˜์„ธ์š”! -๊ณผ์ œ ์ˆ˜ํ–‰ ๋ฐ ์ œ์ถœ ๊ณผ์ •์—์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ, ๋ฐ”๋กœ ๋‹ด๋‹น ๋ฉ˜ํ† ๋‚˜ ๊ฐ•์‚ฌ์—์„œ ์–˜๊ธฐํ•˜์„ธ์š”! - - -[ํ•„์ˆ˜ ๊ตฌํ˜„] -์ง€์ถœ ๋‚ด์—ญ ์ž…๋ ฅ ํผ (์ง€์ถœ ๊ธˆ์•ก, ์ง€์ถœํ•ญ๋ชฉ, ์ง€์ถœ ๋‚ ์งœ) -์ง€์ถœ ๋‚ด์—ญ ๋ชฉ๋ก(์ผ๋ฐ˜ ๋ฆฌ์ŠคํŠธํ˜•, ์นผ๋ Œ๋” ํ˜• ํ‘œ๊ธฐ ๊ฐ€๋Šฅ) -์ง€์ถœ ๋‚ด์—ญ ์ˆ˜์ • ๋ฐ ์‚ญ์ œ - -[์„ ํƒ ๊ตฌํ˜„] -์ง€์ถœ ๋‚ด์—ญ ์นผ๋ Œ๋”๋กœ ํ‘œ๊ธฐ -์ง€์ถœ ๋‚ด์—ญ ์›”๋ณ„ ๋‚ด์—ญ, ์ฃผ๋ณ„ ๋‚ด์—ญ, ์ผ๋ณ„ ๋‚ด์—ญ ํ‘œ๊ธฐ -์ฐจํŠธ๋ฅผ ์ด์šฉํ•ด์„œ ์†Œ๋น„ ๋‚ด์—ญ ํ‘œ๊ธฐ ํ•˜๊ธฐ -๋ชจ๋ฐ”์ผ ํ˜•ํƒœ๋กœ ๊ตฌํ˜„ํ• ์ง€, ์›น ํ˜•ํƒœ๋กœ ๊ตฌํ˜„ํ• ์ง€๋Š” ์ž์œ  - -URL ์˜ˆ์ œ : http://52.78.195.183:3003/api/expenses -API -1. ์†Œ๋น„ ๊ธฐ๋ก ์ž‘์„ฑ API - -description ์ถ”๊ฐ€ (์„ ํƒ) - -Request: -```javascript -POST /expenses -Content-Type: application/json - -{ - "amount": 100, - "userId": "user123", - "category": "food", - "description": "์„ค๋ช…", - "date": "2023-07-04T10:30:00.000Z" -} -``` -Response: - -```javascript -Status: 201 Created -{ - "message": "Expense created successfully" -} -``` - - -2. ์†Œ๋น„ ํ’ˆ๋ชฉ ๋ชฉ๋ก API -Request: -```javascript -GET /categories?userId={userId} -``` -Response: - -Status: 200 OK -```javascript -["food", "clothing", "electronics"] -``` - -3. ๊ฒ€์ƒ‰์–ด์— ํ•ด๋‹นํ•˜๋Š” ์†Œ๋น„ ํ•ญ๋ชฉ ๋ฐ ๊ธˆ์•ก ์กฐํšŒ API - -Request: -```javascript -GET /expenses/search?q={keyword}&userId={userId} -``` - -Response: -```javascript -Status: 200 OK -[ - { - "amount": 100, - "userId": "user123", - "category": "food", - "date": "2023-07-04T10:30:00.000Z" - }, - { - "amount": 80, - "userId": "user456", - "category": "food", - "date": "2023-07-03T14:20:00.000Z" - } -] -``` - -4. ์ผ๋ณ„, ์ฃผ๋ณ„, ์›”๋ณ„ ์†Œ๋น„ ์กฐํšŒ API -Request: -```javascript - -(category๋Š” ์„ ํƒ) -GET /expenses/summary?period={period}&userId={userId}&category={category} -period : daily, weekly, monthly -``` -Response: - -```javascript -Status: 200 OK -[ - { - "_id": "2023-07-04", - "totalAmount": 180 - }, - { - "_id": "2023-07-03", - "totalAmount": 80 - } -] -``` -5. ์†Œ๋น„ ๊ธฐ๋ก ์ˆ˜์ • API -Request: -```javascript -PUT /expenses/123 - -Content-Type: application/json - -{ - "amount": 150, - "userId": "user123", - "category": "food", - "date": "2023-07-04T10:30:00.000Z" -} -``` -Response: -```javascript -Status: 200 OK -{ - "message": "Expense updated successfully" -} -``` - -6. ์†Œ๋น„ ๊ธฐ๋ก ์‚ญ์ œ API -Request: -```javascript -DELETE /expenses/123 -``` -Response: -```javascript -Status: 200 OK -{ - "message": "Expense deleted successfully" -} -``` - -7. ์†Œ๋น„ ๊ธฐ๋ก ๋‹ฌ๋ ฅ ํ˜ธ์ถœ API -Request: -```javascript -(category๋Š” ์„ ํƒ) -GET /expenses/calendar?year=2023&month=7&userId={userId}&category={category} -``` -Response: -```javascript -Status: 200 OK -{ - "1": [ - { - "amount": 100, - "userId": "user123", - "category": "food", - "date": "2023-07-01T10:30:00.000Z" - } - ], - "4": [ - { - "amount": 80, - "userId": "user456", - "category": "food", - "date": "2023-07-04T14:20:00.000Z" - } - ] -} - -``` - - - -8. ์นด๋ฐ๊ณ ๋ฆฌ์— ํ•ด๋‹นํ•˜๋Š” ์†Œ๋น„ ํ•ญ๋ชฉ ๋ฐ ๊ธˆ์•ก ์กฐํšŒ API(์ •ํ™•ํ•œ ์นด๋ฐ๊ณ ๋ฆฌ) - -Request: -```javascript -GET /expenses/category?q={keyword}&userId={userId} -``` - -Response: -```javascript -Status: 200 OK -[ - { - "amount": 100, - "userId": "user123", - "category": "food", - "date": "2023-07-04T10:30:00.000Z" - }, - { - "amount": 80, - "userId": "user456", - "category": "food", - "date": "2023-07-03T14:20:00.000Z" - } -] -``` +| **๊ฑฐ๋ž˜ ์ƒ์„ธ ์กฐํšŒ(๊ธฐ๊ฐ„๋ณ„ I)** | **๊ฑฐ๋ž˜ ์ƒ์„ธ ์กฐํšŒ(๊ธฐ๊ฐ„๋ณ„ II)** | +| :------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------: | +| image | image | +| diff --git a/custom.d.ts b/custom.d.ts new file mode 100644 index 00000000..50f2f0aa --- /dev/null +++ b/custom.d.ts @@ -0,0 +1,49 @@ +// ์†Œ๋น„ ๊ธฐ๋ก์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•  ๋•Œ ์„œ๋ฒ„ ์š”์ฒญ ๋ฐ์ดํ„ฐ +interface ExpenseData { + amount: number; + userId?: string; + category: string; + date: string; +} + +// ์†Œ๋น„ ๊ธฐ๋ก์„ ์ž‘์„ฑํ•˜๋Š” ์š”์ฒญ์ด ์„ฑ๊ณตํ•˜๋ฉด ์„œ๋ฒ„์—์„œ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฐ์ดํ„ฐ +interface ExpenseResponse { + message: string; +} + +// ์†Œ๋น„ ๊ฐ€๋Šฅํ•œ ํ’ˆ๋ชฉ ๋ชฉ๋ก์„ ์š”์ฒญํ•˜๋Š” ์„œ๋ฒ„ ๋ฐ์ดํ„ฐ +type CategoriesResponse = string[]; + +// ๊ฒ€์ƒ‰์–ด์— ํ•ด๋‹นํ•˜๋Š” ์†Œ๋น„ ํ’ˆ๋ชฉ๊ณผ ๊ธˆ์•ก์„ ์กฐํšŒํ•˜๋Š” ์„œ๋ฒ„ ์š”์ฒญ ๋ฐ์ดํ„ฐ +interface SearchResponseItem { + _id: string; + amount: number; + userId: string; + category: string; + date: string; +} + +type SearchResponse = SearchResponseItem[]; + +// ์ผ๋ณ„, ์ฃผ๋ณ„, ์›”๋ณ„ ์†Œ๋น„ ์กฐํšŒ๋ฅผ ์œ„ํ•œ ์„œ๋ฒ„ ์š”์ฒญ ๋ฐ์ดํ„ฐ +interface SummaryResponseItem { + _id: string; + totalAmount: number; +} + +type SummaryResponse = SummaryResponseItem[]; + +// ์†Œ๋น„ ๊ธฐ๋ก์„ ์ˆ˜์ •ํ•˜๋ฉด ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ˜ํ™˜๋˜๋Š” ์‘๋‹ต ๋ฐ์ดํ„ฐ +type UpdateResponse = { + message: string; +}; + +// ์†Œ๋น„ ๊ธฐ๋ก์„ ์‚ญ์ œํ•˜๋ฉด ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ˜ํ™˜๋˜๋Š” ์‘๋‹ต ๋ฐ์ดํ„ฐ +type DeleteResponse = { + message: string; +}; + +// ์†Œ๋น„ ๊ธฐ๋ก์— ๋Œ€ํ•œ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ์˜ ์‘๋‹ต ๋ฐ์ดํ„ฐ ํƒ€์ž… ์ •์˜ +interface CalendarResponse { + [day: string]: ExpenseData; +} diff --git a/index.html b/index.html new file mode 100644 index 00000000..61c9c90c --- /dev/null +++ b/index.html @@ -0,0 +1,12 @@ + + + + + + ์ด๊ฒŒ๋จธ๋‹ˆ + + +
+ + + diff --git a/netlify.toml b/netlify.toml new file mode 100644 index 00000000..93db91a8 --- /dev/null +++ b/netlify.toml @@ -0,0 +1,12 @@ +[[redirects]] + from = "/*" + to = "/index.html" + status = 200 + +[build] + command = "npm run build" + publish = "dist" + +[context.production.environment] + TOML_ENV_VAR = "From netlify.toml" + REACT_APP_TOML_ENV_VAR = "From netlify.toml (VITE_)" \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..aebd5d60 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,5913 @@ +{ + "name": "react-ts", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "react-ts", + "version": "0.0.0", + "dependencies": { + "antd": "^5.6.4", + "chart.js": "^4.3.0", + "dayjs": "^1.11.9", + "dotenv": "^16.3.1", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-icons": "^4.10.1", + "react-router-dom": "^6.14.1", + "styled-components": "^6.0.2" + }, + "devDependencies": { + "@types/node": "^20.3.3", + "@types/react": "^18.0.37", + "@types/react-dom": "^18.0.11", + "@types/styled-components": "^5.1.26", + "@typescript-eslint/eslint-plugin": "^5.59.0", + "@typescript-eslint/parser": "^5.59.0", + "@vitejs/plugin-react": "^4.0.0", + "eslint": "^8.38.0", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.3.4", + "typescript": "^5.0.2", + "vite": "^4.3.9" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@ant-design/colors": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-7.0.0.tgz", + "integrity": "sha512-iVm/9PfGCbC0dSMBrz7oiEXZaaGH7ceU40OJEfKmyuzR9R5CRimJYPlRiFtMQGQcbNMea/ePcoIebi4ASGYXtg==", + "dependencies": { + "@ctrl/tinycolor": "^3.4.0" + } + }, + "node_modules/@ant-design/cssinjs": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@ant-design/cssinjs/-/cssinjs-1.11.1.tgz", + "integrity": "sha512-ya0wpkOzBTdQX4u2h6xpluflKPPQuq7LtvJQ9ThDXwu6t67CNFr6SJCEvkuQ9+4rU89VhYMP4IUaTaqYgtsBTQ==", + "dependencies": { + "@babel/runtime": "^7.11.1", + "@emotion/hash": "^0.8.0", + "@emotion/unitless": "^0.7.5", + "classnames": "^2.3.1", + "csstype": "^3.0.10", + "rc-util": "^5.34.1", + "stylis": "^4.0.13" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/@ant-design/cssinjs/node_modules/@emotion/unitless": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", + "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" + }, + "node_modules/@ant-design/icons": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/@ant-design/icons/-/icons-5.1.4.tgz", + "integrity": "sha512-YHKL7Jx3bM12OxvtiYDon04BsBT/6LGitYEqar3GljzWaAyMOAD8i/uF1Rsi5Us/YNdWWXBGSvZV2OZWMpJlcA==", + "dependencies": { + "@ant-design/colors": "^7.0.0", + "@ant-design/icons-svg": "^4.2.1", + "@babel/runtime": "^7.11.2", + "classnames": "^2.2.6", + "rc-util": "^5.31.1" + }, + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/@ant-design/icons-svg": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@ant-design/icons-svg/-/icons-svg-4.2.1.tgz", + "integrity": "sha512-EB0iwlKDGpG93hW8f85CTJTs4SvMX7tt5ceupvhALp1IF44SeUFOMhKUOYqpsoYWQKAOuTRDMqn75rEaKDp0Xw==" + }, + "node_modules/@ant-design/react-slick": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@ant-design/react-slick/-/react-slick-1.0.1.tgz", + "integrity": "sha512-ARM0TmpGdDuUVE10NwUCENQlJSInNKo5NiBjL5szu5BxWNEHNwQMcDrlVCqFbkvFLy+2CvywW8Y59QJtC0YDag==", + "dependencies": { + "@babel/runtime": "^7.10.4", + "classnames": "^2.2.5", + "json2mq": "^0.2.0", + "resize-observer-polyfill": "^1.5.1", + "throttle-debounce": "^5.0.0" + }, + "peerDependencies": { + "react": ">=16.9.0" + } + }, + "node_modules/@babel/cli": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.22.6.tgz", + "integrity": "sha512-Be3/RfEDmkMRGT1+ru5nTkfcvWz5jDOYg1V9rXqTz2u9Qt96O1ryboGvxVBp7wOnYWDB8DNHIWb6DThrpudfOw==", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.17", + "commander": "^4.0.1", + "convert-source-map": "^1.1.0", + "fs-readdir-recursive": "^1.1.0", + "glob": "^7.2.0", + "make-dir": "^2.1.0", + "slash": "^2.0.0" + }, + "bin": { + "babel": "bin/babel.js", + "babel-external-helpers": "bin/babel-external-helpers.js" + }, + "engines": { + "node": ">=6.9.0" + }, + "optionalDependencies": { + "@nicolo-ribaudo/chokidar-2": "2.1.8-no-fsevents.3", + "chokidar": "^3.4.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/cli/node_modules/slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", + "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", + "dependencies": { + "@babel/highlight": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.6.tgz", + "integrity": "sha512-29tfsWTq2Ftu7MXmimyC0C5FDZv5DYxOZkh3XD3+QW4V/BYuv/LyEsjj3c0hqedEaDt6DBfDvexMKU8YevdqFg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.6.tgz", + "integrity": "sha512-HPIyDa6n+HKw5dEuway3vVAhBboYCtREBMp+IWeseZy6TFtzn6MHkCH2KKYUOC/vKKwgSMHQW4htBOrmuRPXfw==", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helpers": "^7.22.6", + "@babel/parser": "^7.22.6", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.6", + "@babel/types": "^7.22.5", + "@nicolo-ribaudo/semver-v6": "^6.3.3", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.5.tgz", + "integrity": "sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA==", + "dependencies": { + "@babel/types": "^7.22.5", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.5.tgz", + "integrity": "sha512-m1EP3lVOPptR+2DwD125gziZNcmoNSHGmJROKoy87loWUQyJaVXDgpmruWqDARZSmtYQ+Dl25okU8+qhVzuykw==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.6.tgz", + "integrity": "sha512-534sYEqWD9VfUm3IPn2SLcH4Q3P86XL+QvqdC7ZsFrzyyPF3T4XGiVghF6PTYNdWg6pXuoqXxNQAhbYeEInTzA==", + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-validator-option": "^7.22.5", + "@nicolo-ribaudo/semver-v6": "^6.3.3", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.6.tgz", + "integrity": "sha512-iwdzgtSiBxF6ni6mzVnZCF3xt5qE6cEA0J7nFt8QOAWZ0zjCFceEgpn3vtb2V7WFR6QzP2jmIFOHMTRo7eNJjQ==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@nicolo-ribaudo/semver-v6": "^6.3.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.6.tgz", + "integrity": "sha512-nBookhLKxAWo/TUCmhnaEJyLz2dekjQvv5SRpE9epWQBcpedWLKt8aZdsuT9XV5ovzR3fENLjRXVT0GsSlGGhA==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@nicolo-ribaudo/semver-v6": "^6.3.3", + "regexpu-core": "^5.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.0.tgz", + "integrity": "sha512-RnanLx5ETe6aybRi1cO/edaRH+bNYWaryCEmjDDYyNr4wnSzyOp8T0dWipmqVHKEY3AbVKUom50AKSlj1zmKbg==", + "dependencies": { + "@babel/helper-compilation-targets": "^7.17.7", + "@babel/helper-plugin-utils": "^7.16.7", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0-0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", + "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", + "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", + "dependencies": { + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz", + "integrity": "sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", + "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz", + "integrity": "sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", + "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.5.tgz", + "integrity": "sha512-cU0Sq1Rf4Z55fgz7haOakIyM7+x/uCFwXpLPaeRzfoUtAEAuUZjZvFPjL/rk5rW693dIgn2hng1W7xbT7lWT4g==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-wrap-function": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.5.tgz", + "integrity": "sha512-aLdNM5I3kdI/V9xGNyKSF3X/gTyMUBohTZ+/3QdQKAA9vxIiy12E+8E2HoOP1/DjeqU+g6as35QHJNMDDYpuCg==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", + "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.5.tgz", + "integrity": "sha512-bYqLIBSEshYcYQyfks8ewYA8S30yaGSeRslcvKMvoUk6HHPySbxHq9YRi6ghhzEU+yhQv9bP/jXnygkStOcqZw==", + "dependencies": { + "@babel/helper-function-name": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.6.tgz", + "integrity": "sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==", + "dependencies": { + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.6", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", + "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.6.tgz", + "integrity": "sha512-EIQu22vNkceq3LbjAq7knDf/UmtI2qbcNI8GRBlijez6TpQLvSodJPYfydQmNA5buwkxxxa/PVI44jjYZ+/cLw==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.5.tgz", + "integrity": "sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.5.tgz", + "integrity": "sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-external-helpers": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-external-helpers/-/plugin-external-helpers-7.22.5.tgz", + "integrity": "sha512-ngnNEWxmykPk82mH4ajZT0qTztr3Je6hrMuKAslZVM8G1YZTENJSYwrIGtt6KOtznug3exmAtF4so/nPqJuA4A==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", + "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", + "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", + "dependencies": { + "@babel/compat-data": "^7.20.5", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-unicode-property-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", + "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz", + "integrity": "sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz", + "integrity": "sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", + "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", + "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz", + "integrity": "sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.5.tgz", + "integrity": "sha512-gGOEvFzm3fWoyD5uZq7vVTD57pPJ3PczPUD/xCFGjzBpUosnklmXyKnGQbbbGs1NPNPskFex0j93yKbHt0cHyg==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.5", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz", + "integrity": "sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==", + "dependencies": { + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz", + "integrity": "sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.5.tgz", + "integrity": "sha512-EcACl1i5fSQ6bt+YGuU/XGCeZKStLmyVGytWkpyhCLeQVA0eu6Wtiw92V+I1T/hnezUv7j74dA/Ro69gWcU+hg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz", + "integrity": "sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.5.tgz", + "integrity": "sha512-SPToJ5eYZLxlnp1UzdARpOGeC2GbHvr9d/UV0EukuVx8atktg194oe+C5BqQ8jRTkgLRVOPYeXRSBg1IlMoVRA==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.6.tgz", + "integrity": "sha512-58EgM6nuPNG6Py4Z3zSuu0xWu2VfodiMi72Jt5Kj2FECmaYk1RrTXA45z6KBFsu9tRgwQDwIiY4FXTt+YsSFAQ==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz", + "integrity": "sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/template": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.5.tgz", + "integrity": "sha512-GfqcFuGW8vnEqTUBM7UtPd5A4q797LTvvwKxXTgRsFjoqaJiEg9deBG6kWeQYkVEL569NpnmpC0Pkr/8BLKGnQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz", + "integrity": "sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz", + "integrity": "sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.5.tgz", + "integrity": "sha512-0MC3ppTB1AMxd8fXjSrbPa7LT9hrImt+/fcj+Pg5YMD7UQyWp/02+JWpdnCymmsXwIx5Z+sYn1bwCn4ZJNvhqQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz", + "integrity": "sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==", + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.5.tgz", + "integrity": "sha512-X4hhm7FRnPgd4nDA4b/5V280xCx6oL7Oob5+9qVS5C13Zq4bh1qq7LU0GgRU6b5dBWBvhGaXYVB4AcN6+ol6vg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.5.tgz", + "integrity": "sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz", + "integrity": "sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==", + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.5.tgz", + "integrity": "sha512-DuCRB7fu8MyTLbEQd1ew3R85nx/88yMoqo2uPSjevMj3yoN7CDM8jkgrY0wmVxfJZyJ/B9fE1iq7EQppWQmR5A==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz", + "integrity": "sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.5.tgz", + "integrity": "sha512-MQQOUW1KL8X0cDWfbwYP+TbVbZm16QmQXJQ+vndPtH/BoO0lOKpVoEDMI7+PskYxH+IiE0tS8xZye0qr1lGzSA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz", + "integrity": "sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.22.5.tgz", + "integrity": "sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ==", + "dependencies": { + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.5.tgz", + "integrity": "sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA==", + "dependencies": { + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.5.tgz", + "integrity": "sha512-emtEpoaTMsOs6Tzz+nbmcePl6AKVtS1yC4YNAeMun9U8YCsgadPNxnOPQ8GhHFB2qdx+LZu9LgoC0Lthuu05DQ==", + "dependencies": { + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz", + "integrity": "sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==", + "dependencies": { + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", + "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz", + "integrity": "sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.5.tgz", + "integrity": "sha512-6CF8g6z1dNYZ/VXok5uYkkBBICHZPiGEl7oDnAx2Mt1hlHVHOSIKWJaXHjQJA5VB43KZnXZDIexMchY4y2PGdA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.5.tgz", + "integrity": "sha512-NbslED1/6M+sXiwwtcAB/nieypGw02Ejf4KtDeMkCEpP6gWFMX1wI9WKYua+4oBneCCEmulOkRpwywypVZzs/g==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.5.tgz", + "integrity": "sha512-Kk3lyDmEslH9DnvCDA1s1kkd3YWQITiBOHngOtDL9Pt6BZjzqb6hiOlb8VfjiiQJ2unmegBqZu0rx5RxJb5vmQ==", + "dependencies": { + "@babel/compat-data": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz", + "integrity": "sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.5.tgz", + "integrity": "sha512-pH8orJahy+hzZje5b8e2QIlBWQvGpelS76C63Z+jhZKsmzfNaPQ+LaW6dcJ9bxTpo1mtXbgHwy765Ro3jftmUg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.6.tgz", + "integrity": "sha512-Vd5HiWml0mDVtcLHIoEU5sw6HOUW/Zk0acLs/SAeuLzkGNOPc9DB4nkUajemhCmTIz3eiaKREZn2hQQqF79YTg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.5.tgz", + "integrity": "sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz", + "integrity": "sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.5.tgz", + "integrity": "sha512-/9xnaTTJcVoBtSSmrVyhtSvO3kbqS2ODoh2juEU72c3aYonNF0OMGiaz2gjukyKM2wBBYJP38S4JiE0Wfb5VMQ==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz", + "integrity": "sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.22.5.tgz", + "integrity": "sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.5.tgz", + "integrity": "sha512-rog5gZaVbUip5iWDMTYbVM15XQq+RkUKhET/IHR6oizR+JEoN6CAfTTuHcK4vwUyzca30qqHqEpzBOnaRMWYMA==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz", + "integrity": "sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==", + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.22.5.tgz", + "integrity": "sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.22.5.tgz", + "integrity": "sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.22.5.tgz", + "integrity": "sha512-gP4k85wx09q+brArVinTXhWiyzLl9UpmGva0+mWyKxk6JZequ05x3eUcIUE+FyttPKJFRRVtAvQaJ6YF9h1ZpA==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.5.tgz", + "integrity": "sha512-rR7KePOE7gfEtNTh9Qw+iO3Q/e4DEsoQ+hdvM6QUDH7JRJ5qxq5AA52ZzBWbI5i9lfNuvySgOGP8ZN7LAmaiPw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "regenerator-transform": "^0.15.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz", + "integrity": "sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz", + "integrity": "sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz", + "integrity": "sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz", + "integrity": "sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz", + "integrity": "sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz", + "integrity": "sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.5.tgz", + "integrity": "sha512-SMubA9S7Cb5sGSFFUlqxyClTA9zWJ8qGQrppNUm05LtFuN1ELRFNndkix4zUJrC9F+YivWwa1dHMSyo0e0N9dA==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-typescript": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.5.tgz", + "integrity": "sha512-biEmVg1IYB/raUO5wT1tgfacCef15Fbzhkx493D3urBI++6hpJ+RFG4SrWMn0NEZLfvilqKf3QDrRVZHo08FYg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz", + "integrity": "sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz", + "integrity": "sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz", + "integrity": "sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.6.tgz", + "integrity": "sha512-IHr0AXHGk8oh8HYSs45Mxuv6iySUBwDTIzJSnXN7PURqHdxJVQlCoXmKJgyvSS9bcNf9NVRVE35z+LkCvGmi6w==", + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.5", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.5", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.5", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.22.5", + "@babel/plugin-syntax-import-attributes": "^7.22.5", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.22.5", + "@babel/plugin-transform-async-generator-functions": "^7.22.5", + "@babel/plugin-transform-async-to-generator": "^7.22.5", + "@babel/plugin-transform-block-scoped-functions": "^7.22.5", + "@babel/plugin-transform-block-scoping": "^7.22.5", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-class-static-block": "^7.22.5", + "@babel/plugin-transform-classes": "^7.22.6", + "@babel/plugin-transform-computed-properties": "^7.22.5", + "@babel/plugin-transform-destructuring": "^7.22.5", + "@babel/plugin-transform-dotall-regex": "^7.22.5", + "@babel/plugin-transform-duplicate-keys": "^7.22.5", + "@babel/plugin-transform-dynamic-import": "^7.22.5", + "@babel/plugin-transform-exponentiation-operator": "^7.22.5", + "@babel/plugin-transform-export-namespace-from": "^7.22.5", + "@babel/plugin-transform-for-of": "^7.22.5", + "@babel/plugin-transform-function-name": "^7.22.5", + "@babel/plugin-transform-json-strings": "^7.22.5", + "@babel/plugin-transform-literals": "^7.22.5", + "@babel/plugin-transform-logical-assignment-operators": "^7.22.5", + "@babel/plugin-transform-member-expression-literals": "^7.22.5", + "@babel/plugin-transform-modules-amd": "^7.22.5", + "@babel/plugin-transform-modules-commonjs": "^7.22.5", + "@babel/plugin-transform-modules-systemjs": "^7.22.5", + "@babel/plugin-transform-modules-umd": "^7.22.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", + "@babel/plugin-transform-new-target": "^7.22.5", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.5", + "@babel/plugin-transform-numeric-separator": "^7.22.5", + "@babel/plugin-transform-object-rest-spread": "^7.22.5", + "@babel/plugin-transform-object-super": "^7.22.5", + "@babel/plugin-transform-optional-catch-binding": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.22.6", + "@babel/plugin-transform-parameters": "^7.22.5", + "@babel/plugin-transform-private-methods": "^7.22.5", + "@babel/plugin-transform-private-property-in-object": "^7.22.5", + "@babel/plugin-transform-property-literals": "^7.22.5", + "@babel/plugin-transform-regenerator": "^7.22.5", + "@babel/plugin-transform-reserved-words": "^7.22.5", + "@babel/plugin-transform-shorthand-properties": "^7.22.5", + "@babel/plugin-transform-spread": "^7.22.5", + "@babel/plugin-transform-sticky-regex": "^7.22.5", + "@babel/plugin-transform-template-literals": "^7.22.5", + "@babel/plugin-transform-typeof-symbol": "^7.22.5", + "@babel/plugin-transform-unicode-escapes": "^7.22.5", + "@babel/plugin-transform-unicode-property-regex": "^7.22.5", + "@babel/plugin-transform-unicode-regex": "^7.22.5", + "@babel/plugin-transform-unicode-sets-regex": "^7.22.5", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.22.5", + "@nicolo-ribaudo/semver-v6": "^6.3.3", + "babel-plugin-polyfill-corejs2": "^0.4.3", + "babel-plugin-polyfill-corejs3": "^0.8.1", + "babel-plugin-polyfill-regenerator": "^0.5.0", + "core-js-compat": "^3.31.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", + "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.22.5.tgz", + "integrity": "sha512-M+Is3WikOpEJHgR385HbuCITPTaPRaNkibTEa9oiofmJvIsrceb4yp9RL9Kb+TE8LznmeyZqpP+Lopwcx59xPQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.5", + "@babel/plugin-transform-react-display-name": "^7.22.5", + "@babel/plugin-transform-react-jsx": "^7.22.5", + "@babel/plugin-transform-react-jsx-development": "^7.22.5", + "@babel/plugin-transform-react-pure-annotations": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.22.5.tgz", + "integrity": "sha512-YbPaal9LxztSGhmndR46FmAbkJ/1fAsw293tSU+I5E5h+cnJ3d4GTwyUgGYmOXJYdGA+uNePle4qbaRzj2NISQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.22.5", + "@babel/plugin-transform-modules-commonjs": "^7.22.5", + "@babel/plugin-transform-typescript": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" + }, + "node_modules/@babel/runtime": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz", + "integrity": "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==", + "dependencies": { + "regenerator-runtime": "^0.13.11" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", + "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", + "dependencies": { + "@babel/code-frame": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.6.tgz", + "integrity": "sha512-53CijMvKlLIDlOTrdWiHileRddlIiwUIyCKqYa7lYnnPldXCG5dUSN38uT0cA6i7rHWNKJLH0VU/Kxdr1GzB3w==", + "dependencies": { + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.22.6", + "@babel/types": "^7.22.5", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz", + "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==", + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@ctrl/tinycolor": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.6.0.tgz", + "integrity": "sha512-/Z3l6pXthq0JvMYdUFyX9j0MaCltlIn6mfh9jLyQwg5aPKxkyNa0PTHtU1AlFXLNk55ZuAeJRcpvq+tmLfKmaQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/@emotion/hash": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", + "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz", + "integrity": "sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==", + "dependencies": { + "@emotion/memoize": "^0.8.1" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" + }, + "node_modules/@emotion/unitless": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", + "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" + }, + "node_modules/@esbuild/android-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", + "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", + "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", + "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", + "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", + "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", + "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", + "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", + "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", + "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", + "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", + "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", + "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", + "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", + "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", + "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", + "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", + "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", + "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", + "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", + "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", + "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", + "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz", + "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.0.tgz", + "integrity": "sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.44.0.tgz", + "integrity": "sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", + "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.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, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" + }, + "node_modules/@kurkle/color": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.2.tgz", + "integrity": "sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw==" + }, + "node_modules/@nicolo-ribaudo/chokidar-2": { + "version": "2.1.8-no-fsevents.3", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz", + "integrity": "sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==", + "optional": true + }, + "node_modules/@nicolo-ribaudo/semver-v6": { + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/semver-v6/-/semver-v6-6.3.3.tgz", + "integrity": "sha512-3Yc1fUTs69MG/uZbJlLSI3JISMn2UV2rg+1D/vROUqZyh3l6iYHCs7GMp+M40ZD7yOdDbYjJcU1oTJhrc+dGKg==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@rc-component/color-picker": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@rc-component/color-picker/-/color-picker-1.2.0.tgz", + "integrity": "sha512-IitJ6RWGHs7btI1AqzGPrehr5bueWLGDUyMKwDwvFunfSDo/o8g/95kUG55vC5EYLM0ZJ3SDfw45OrW5KAx3oA==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@ctrl/tinycolor": "^3.6.0", + "classnames": "^2.2.6", + "rc-util": "^5.30.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/context": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@rc-component/context/-/context-1.3.0.tgz", + "integrity": "sha512-6QdaCJ7Wn5UZLJs15IEfqy4Ru3OaL5ctqpQYWd5rlfV9wwzrzdt6+kgAQZV/qdB0MUPN4nhyBfRembQCIvBf+w==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "rc-util": "^5.27.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/mini-decimal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rc-component/mini-decimal/-/mini-decimal-1.1.0.tgz", + "integrity": "sha512-jS4E7T9Li2GuYwI6PyiVXmxTiM6b07rlD9Ge8uGZSCz3WlzcG5ZK7g5bbuKNeZ9pgUuPK/5guV781ujdVpm4HQ==", + "dependencies": { + "@babel/runtime": "^7.18.0" + }, + "engines": { + "node": ">=8.x" + } + }, + "node_modules/@rc-component/mutate-observer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@rc-component/mutate-observer/-/mutate-observer-1.0.0.tgz", + "integrity": "sha512-okqRJSfNisXdI6CUeOLZC5ukBW/8kir2Ii4PJiKpUt+3+uS7dxwJUMxsUZquxA1rQuL8YcEmKVp/TCnR+yUdZA==", + "dependencies": { + "@babel/runtime": "^7.18.0", + "classnames": "^2.3.2", + "rc-util": "^5.24.4" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/portal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@rc-component/portal/-/portal-1.1.1.tgz", + "integrity": "sha512-m8w3dFXX0H6UkJ4wtfrSwhe2/6M08uz24HHrF8pWfAXPwA9hwCuTE5per/C86KwNLouRpwFGcr7LfpHaa1F38g==", + "dependencies": { + "@babel/runtime": "^7.18.0", + "classnames": "^2.3.2", + "rc-util": "^5.24.4" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/tour": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@rc-component/tour/-/tour-1.8.0.tgz", + "integrity": "sha512-rrRGioHTLQlGca27G2+lw7QpRb3uuMYCUIJjj31/B44VCJS0P2tqYhOgtzvWQmaLMlWH3ZlpzotkKX13NT4XEA==", + "dependencies": { + "@babel/runtime": "^7.18.0", + "@rc-component/portal": "^1.0.0-9", + "@rc-component/trigger": "^1.3.6", + "classnames": "^2.3.2", + "rc-util": "^5.24.4" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/trigger": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@rc-component/trigger/-/trigger-1.14.1.tgz", + "integrity": "sha512-P6guwJV0etdP4pPEl3MY6SlqNuAhHfV1b793b/oXE8LTQJDR+kaxYZ0E8tFgZtnDr+FZ4zL/Txg5ri2cT2V3lg==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@rc-component/portal": "^1.1.0", + "classnames": "^2.3.2", + "rc-align": "^4.0.0", + "rc-motion": "^2.0.0", + "rc-resize-observer": "^1.3.1", + "rc-util": "^5.33.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@remix-run/router": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.7.1.tgz", + "integrity": "sha512-bgVQM4ZJ2u2CM8k1ey70o1ePFXsEzYVZoWghh6WjM8p59jQ7HxzbHW4SbnWFG7V9ig9chLawQxDTZ3xzOF8MkQ==", + "engines": { + "node": ">=14" + } + }, + "node_modules/@types/hoist-non-react-statics": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", + "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==", + "dev": true, + "dependencies": { + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.3.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.3.3.tgz", + "integrity": "sha512-wheIYdr4NYML61AjC8MKj/2jrR/kDQri/CIpVoZwldwhnIrD/j9jIU5bJ8yBKuB2VhpFV7Ab6G2XkBjv9r9Zzw==", + "dev": true + }, + "node_modules/@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", + "dev": true + }, + "node_modules/@types/react": { + "version": "18.2.14", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.14.tgz", + "integrity": "sha512-A0zjq+QN/O0Kpe30hA1GidzyFjatVvrpIvWLxD+xv67Vt91TWWgco9IvrJBkeyHm1trGaFS/FSGqPlhyeZRm0g==", + "dev": true, + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.2.6", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.6.tgz", + "integrity": "sha512-2et4PDvg6PVCyS7fuTc4gPoksV58bW0RwSxWKcPRcHZf0PRUGq03TKcD/rUHe3azfV6/5/biUBJw+HhCQjaP0A==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/scheduler": { + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", + "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==", + "dev": true + }, + "node_modules/@types/semver": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", + "dev": true + }, + "node_modules/@types/styled-components": { + "version": "5.1.26", + "resolved": "https://registry.npmjs.org/@types/styled-components/-/styled-components-5.1.26.tgz", + "integrity": "sha512-KuKJ9Z6xb93uJiIyxo/+ksS7yLjS1KzG6iv5i78dhVg/X3u5t1H7juRWqVmodIdz6wGVaIApo1u01kmFRdJHVw==", + "dev": true, + "dependencies": { + "@types/hoist-non-react-statics": "*", + "@types/react": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@types/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-n4sx2bqL0mW1tvDf/loQ+aMX7GQD3lc3fkCMC55VFNDu/vBOabO+LTIeXKM14xK0ppk5TUGcWRjiSpIlUpghKw==" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.61.0.tgz", + "integrity": "sha512-A5l/eUAug103qtkwccSCxn8ZRwT+7RXWkFECdA4Cvl1dOlDUgTpAOfSEElZn2uSUxhdDpnCdetrf0jvU4qrL+g==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.61.0", + "@typescript-eslint/type-utils": "5.61.0", + "@typescript-eslint/utils": "5.61.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "5.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.61.0.tgz", + "integrity": "sha512-yGr4Sgyh8uO6fSi9hw3jAFXNBHbCtKKFMdX2IkT3ZqpKmtAq3lHS4ixB/COFuAIJpwl9/AqF7j72ZDWYKmIfvg==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.61.0", + "@typescript-eslint/types": "5.61.0", + "@typescript-eslint/typescript-estree": "5.61.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.61.0.tgz", + "integrity": "sha512-W8VoMjoSg7f7nqAROEmTt6LoBpn81AegP7uKhhW5KzYlehs8VV0ZW0fIDVbcZRcaP3aPSW+JZFua+ysQN+m/Nw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.61.0", + "@typescript-eslint/visitor-keys": "5.61.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "5.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.61.0.tgz", + "integrity": "sha512-kk8u//r+oVK2Aj3ph/26XdH0pbAkC2RiSjUYhKD+PExemG4XSjpGFeyZ/QM8lBOa7O8aGOU+/yEbMJgQv/DnCg==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "5.61.0", + "@typescript-eslint/utils": "5.61.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "5.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.61.0.tgz", + "integrity": "sha512-ldyueo58KjngXpzloHUog/h9REmHl59G1b3a5Sng1GfBo14BkS3ZbMEb3693gnP1k//97lh7bKsp6/V/0v1veQ==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.61.0.tgz", + "integrity": "sha512-Fud90PxONnnLZ36oR5ClJBLTLfU4pIWBmnvGwTbEa2cXIqj70AEDEmOmpkFComjBZ/037ueKrOdHuYmSFVD7Rw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.61.0", + "@typescript-eslint/visitor-keys": "5.61.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "5.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.61.0.tgz", + "integrity": "sha512-mV6O+6VgQmVE6+xzlA91xifndPW9ElFW8vbSF0xCT/czPXVhwDewKila1jOyRwa9AE19zKnrr7Cg5S3pJVrTWQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.61.0", + "@typescript-eslint/types": "5.61.0", + "@typescript-eslint/typescript-estree": "5.61.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.61.0.tgz", + "integrity": "sha512-50XQ5VdbWrX06mQXhy93WywSFZZGsv3EOjq+lqp6WC2t+j3mb6A9xYVdrRxafvK88vg9k9u+CT4l6D8PEatjKg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.61.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.0.1.tgz", + "integrity": "sha512-g25lL98essfeSj43HJ0o4DMp0325XK0ITkxpgChzJU/CyemgyChtlxfnRbjfwxDGCTRxTiXtQAsdebQXKMRSOA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.22.5", + "@babel/plugin-transform-react-jsx-self": "^7.22.5", + "@babel/plugin-transform-react-jsx-source": "^7.22.5", + "react-refresh": "^0.14.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0" + } + }, + "node_modules/acorn": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.9.0.tgz", + "integrity": "sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==", + "dev": true, + "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, + "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, + "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-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/antd": { + "version": "5.6.4", + "resolved": "https://registry.npmjs.org/antd/-/antd-5.6.4.tgz", + "integrity": "sha512-ttAN5vk6yUybDCe5WFloEb49dyLwyec+FJlvopfZFSkScHX2OBbfpPlCQ50Bpp2u5P/eqN6EQUM4PsE4MPslAA==", + "dependencies": { + "@ant-design/colors": "^7.0.0", + "@ant-design/cssinjs": "^1.10.1", + "@ant-design/icons": "^5.1.0", + "@ant-design/react-slick": "~1.0.0", + "@babel/runtime": "^7.18.3", + "@ctrl/tinycolor": "^3.6.0", + "@rc-component/color-picker": "~1.2.0", + "@rc-component/mutate-observer": "^1.0.0", + "@rc-component/tour": "~1.8.0", + "@rc-component/trigger": "^1.13.0", + "classnames": "^2.2.6", + "copy-to-clipboard": "^3.2.0", + "dayjs": "^1.11.1", + "qrcode.react": "^3.1.0", + "rc-cascader": "~3.12.0", + "rc-checkbox": "~3.1.0", + "rc-collapse": "~3.7.0", + "rc-dialog": "~9.1.0", + "rc-drawer": "~6.2.0", + "rc-dropdown": "~4.1.0", + "rc-field-form": "~1.34.0", + "rc-image": "~5.17.1", + "rc-input": "~1.0.4", + "rc-input-number": "~7.4.0", + "rc-mentions": "~2.3.0", + "rc-menu": "~9.9.2", + "rc-motion": "^2.7.3", + "rc-notification": "~5.0.4", + "rc-pagination": "~3.5.0", + "rc-picker": "~3.8.2", + "rc-progress": "~3.4.1", + "rc-rate": "~2.12.0", + "rc-resize-observer": "^1.2.0", + "rc-segmented": "~2.2.0", + "rc-select": "~14.5.0", + "rc-slider": "~10.1.0", + "rc-steps": "~6.0.0", + "rc-switch": "~4.1.0", + "rc-table": "~7.32.1", + "rc-tabs": "~12.7.0", + "rc-textarea": "~1.2.2", + "rc-tooltip": "~6.0.0", + "rc-tree": "~5.7.4", + "rc-tree-select": "~5.9.0", + "rc-upload": "~4.3.0", + "rc-util": "^5.32.0", + "scroll-into-view-if-needed": "^3.0.3", + "throttle-debounce": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ant-design" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "optional": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "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 + }, + "node_modules/array-tree-filter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-tree-filter/-/array-tree-filter-2.1.0.tgz", + "integrity": "sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==" + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/async-validator": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz", + "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==" + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.3.tgz", + "integrity": "sha512-bM3gHc337Dta490gg+/AseNB9L4YLHxq1nGKZZSHbhXv4aTYU2MD2cjza1Ru4S6975YLTaL1K8uJf6ukJhhmtw==", + "dependencies": { + "@babel/compat-data": "^7.17.7", + "@babel/helper-define-polyfill-provider": "^0.4.0", + "semver": "^6.1.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.1.tgz", + "integrity": "sha512-ikFrZITKg1xH6pLND8zT14UPgjKHiGLqex7rGEZCH2EvhsneJaJPemmpQaIZV5AL03II+lXylw3UmddDK8RU5Q==", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.4.0", + "core-js-compat": "^3.30.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.0.tgz", + "integrity": "sha512-hDJtKjMLVa7Z+LwnTCxoDLQj6wdc+B8dun7ayF2fYieI6OzfuvcLMB32ihJZ4UhCBwNYGl5bg/x/P9cMdnkc2g==", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.4.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-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==" + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "devOptional": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.21.9", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", + "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", + "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" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001503", + "electron-to-chromium": "^1.4.431", + "node-releases": "^2.0.12", + "update-browserslist-db": "^1.0.11" + }, + "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, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelize": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", + "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001512", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001512.tgz", + "integrity": "sha512-2S9nK0G/mE+jasCUsMPlARhRCts1ebcp2Ji8Y8PWi4NDE1iRdLCnEPHkEfeBrGC45L4isBx5ur3IQ6yTE2mRZw==", + "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" + } + ] + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chart.js": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.3.0.tgz", + "integrity": "sha512-ynG0E79xGfMaV2xAHdbhwiPLczxnNNnasrmPEXriXsPJGjmhOBYzFVEsB65w2qMDz+CaBJJuJD0inE/ab/h36g==", + "dependencies": { + "@kurkle/color": "^0.3.0" + }, + "engines": { + "pnpm": ">=7" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "optional": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/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==", + "optional": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/classnames": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", + "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==" + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/compute-scroll-into-view": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-3.0.3.tgz", + "integrity": "sha512-nadqwNxghAGTamwIqQSG433W6OADZx2vCo3UXHNrzTRHK/htu+7+L0zhjEoaeaQVNAi3YgqWDv8+tzf0hRfR+A==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + }, + "node_modules/copy-to-clipboard": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz", + "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==", + "dependencies": { + "toggle-selection": "^1.0.6" + } + }, + "node_modules/core-js-compat": { + "version": "3.31.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.31.0.tgz", + "integrity": "sha512-hM7YCu1cU6Opx7MXNu0NuumM0ezNeAeRKadixyiQELWY3vT3De9S4J5ZBMraWV2vZnrE1Cirl0GtFtDtMUXzPw==", + "dependencies": { + "browserslist": "^4.21.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-color-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", + "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==", + "engines": { + "node": ">=4" + } + }, + "node_modules/css-to-react-native": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz", + "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==", + "dependencies": { + "camelize": "^1.0.0", + "css-color-keywords": "^1.0.0", + "postcss-value-parser": "^4.0.2" + } + }, + "node_modules/csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" + }, + "node_modules/date-fns": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", + "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", + "optional": true, + "peer": true, + "dependencies": { + "@babel/runtime": "^7.21.0" + }, + "engines": { + "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" + } + }, + "node_modules/dayjs": { + "version": "1.11.9", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.9.tgz", + "integrity": "sha512-QvzAURSbQ0pKdIye2txOzNaHmxtUBXerpY0FJsFXUMKbIZeFm5ht1LS/jFsrncjnmtv8HsG0W2g6c0zUjZWmpA==" + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "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 + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-align": { + "version": "1.12.4", + "resolved": "https://registry.npmjs.org/dom-align/-/dom-align-1.12.4.tgz", + "integrity": "sha512-R8LUSEay/68zE5c8/3BDxiTEvgb4xZTF0RKmAHfiEVN3klfIpXfi2/QCoiWPccVQ0J/ZGdz9OjzL4uJEP/MRAw==" + }, + "node_modules/dotenv": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/motdotla/dotenv?sponsor=1" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.450", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.450.tgz", + "integrity": "sha512-BLG5HxSELlrMx7dJ2s+8SFlsCtJp37Zpk2VAxyC6CZtbc+9AJeZHfYHbrlSgdXp6saQ8StMqOTEDaBKgA7u1sw==" + }, + "node_modules/esbuild": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", + "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.17.19", + "@esbuild/android-arm64": "0.17.19", + "@esbuild/android-x64": "0.17.19", + "@esbuild/darwin-arm64": "0.17.19", + "@esbuild/darwin-x64": "0.17.19", + "@esbuild/freebsd-arm64": "0.17.19", + "@esbuild/freebsd-x64": "0.17.19", + "@esbuild/linux-arm": "0.17.19", + "@esbuild/linux-arm64": "0.17.19", + "@esbuild/linux-ia32": "0.17.19", + "@esbuild/linux-loong64": "0.17.19", + "@esbuild/linux-mips64el": "0.17.19", + "@esbuild/linux-ppc64": "0.17.19", + "@esbuild/linux-riscv64": "0.17.19", + "@esbuild/linux-s390x": "0.17.19", + "@esbuild/linux-x64": "0.17.19", + "@esbuild/netbsd-x64": "0.17.19", + "@esbuild/openbsd-x64": "0.17.19", + "@esbuild/sunos-x64": "0.17.19", + "@esbuild/win32-arm64": "0.17.19", + "@esbuild/win32-ia32": "0.17.19", + "@esbuild/win32-x64": "0.17.19" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint": { + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.44.0.tgz", + "integrity": "sha512-0wpHoUbDUHgNCyvFB5aXLiQVfK9B0at6gUvzy83k4kAsQ/u769TQDX6iKC+aO4upIHO9WSaA3QoXYQDHbNwf1A==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.1.0", + "@eslint/js": "8.44.0", + "@humanwhocodes/config-array": "^0.11.10", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.0", + "eslint-visitor-keys": "^3.4.1", + "espree": "^9.6.0", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", + "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "dev": true, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.3.5.tgz", + "integrity": "sha512-61qNIsc7fo9Pp/mju0J83kzvLm0Bsayu7OQSLEoJxLDCBjIIyb87bkzufoOvdDxLkSlMfkF7UxomC4+eztUBSA==", + "dev": true, + "peerDependencies": { + "eslint": ">=7" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/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, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/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, + "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/eslint/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, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eslint/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 + }, + "node_modules/eslint/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, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", + "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/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, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/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, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/espree": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.0.tgz", + "integrity": "sha512-1FH/IiruXZ84tpUlm0aCUEwMl2Ho5ilqVh0VvQXw+byAz/4SAciyHLlfmL5WYqsvD38oymdUwBss0LtK8m4s/A==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/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, + "engines": { + "node": ">=4.0" + } + }, + "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, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/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, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "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 + }, + "node_modules/fast-glob": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz", + "integrity": "sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "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 + }, + "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 + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "devOptional": true, + "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, + "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": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, + "node_modules/fs-readdir-recursive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", + "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "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==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "dev": true, + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "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, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "optional": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "devOptional": true, + "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==", + "devOptional": true, + "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==", + "devOptional": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "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==" + }, + "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, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "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 + }, + "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 + }, + "node_modules/json2mq": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz", + "integrity": "sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==", + "dependencies": { + "string-convert": "^0.2.0" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "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, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "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 + }, + "node_modules/natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.12.tgz", + "integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "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, + "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, + "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, + "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, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "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, + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "devOptional": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "engines": { + "node": ">=6" + } + }, + "node_modules/postcss": { + "version": "8.4.24", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.24.tgz", + "integrity": "sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "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==" + }, + "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, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/qrcode.react": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/qrcode.react/-/qrcode.react-3.1.0.tgz", + "integrity": "sha512-oyF+Urr3oAMUG/OiOuONL3HXM+53wvuH3mtIWQrYmsXoAq0DkvZp2RYUWFSMFtbdOpuS++9v+WAkzNVkMlNW6Q==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "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" + } + ] + }, + "node_modules/rc-align": { + "version": "4.0.15", + "resolved": "https://registry.npmjs.org/rc-align/-/rc-align-4.0.15.tgz", + "integrity": "sha512-wqJtVH60pka/nOX7/IspElA8gjPNQKIx/ZqJ6heATCkXpe1Zg4cPVrMD2vC96wjsFFL8WsmhPbx9tdMo1qqlIA==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "dom-align": "^1.7.0", + "rc-util": "^5.26.0", + "resize-observer-polyfill": "^1.5.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-cascader": { + "version": "3.12.1", + "resolved": "https://registry.npmjs.org/rc-cascader/-/rc-cascader-3.12.1.tgz", + "integrity": "sha512-g6In2y6eudHXS/Fs9dKFhp9acvHRUPqem/7xReR9ng8M1pNAE137uGBOt9WNpgsKT/cDGudXZQVehaBwAKg6hQ==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "array-tree-filter": "^2.1.0", + "classnames": "^2.3.1", + "rc-select": "~14.5.0", + "rc-tree": "~5.7.0", + "rc-util": "^5.6.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-checkbox": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/rc-checkbox/-/rc-checkbox-3.1.0.tgz", + "integrity": "sha512-PAwpJFnBa3Ei+5pyqMMXdcKYKNBMS+TvSDiLdDnARnMJHC8ESxwPfm4Ao1gJiKtWLdmGfigascnCpwrHFgoOBQ==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.3.2", + "rc-util": "^5.25.2" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-collapse": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/rc-collapse/-/rc-collapse-3.7.0.tgz", + "integrity": "sha512-Cir1c89cENiK5wryd9ut+XltrIfx/+KH1/63uJIVjuXkgfrIvIy6W1fYGgEYtttbHW2fEfxg1s31W+Vm98fSRw==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.3.4", + "rc-util": "^5.27.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-dialog": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/rc-dialog/-/rc-dialog-9.1.0.tgz", + "integrity": "sha512-5ry+JABAWEbaKyYsmITtrJbZbJys8CtMyzV8Xn4LYuXMeUx5XVHNyJRoqLFE4AzBuXXzOWeaC49cg+XkxK6kHA==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/portal": "^1.0.0-8", + "classnames": "^2.2.6", + "rc-motion": "^2.3.0", + "rc-util": "^5.21.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-drawer": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/rc-drawer/-/rc-drawer-6.2.0.tgz", + "integrity": "sha512-spPkZ3WvP0U0vy5dyzSwlUJ/+vLFtjP/cTwSwejhQRoDBaexSZHsBhELoCZcEggI7LQ7typmtG30lAue2HEhvA==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/portal": "^1.1.1", + "classnames": "^2.2.6", + "rc-motion": "^2.6.1", + "rc-util": "^5.21.2" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-dropdown": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/rc-dropdown/-/rc-dropdown-4.1.0.tgz", + "integrity": "sha512-VZjMunpBdlVzYpEdJSaV7WM7O0jf8uyDjirxXLZRNZ+tAC+NzD3PXPEtliFwGzVwBBdCmGuSqiS9DWcOLxQ9tw==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@rc-component/trigger": "^1.7.0", + "classnames": "^2.2.6", + "rc-util": "^5.17.0" + }, + "peerDependencies": { + "react": ">=16.11.0", + "react-dom": ">=16.11.0" + } + }, + "node_modules/rc-field-form": { + "version": "1.34.1", + "resolved": "https://registry.npmjs.org/rc-field-form/-/rc-field-form-1.34.1.tgz", + "integrity": "sha512-oohdrjUHYWzY4H5EOw/9xk324oatZOKiCfo3FwnK9G/LswoqflWoxeaAGMkjI5Ug4YxSq80fehoJjVYApSheYA==", + "dependencies": { + "@babel/runtime": "^7.18.0", + "async-validator": "^4.1.0", + "rc-util": "^5.32.2" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-image": { + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/rc-image/-/rc-image-5.17.1.tgz", + "integrity": "sha512-oR4eviLyQxd/5A7pn843w2/Z1wuBA27L2lS4agq0sjl2z97ssNIVEzRzgwgB0ZxVZG/qSu9Glit2Zgzb/n+blQ==", + "dependencies": { + "@babel/runtime": "^7.11.2", + "@rc-component/portal": "^1.0.2", + "classnames": "^2.2.6", + "rc-dialog": "~9.1.0", + "rc-motion": "^2.6.2", + "rc-util": "^5.0.6" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-input": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/rc-input/-/rc-input-1.0.4.tgz", + "integrity": "sha512-clY4oneVHRtKHYf/HCxT/MO+4BGzCIywSNLosXWOm7fcQAS0jQW7n0an8Raa8JMB8kpxc8m28p7SNwFZmlMj6g==", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-util": "^5.18.1" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/rc-input-number": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/rc-input-number/-/rc-input-number-7.4.2.tgz", + "integrity": "sha512-yGturTw7WGP+M1GbJ+UTAO7L4buxeW6oilhL9Sq3DezsRS8/9qec4UiXUbeoiX9bzvRXH11JvgskBtxSp4YSNg==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/mini-decimal": "^1.0.1", + "classnames": "^2.2.5", + "rc-util": "^5.28.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-mentions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/rc-mentions/-/rc-mentions-2.3.0.tgz", + "integrity": "sha512-gNpsSKsBHSXvyAA1ZowVTqXSWUIw7+OI9wmjL87KcYURvtm9nDo8R0KtOc2f1PT7q9McUpFzhm6AvQdIly0aRA==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/trigger": "^1.5.0", + "classnames": "^2.2.6", + "rc-input": "~1.0.0", + "rc-menu": "~9.9.0", + "rc-textarea": "~1.2.0", + "rc-util": "^5.22.5" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-menu": { + "version": "9.9.2", + "resolved": "https://registry.npmjs.org/rc-menu/-/rc-menu-9.9.2.tgz", + "integrity": "sha512-kVJwaQn5VUu6DIddxd/jz3QupTPg0tNYq+mpFP8wYsRF5JgzPA9fPVw+CfwlTPwA1w7gzEY42S8pj6M3uev5CQ==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/trigger": "^1.6.2", + "classnames": "2.x", + "rc-motion": "^2.4.3", + "rc-overflow": "^1.2.8", + "rc-util": "^5.27.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-motion": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/rc-motion/-/rc-motion-2.7.3.tgz", + "integrity": "sha512-2xUvo8yGHdOHeQbdI8BtBsCIrWKchEmFEIskf0nmHtJsou+meLd/JE+vnvSX2JxcBrJtXY2LuBpxAOxrbY/wMQ==", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-util": "^5.21.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-notification": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/rc-notification/-/rc-notification-5.0.4.tgz", + "integrity": "sha512-3535oellIRlt1LspERfK8yvCqb8Gio3R02rULciaSc1xe3H7ArTU/khlUTv1ddGzua4HhmF4D4Rwz/+mBxETvg==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.6.0", + "rc-util": "^5.20.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-overflow": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/rc-overflow/-/rc-overflow-1.3.1.tgz", + "integrity": "sha512-RY0nVBlfP9CkxrpgaLlGzkSoh9JhjJLu6Icqs9E7CW6Ewh9s0peF9OHIex4OhfoPsR92LR0fN6BlCY9Z4VoUtA==", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.19.2" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-pagination": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/rc-pagination/-/rc-pagination-3.5.0.tgz", + "integrity": "sha512-lUBVtVVUn7gGsq4mTyVpcZQr+AMcljbMiL/HcCmSdFrcsK0iZVKwwbXDxhz2IV0JXUs9Hzepr5sQFaF+9ad/pQ==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.1", + "rc-util": "^5.32.2" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-picker": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/rc-picker/-/rc-picker-3.8.2.tgz", + "integrity": "sha512-q6jnMwBoOi6tFA4xohrKIhzq80Fc3dH0Kiw5VRx6Tf1db7y27PBFCLwu6f66niXidZKD8F4R0M9VIui/jkL4cg==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/trigger": "^1.5.0", + "classnames": "^2.2.1", + "rc-util": "^5.30.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "date-fns": ">= 2.x", + "dayjs": ">= 1.x", + "luxon": ">= 3.x", + "moment": ">= 2.x", + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + }, + "peerDependenciesMeta": { + "date-fns": { + "optional": true + }, + "dayjs": { + "optional": true + }, + "luxon": { + "optional": true + }, + "moment": { + "optional": true + } + } + }, + "node_modules/rc-progress": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/rc-progress/-/rc-progress-3.4.2.tgz", + "integrity": "sha512-iAGhwWU+tsayP+Jkl9T4+6rHeQTG9kDz8JAHZk4XtQOcYN5fj9H34NXNEdRdZx94VUDHMqCb1yOIvi8eJRh67w==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.6", + "rc-util": "^5.16.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-rate": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/rc-rate/-/rc-rate-2.12.0.tgz", + "integrity": "sha512-g092v5iZCdVzbjdn28FzvWebK2IutoVoiTeqoLTj9WM7SjA/gOJIw5/JFZMRyJYYVe1jLAU2UhAfstIpCNRozg==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.5", + "rc-util": "^5.0.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-resize-observer": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/rc-resize-observer/-/rc-resize-observer-1.3.1.tgz", + "integrity": "sha512-iFUdt3NNhflbY3mwySv5CA1TC06zdJ+pfo0oc27xpf4PIOvfZwZGtD9Kz41wGYqC4SLio93RVAirSSpYlV/uYg==", + "dependencies": { + "@babel/runtime": "^7.20.7", + "classnames": "^2.2.1", + "rc-util": "^5.27.0", + "resize-observer-polyfill": "^1.5.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-segmented": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/rc-segmented/-/rc-segmented-2.2.2.tgz", + "integrity": "sha512-Mq52M96QdHMsNdE/042ibT5vkcGcD5jxKp7HgPC2SRofpia99P5fkfHy1pEaajLMF/kj0+2Lkq1UZRvqzo9mSA==", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-motion": "^2.4.4", + "rc-util": "^5.17.0" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/rc-select": { + "version": "14.5.2", + "resolved": "https://registry.npmjs.org/rc-select/-/rc-select-14.5.2.tgz", + "integrity": "sha512-Np/lDHvxCnVhVsheQjSV1I/OMJTWJf1n10wq8q1AGy3ytyYLfjNpi6uaz/pmjsbbiSddSWzJnNZCli9LmgBZsA==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/trigger": "^1.5.0", + "classnames": "2.x", + "rc-motion": "^2.0.1", + "rc-overflow": "^1.0.0", + "rc-util": "^5.16.1", + "rc-virtual-list": "^3.5.2" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/rc-slider": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-10.1.1.tgz", + "integrity": "sha512-gn8oXazZISEhnmRinI89Z/JD/joAaM35jp+gDtIVSTD/JJMCCBqThqLk1SVJmvtfeiEF/kKaFY0+qt4SDHFUDw==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.5", + "rc-util": "^5.27.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-steps": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/rc-steps/-/rc-steps-6.0.0.tgz", + "integrity": "sha512-+KfMZIty40mYCQSDvYbZ1jwnuObLauTiIskT1hL4FFOBHP6ZOr8LK0m143yD3kEN5XKHSEX1DIwCj3AYZpoeNQ==", + "dependencies": { + "@babel/runtime": "^7.16.7", + "classnames": "^2.2.3", + "rc-util": "^5.16.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-switch": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/rc-switch/-/rc-switch-4.1.0.tgz", + "integrity": "sha512-TI8ufP2Az9oEbvyCeVE4+90PDSljGyuwix3fV58p7HV2o4wBnVToEyomJRVyTaZeqNPAp+vqeo4Wnj5u0ZZQBg==", + "dependencies": { + "@babel/runtime": "^7.21.0", + "classnames": "^2.2.1", + "rc-util": "^5.30.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-table": { + "version": "7.32.1", + "resolved": "https://registry.npmjs.org/rc-table/-/rc-table-7.32.1.tgz", + "integrity": "sha512-fHMQteKMocUC9I9Vex3eBLH7QsiaMR/qtzh3B1Ty2PoNGwVTwVdDFyRL05zch+JU3KnNNczgQeVvtf/p//gdrQ==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/context": "^1.3.0", + "classnames": "^2.2.5", + "rc-resize-observer": "^1.1.0", + "rc-util": "^5.27.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-tabs": { + "version": "12.7.1", + "resolved": "https://registry.npmjs.org/rc-tabs/-/rc-tabs-12.7.1.tgz", + "integrity": "sha512-NrltXEYIyiDP5JFu85NQwc9eR+7e50r/6MNXYDyG1EMIFNc7BgDppzdpnD3nW4NHYWw5wLIThCURGib48OCTBg==", + "dependencies": { + "@babel/runtime": "^7.11.2", + "classnames": "2.x", + "rc-dropdown": "~4.1.0", + "rc-menu": "~9.9.0", + "rc-motion": "^2.6.2", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.16.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-textarea": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/rc-textarea/-/rc-textarea-1.2.3.tgz", + "integrity": "sha512-YvN8IskIVBRRzcS4deT0VAMim31+T3IoVX4yoCJ+b/iVCvw7yf0usR7x8OaHiUOUoURKcn/3lfGjmtzplcy99g==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.1", + "rc-input": "~1.0.4", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.27.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-tooltip": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-6.0.1.tgz", + "integrity": "sha512-MdvPlsD1fDSxKp9+HjXrc/CxLmA/s11QYIh1R7aExxfodKP7CZA++DG1AjrW80F8IUdHYcR43HAm0Y2BYPelHA==", + "dependencies": { + "@babel/runtime": "^7.11.2", + "@rc-component/trigger": "^1.0.4", + "classnames": "^2.3.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-tree": { + "version": "5.7.8", + "resolved": "https://registry.npmjs.org/rc-tree/-/rc-tree-5.7.8.tgz", + "integrity": "sha512-Ei+wID0SWA8BNCdEMO6UMblHs/jnSRDqz7csWXZ0o5VB08iDhxVnF+VHYTGDsJ9pARJ2xEXfjyTksOkEx5R4RQ==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.0.1", + "rc-util": "^5.16.1", + "rc-virtual-list": "^3.5.1" + }, + "engines": { + "node": ">=10.x" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/rc-tree-select": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/rc-tree-select/-/rc-tree-select-5.9.0.tgz", + "integrity": "sha512-oh3blESzLfLCBPSiVDtZ2irzrWWZUMeHvnSwRvFo79br8Z+K/1OhXhXBZmROvfKwaH8YUugAQy8B2j5EGQbdyA==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-select": "~14.5.0", + "rc-tree": "~5.7.0", + "rc-util": "^5.16.1" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/rc-upload": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/rc-upload/-/rc-upload-4.3.4.tgz", + "integrity": "sha512-uVbtHFGNjHG/RyAfm9fluXB6pvArAGyAx8z7XzXXyorEgVIWj6mOlriuDm0XowDHYz4ycNK0nE0oP3cbFnzxiQ==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "classnames": "^2.2.5", + "rc-util": "^5.2.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-util": { + "version": "5.34.1", + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.34.1.tgz", + "integrity": "sha512-SqiUT8Ssgh5C+hu4y887xwCrMNcxLm6ScOo8AFlWYYF3z9uNNiPpwwSjvicqOlWd79rNw1g44rnP7tz9MrO1ZQ==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "react-is": "^16.12.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-virtual-list": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/rc-virtual-list/-/rc-virtual-list-3.5.2.tgz", + "integrity": "sha512-sE2G9hTPjVmatQni8OP2Kx33+Oth6DMKm67OblBBmgMBJDJQOOFpSGH7KZ6Pm85rrI2IGxDRXZCr0QhYOH2pfQ==", + "dependencies": { + "@babel/runtime": "^7.20.0", + "classnames": "^2.2.6", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.15.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/react-icons": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.10.1.tgz", + "integrity": "sha512-/ngzDP/77tlCfqthiiGNZeYFACw85fUjZtLbedmJ5DTlNDIwETxhwBzdOJ21zj4iJdvc0J3y7yOsX3PpxAJzrw==", + "peerDependencies": { + "react": "*" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "node_modules/react-refresh": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", + "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-router": { + "version": "6.14.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.14.1.tgz", + "integrity": "sha512-U4PfgvG55LdvbQjg5Y9QRWyVxIdO1LlpYT7x+tMAxd9/vmiPuJhIwdxZuIQLN/9e3O4KFDHYfR9gzGeYMasW8g==", + "dependencies": { + "@remix-run/router": "1.7.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.14.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.14.1.tgz", + "integrity": "sha512-ssF6M5UkQjHK70fgukCJyjlda0Dgono2QGwqGvuk7D+EDGHdacEN3Yke2LTMjkrpHuFwBfDFsEjGVXBDmL+bWw==", + "dependencies": { + "@remix-run/router": "1.7.1", + "react-router": "6.14.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "optional": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", + "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + }, + "node_modules/regenerator-transform": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", + "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==", + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regexpu-core": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "dependencies": { + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" + }, + "node_modules/resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "dependencies": { + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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, + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "3.26.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.26.0.tgz", + "integrity": "sha512-YzJH0eunH2hr3knvF3i6IkLO/jTjAEwU4HoMUbQl4//Tnl3ou0e7P5SjxdDr8HQJdeUJShlbEHXrrnEHy1l7Yg==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "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" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/scroll-into-view-if-needed": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.0.10.tgz", + "integrity": "sha512-t44QCeDKAPf1mtQH3fYpWz8IM/DyvHLjs8wUvvwMYxk5moOqCzrMSxK6HQVD0QVmVjXFavoFIPRVrMuJPKAvtg==", + "dependencies": { + "compute-scroll-into-view": "^3.0.2" + } + }, + "node_modules/semver": { + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" + }, + "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, + "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, + "engines": { + "node": ">=8" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string-convert": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz", + "integrity": "sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==" + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/styled-components": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-6.0.2.tgz", + "integrity": "sha512-CRWTuYme0W4zVqzXpODByyocgVbBpRoXmaEgPGb67dvweV1igp7Ik4Z5C9e83wZ2l2hPg/XKV7cjuNxhRlC7Mg==", + "dependencies": { + "@babel/cli": "^7.21.0", + "@babel/core": "^7.21.0", + "@babel/helper-module-imports": "^7.18.6", + "@babel/plugin-external-helpers": "^7.18.6", + "@babel/plugin-proposal-class-properties": "^7.18.6", + "@babel/plugin-proposal-object-rest-spread": "^7.20.7", + "@babel/preset-env": "^7.20.2", + "@babel/preset-react": "^7.18.6", + "@babel/preset-typescript": "^7.21.0", + "@babel/traverse": "^7.21.2", + "@emotion/is-prop-valid": "^1.2.1", + "@emotion/unitless": "^0.8.0", + "@types/stylis": "^4.0.2", + "css-to-react-native": "^3.2.0", + "csstype": "^3.1.2", + "postcss": "^8.4.23", + "shallowequal": "^1.1.0", + "stylis": "^4.3.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/styled-components" + }, + "peerDependencies": { + "babel-plugin-styled-components": ">= 2", + "react": ">= 16.8.0", + "react-dom": ">= 16.8.0" + }, + "peerDependenciesMeta": { + "babel-plugin-styled-components": { + "optional": true + } + } + }, + "node_modules/styled-components/node_modules/tslib": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", + "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==" + }, + "node_modules/stylis": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.0.tgz", + "integrity": "sha512-E87pIogpwUsUwXw7dNyU4QDjdgVMy52m+XEOPEKUn161cCzWjjhPSQhByfd1CcNvrOLnXQ6OnnZDwnJrz/Z4YQ==" + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/throttle-debounce": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-5.0.0.tgz", + "integrity": "sha512-2iQTSgkkc1Zyk0MeVrt/3BvuOXYPl/R8Z0U2xxo9rjwNciaHDG3R+Lm6dh4EeUci49DanvBnuqI6jshoQQRGEg==", + "engines": { + "node": ">=12.22" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "engines": { + "node": ">=4" + } + }, + "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==", + "devOptional": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toggle-selection": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", + "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==" + }, + "node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/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, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "engines": { + "node": ">=4" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "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" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "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, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/vite": { + "version": "4.3.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.3.9.tgz", + "integrity": "sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==", + "dev": true, + "dependencies": { + "esbuild": "^0.17.5", + "postcss": "^8.4.23", + "rollup": "^3.21.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "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, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "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, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 00000000..9b66a862 --- /dev/null +++ b/package.json @@ -0,0 +1,37 @@ +{ + "name": "react-ts", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "lint": "eslint src --ext ts,tsx --report-unused-disable-directives --max-warnings 0", + "preview": "vite preview" + }, + "dependencies": { + "antd": "^5.6.4", + "chart.js": "^4.3.0", + "dayjs": "^1.11.9", + "dotenv": "^16.3.1", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-icons": "^4.10.1", + "react-router-dom": "^6.14.1", + "styled-components": "^6.0.2" + }, + "devDependencies": { + "@types/node": "^20.3.3", + "@types/react": "^18.0.37", + "@types/react-dom": "^18.0.11", + "@types/styled-components": "^5.1.26", + "@typescript-eslint/eslint-plugin": "^5.59.0", + "@typescript-eslint/parser": "^5.59.0", + "@vitejs/plugin-react": "^4.0.0", + "eslint": "^8.38.0", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.3.4", + "typescript": "^5.0.2", + "vite": "^4.3.9" + } +} diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 00000000..96ac126b Binary files /dev/null and b/public/favicon.ico differ diff --git a/src/App.css b/src/App.css new file mode 100644 index 00000000..7c2372e9 --- /dev/null +++ b/src/App.css @@ -0,0 +1,19 @@ +.ant-picker-panels > *:first-child button.ant-picker-header-next-btn { + visibility: visible !important; +} + +.ant-picker-panels > *:first-child button.ant-picker-header-super-next-btn { + visibility: visible !important; +} + +.ant-picker-panels > *:last-child { + display: none !important; +} + +.ant-picker-panel-container, .ant-picker-footer { + width: 280px !important; +} + +.ant-picker-footer-extra > div { + flex-wrap: wrap !important; +} \ No newline at end of file diff --git a/src/App.tsx b/src/App.tsx new file mode 100644 index 00000000..d2a29925 --- /dev/null +++ b/src/App.tsx @@ -0,0 +1,28 @@ +import Graph from '@/components/graph/Graph'; +import Layout from '@/components/common/Layout'; +import NotFound from '@/components/common/NotFound'; +import Detail from '@/components/detail/Detail'; +import { BrowserRouter, Routes, Route } from 'react-router-dom'; +import Home from '@/components/Home/Home'; +import '@/App.css' + +const App = () => { + return ( +
+ + + {/* }> */} + }> + }> + }> + {/* ์ƒ๋‹จ์— ์œ„์น˜ํ•˜๋Š” ๋ผ์šฐํŠธ๋“ค์˜ ๊ทœ์น™์„ ๋ชจ๋‘ ํ™•์ธ, ์ผ์น˜ํ•˜๋Š” ๋ผ์šฐํŠธ๊ฐ€ ์—†๋Š”๊ฒฝ์šฐ ์ฒ˜๋ฆฌ */} + } /> + }> + + + +
+ ); +}; + +export default App; diff --git a/src/components/Home/Calendar.tsx b/src/components/Home/Calendar.tsx new file mode 100644 index 00000000..ff50502f --- /dev/null +++ b/src/components/Home/Calendar.tsx @@ -0,0 +1,245 @@ +import styled from 'styled-components'; +import { theme } from '@/styles/theme'; +import { useEffect, useState } from 'react'; +import { expenseSummary } from '@/lib/api/Api'; +import Header from '@/components/common/Header'; +import CurrentMonth from '@/components/Home/CurrentMonth'; +import WeeklyExpenses from '@/components/Home/WeeklyExpenses'; +import NotCurrentMonth from '@/components/Home/NotCurrentMonth'; +import { SelectedDailyProps } from '@/components/Home/ExpensesList'; + +export interface DayProps { + $isCurrentMonth?: boolean; + $day?: number; +} +interface GetDaysProps { + year: number; + month: number; +} + +interface CalendarProps { + // eslint-disable-next-line no-unused-vars + onDayClick: (year: number, month: number, currentDay: number) => void; + setTag: React.Dispatch>; + monthlyList: SelectedDailyProps[]; + currentMonth: number; + setCurrentMonth: React.Dispatch>; + currentYear: number; + setCurrentYear: React.Dispatch>; + onItemUpdated: () => void; +} + +interface WeeklyListProps { + _id: string; + totalAmount: number; +} + +const TheCalendar = ({ + setTag, + onDayClick, + monthlyList, + currentMonth, + setCurrentMonth, + currentYear, + setCurrentYear, + onItemUpdated, +}: CalendarProps) => { + const [currentDate, setCurrentDate] = useState(new Date()); + const [weeklyList, setWeeklyList] = useState([]); + const weekDate = ['์ผ', '์›”', 'ํ™”', '์ˆ˜', '๋ชฉ', '๊ธˆ', 'ํ† ']; + + // ๋งˆ์ง€๋ง‰ ๋‚ ์งœ ๋ฐ˜ํ™˜ ํ•จ์ˆ˜ + const getLastDate = ({ year, month }: GetDaysProps) => { + // month index๋Š” 0๋ถ€ํ„ฐ + // ๊ตฌํ•˜๊ณ ์ž ํ•˜๋Š” ์—ฐ์›”์˜ ๋งˆ์ง€๋ง‰ ๋‚ ์งœ ๋ฐ˜ํ™˜ (8์›” 0์ผ => 7์›” 31์ผ) + return new Date(year, month + 1, 0).getDate(); + }; + + // ์ฒซ ์š”์ผ ๋ฐ˜ํ™˜ ํ•จ์ˆ˜ (0: ์›”์š”์ผ ~ 6: ์ผ์š”์ผ) + const getFirstDayIdx = ({ year, month }: GetDaysProps) => { + return new Date(year, month, 1).getDay(); + }; + // ์ด์ „ Month๋กœ ์ด๋™ํ•˜๋Š” ํด๋ฆญ ์ด๋ฒคํŠธ + const handlePrevMonth = () => { + let prevMonth: Date; + // ํ˜„์žฌ 1์›”์—์„œ prevํ•  ๋•Œ + if (currentMonth === 1) { + // ์ž‘๋…„ 12์›” 1์ผ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅ + prevMonth = new Date(currentYear - 1, 11); + // ์—ฐ๋„๋ฅผ ์ž‘๋…„ ์—ฐ๋„๋กœ ๋ฐ”๊ฟˆ + setCurrentYear(currentYear - 1); + // 1์›” -> 12์›”์ด ์•„๋‹Œ, ์ผ๋ฐ˜์ ์œผ๋กœ 1๊ฐœ์›”์”ฉ ์ค„์ผ ๋•Œ + } else { + // prevMonth์— ํ˜„์žฌ๋…„๋„ ์ด์ „ ์›” ์ €์žฅ + prevMonth = new Date(currentYear, currentMonth - 2); + } + // + setCurrentDate(prevMonth); // ์ด์ „ ์›” 1์ผ๋กœ ์ €์žฅ + setCurrentMonth(prevMonth.getMonth() + 1); + }; + + // ๋‹ค์Œ Month๋กœ ์ด๋™ํ•˜๋Š” ํด๋ฆญ ์ด๋ฒคํŠธ + const handleNextMonth = () => { + let nextMonth: Date; + // ํ˜„์žฌ 12์›”์—์„œ nextํ•  ๋•Œ + if (currentMonth === 12) { + // ๋‚ด๋…„ 1์›” 1์ผ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅ + nextMonth = new Date(currentYear + 1, 0); + // ์—ฐ๋„๋ฅผ ๋‚ด๋…„ ์—ฐ๋„๋กœ ๋ฐ”๊ฟˆ + setCurrentYear(currentYear + 1); + // 12์›” -> 1์›”์ด ์•„๋‹Œ, ์ผ๋ฐ˜์ ์œผ๋กœ 1๊ฐœ์›”์”ฉ ์ค„์ผ ๋•Œ + } else { + // nextMonth์— ํ˜„์žฌ๋…„๋„ ๋‚ด๋…„ ์›” ์ €์žฅ + nextMonth = new Date(currentYear, currentMonth); + } + // + setCurrentDate(nextMonth); // ์ด์ „ ์›” 1์ผ๋กœ ์ €์žฅ + setCurrentMonth(nextMonth.getMonth() + 1); + }; + + const year = currentDate.getFullYear(); + const month = currentDate.getMonth(); + const lastDate = getLastDate({ year, month }); // ํ•ด๋‹น ์›”์˜ ๋งˆ์ง€๋ง‰ ๋‚ ์งœ + const firstDayIdx = getFirstDayIdx({ year, month }); // ํ•ด๋‹น ์›”์˜ ์ฒซ ๋ฒˆ์งธ ์š”์ผ ์ธ๋ฑ์Šค + + const prevMonth = new Date(year, month - 1); // ์ด์ „ ๋‹ฌ + const prevMonthLastDate = getLastDate({ + year: prevMonth.getFullYear(), // ์ด์ „ month์˜ ์—ฐ๋„(2023) + month: prevMonth.getMonth(), // ์ด์ „ month index (5) + }); + + const nextMonth = new Date(year, month + 1); + const nextMonthFirstIdx = getFirstDayIdx({ + year: nextMonth.getFullYear(), // ์ดํ›„ month์˜ ์—ฐ๋„(2023) + month: nextMonth.getMonth(), // ์ดํ›„ month index (7) + }); + + const calendar = []; // ํ™”๋ฉด์— ๋ฟŒ๋ฆด ๋‹ฌ๋ ฅ ์š”์†Œ๋“ค์„ ๋‹ด๋Š” Array + let currentDay = 1; // 1์ผ๋ถ€ํ„ฐ ์ฑ„์›Œ๋‚˜๊ฐ + + // week 0์ฃผ์ฐจ๋ถ€ํ„ฐ 5์ฃผ์ฐจ๊นŒ์ง€ + for (let week = 0; week <= 5; week++) { + // ํ•œ ์ฃผ๋ฅผ ๋‹ด๋Š” ๋ฐฐ์—ด ์„ ์–ธ + const weekDays = []; + + // day ํ•œ ์ฃผ์— 1์ผ๋ถ€ํ„ฐ 7์ผ๊นŒ์ง€ + for (let day = 1; day <= 7; day++) { + // ๊ตฌํ•˜๊ณ ์ž ํ•˜๋Š” ๋‹ฌ๋ ฅ ์™ธ์˜ ๋‚ ์งœ ํ‘œ๊ธฐ + if ((week === 0 && day <= firstDayIdx) || currentDay > lastDate) { + weekDays.push( + , + ); + } else { + weekDays.push( + , + ); + currentDay++; + } + } + // ์บ˜๋ฆฐ๋”๋ผ๋Š” ๋ฐฐ์—ด์— ํ•œ ์ฃผ์ฐจ์”ฉ push + calendar.push( + + + {weekDays} + , + ); + // ํ˜„์žฌ ๋‚ ์งœ(currentDay)๊ฐ€ ๋งˆ์ง€๋ง‰ ๋‚ ์งœ(lastDate)๋ฅผ ์ดˆ๊ณผํ•œ ๊ฒฝ์šฐ, + // ๋ฐ˜๋ณต๋ฌธ์„ ์ข…๋ฃŒํ•˜์—ฌ ๋‚จ์€ ์ฃผ์ฐจ๋ฅผ ํ‘œ์‹œํ•˜์ง€ ์•Š์Œ + if (currentDay > lastDate) { + break; + } + } + + // Weekly ์กฐํšŒ + useEffect(() => { + const fetchList = async () => { + const res = await expenseSummary('weekly'); + setWeeklyList(res); + }; + fetchList(); + }, [monthlyList]); + + return ( + +
+ + {weekDate.map((date) => ( + {date} + ))} + + {calendar} + + ); +}; + +const Container = styled.div` + width: 100%; + display: flex; + align-items: center; + flex-direction: column; +`; + +const Calendar = styled.div` + width: 100%; +`; + +const WeekWrapper = styled.div``; + +const Week = styled.div` + width: 100%; + display: flex; + min-height: 3.5rem; + margin-bottom: 0.5rem; + justify-content: space-evenly; +`; + +const WeekDay = styled.div` + width: 100%; + display: flex; + align-items: end; + justify-content: space-evenly; +`; + +const Dates = styled.div` + display: flex; + align-items: end; + min-height: 3.5rem; + margin-bottom: 0.5rem; + justify-content: center; + min-width: calc(100% / 7); + color: ${theme.colors.gray[1]}; +`; + +export default TheCalendar; diff --git a/src/components/Home/CurrentMonth.tsx b/src/components/Home/CurrentMonth.tsx new file mode 100644 index 00000000..738ff52b --- /dev/null +++ b/src/components/Home/CurrentMonth.tsx @@ -0,0 +1,121 @@ +import { theme } from '@/styles/theme'; +import { css, styled } from 'styled-components'; +import { DayProps } from '@/components/Home/Calendar'; +import { SelectedDailyProps } from '@/components/Home/ExpensesList'; + +interface CurrentMonthProps { + year: number; + month: number; + currentDay: number; + day: number; + $isCurrentMonth: boolean; + // eslint-disable-next-line no-unused-vars + onDayClick: (year: number, month: number, currentDay: number) => void; + monthlyList?: SelectedDailyProps[]; +} + +function CurrentMonth({ + year, + month, + day, + currentDay, + $isCurrentMonth, + onDayClick, + monthlyList, +}: CurrentMonthProps) { + const handleClick = () => { + onDayClick(year, month, currentDay); // ํด๋ฆญ ์‹œ year, month, currentDay ๊ฐ’์„ ์ „๋‹ฌ + }; + + const dailyIncome = (currentDay: number) => { + let income = 0; + + if (monthlyList) { + if (monthlyList[currentDay]) { + income = Object.values(monthlyList[currentDay]) + .filter((cur) => cur.amount > 0) + .reduce((acc: number, cur: SelectedDailyProps) => acc + cur.amount, 0) + .toLocaleString(); + } + } + return income !== 0 ? `+${income}` : ''; + }; + + const dailyExpense = (currentDay: number) => { + let expense = 0; + + if (monthlyList) { + if (monthlyList[currentDay]) { + expense = Object.values(monthlyList[currentDay]) + .filter((cur) => cur.amount < 0) + .reduce((acc: number, cur: SelectedDailyProps) => acc + cur.amount, 0) + .toLocaleString(); + } + } + return expense !== 0 ? expense : ''; + }; + + return ( + + + {currentDay} + + {dailyIncome(currentDay)} + {dailyExpense(currentDay)} + + ); +} +const Day = styled.button` + color: black; + display: flex; + align-items: center; + flex-direction: column; + min-width: calc(100% / 7); +`; + +const DayContent = styled.div` + width: 2rem; + padding: 4px 0; + border-radius: 10%; + + &:hover { + scale: calc(110%); + background-color: ${theme.colors.lightGreen}; + } + + ${(props) => + props.$day === 7 && + css` + color: ${theme.colors.deepBlue}; + `} + + ${(props) => + props.$day === 1 && + css` + color: ${theme.colors.red}; + `} + + + ${(props) => props.$isCurrentMonth && css``} + + ${(props) => + !props.$isCurrentMonth && + css` + color: ${theme.colors.gray[1]}; + `} +`; + +const Income = styled.div` + font-size: 0.5rem; + color: ${theme.colors.deepGreen}; +`; + +const Expense = styled.div` + font-size: 0.5rem; + color: ${theme.colors.gray[1]}; +`; +export default CurrentMonth; diff --git a/src/components/Home/ExpensesDailyList.tsx b/src/components/Home/ExpensesDailyList.tsx new file mode 100644 index 00000000..0eb4caa8 --- /dev/null +++ b/src/components/Home/ExpensesDailyList.tsx @@ -0,0 +1,157 @@ +import { useState } from 'react'; +import { theme } from '@/styles/theme'; +import { tags } from '@/lib/utils/Tags'; +import Button from '@/components/common/Button'; +import { css, styled } from 'styled-components'; +import InfoModal from '@/components/modal/InfoModal'; +import UpdateModal from '@/components/modal/UpdateModal'; + +interface SelectedDailyProps { + amount: number; + category: string; + date: string; + userId: string; + _id: string; +} + +interface ExpensesDailyList { + dailyList: SelectedDailyProps[]; + onItemUpdated: () => void; +} + +function ExpensesDailyList({ dailyList, onItemUpdated }: ExpensesDailyList) { + const [showUpdateModal, setShowUpdateModal] = useState(null); + const [showInfoModal, setShowInfoModal] = useState(null); + const [selelctItem, setSelectItem] = useState( + null, + ); + + const handleOpenUpdateModal = (item: SelectedDailyProps, index: number) => { + setShowUpdateModal(index); + setSelectItem(item); + }; + + const handleCloseUpdateModal = () => { + setShowUpdateModal(null); + }; + + const handleOpenInfoModal = (item: SelectedDailyProps, index: number) => { + setShowInfoModal(index); + setSelectItem(item); + }; + + const handleCloseInfoModal = () => { + setShowInfoModal(null); + }; + + const Icon = ({ label }: { label: string }) => { + const tag = tags.find((tag) => tag.label === label); + if (tag) { + return
{tag.icon}
; + } + }; + return ( + <> + +
    + {dailyList + ? dailyList.map((item, index) => ( +
  • + + + + {[...item.category.split(',')][0]} + + + 0}> + {item.amount.toLocaleString()}์› + + + + + + + + {showInfoModal === index && selelctItem && ( + + )} + + {showUpdateModal === index && selelctItem && ( + + )} +
  • + )) + : '๋‚ด์—ญ์ด ์—†์Šต๋‹ˆ๋‹ค!'} +
+ + ); +} + +const Title = styled.h1` + margin-left: 0.5rem; +`; + +const Wrapper = styled.div` + display: flex; + align-items: center; + justify-content: space-between; + border-top: 1px solid #000; + margin-bottom: 0.5rem; + padding: 1rem 0.5rem 0.5rem; +`; + +const Category = styled.div` + color: ${theme.colors.gray}; + display: flex; +`; + +const Detail = styled.div` + display: flex; +`; + +const Amount = styled.div<{ + $isSpend?: boolean; +}>` + margin: 2px 8px; + ${(props) => + props.$isSpend && + css` + color: ${theme.colors.blue}; + `} +`; +const Buttons = styled.div` + > button { + font-size: 0.5rem; + padding: 4px 8px; + margin-left: 5px; + } + > button:hover { + transform: scale(110%); + } +`; + +export default ExpensesDailyList; diff --git a/src/components/Home/ExpensesList.tsx b/src/components/Home/ExpensesList.tsx new file mode 100644 index 00000000..1f6dfb4e --- /dev/null +++ b/src/components/Home/ExpensesList.tsx @@ -0,0 +1,37 @@ +import ExpensesTagList from '@/components/Home/ExpensesTagList'; +import ExpensesDailyList from '@/components/Home/ExpensesDailyList'; + +export interface SelectedDailyProps { + amount: number; + category: string; + date: string; + userId: string; + _id: string; +} +interface CalendarDataProps { + dailyList: SelectedDailyProps[]; + tag: string; + onItemUpdated: () => void; +} + +function ExpensesList({ dailyList, tag, onItemUpdated }: CalendarDataProps) { + // tag๊ฐ€ ์กด์žฌ๋ฉด TagList, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด DailyList ๋ฐ˜ํ™˜ + return ( + <> + {tag ? ( + + ) : ( + + )} + + ); +} + +export default ExpensesList; diff --git a/src/components/Home/ExpensesTagList.tsx b/src/components/Home/ExpensesTagList.tsx new file mode 100644 index 00000000..b8d5da9d --- /dev/null +++ b/src/components/Home/ExpensesTagList.tsx @@ -0,0 +1,161 @@ +import { useState } from 'react'; +import Button from '../common/Button'; +import { theme } from '@/styles/theme'; +import { tags } from '@/lib/utils/Tags'; +import InfoModal from '../modal/InfoModal'; +import UpdateModal from '../modal/UpdateModal'; +import { css, styled } from 'styled-components'; + +interface SelectedDailyProps { + amount: number; + category: string; + date: string; + userId: string; + _id: string; +} + +interface ExpensesTagList { + dailyList: SelectedDailyProps[]; + tag: string; + onItemUpdated: () => void; +} + +function ExpensesTagList({ dailyList, onItemUpdated }: ExpensesTagList) { + const [showUpdateModal, setShowUpdateModal] = useState(null); + const [showInfoModal, setShowInfoModal] = useState(null); + const [selelctItem, setSelectItem] = useState( + null, + ); + + const handleOpenUpdateModal = (item: SelectedDailyProps, index: number) => { + setShowUpdateModal(index); + setSelectItem(item); + }; + + const handleCloseUpdateModal = () => { + setShowUpdateModal(null); + }; + + const handleOpenInfoModal = (item: SelectedDailyProps, index: number) => { + setShowInfoModal(index); + setSelectItem(item); + }; + + const handleCloseInfoModal = () => { + setShowInfoModal(null); + }; + + const Icon = ({ label }: { label: string }) => { + const iconTag = tags.find((iconTag) => iconTag.label === label); + if (iconTag) { + return
{iconTag.icon}
; + } + }; + + return ( + <> + +
    + {dailyList + ? dailyList.map((item, index) => ( +
  • + + + + {[...item.category.split(',')][0]} + + + 0}> + {item.amount.toLocaleString()}์› + + + + + + + + {showInfoModal === index && selelctItem && ( + + )} + + {showUpdateModal === index && selelctItem && ( + + )} +
  • + )) + : '๋‚ด์—ญ์ด ์—†์Šต๋‹ˆ๋‹ค!'} +
+ + ); +} + +const Title = styled.h1` + margin-left: 0.5rem; +`; + +const Wrapper = styled.div` + display: flex; + align-items: center; + margin-bottom: 0.5rem; + border-top: 1px solid #000; + padding: 1rem 0.5rem 0.5rem; + justify-content: space-between; +`; + +const Category = styled.div` + display: flex; + color: ${theme.colors.gray}; +`; + +const Detail = styled.div` + display: flex; +`; + +const Amount = styled.div<{ + $isSpend?: boolean; +}>` + margin: 2px 8px; + + ${(props) => + props.$isSpend && + css` + color: ${theme.colors.blue}; + `} +`; + +const Buttons = styled.div` + > button { + padding: 4px 8px; + margin-left: 5px; + font-size: 0.5rem; + } + > button:hover { + transform: scale(110%); + } +`; + +export default ExpensesTagList; diff --git a/src/components/Home/Home.tsx b/src/components/Home/Home.tsx new file mode 100644 index 00000000..fa25ecdb --- /dev/null +++ b/src/components/Home/Home.tsx @@ -0,0 +1,89 @@ +import { useEffect, useState } from 'react'; +import UserId from '@/components/Home/UserId'; +import Calendar from '@/components/Home/Calendar'; +import ExpensesList from '@/components/Home/ExpensesList'; +import { calendarData, expenseSearch } from '@/lib/api/Api'; + +export interface SelectedDateProps { + year: number; + month: number; + currentDay: number; +} + +interface SelectedDailyProps { + amount: number; + category: string; + date: string; + userId: string; + _id: string; +} + +function Home() { + const [tag, setTag] = useState(''); // ์นดํ…Œ๊ณ ๋ฆฌ ์†Œ๋น„ ํƒœ๊ทธ + const [dailyList, setDailyList] = useState([]); + const [monthlyList, setMonthlyList] = useState([]); + const [selectedDate, setSelectedDate] = useState(); + const [currentMonth, setCurrentMonth] = useState(new Date().getMonth() + 1); + const [currentYear, setCurrentYear] = useState(new Date().getFullYear()); + + const onDayClick = (year: number, month: number, currentDay: number) => { + setSelectedDate({ year, month, currentDay }); + }; + + const onItemUpdated = async () => { + const res = await calendarData(currentYear, currentMonth); + setMonthlyList(res); + if (selectedDate) { + setDailyList(res[selectedDate.currentDay]); + } + }; + + useEffect(() => { + const fetchData = async () => { + const res = await calendarData(currentYear, currentMonth); + setMonthlyList(res); + }; + + fetchData(); + }, [currentYear, currentMonth, tag]); + + useEffect(() => { + if (selectedDate) { + setDailyList(monthlyList[selectedDate.currentDay]); + } + }, [selectedDate, monthlyList]); + + useEffect(() => { + const fetchCategoryList = async () => { + if (tag) { + const res = await expenseSearch(tag); + setDailyList(res); + } + }; + fetchCategoryList(); + }, [tag]); + + return ( + <> + + + + + + ); +} + +export default Home; diff --git a/src/components/Home/NotCurrentMonth.tsx b/src/components/Home/NotCurrentMonth.tsx new file mode 100644 index 00000000..e507cc1d --- /dev/null +++ b/src/components/Home/NotCurrentMonth.tsx @@ -0,0 +1,77 @@ +import { theme } from '@/styles/theme'; +import { css, styled } from 'styled-components'; +import { DayProps } from '@/components/Home/Calendar'; + +interface NotCurrentMonthProps { + week: number; + day: number; + prevMonthLastDate: number; + firstDayIdx: number; + $isCurrentMonth: boolean; + currentDay: number; + lastDate: number; + nextMonthFirstIdx: number; +} + +function NotCurrentMonth({ + week, + day, + prevMonthLastDate, + firstDayIdx, + $isCurrentMonth, + currentDay, + lastDate, + nextMonthFirstIdx, +}: NotCurrentMonthProps) { + return ( + <> + {/* '0์ฃผ์ฐจ์ด๊ณ , ์ฒซ ๋ฒˆ์งธ ์š”์ผ ์ธ๋ฑ์Šค๋ณด๋‹ค day ๊ฐ’์ด ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์„ ๊ฒฝ์šฐ' ๋˜๋Š” + 'ํ˜„์žฌ ๋‚ ์งœ(currentDay)๊ฐ€ ๋งˆ์ง€๋ง‰ ๋‚ ์งœ(lastDate)๋ฅผ ์ดˆ๊ณผํ•œ ๊ฒฝ์šฐ' */} + {week === 0 && day <= firstDayIdx ? ( + // 0์ฃผ์ฐจ์ด๊ณ , ์ฒซ ๋ฒˆ์งธ ์š”์ผ ์ธ๋ฑ์Šค๋ณด๋‹ค day ๊ฐ’์ด ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์„ ๊ฒฝ์šฐ (1์ผ ์ด์ „) + + + {/* 30 - firstDayIndex + day */} + {prevMonthLastDate - (firstDayIdx - day)} + + + ) : ( + // ํ˜„์žฌ ๋‚ ์งœ(currentDay)๊ฐ€ ๋งˆ์ง€๋ง‰ ๋‚ ์งœ๋ฅผ ์ดˆ๊ณผํ•œ ๊ฒฝ์šฐ(31์ผ ์ดํ›„) + + + {/* ํ˜„์žฌ ๋‚ ์งœ - ๋งˆ์ง€๋ง‰ ํ•ด๋‹น ์›”์˜ ๋‚ ์งœ + day - ๋‹ค์Œ ๋‹ฌ์˜ ์ฒซ ๋‚ ์งœ index - 1 */} + {currentDay - lastDate + day - nextMonthFirstIdx - 1} + + + )} + + ); +} +const Day = styled.button` + width: 100%; + display: flex; + justify-content: space-evenly; +`; + +const DayContent = styled.div` + padding: 4px 0; + + ${(props) => + props.$day === 7 && + css` + color: ${theme.colors.blue}; + `} + + ${(props) => + props.$day === 1 && + css` + color: ${theme.colors.red}; + `} + + ${(props) => + !props.$isCurrentMonth && + css` + color: ${theme.colors.gray[1]}; + `} +`; +export default NotCurrentMonth; diff --git a/src/components/Home/UserId.tsx b/src/components/Home/UserId.tsx new file mode 100644 index 00000000..5187411b --- /dev/null +++ b/src/components/Home/UserId.tsx @@ -0,0 +1,131 @@ +import { useState } from 'react'; +import styled from 'styled-components'; + +function UserId() { + const inittialUserId = localStorage.getItem('userId') || ''; + const initialIsSubmit = !!localStorage.getItem('userId'); // localStorage์— userId๊ฐ€ ์—†์œผ๋ฉด false, ์žˆ์œผ๋ฉด true๊ฐ€ ๋œ๋‹ค. + const [userId, setUserId] = useState(inittialUserId); + const [isSubmit, setIsSubmit] = useState(initialIsSubmit); + + const handleUserId = (e: React.ChangeEvent) => { + setUserId(e.target.value); + }; + + const setLocalStorage = (event: React.FormEvent) => { + event.preventDefault(); + localStorage.setItem('userId', userId); + setIsSubmit(true); + window.location.reload(); + }; + + const DeleteLocalStorage = (event: React.FormEvent) => { + event.preventDefault(); + localStorage.clear(); + setIsSubmit(false); + setUserId(''); // ๋กœ๊ทธ์•„์›ƒ์„ ํ•˜๋ฉด userId๊ฐ’์„ ๋นˆ ๊ฐ’์œผ๋กœ ๋ณ€๊ฒฝ + window.location.reload(); + }; + + return ( + + {isSubmit ? ( + <> + + {userId}๋‹˜ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค. + ๋กœ๊ทธ์•„์›ƒ + + + ) : ( + <> + + + + ๋กœ๊ทธ์ธ + + + + )} + + ); +} + +const Wrapper = styled.div` + padding: 20px; + display: flex; + align-items: center; + flex-direction: column; + justify-content: center; +`; + +const User = styled.span` + font-weight: bold; + text-align: center; +`; + +const LogOutForm = styled.form` + height: 25px; +`; + +const LogOutButton = styled.button` + margin-left: 10px; + font-weight: bold; + border-radius: 8px; + background-color: #fff; + color: #000; + + &:hover { + color: #fff; + background-color: #000; + } + + @media screen and (max-width: 500px) { + background-color: #fff; + color: #000; + + &:hover { + background-color: #000; + color: #fff; + } + } +`; + +const LogInForm = styled.form` + height: 25px; +`; + +const LogInInput = styled.input` + line-height: 1.3; +`; + +const LogInButton = styled.button` + margin-left: 10px; + font-weight: bold; + border-radius: 8px; + background-color: #fff; + color: #000; + + &:hover { + color: #fff; + background-color: #000; + + @media screen and (max-width: 500px) { + background-color: #fff; + color: #000; + + &:hover { + background-color: #000; + color: #fff; + } + } + } + + &:disabled { + cursor: not-allowed; + } +`; + +export default UserId; diff --git a/src/components/Home/WeeklyExpenses.tsx b/src/components/Home/WeeklyExpenses.tsx new file mode 100644 index 00000000..37d3034d --- /dev/null +++ b/src/components/Home/WeeklyExpenses.tsx @@ -0,0 +1,61 @@ +import { theme } from '@/styles/theme'; +import { css, styled } from 'styled-components'; +import { weekToNumFn } from '@/lib/utils/weekNumFn'; + +interface WeeklyListProps { + _id?: string; + totalAmount?: number; +} +interface WeeklyExpensesProps { + year?: number; + month?: number; + week?: number; + weeklyList?: WeeklyListProps[]; +} + +function WeeklyExpenses({ ...props }: WeeklyExpensesProps) { + const weekOfYear = weekToNumFn( + props.year as number, + props.month as number, + props.week as number, + ); + + // weekOfYear์— ํ•ด๋‹นํ•˜๋Š” id๊ฐ’์„ ์ฐพ์Œ + const targetWeek = props.weeklyList + ? props.weeklyList.find((target) => target._id === `2023-${weekOfYear}`) + : undefined; + + // ํ•ด๋‹น ์ฃผ์ฐจ์˜ totalAmount ์ €์žฅ + const targetAmount = targetWeek ? targetWeek?.totalAmount : undefined; + + // ์ฃผ๊ฐ„ ๊ฑฐ๋ž˜๋‚ด์—ญ์ด ์žˆ๋‹ค๋ฉด, ์Œ์ˆ˜ ์–‘์ˆ˜์— ๋”ฐ๋ผ ๊ตฌ๋ถ„์ง€์–ด ๋ Œ๋”๋ง, ๊ฑฐ๋ž˜๋‚ด์—ญ์ด ์—†๋‹ค๋ฉด non-breaking space + return ( + <> + {targetAmount ? ( + 0}> + {targetAmount > 0 ? '+' : ''} + {targetAmount ? targetAmount.toLocaleString() : ''} + + ) : ( +   + )} + + ); +} +const Wrapper = styled.div<{ + $isPositive?: boolean; +}>` + display: flex; + font-size: 0.8rem; + padding-right: 2px; + align-items: center; + justify-content: right; + background-color: ${theme.colors.gray[0]}; + ${(props) => + props.$isPositive && + css` + color: ${theme.colors.deepGreen}; + `} +`; + +export default WeeklyExpenses; diff --git a/src/components/common/Button.tsx b/src/components/common/Button.tsx new file mode 100644 index 00000000..c9f6fdbe --- /dev/null +++ b/src/components/common/Button.tsx @@ -0,0 +1,45 @@ +import { theme } from '@/styles/theme'; +import styled, { css } from 'styled-components'; + +interface IButtonProps { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + [props: string]: any; +} + +function Button({ ...props }: IButtonProps) { + return ; +} + +const StyledButton = styled.button<{ + green?: boolean; + lightgreen?: boolean; + red?: boolean; + $gray?: boolean; +}>` + cursor: pointer; + border-radius: 5px; + + ${(props) => + props.green && + css` + background-color: ${theme.colors.green}; + `} + ${(props) => + props.lightgreen && + css` + background-color: ${theme.colors.lightGreen}; + `} + ${(props) => + props.red && + css` + background-color: ${theme.colors.red}; + `} + ${(props) => + props.$gray && + css` + color: ${theme.colors.gray[2]}; + background-color: ${theme.colors.gray[0]}; + `}; +`; + +export default Button; diff --git a/src/components/common/Header.tsx b/src/components/common/Header.tsx new file mode 100644 index 00000000..3e4cf9cc --- /dev/null +++ b/src/components/common/Header.tsx @@ -0,0 +1,240 @@ +import Button from './Button'; +import { theme } from '@/styles/theme'; +import { Link } from 'react-router-dom'; +import AddModal from '@/components/modal/AddModal'; +import { useEffect, useState } from 'react'; +import { css, styled } from 'styled-components'; +import SearchModal from '@/components/modal/SearchModal'; +import { SelectedDailyProps } from '@/components/Home/ExpensesList'; +import { leftIcon, rightIcon, searchIcon } from '@/lib/utils/Icons'; + +interface HeaderProps { + onPrev: () => void; + onNext: () => void; + currentYear?: number; + currentMonth?: number; + setTag: React.Dispatch>; + onItemUpdated: () => void; + monthlyList: SelectedDailyProps[]; +} + +function Header({ + onPrev, + onNext, + currentYear, + currentMonth, + setTag, + onItemUpdated, + monthlyList, +}: HeaderProps) { + const [dailyList, setDailyList] = useState([]); + const [showSearchModal, setShowSearchModal] = useState(false); + const [showAddModal, setShowAddModal] = useState(false); + useEffect(() => { + setDailyList(Object.values(monthlyList)); + }, [monthlyList]); + + const handleOpenSearchModal = () => { + setShowSearchModal(true); + }; + const handleCloseSearchModal = () => { + setShowSearchModal(false); + }; + + const handleOpenAddModal = () => { + setShowAddModal(true); + }; + + const handleCloseAddModal = () => { + setShowAddModal(false); + }; + + const expense = + // dailyList๊ฐ€ ์กด์žฌํ•  ๋•Œ, + dailyList.length > 0 + ? dailyList.reduce((acc, cur) => { + // amount๊ฐ€ ์Œ์ˆ˜์ธ ํ•ญ๋ชฉ filterling + const expenses = Object.values(cur).filter( + (item: { amount: number }) => item.amount * 1 < 0, + ); + // ํ•„ํ„ฐ๋ง ๋œ expenses์˜ amount๋ฅผ reduce๋กœ ๋ชจ๋‘ ํ•ฉํ•จ + const total = expenses.reduce( + (sum: number, item: { amount: number }) => sum + item.amount, + 0, + ); + return acc + total * -1; + }, 0) + : 0; + + const income = // dailyList๊ฐ€ ์กด์žฌํ•  ๋•Œ, + dailyList.length > 0 + ? dailyList.reduce((acc, cur) => { + // amount๊ฐ€ ์–‘์ˆ˜์ธ ํ•ญ๋ชฉ filterling + const expenses = Object.values(cur).filter( + (item: { amount: number }) => item.amount * 1 >= 0, + ); + // ํ•„ํ„ฐ๋ง ๋œ expenses์˜ amount๋ฅผ reduce๋กœ ๋ชจ๋‘ ํ•ฉํ•จ + const total = expenses.reduce( + (sum: number, item: { amount: number }) => sum + item.amount, + 0, + ); + return acc + total; + }, 0) + : 0; + + return ( + + + + {leftIcon} + {currentYear}.{currentMonth} + {rightIcon} + + {searchIcon} + + + + + ์ง€์ถœ{expense.toLocaleString()}์› + + + ์ˆ˜์ž…{income.toLocaleString()}์› + + + + + + + + + + + + + ์ถ”๊ฐ€ + + + {showAddModal && ( + + )} + {showSearchModal && ( + + )} + + ); +} + +const Search = styled.button` + margin-right: 10px; + > svg { + color: black; + font-size: 1rem; + } +`; + +const StyledHeader = styled.header` + width: 100%; + display: flex; + padding: 0.5rem 0; + align-items: center; + flex-direction: column; + justify-content: space-between; +`; + +const SearchWrapper = styled.div` + width: 100%; + display: flex; + justify-content: space-between; +`; + +const Month = styled.div` + display: flex; + font-size: 1.5rem; + align-items: center; + margin-left: 0.5rem; +`; + +const Arrow = styled.button` + border: none; + cursor: pointer; + background: none; + font-size: 1.5rem; + > svg { + color: black; + } +`; + +const InfoWrapper = styled.div` + width: 100%; + height: 100%; + display: flex; + align-items: center; + justify-content: space-between; +`; + +const Balance = styled.div` + height: 100%; + display: flex; + flex-direction: column; +`; + +const Buttons = styled.div` + display: flex; + padding: 1.4rem 0; + margin-right: 1rem; + flex-direction: column; +`; + +const ButtonWrapper = styled.div` + display: flex; + + > a > button { + padding: 8px 8px; + font-size: 0.5rem; + } + + > a:first-child { + margin-right: 0.5rem; + } +`; + +const Add = styled.button` + display: flex; + color: black; + font-size: 1rem; + margin-top: 1rem; + align-items: center; + justify-content: right; +`; + +const Expense = styled.div` + display: flex; + font-size: 12px; + margin-left: 1.5rem; + margin-bottom: 1rem; + align-items: center; + color: ${theme.colors.gray[1]}; +`; + +const Income = styled.div` + display: flex; + font-size: 12px; + align-items: center; + margin-left: 1.5rem; + color: ${theme.colors.gray[1]}; +`; + +const Price = styled.div<{ + $deepGreen?: boolean; +}>` + color: black; + font-size: 1rem; + margin-left: 4px; + + ${(props) => + props.$deepGreen && + css` + color: ${theme.colors.deepGreen}; + `}; +`; + +export default Header; diff --git a/src/components/common/Layout.tsx b/src/components/common/Layout.tsx new file mode 100644 index 00000000..1652a384 --- /dev/null +++ b/src/components/common/Layout.tsx @@ -0,0 +1,19 @@ +import { Outlet } from 'react-router-dom'; +import { styled } from 'styled-components'; + +function Layout() { + return ( + + + + ); +} +const Container = styled.div` + height: 100vh; + margin: 0 auto; + max-width: 480px; + overflow-y: auto; + overflow-x: hidden; +`; + +export default Layout; diff --git a/src/components/common/NotFound.tsx b/src/components/common/NotFound.tsx new file mode 100644 index 00000000..48a61741 --- /dev/null +++ b/src/components/common/NotFound.tsx @@ -0,0 +1,5 @@ +function NotFound() { + return
NotFound
; +} + +export default NotFound; diff --git a/src/components/detail/Detail.tsx b/src/components/detail/Detail.tsx new file mode 100644 index 00000000..8570b94c --- /dev/null +++ b/src/components/detail/Detail.tsx @@ -0,0 +1,256 @@ +import { useState, useEffect } from 'react'; +import SelectPeriod from './SelectPeriod'; +import styled from 'styled-components'; +import {expenseSummary, expenseSearch} from '@/lib/api/Api'; +import DetailChart from './DetailChart'; +import DetailList from './DetailList'; +import { DatePicker } from 'antd'; +import SelectChart from './SelectChart'; +import SelectCategory from './SelectCategory'; +import SelectMonthly from './SelectMonthly'; +import {Table} from 'antd' +import { FaArrowLeft } from 'react-icons/fa'; +import { useNavigate } from 'react-router-dom'; +import { theme } from '@/styles/theme'; + +const { RangePicker } = DatePicker; + + +function Detail () { + + // ๊ธฐ๊ฐ„ + const [period, setPeriod] = useState('monthly'); + const [selectPeriod, setSelectPeriod] = useState('') + const [summaries, setSummeries] = useState([]) + const [sortSummaries, setSortSummeries] = useState([]) + const [selectDays, setSelectDays] = useState(false) + const navigate = useNavigate() + + const periodApi = async (selectedPeriod: string) => { + try { + const response = await expenseSummary(selectedPeriod); + setSummeries(response ) + } catch (error) { + console.log('error :', error) + } + } + + useEffect(() => { + if(period !== '๊ธฐ๊ฐ„์„ ํƒ') { + periodApi(period) + } else { + setPeriod('daily') + } + }, [period]) + + const sortSummariesFunc = () => { + setSortSummeries(summaries.sort((acc, cur) => { + const idA = Number(acc._id.replace(/-/g, '')) + const idB = Number(cur._id.replace(/-/g, '')) + return idA - idB + })) + } + + useEffect(() => { + sortSummariesFunc() + }, [summaries]) + + const handlePeriod = (value: string) => { + setPeriod(value); + } + + const selectDay = (dates: any, dateStrings: string[]) => { + if (dates && dates.length > 0) { + setSelectDays(true); + console.log(selectDays) + const [startDay, endDay] = dateStrings; + const filteredSummaries = summaries.filter((summary) => { + return summary._id >= startDay && summary._id <= endDay; + }); + setSortSummeries(filteredSummaries); + } else { + setSelectDays(false); + sortSummariesFunc(); + } + }; + + const handleSelectPeriod = (value: string) => { + setSelectPeriod(value) + } + + // ์นดํ…Œ๊ณ ๋ฆฌ ๊ฒ€์ƒ‰ + const [categories, setCategories] = useState([]) + const [selectCategories, setSelectCategories] = useState('') + + const categoryApi = async() => { + try { + const response = await expenseSearch(selectCategories) + setCategories(response) + } catch (error) { + console.log('error :' + error) + } + } + + + + useEffect(() => { + categoryApi() + }, [selectCategories]) + + const handleSelectCategory = (value: string) => { + setSelectCategories(value) + } + + categories + .sort((acc, cur) => { + const dateA: any = new Date(acc.date) + const dateB: any = new Date(cur.date) + return dateA - dateB + }) + + // ํ•„ํ„ฐ + + const filterCategories = selectPeriod ? categories.filter((category) => category.date.includes(selectPeriod) ) : categories + + // ์ฐจํŠธ + const [chart, setChart] = useState('bar') + + const handleChart = (value: string) => { + setChart(value) + } + // table + const tableitemSource = filterCategories.map((categories, index) => ({ + key : index + 1, + categoryName: categories.category.replace(/, .*$/, ''), + categoryAmount: Number(categories.amount) >= 0 ? categories.amount.toLocaleString() : {categories.amount.toLocaleString()}, + categoryDate: categories.date.replace(/T.*$/, '') + })) + + const itemColumns = [ + { + title:'๋ฒˆํ˜ธ', + dataIndex: 'key', + key: 'key' + }, + { + title: '์นดํ…Œ๊ณ ๋ฆฌ', + dataIndex: 'categoryName', + key: 'categoryName' + }, + { + title: '๊ธˆ์•ก', + dataIndex: 'categoryAmount', + key: 'categoryAmount' + }, + { + title: '๋‚ ์งœ', + dataIndex: 'categoryDate', + key: 'categoryDate' + }, + ] + + const selectCategoryAmount = selectCategories ? categories.filter((category) => category.date.includes(selectPeriod)) : categories; + + let income = 0 + let expenses = 0 + for(let i = 0; i < filterCategories.length; i++) { + if(selectCategoryAmount[i].amount >= 0) { + income += selectCategoryAmount[i].amount + } else { + expenses += selectCategoryAmount[i].amount + } + } + + const hanldeBackPage = () => { + navigate('/') + } + + return ( + <> + + + + + + + + {period === 'daily' && ( + + + + )} + + + + + + + + + ์ˆ˜์ž… : {income.toLocaleString()}์› + ์ง€์ถœ : {expenses.toLocaleString()}์› + + + ); +} + +export default Detail + +const Check = styled.div` + display: flex; + align-items: center; + justify-content: center; +`; + +const StyleDatePicker = styled.div` + display: flex; + align-items: center; + justify-content: center; + +` + +const StyledSelect = styled.div ` + display: flex; + justify-content: center; + flex-align: justify; + margin-bottom: 20px; +` + +const StyledTotalCategoryAmount = styled.div` + display: flex; + margin: 30px; + justify-content: center; +` + +const StyleIncome = styled.div` + color: black; + margin-left: auto; +` + +const StyleExpeses = styled.div ` + color: red; + margin-left: auto; + margin-right: auto; +` + +const BackButton = styled.button` + border: none; + font-size: 20px; + margin: 15px; + cursor: pointer; + background-color: #fff; + position: relative; +/* left: - 50px; */ + + &:hover { + color: ${theme.colors.red}; + } +`; + diff --git a/src/components/detail/DetailChart.tsx b/src/components/detail/DetailChart.tsx new file mode 100644 index 00000000..07b78fa7 --- /dev/null +++ b/src/components/detail/DetailChart.tsx @@ -0,0 +1,90 @@ +import {useEffect, useRef} from 'react' +import Chart, {ChartType} from 'chart.js/auto'; +import styled from 'styled-components'; + +interface Summaries { + summaries: SummaryResponseItem[] + period: string + selectChart: string +} + +function DeatilChart({summaries, period, selectChart}: Summaries) { + + const chartRef = useRef(null); + + useEffect(() => { + if (!chartRef.current) return; + + const chartLabels = summaries.map((item) => { + if(period === 'monthly') { + const [year, month] = item._id.split('-') + return `${year}๋…„ ${month}์›”` + } else if ( period === 'weekly'){ + const weekNum = item._id.split('-')[1] + return `์ฃผ${weekNum}` + } else if ( period === 'daily') { + const [, monthNum, dayNum] = item._id.split('-') + return `${monthNum}์›” ${dayNum}์ผ` + } + }) + + const dynaminColor = function () { + const r: number = Math.floor(Math.random() * 255) + const g: number = Math.floor(Math.random() * 255) + const b: number = Math.floor(Math.random() * 255) + return 'rgba(' + r + ',' + g + ',' + b + ',0.6)' + } + + const chartData = { + labels: chartLabels, + datasets: [ + { + label: '์ง€์ถœ ๋‚ด์—ญ', + data: summaries.map((item) => item.totalAmount), // ๊ฐ ์ฃผ์— ํ•ด๋‹นํ•˜๋Š” ์ง€์ถœ ๋ฐ์ดํ„ฐ + backgroundColor: summaries.map(() => dynaminColor()), // ์ฐจํŠธ ์˜์—ญ ๋ฐฐ๊ฒฝ์ƒ‰ + borderColor: 'rgba(75, 192, 192, 1)', // ์ฐจํŠธ ์„  ์ƒ‰์ƒ + borderWidth: 2, // ์ฐจํŠธ ์„  ๋‘๊ป˜ + }, + ], + }; + // ์ฐจํŠธ ์˜ต์…˜ + const chartOptions = { + responsive: true, + scales: { + y: { + beginAtZero: true, + ticks: { + stepSize: 1000, // y ์ถ• ๊ฐ„๊ฒฉ + }, + }, + }, + }; + + // ์ฐจํŠธ ์ƒ์„ฑ + const chartType = selectChart as ChartType + const myChart = new Chart(chartRef.current, { + type: chartType, + data: chartData, + options: chartOptions, + }); + + // ์ปดํฌ๋„ŒํŠธ ์–ธ๋งˆ์šดํŠธ ์‹œ ์ฐจํŠธ ์ธ์Šคํ„ด์Šค ์ œ๊ฑฐ + return () => { + myChart.destroy(); + }; + + }, [summaries, period, selectChart]); + + return ( +
+ +
+ ) +} + +export default DeatilChart + +const StyledCanvas = styled.canvas` + max-height: 250px; + margin-bottom: 40px; +` \ No newline at end of file diff --git a/src/components/detail/DetailList.tsx b/src/components/detail/DetailList.tsx new file mode 100644 index 00000000..651d287b --- /dev/null +++ b/src/components/detail/DetailList.tsx @@ -0,0 +1,82 @@ +import styled from "styled-components" +import { Table } from "antd" +interface Summaries { + summaries: SummaryResponse +} + +function DetailList({summaries}: Summaries) { + let income = 0 + let expenses = 0 + + for(let i = 0; i < summaries.length; i++) { + if(summaries[i].totalAmount >= 0) { + income += summaries[i].totalAmount + } else { + expenses += summaries[i].totalAmount + } + } + + // table + const tableitemSource = summaries.map((item, index) => ({ + key: index+1, + summaiesDate : item._id, + summariesAmount: item.totalAmount >= 0 ? item.totalAmount.toLocaleString() : {item.totalAmount.toLocaleString()} + })) + + const itemColumns = [ + { + title: '๋‚ ์งœ', + dataIndex: 'summaiesDate', + key: 'summaiesDate' + }, + { + title: '๊ธˆ์•ก', + dataIndex: 'summariesAmount', + key: 'summariesAmount', + } + ] + + + return ( +
+
+ + + ์ˆ˜์ž… : {income.toLocaleString()} ์› + + + ์ง€์ถœ : {expenses.toLocaleString()} ์› + + + + + ) +} + +export default DetailList + +const StyleListExpense = styled.span` + color: red +` + +const StyleAmount = styled.div` + margin-top: 50px; + margin-bottom: 20px; + display: flex; + justify-content: center; +` + +const StyleIncome = styled.div` + display: inline-block; +` + +const SytleExpese = styled.div` + display: inline-block; + margin-left: 40px; + color: red +` diff --git a/src/components/detail/SelectCategory.tsx b/src/components/detail/SelectCategory.tsx new file mode 100644 index 00000000..3a007d9d --- /dev/null +++ b/src/components/detail/SelectCategory.tsx @@ -0,0 +1,40 @@ +import styled from 'styled-components' + +interface OnSelectCategory { + summaries: SearchResponseItem[] + onSelectCategory: (value: string) => void +} + +function SelectCategory({summaries, onSelectCategory}: OnSelectCategory) { + + const handleChangeCategory = (e:React.ChangeEvent) => { + onSelectCategory(e.target.value) + e.target.blur(); + } + + return ( + <> + + + {summaries.map((item, index) => + + )} + + + + ) +} + +export default SelectCategory + +const StyledSelectCategory = styled.select` + width: 140px; + height: 30px; + font-size: 18px; + text-align: center; + margin-left: 20px; +` \ No newline at end of file diff --git a/src/components/detail/SelectChart.tsx b/src/components/detail/SelectChart.tsx new file mode 100644 index 00000000..d4649c43 --- /dev/null +++ b/src/components/detail/SelectChart.tsx @@ -0,0 +1,37 @@ +import styled from 'styled-components' + +interface OnSelectChartProps { + onSelectChart: (value: string) => void +} + +function SelectChart({onSelectChart}: OnSelectChartProps) { + const handleSelectChart = (e: React.ChangeEvent) => { + const value = e.target.value + onSelectChart(value) + e.target.blur(); + } + + return ( + + + + + + ) +} + +export default SelectChart + +const StyledSelectChart = styled.select` + width: 120px; + height: 30px; + font-size: 20px; + text-align: center; + margin-left: 20px; +` \ No newline at end of file diff --git a/src/components/detail/SelectMonthly.tsx b/src/components/detail/SelectMonthly.tsx new file mode 100644 index 00000000..5374eeff --- /dev/null +++ b/src/components/detail/SelectMonthly.tsx @@ -0,0 +1,37 @@ +import styled from "styled-components" + +interface Summaries { + summaries: SummaryResponseItem[] + onSelectPeriod: (value: string) => void +} + +const SelectMonthly = ({summaries, onSelectPeriod}: Summaries) => { + const handleChange = (e: React.ChangeEvent) => { + onSelectPeriod(e.target.value) + e.target.blur(); + } + + return ( + <> + + + {summaries.map((item, index) => + + )} + + + ) +} + +export default SelectMonthly + +const StyledSelectMonthly = styled.select` + width: 140px; + height: 30px; + font-size: 18px; + text-align: center; +` diff --git a/src/components/detail/SelectPeriod.tsx b/src/components/detail/SelectPeriod.tsx new file mode 100644 index 00000000..9bbfdb3f --- /dev/null +++ b/src/components/detail/SelectPeriod.tsx @@ -0,0 +1,33 @@ +import React from 'react'; +import styled from 'styled-components'; +interface OnPeriodProps { + onPeriodChange: (value: string) => void; +} + +const SelectPeriod: React.FC = ({ onPeriodChange }) => { + const handleChange = (e: React.ChangeEvent) => { + const value = e.target.value; + onPeriodChange(value); + e.target.blur(); + }; + + return ( + + + + + ); +}; + +export default SelectPeriod; + +const StyledSelectPeriod = styled.select` + width: 120px; + height: 30px; + font-size: 20px; + text-align: center; +` \ No newline at end of file diff --git a/src/components/graph/Graph.tsx b/src/components/graph/Graph.tsx new file mode 100644 index 00000000..91877afa --- /dev/null +++ b/src/components/graph/Graph.tsx @@ -0,0 +1,280 @@ +/* eslint-disable no-console */ +import React, { useState, useEffect, useRef } from 'react'; +import { Collapse } from 'antd'; +import Chart from 'chart.js/auto'; +import { expenseSummary } from '@/lib/api/Api'; +import { FaArrowLeft } from 'react-icons/fa'; +import { useNavigate } from 'react-router-dom'; +import { theme } from '@/styles/theme'; +import styled from 'styled-components'; + +interface ExpenseItem { + _id: string; + totalAmount: number; +} + +function getWeeksInMonth(year: number, month: number): string[][] { + const weeks: string[][] = []; + + const firstDay = new Date(year, month - 1, 1); + const lastDay = new Date(year, month, 0); + + let currentWeek: string[] = []; + const currentDate = firstDay; + + while (currentDate <= lastDay) { + const dateStr = `${year}-${month.toString().padStart(2, '0')}-${currentDate.getDate().toString().padStart(2, '0')}`; + currentWeek.push(dateStr); + + if (currentDate.getDay() === 6 || currentDate === lastDay) { + weeks.push(currentWeek); + currentWeek = []; + } + + currentDate.setDate(currentDate.getDate() + 1); + } + + if (currentWeek.length > 0) { + weeks.push(currentWeek); + } + + return weeks; +} + +function getOrdinalWeek(index: number): string { + const ordinalNumbers = ['์ฒซ์งธ', '๋‘˜์งธ', '์…‹์งธ', '๋„ท์งธ', '๋‹ค์„ฏ์งธ', '์—ฌ์„ฏ์งธ']; + return ordinalNumbers[index] || ''; +} + +function App() { + const [expenseData, setExpenseData] = useState([]); + const currentDate = new Date(); + const currentYear = currentDate.getFullYear(); + const currentMonth = currentDate.getMonth() + 1; + const [selectedYear, setSelectedYear] = useState(currentYear); + const [selectedMonth, setSelectedMonth] = useState(currentMonth); + const chartRefs = useRef<(HTMLCanvasElement | null)[]>([]); + const navigate = useNavigate() + + useEffect(() => { + fetchData(); + }, []); + + useEffect(() => { + updateCharts(); + },); + + const fetchData = async () => { + try { + const data = await expenseSummary('daily'); + setExpenseData(data); + } catch (error) { + console.error('Failed to fetch expense data:', error); + } + }; + + const handleYearChange = (event: React.ChangeEvent): void => { + setSelectedYear(Number(event.target.value)); + }; + + const handleMonthChange = (event: React.ChangeEvent): void => { + setSelectedMonth(Number(event.target.value)); + }; + + const handlePreviousMonth = (): void => { + if (selectedMonth === 1) { + setSelectedYear((prevYear) => prevYear - 1); + setSelectedMonth(12); + } else { + setSelectedMonth((prevMonth) => prevMonth - 1); + } + }; + + const handleNextMonth = (): void => { + if (selectedMonth === 12) { + setSelectedYear((prevYear) => prevYear + 1); + setSelectedMonth(1); + } else { + setSelectedMonth((prevMonth) => prevMonth + 1); + } + }; + + const updateCharts = () => { + chartRefs.current.forEach((chartRef, index) => { + if (chartRef) { + const ctx = chartRef.getContext('2d'); + if (ctx) { + const weeksInMonth = getWeeksInMonth(selectedYear, selectedMonth); + if (weeksInMonth[index]) { + const week = weeksInMonth[index]; + const weekTitle = index === 0 ? '์ฒซ์งธ ์ฃผ' : `${getOrdinalWeek(index)} ์ฃผ`; + let existingChart = Chart.getChart(chartRef); + if (existingChart) { + existingChart.data.labels = week.map((date) => date.split('-')[2]); + existingChart.data.datasets[0].data = week.map((date) => { + const expenseItem = expenseData.find((item) => item._id === date); + return expenseItem ? expenseItem.totalAmount : 0; + }); + existingChart.update(); + } else { + existingChart = new Chart(ctx, { + type: 'bar', + data: { + labels: week.map((date) => date.split('-')[2]), + datasets: [ + { + label: `${weekTitle} ๊ทธ๋ž˜ํ”„`, + data: week.map((date) => { + const expenseItem = expenseData.find((item) => item._id === date); + return expenseItem ? expenseItem.totalAmount : 0; + }), + backgroundColor: 'rgba(75, 192, 192, 0.2)', + borderColor: 'rgba(75, 192, 192, 1)', + borderWidth: 1, + }, + ], + }, + options: { + scales: { + y: { + beginAtZero: true, + }, + }, + }, + }); + } + } + } + } + }); + }; + + const renderMonthGraph = (year: number, month: number) => { + const weeksInMonth = getWeeksInMonth(year, month); + + const weekData = weeksInMonth.map((week, index) => { + const weekTitle = index === 0 ? '์ฒซ์งธ ์ฃผ' : `${getOrdinalWeek(index)} ์ฃผ`; + + const weekExpense = week.reduce((total, date) => { + const expenseItem = expenseData.find((item) => item._id === date); + const totalAmount = expenseItem ? expenseItem.totalAmount : 0; + return total + totalAmount; + }, 0); + + const startDay = Number(week[0].split('-')[2]); + const endDay = Number(week[week.length - 1].split('-')[2]); + + return { + title: weekTitle, + period: `${month}์›” ${startDay}์ผ - ${month}์›” ${endDay}์ผ`, + totalExpense: weekExpense, + }; + }); + + + return ( + + {weekData.map((week, index) => ( + +
    +
  • {`${week.period}`}
  • +
  • {`์ด ๊ธˆ์•ก: ${week.totalExpense .toLocaleString()} ์›`}
  • +
+
+ { + if (el) { + chartRefs.current[index] = el; + } + }} + /> +
+
+ ))} +
+ ); + }; + + const years = []; + for (let i = 2022; i <= 2099; i++) { + years.push( + + ); + } + + const months = []; + for (let i = 1; i <= 12; i++) { + months.push( + + ); + } + + const hanldeBackPage = () => { + navigate('/') + } + + return ( +
+ + + +

์ฃผ๊ฐ„ ๊ทธ๋ž˜ํ”„

+
+ + + + +
+
{renderMonthGraph(selectedYear, selectedMonth)}
+
+ ); +} + +const Div = styled.div` + display: flex; + justify-content: center; + margin: 20px; +` + +const BackButton = styled.button` + border: none; + font-size: 20px; + margin: 15px; + cursor: pointer; + background-color: #fff; + position: relative; +/* left: - 50px; */ + + &:hover { + color: ${theme.colors.red}; + } +`; + +const Button = styled.button` + font-size: 20px; +` + +const Li = styled.li` + color: red; +` + +const H1 = styled.h1` + font-size: 25px; + margin-bottom: 33px; + padding-left: 190px; +` + +const Select = styled.select` + font-size: 16px; +` + +export default App; \ No newline at end of file diff --git a/src/components/modal/AddModal.tsx b/src/components/modal/AddModal.tsx new file mode 100644 index 00000000..82e4b84c --- /dev/null +++ b/src/components/modal/AddModal.tsx @@ -0,0 +1,282 @@ +import React, { useState, useRef } from 'react'; +import ExpensesAmount from './ExpensesAmount'; +import ExpensesTag from './ExpensesTag'; +import DepositTag from './DepositTag'; +import PaymentMethod from './PaymentMethod'; +import { numeric } from '@/lib/utils/Numeric'; +import { createdExpense } from '@/lib/api/Api'; +import { styled, css } from 'styled-components'; +import { theme } from '@/styles/theme'; +import { FaArrowLeft } from 'react-icons/fa'; + +interface AddModalProps { + close: () => void; + onItemUpdated?: () => void; +} + +function AddModal({ close, onItemUpdated }: AddModalProps) { + const [type, setType] = useState(''); // ์ž…๊ธˆ/์ง€์ถœ form + const [amount, setAmount] = useState(0); // ์†Œ๋น„ ๊ธˆ์•ก + const [tag, setTag] = useState(''); // ์นดํ…Œ๊ณ ๋ฆฌ ์†Œ๋น„ ํƒœ๊ทธ + const [paymentMethod, setPaymentMethod] = useState(''); // ๊ฒฐ์ œ ๋ฐฉ์‹ + const [activeButton, setActiveButton] = useState(''); // ๋ฒ„ํŠผ ํ™œ์„ฑํ™” ์ƒํƒœ ํ™•์ธ + const today = new Date().toISOString().slice(0, 10); + const [selectDate, setSelectDate] = useState(today); + const modalRef = useRef(null); + + const handleButtonClick = ( + e: React.MouseEvent, + ) => { + const formType = e.currentTarget.dataset.formType; // ๋ฐ์ดํ„ฐ์…‹์„ ์ด์šฉํ•œ ํƒ€์ž… ์ง€์ • + setType(formType); // ์ง€์ •๋œ ํƒ€์ž…์„ type๊ฐ’์œผ๋กœ + setActiveButton(formType || ''); // ์ง€์ •๋œ type์— ๋”ฐ๋ผ ๋ฒ„ํŠผ ํ™œ์„ฑํ™” + }; + + // numeric + const handleAmountChange = (e: React.ChangeEvent) => { + const input = e.target.value; + setAmount(numeric(input)); + }; + + const handleTagChange = (tags: string) => { + setTag(tags); + }; + + const handleMethodChange = (tags: string) => { + setPaymentMethod(tags); + }; + + const handleSubmit = async () => { + // type์ด expense์ผ ๋•Œ amount๊ฐ€ ์Œ์ˆ˜๋กœ ์„œ๋ฒ„์— ๋ฐ์ดํ„ฐ์— ์ „๋‹ฌ๋˜๊ฒŒ + let formAmount = amount; + if (type === 'expense') { + formAmount = -amount; + } + // category์— ์†Œ๋น„ ํƒœ๊ทธ ๊ฐ’์ด ์žˆ๊ณ , paymentMethod๊ฐ’์ด ์žˆ์„ ๋•Œ ์นดํ…Œ๊ณ ๋ฆฌ์— ์ถ”๊ฐ€ + let category = tag; + if (paymentMethod) { + category += `, ${paymentMethod}`; + } + + const data = { + amount: formAmount, + category: category, + date: new Date(selectDate).toString(), + }; + + await createdExpense(data); + if (onItemUpdated) { + onItemUpdated(); + } + close(); + }; + + const handleDate = (e: React.ChangeEvent) => { + const input = e.target.value; + setSelectDate(input); + }; + + const handleClick = (e: React.MouseEvent) => { + if (e.target === modalRef.current) close(); + }; + + return ( + + + + + + + ๋‚ ์งœ ์„ ํƒ + + + {/*์ž…๊ธˆ ๋ฒ„ํŠผ*/} + + ์ž…๊ธˆ + + {/*์ง€์ถœ ๋ฒ„ํŠผ*/} + + ์ง€์ถœ + + + + {type === 'deposit' ? ( + + ) : type === 'expense' ? ( + + ) : null} + {type === 'deposit' ? null : type === 'expense' ? ( + + ) : null} + ํ™•์ธ + + + + ); +} + +const Container = styled.div` + width: 390px; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + margin: 0 auto; +`; + +const BackButton = styled.button` + border: none; + font-size: 20px; + margin: 15px; + cursor: pointer; + background-color: #fff; + position: relative; + left: -150px; + + &:hover { + color: ${theme.colors.red}; + } +`; + +const StyleDateLabel = styled.label` + margin-bottom: 8px; + font-weight: bold; +`; + +const StyleDate = styled.input` + width: 50%; + text-align: center; +`; + +const ButtonCotainer = styled.div` + display: flex; + gap: 50px; + justify-content: center; + margin: 10px; +`; + +const DepositButton = styled.button<{ + $green?: string; + $active?: boolean; +}>` + width: 100px; + height: 30px; + border-radius: 8px; + font-size: 18px; + font-weight: bold; + border: none; + cursor: pointer; + transition: all ease 1s 0s; + + ${(props) => + props.$green && + css` + &:hover { + background-color: ${theme.colors.green}; + color: #ffffffdb; + background-image: linear-gradient(315deg, #b9fad9, transparent); + } + `} + + ${(props) => + props.$active && + css` + background-color: ${theme.colors.green}; + color: #ffffffdb; + background-image: linear-gradient(315deg, #b9fad9, transparent); + `} +`; + +const ExpenseButton = styled.button<{ + $red?: string; + $active?: boolean; +}>` + width: 100px; + height: 30px; + border-radius: 8px; + font-size: 18px; + font-weight: bold; + border: none; + cursor: pointer; + transition: all ease 1s 0s; + + ${(props) => + props.$red && + css` + &:hover { + background-color: ${theme.colors.red}; + color: #ffffffdb; + background-image: linear-gradient(315deg, #e6b0c3, transparent); + } + `} + + ${(props) => + props.$active && + css` + background-color: ${theme.colors.red}; + color: #ffffffdb; + background-image: linear-gradient(315deg, #e6b0c3, transparent); + `} +`; + +const Submit = styled.button` + width: 250px; + height: 50px; + margin: 10px; + cursor: pointer; + border-radius: 8px; + border: none; + font-size: 18px; + font-weight: bold; + + &:hover { + background-color: #33ff99; + color: #ffffffdb; + } +`; + +const AddModalWraaper = styled.div` + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: rgba(0, 0, 0, 0.5); + display: flex; + justify-content: center; + align-items: center; + z-index: 9999; +`; + +const Modal = styled.div` + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + background-color: #fff; + padding: 20px; + border-radius: 4px; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); + max-width: 400px; + width: 100%; +`; +export default AddModal; diff --git a/src/components/modal/AllTag.tsx b/src/components/modal/AllTag.tsx new file mode 100644 index 00000000..2d34f107 --- /dev/null +++ b/src/components/modal/AllTag.tsx @@ -0,0 +1,78 @@ +/* eslint-disable no-unused-vars */ +import { useState } from 'react'; +import styled from 'styled-components'; +import { tags } from '@/lib/utils/Tags'; + +interface Option { + label: string; + icon: React.ReactNode; +} + +interface AllTagProps { + handleTagChange: (tags: string) => void; +} + +function AllTag({ handleTagChange }: AllTagProps) { + const [isClosed, setIsClosed] = useState(true); // ๋“œ๋กญ๋‹ค์šด ํ˜•์‹์„ ์—ฌ๋‹ซ๋Š” ์ƒํƒœ๊ด€๋ฆฌ + + // ํƒœ๊ทธ๋ฅผ ์„ ํƒํ•˜๋ฉด selectedOption๊ฐ’์œผ๋กœ ์„ ํƒํ•œ option์˜ label์„ ์ „๋‹ฌ + // ๊ทธ๋ฆฌ๊ณ  ๋“œ๋กญ๋‹ค์šด ๋ฉ”๋‰ด ๋‹ซํž˜ + // ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ๋กœ option.label์„ ์ „๋‹ฌ + const handleOptionSelect = (option: Option) => { + setIsClosed(!isClosed); + handleTagChange(option.label); + }; + return ( + <> + ๊ฒ€์ƒ‰ํ•  ํƒœ๊ทธ๋ฅผ ์„ ํƒํ•˜์„ธ์š”. + + {/*์ „๋‹ฌ ๋ฐ›์€ options ๋ฐฐ์—ด์„ map๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•ด์„œ ๊ฐ๊ฐ์˜ label๊ณผ icon์„ ๋ Œ๋”๋ง๋˜๊ฒŒ*/} + {tags.map((option: Option, index: number) => ( + handleOptionSelect(option)}> + {option.icon} + + + ))} + + + ); +} + +const Title = styled.h2` + height: 3rem; + display: flex; + justify-content: center; + align-items: center; +`; + +const ItemBoard = styled.div` + display: flex; + flex-wrap: wrap; +`; + +const MenuItem = styled.div` + margin: 0.5%; + flex: 1 0 24%; + display: flex; + font-size: 16px; + padding: 14px 10px; + align-items: center; + justify-content: center; + flex-direction: column; + + &:hover { + color: red; + cursor: pointer; + transform: scale(1.1); + } +`; + +const IconWrapper = styled.div` + margin-bottom: 0.5rem; +`; + +const Label = styled.span` + font-size: 12px; +`; + +export default AllTag; diff --git a/src/components/modal/DepositTag.tsx b/src/components/modal/DepositTag.tsx new file mode 100644 index 00000000..7d9cc727 --- /dev/null +++ b/src/components/modal/DepositTag.tsx @@ -0,0 +1,18 @@ +/* eslint-disable no-unused-vars */ +import Dropdown from './Dropdown'; +import { depositTags } from '@/lib/utils/Tags'; + +interface DepositTagProps { + handleTagChange: (tags: string) => void; + tag?: string; +} + +function DepositTag({ handleTagChange, tag }: DepositTagProps) { + return ( + // options์œผ๋กœ depositTags ๋ฐฐ์—ด์„ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋กœ ์ „๋‹ฌ + // ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ „๋‹ฌ ๋ฐ›์€ handleTagChange๋ฅผ onSelect๋กœ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋กœ props ์ „๋‹ฌ + + ); +} + +export default DepositTag; diff --git a/src/components/modal/Dropdown.tsx b/src/components/modal/Dropdown.tsx new file mode 100644 index 00000000..6efdad68 --- /dev/null +++ b/src/components/modal/Dropdown.tsx @@ -0,0 +1,109 @@ +/* eslint-disable no-unused-vars */ +import { useState } from 'react'; +import styled from 'styled-components'; + +interface Option { + label: string; + icon: React.ReactNode; +} + +interface DropdownProps { + options: Option[]; + onSelect: (selectedOption: string) => void; + tag?: string; +} + +function Dropdown({ + options, + onSelect, + tag = 'ํƒœ๊ทธ๋ฅผ ์„ ํƒํ•˜์„ธ์š”.', +}: DropdownProps) { + const [isClosed, setIsClosed] = useState(true); // ๋“œ๋กญ๋‹ค์šด ํ˜•์‹์„ ์—ฌ๋‹ซ๋Š” ์ƒํƒœ๊ด€๋ฆฌ + const [selectedOption, setSelectedOption] = useState(tag); // tag๋ฅผ ์„ ํƒํ•˜๊ธฐ ์ „ ์ดˆ๊ธฐ๊ฐ’ + + // ๋“œ๋กญ๋‹ค์šด ๋ฉ”๋‰ด๋ฅผ ํ† ๊ธ€์‹์œผ๋กœ + const toggleDropdown = () => { + setIsClosed(!isClosed); + }; + + // ํƒœ๊ทธ๋ฅผ ์„ ํƒํ•˜๋ฉด selectedOption๊ฐ’์œผ๋กœ ์„ ํƒํ•œ option์˜ label์„ ์ „๋‹ฌ + // ๊ทธ๋ฆฌ๊ณ  ๋“œ๋กญ๋‹ค์šด ๋ฉ”๋‰ด ๋‹ซํž˜ + // ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ๋กœ option.label์„ ์ „๋‹ฌ + const handleOptionSelect = (option: Option) => { + setSelectedOption(option.label); + setIsClosed(!isClosed); + onSelect(option.label); + }; + + return ( + + {selectedOption} + + + {/*์ „๋‹ฌ ๋ฐ›์€ options ๋ฐฐ์—ด์„ map๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•ด์„œ ๊ฐ๊ฐ์˜ label๊ณผ icon์„ ๋ Œ๋”๋ง๋˜๊ฒŒ*/} + {options.map((option: Option, index: number) => ( + handleOptionSelect(option)}> + {option.icon} + + + ))} + + + + ); +} + +const DropdownWrapper = styled.div` + transition: all 0.2s ease-in-out; + overflow: hidden; + margin: 30px; + background: rgb(248, 248, 248); + border: solid 1px rgb(222, 222, 222); + width: 320px; + cursor: pointer; + text-align: center; +`; + +const Title = styled.h2` + height: 48px; + display: flex; + justify-content: center; + align-items: center; +`; + +const Menu = styled.div<{ $closed?: string | undefined }>` + margin: 0; + padding: 0; + list-style-type: none; + height: ${(props) => (props.$closed === 'true' ? '0px' : 'auto')}; +`; + +const ItemBoard = styled.div` + display: flex; + flex-wrap: wrap; +`; + +const MenuItem = styled.div` + display: flex; + align-items: center; + justify-content: center; + flex-direction: column; + font-size: 16px; + padding: 14px 10px; + flex: 1 0 24%; + margin: 0.5%; + + &:hover { + color: red; + } +`; + +const IconWrapper = styled.div` + margin-bottom: 8px; +`; + +const Label = styled.span` + font-size: 12px; +`; + +export default Dropdown; diff --git a/src/components/modal/ExpensesAmount.tsx b/src/components/modal/ExpensesAmount.tsx new file mode 100644 index 00000000..de9ebaed --- /dev/null +++ b/src/components/modal/ExpensesAmount.tsx @@ -0,0 +1,54 @@ +/* eslint-disable no-unused-vars */ +import { ChangeEvent, useRef, useEffect } from 'react'; +import styled from 'styled-components'; + +interface ExpensesAmountProps { + amount: number; + handleAmountChange: (e: ChangeEvent) => void; +} + +function ExpensesAmount({ amount, handleAmountChange }: ExpensesAmountProps) { + const inputRef = useRef(null); + + useEffect(() => { + if (inputRef.current) { + inputRef.current.focus(); + } + }, []); + + return ( + + + + + ); +} + +const AmountContainer = styled.div` + width: 150px; + border-bottom: 1px solid; + display: flex; + justify-content: space-between; + line-height: 1.5; +`; + +const Won = styled.span``; + +const AmountInput = styled.input` + border: none; + width: 100px; + + &:focus { + border: none; + outline: none; + font-weight: bold; + } +`; + +export default ExpensesAmount; diff --git a/src/components/modal/ExpensesTag.tsx b/src/components/modal/ExpensesTag.tsx new file mode 100644 index 00000000..5b3ee19e --- /dev/null +++ b/src/components/modal/ExpensesTag.tsx @@ -0,0 +1,16 @@ +/* eslint-disable no-unused-vars */ +import Dropdown from './Dropdown'; +import { expenseTags } from '@/lib/utils/Tags'; + +interface ExpensesTagProps { + handleTagChange: (tags: string) => void; + tag?: string; +} + +function ExpensesTag({ handleTagChange, tag }: ExpensesTagProps) { + return ( + + ); +} + +export default ExpensesTag; diff --git a/src/components/modal/InfoModal.tsx b/src/components/modal/InfoModal.tsx new file mode 100644 index 00000000..e473a8ad --- /dev/null +++ b/src/components/modal/InfoModal.tsx @@ -0,0 +1,186 @@ +import React, { useState, useRef, useEffect } from 'react'; +import { styled } from 'styled-components'; +import { FaArrowLeft } from 'react-icons/fa'; +import { theme } from '@/styles/theme'; + +interface UpdateModalProps { + amount: number; + category: string; + date: string; + close: () => void; +} + +function InfoModal({ + amount: initialAmount, + category, + date, + close, +}: UpdateModalProps) { + const [type, setType] = useState(); + const amount = Math.abs(initialAmount); + const splitCategory = category.split(', '); + const tag = splitCategory[0]; + const paymentMethod = splitCategory[1]; + const modalRef = useRef(null); + + useEffect(() => { + setType(initialAmount >= 0 ? 'deposit' : 'expense'); + }, [initialAmount]); + + const handleRef = (e: React.MouseEvent) => { + if (e.target === modalRef.current) close(); + }; + + const krDate = new Date(date); + const year = krDate.getFullYear(); // ์—ฐ๋„ + const month = krDate.getMonth() + 1; // ์›” (0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋ฏ€๋กœ +1์„ ํ•ด์คŒ) + const day = krDate.getDate(); // ์ผ + const creationDate = `${year}๋…„ ${month}์›” ${day}์ผ`; + + return ( + + + + + + + {type === 'deposit' ? ( + <> + + < ์ž…๊ธˆ ์ƒ์„ธ ์ •๋ณด > + + + ) : ( + <> + + < ์ง€์ถœ ์ƒ์„ธ ์ •๋ณด > + + + )} + {creationDate} + + ๊ธˆ์•ก {amount.toLocaleString()}์› + + {type === 'deposit' ? ( + <> + + ์ž…๊ธˆ๋‚ด์—ญ {tag} + + + ) : ( + <> + + ์ง€์ถœ๋‚ด์—ญ {tag} + + + ๊ฒฐ์ œ๋ฐฉ๋ฒ• {paymentMethod} + + + )} + + + + ); +} + +const Container = styled.div` + width: 390px; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + margin: 0 auto; +`; + +const BackButton = styled.button` + border: none; + font-size: 20px; + margin: 15px; + cursor: pointer; + background-color: #fff; + position: relative; + left: -150px; + + &:hover { + color: ${theme.colors.red}; + } +`; + +const ModalWrapper = styled.div` + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: rgba(0, 0, 0, 0.5); + display: flex; + justify-content: center; + align-items: center; + z-index: 9999; +`; + +const Modal = styled.div` + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + background-color: #fff; + padding: 20px; + border-radius: 4px; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); + max-width: 400px; + width: 100%; +`; + +const Span = styled.span` + font-size: 16px; + font-weight: bold; + color: #000; +`; + +const TitleDeposit = styled.div` + margin-bottom: 25px; + font-size: 18px; + font-weight: bold; + text-align: center; + color: ${theme.colors.green}; + display: flex; + gap: 5px; +`; + +const TitleExpense = styled.div` + margin-bottom: 25px; + font-size: 18px; + font-weight: bold; + text-align: center; + color: ${theme.colors.red}; + display: flex; + gap: 5px; +`; + +const InfoDate = styled.div` + margin-bottom: 25px; + font-weight: bold; +`; + +const InfoAmount = styled.div` + margin-bottom: 25px; + text-align: center; +`; +const Title = styled.div` + margin-bottom: 15px; + font-size: 18px; + font-weight: 600; +`; + +const InfoTag = styled.div` + margin-bottom: 25px; + text-align: center; +`; + +const InfoPaymentMethod = styled.div` + margin-bottom: 25px; + text-align: center; +`; + +export default InfoModal; diff --git a/src/components/modal/PaymentMethod.tsx b/src/components/modal/PaymentMethod.tsx new file mode 100644 index 00000000..26ad5def --- /dev/null +++ b/src/components/modal/PaymentMethod.tsx @@ -0,0 +1,16 @@ +/* eslint-disable no-unused-vars */ +import Dropdown from './Dropdown'; +import { PaymentTags } from '@/lib/utils/Tags'; + +interface PaymentTagProps { + handleMethodChange: (tags: string) => void; + tag?: string; +} + +function PaymentTag({ handleMethodChange, tag }: PaymentTagProps) { + return ( + + ); +} + +export default PaymentTag; diff --git a/src/components/modal/SearchModal.tsx b/src/components/modal/SearchModal.tsx new file mode 100644 index 00000000..c0acd10a --- /dev/null +++ b/src/components/modal/SearchModal.tsx @@ -0,0 +1,86 @@ +import React, { useRef } from 'react'; +import { styled } from 'styled-components'; +import { theme } from '@/styles/theme'; +import { FaArrowLeft } from 'react-icons/fa'; +import AllTag from './AllTag'; + +interface SearchModalProps { + close: () => void; + setTag: React.Dispatch>; +} + +function SearchModal({ close, setTag }: SearchModalProps) { + const modalRef = useRef(null); + + const handleTagChange = (tags: string) => { + setTag(tags); + close(); + }; + + const handleClick = (e: React.MouseEvent) => { + if (e.target === modalRef.current) close(); + }; + + return ( + + + + + + + + + + + ); +} + +const Container = styled.div` + width: 390px; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + margin: 0 auto; +`; + +const BackButton = styled.button` + border: none; + font-size: 20px; + margin: 15px; + cursor: pointer; + background-color: #fff; + position: relative; + left: -150px; + + &:hover { + color: ${theme.colors.red}; + } +`; + +const SearchModalWraaper = styled.div` + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: rgba(0, 0, 0, 0.5); + display: flex; + justify-content: center; + align-items: center; + z-index: 9999; +`; + +const Modal = styled.div` + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + background-color: #fff; + padding: 20px; + border-radius: 4px; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); + max-width: 400px; + width: 100%; +`; +export default SearchModal; diff --git a/src/components/modal/UpdateModal.tsx b/src/components/modal/UpdateModal.tsx new file mode 100644 index 00000000..21472170 --- /dev/null +++ b/src/components/modal/UpdateModal.tsx @@ -0,0 +1,230 @@ +import React, { useState, useEffect, useRef } from 'react'; +import ExpensesAmount from './ExpensesAmount'; +import ExpensesTag from './ExpensesTag'; +import DepositTag from './DepositTag'; +import PaymentMethod from './PaymentMethod'; +import { numeric } from '@/lib/utils/Numeric'; +import { updatedRecord, deletedRecord } from '@/lib/api/Api'; +import { styled } from 'styled-components'; +import { FaTrashAlt, FaArrowLeft } from 'react-icons/fa'; +import { theme } from '@/styles/theme'; + +interface UpdateModalProps { + amount: number; + category: string; + date: string; + _id: string; + close: () => void; + onItemUpdated: () => void; +} + +// props๋กœ ์ „๋‹ฌ๋ฐ›์€ amount๋ฅผ initialAmount๋กœ ๋ฐ›์Œ. +function UpdateModal({ + amount: initialAmount, + category, + _id, + date, + close, + onItemUpdated, +}: UpdateModalProps) { + const [type, setType] = useState(); + const [amount, setAmount] = useState(Math.abs(initialAmount)); // porps๋กœ ๋ฐ›์€ amount๊ฐ’์„ ๋ Œ๋”๋ง๋  ๋•Œ ์ •์ˆ˜๋กœ + // props๋กœ ๋ฐ›์€ category์˜ ๊ฐ’์ด "์†Œ๋น„ ํƒœ๊ทธ, ๊ฒฐ์ œ ๋ฐฉ๋ฒ•" ํ˜•์‹์ด๊ณ  ์ดˆ๊ธฐ ์ˆ˜์ •ํผ์„ ๋ Œ๋”๋ง ํ•  ๋•Œ + // ์ „๋‹ฌ ๋ฐ›์€ ์†Œ๋น„ ํƒœ๊ทธ์™€ ๊ฒฐ์ œ ๋ฐฉ๋ฒ•์ด ๋ Œ๋”๋ง ๋  ์ˆ˜ ์žˆ๊ฒŒ split์„ ์ด์šฉํ•ด์„œ , ๊ธฐ์ค€์œผ๋กœ ๋ฐฐ์—ด์„ ์ƒ์„ฑ + const splitCategory = category.split(', '); + const [tag, setTag] = useState(splitCategory[0]); + const [paymentMethod, setPaymentMethod] = useState(splitCategory[1]); + const modalRef = useRef(null); + + // useEffect๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋งˆ์šดํŠธ ๋  ๋•Œ initialAmount๊ฐ€ 0๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™์œผ๋ฉด type์€ deposit ์•„๋‹ˆ๋ฉด expense๊ฐ€ ๋œ๋‹ค. + useEffect(() => { + setType(initialAmount >= 0 ? 'deposit' : 'expense'); + }, [initialAmount]); + + const handleAmountChange = (e: React.ChangeEvent) => { + const input = e.target.value; + setAmount(numeric(input)); + }; + + const handleTagChange = (tags: string) => { + setTag(tags); + }; + + const handleMethodChange = (tags: string) => { + setPaymentMethod(tags); + }; + + const handleSubmit = async () => { + const chageData = + // amount ๋˜๋Š” tag๋‚˜ paymentMethod์˜ state์ดˆ๊ธฐ๊ฐ’์ด ๋ฐ”๋€Œ๋Š”์ง€ ํ™•์ธ + amount !== Math.abs(initialAmount) || + tag !== splitCategory[0] || + paymentMethod !== splitCategory[1]; + // ๋ณ€๊ฒฝ๋˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์œผ๋ฉด ๋ชจ๋‹ฌ์„ ๋‹ซ๊ณ  ํ•จ์ˆ˜๋ฅผ ์ข…๋ฃŒํ•œ๋‹ค. + if (!chageData) { + close(); + return; + } + + // ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์žˆ์œผ๋ฉด ์•„๋ž˜ ์ฝ”๋“œ๋“ค์„ ์‹คํ–‰ + // type์ด expense์ผ ๋•Œ ์„œ๋ฒ„๋กœ ์ „๋‹ฌํ•˜๋Š” ๋ฐ์ดํ„ฐ amount๊ฐ€ ์Œ์ˆ˜๊ฐ€ ๋˜๊ฒŒ ์•„๋‹ˆ๋ฉด ์ •์ˆ˜๋กœ + const formAmount = type === 'expense' ? -amount : amount; + + // paymentMethod๊ฐ€ ์žˆ์œผ๋ฉด category์— paymentMethod์˜ ๊ฐ’์„ ์ถ”๊ฐ€ํ•ด์„œ ์„œ๋ฒ„๋กœ ์ „๋‹ฌ + let updatedCategory = tag; + if (paymentMethod) { + updatedCategory += `, ${paymentMethod}`; + } + + const data = { + amount: formAmount, + category: updatedCategory, + date: date, + }; + + await updatedRecord(_id, data); + onItemUpdated(); + close(); + }; + + const handleDeleted = async () => { + await deletedRecord(_id); + onItemUpdated(); + close(); + }; + + // useRef๋ฅผ ์‚ฌ์šฉํ•ด์„œ ModalWrapper๋ฅผ ํด๋ฆญํ•˜๊ฒŒ ๋˜๋ฉด ๋ชจ๋‹ฌ์ด ๋‹ซํžˆ๊ฒŒ + const handleRef = (e: React.MouseEvent) => { + if (e.target === modalRef.current) close(); + }; + + // props๋กœ ์ „๋‹ฌ ๋ฐ›์€ date๊ฐ’์„ ๋ณ€ํ˜• + const krDate = new Date(date); + const year = krDate.getFullYear(); // ์—ฐ๋„ + const month = krDate.getMonth() + 1; // ์›” (0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋ฏ€๋กœ +1์„ ํ•ด์คŒ) + const day = krDate.getDate(); // ์ผ + const creationDate = `${year}๋…„ ${month}์›” ${day}์ผ`; + + return ( + + + + + + + + + + + + {creationDate} + + {/* type์ด deposit์ผ ๋•Œ์™€ expense์ผ ๋•Œ ์‚ผํ•ญ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ Œ๋”๋ง ๋˜๋Š” ์ปดํฌ๋„ŒํŠธ ์„ค์ • */} + {type === 'deposit' ? ( + + ) : ( + + )} + {/* type์ด expense์ผ ๋•Œ๋งŒ PaymentMethod ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง๋˜๊ฒŒ*/} + {type === 'expense' ? ( + + ) : null} + ํ™•์ธ + + + + ); +} + +const Container = styled.div` + width: 390px; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + margin: 0 auto; +`; + +const ButtonContainer = styled.div` + width: 100%; + display: flex; + justify-content: space-between; +`; + +const BackButton = styled.button` + border: none; + font-size: 20px; + margin: 15px; + cursor: pointer; + background-color: #fff; + + &:hover { + color: ${theme.colors.red}; + } +`; + +const DeleteButton = styled.button` + border: none; + font-size: 20px; + margin: 15px; + cursor: pointer; + background-color: #fff; + + &:hover { + color: ${theme.colors.red}; + } +`; + +const DateContainer = styled.div` + margin-bottom: 10px; +`; + +const Submit = styled.button` + width: 250px; + height: 50px; + margin: 10px; + cursor: pointer; + border-radius: 8px; + border: none; + font-size: 18px; + font-weight: bold; + + &:hover { + background-color: #33ff99; + color: #ffffffdb; + } +`; + +const ModalWrapper = styled.div` + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: rgba(0, 0, 0, 0.5); + display: flex; + justify-content: center; + align-items: center; + z-index: 9999; +`; + +const Modal = styled.div` + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + background-color: #fff; + padding: 20px; + border-radius: 4px; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); + max-width: 400px; + width: 100%; +`; + +export default UpdateModal; diff --git a/src/lib/api/Api.ts b/src/lib/api/Api.ts new file mode 100644 index 00000000..a9646f40 --- /dev/null +++ b/src/lib/api/Api.ts @@ -0,0 +1,154 @@ +/* eslint-disable no-console */ +import { API_URL, HEADERS, userId } from '@/lib/api/Base'; + +// ์†Œ๋น„ ๊ธฐ๋ก ์ž‘์„ฑ +export const createdExpense = async (data: ExpenseData) => { + try { + const res = await fetch(`${API_URL}/expenses`, { + method: 'POST', + headers: HEADERS, + body: JSON.stringify({ ...data, userId }), + }); + // ์†Œ๋น„ ๊ธฐ๋ก ์ž‘์„ฑ ์„ฑ๊ณต + if (res.ok) { + const data: ExpenseResponse = await res.json(); + return data; + } + // ์‹คํŒจํ•œ ๊ฒฝ์šฐ + throw new Error('๊ธฐ๋ก ์ž‘์„ฑ์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.'); + } catch (error) { + console.error(error); + throw error; + } +}; + +// ์†Œ๋น„ ํ’ˆ๋ชฉ ๋ชฉ๋ก +export const expenseCategory = async () => { + try { + const res = await fetch(`${API_URL}/categories?userId=${userId}`, { + method: 'GET', + headers: HEADERS, + }); + // ๋ชฉ๋ก ํ˜ธ์ถœ ์„ฑ๊ณต + if (res.ok) { + const data: CategoriesResponse = await res.json(); + return data; + } + // ์‹คํŒจํ•œ ๊ฒฝ์šฐ + throw new Error('์นดํ…Œ๊ณ ๋ฆฌ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š”๋ฐ ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.'); + } catch (error) { + console.error(error); + throw error; + } +}; + +// ๊ฒ€์ƒ‰์–ด์— ํ•ด๋‹นํ•˜๋Š” ์†Œ๋น„ ํ•ญ๋ชฉ ๋ฐ ๊ธˆ์•ก ์กฐํšŒ +export const expenseSearch = async (keyword: string) => { + try { + const encodedKeyword = encodeURIComponent(keyword); + const res = await fetch( + `${API_URL}/expenses/search?q=${encodedKeyword}&userId=${userId}`, + { + method: 'GET', + headers: HEADERS, + }, + ); + + // ์„ฑ๊ณต + if (res.ok) { + const data: SearchResponse = await res.json(); + return data; + } + // ์‹คํŒจ + throw new Error('๊ฒ€์ƒ‰์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.'); + } catch (error) { + console.error(error); + throw error; + } +}; + +// ์ผ๋ณ„, ์ฃผ๋ณ„, ์›”๋ณ„ ์†Œ๋น„ ์กฐํšŒ +export const expenseSummary = async (period: string) => { + try { + const res = await fetch( + `${API_URL}/expenses/summary?period=${period}&userId=${userId}`, + { + method: 'GET', + headers: HEADERS, + }, + ); + if (res.ok) { + const data: SummaryResponseItem[] = await res.json(); + return data; + } + + throw new Error('์กฐํšŒ์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.'); + } catch (error) { + console.error(error); + throw error; + } +}; + +// ์†Œ๋น„ ๊ธฐ๋ก ์ˆ˜์ • +export const updatedRecord = async (id: string, data: ExpenseData) => { + try { + const res = await fetch(`${API_URL}/expenses/${id}`, { + method: 'PUT', + headers: HEADERS, + body: JSON.stringify(data), + }); + + if (res.ok) { + const data: UpdateResponse = await res.json(); + return data; + } + + throw new Error('์ˆ˜์ •์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.'); + } catch (error) { + console.error(error); + throw error; + } +}; + +// ์†Œ๋น„ ๊ธฐ๋ก ์‚ญ์ œ +export const deletedRecord = async (id: string) => { + try { + const res = await fetch(`${API_URL}/expenses/${id}`, { + method: 'DELETE', + headers: HEADERS, + }); + + if (res.ok) { + const data: DeleteResponse = await res.json(); + return data; + } + + throw new Error('์‚ญ์ œ์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.'); + } catch (error) { + console.error(error); + throw error; + } +}; + +// ์†Œ๋น„ ๊ธฐ๋ก ๋‹ฌ๋ ฅ ํ˜ธ์ถœ +export const calendarData = async (year: number, month: number) => { + try { + const res = await fetch( + `${API_URL}/expenses/calendar?year=${year}&month=${month}&userId=${userId}`, + { + method: 'GET', + headers: HEADERS, + }, + ); + + if (res.ok) { + const data = await res.json(); + return data; + } + + throw new Error('ํ˜ธ์ถœ์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.'); + } catch (error) { + console.error(error); + throw error; + } +}; diff --git a/src/lib/api/Base.ts b/src/lib/api/Base.ts new file mode 100644 index 00000000..3c7366ce --- /dev/null +++ b/src/lib/api/Base.ts @@ -0,0 +1,7 @@ +export const API_URL = import.meta.env.VITE_BASE_URL; + +export const HEADERS = { + 'content-Type': 'application/json', +} + +export const userId = localStorage.getItem('userId') \ No newline at end of file diff --git a/src/lib/utils/Icons.tsx b/src/lib/utils/Icons.tsx new file mode 100644 index 00000000..7339baf4 --- /dev/null +++ b/src/lib/utils/Icons.tsx @@ -0,0 +1,76 @@ +import { + FaUtensils, + FaBus, + FaFilm, + FaSprayCan, + FaTshirt, + FaCut, + FaStethoscope, + FaPencilAlt, + FaMobileAlt, + FaBeer, + FaRegHandshake, + FaPiggyBank, + FaTv, + FaReceipt, + FaCreditCard, + FaEllipsisH, + FaMoneyBill, + FaMoneyCheck, + FaMoneyCheckAlt, + FaAngleLeft, + FaAngleRight, + FaSearch, +} from 'react-icons/fa'; + +const foodIcon = ; // ์‹๋น„ +const transportationIcon = ; // ๊ตํ†ต๋น„ +const culturalIcon = ; // ๋ฌธํ™”์ƒํ™œ +const dailyNecessityIcon = ; // ์ƒํ•„ํ’ˆ +const clothesIcon = ; // ์˜๋ฅ˜ +const beautyIcon = ; // ๋ฏธ์šฉ +const medicalHealthIcon = ; // ์˜๋ฃŒ/๊ฑด๊ฐ• +const educationIcon = ; // ๊ต์œก +const communicationIcon = ; // ํ†ต์‹ ๋น„ +const gatheringIcon = ; // ํšŒ์‹/๋ชจ์ž„ +const eventsIcon = ; // ๊ฒฝ์กฐ์‚ฌ +const savingIcon = ; // ์ €์ถ• +const electronicsIcon = ; // ๊ฐ€์ „ +const utilitiesIcon = ; // ๊ณต๊ณผ๊ธˆ +const cardIcon = ; // ์นด๋“œ๋Œ€๊ธˆ +const etcIcon = ; // ๊ธฐํƒ€ +const salaryIcon = ; // +const moneyIcon = ; +const cashIcon = ; +const debitCardIcon = ; +const creditCardIcon = ; +const leftIcon = ; +const rightIcon = ; +const searchIcon = ; + +export { + foodIcon, + transportationIcon, + culturalIcon, + dailyNecessityIcon, + clothesIcon, + beautyIcon, + medicalHealthIcon, + educationIcon, + communicationIcon, + gatheringIcon, + eventsIcon, + savingIcon, + electronicsIcon, + utilitiesIcon, + cardIcon, + etcIcon, + salaryIcon, + moneyIcon, + cashIcon, + debitCardIcon, + creditCardIcon, + leftIcon, + rightIcon, + searchIcon, +}; diff --git a/src/lib/utils/Numeric.ts b/src/lib/utils/Numeric.ts new file mode 100644 index 00000000..4a681eeb --- /dev/null +++ b/src/lib/utils/Numeric.ts @@ -0,0 +1,5 @@ +// input์— ์ˆซ์ž๊ฐ€ ์•„๋‹Œ ๋ถ€๋ถ„์„ ์ฐพ์•„์„œ ์ œ๊ฑฐ +// ์ˆซ์ž ๋‹จ์œ„์— , ๊ฐ€ ํ•„์š”ํ•˜๋ฉด input value๊ฐ’์— .toLocaleString() +export const numeric = (input: string) => { + return Number(input.replace(/[^0-9]/g, '')); +} \ No newline at end of file diff --git a/src/lib/utils/Tags.tsx b/src/lib/utils/Tags.tsx new file mode 100644 index 00000000..38834c75 --- /dev/null +++ b/src/lib/utils/Tags.tsx @@ -0,0 +1,95 @@ +import { + foodIcon, + transportationIcon, + culturalIcon, + dailyNecessityIcon, + clothesIcon, + beautyIcon, + medicalHealthIcon, + educationIcon, + communicationIcon, + gatheringIcon, + eventsIcon, + savingIcon, + electronicsIcon, + utilitiesIcon, + cardIcon, + etcIcon, + salaryIcon, + moneyIcon, + cashIcon, + debitCardIcon, + creditCardIcon, +} from '@/lib/utils/Icons'; +import styled from 'styled-components'; + +export const tags = [ + { label: '์‹๋น„', icon: foodIcon }, + { label: '๋ฌธํ™”์ƒํ™œ', icon: culturalIcon }, + { label: '๊ตํ†ต๋น„', icon: transportationIcon }, + { label: '์ƒํ•„ํ’ˆ', icon: dailyNecessityIcon }, + { label: '์˜๋ฅ˜', icon: clothesIcon }, + { label: '๋ฏธ์šฉ', icon: beautyIcon }, + { label: '์˜๋ฃŒ/๊ฑด๊ฐ•', icon: medicalHealthIcon }, + { label: '๊ต์œก', icon: educationIcon }, + { label: 'ํ†ต์‹ ๋น„', icon: communicationIcon }, + { label: 'ํšŒ์‹/๋ชจ์ž„', icon: gatheringIcon }, + { label: '๊ฒฝ์กฐ์‚ฌ', icon: eventsIcon }, + { label: '์ €์ถ•', icon: savingIcon }, + { label: '๊ฐ€์ „', icon: electronicsIcon }, + { label: '๊ณต๊ณผ๊ธˆ', icon: utilitiesIcon }, + { label: '์นด๋“œ๋Œ€๊ธˆ', icon: cardIcon }, + { label: '๊ธฐํƒ€', icon: etcIcon }, + { label: '์›”๊ธ‰', icon: salaryIcon }, + { label: '์šฉ๋ˆ', icon: moneyIcon }, + { label: 'ํ˜„๊ธˆ', icon: cashIcon }, + { label: '์ฒดํฌ์นด๋“œ', icon: debitCardIcon }, + { label: '์‹ ์šฉ์นด๋“œ', icon: creditCardIcon }, +]; + +export const expenseTags = [ + { label: '์‹๋น„', icon: foodIcon }, + { label: '๋ฌธํ™”์ƒํ™œ', icon: culturalIcon }, + { label: '๊ตํ†ต๋น„', icon: transportationIcon }, + { label: '์ƒํ•„ํ’ˆ', icon: dailyNecessityIcon }, + { label: '์˜๋ฅ˜', icon: clothesIcon }, + { label: '๋ฏธ์šฉ', icon: beautyIcon }, + { label: '์˜๋ฃŒ/๊ฑด๊ฐ•', icon: medicalHealthIcon }, + { label: '๊ต์œก', icon: educationIcon }, + { label: 'ํ†ต์‹ ๋น„', icon: communicationIcon }, + { label: 'ํšŒ์‹/๋ชจ์ž„', icon: gatheringIcon }, + { label: '๊ฒฝ์กฐ์‚ฌ', icon: eventsIcon }, + { label: '์ €์ถ•', icon: savingIcon }, + { label: '๊ฐ€์ „', icon: electronicsIcon }, + { label: '๊ณต๊ณผ๊ธˆ', icon: utilitiesIcon }, + { label: '์นด๋“œ๋Œ€๊ธˆ', icon: cardIcon }, + { label: '๊ธฐํƒ€', icon: etcIcon }, +]; + +export const depositTags = [ + { label: '์›”๊ธ‰', icon: salaryIcon }, + { label: '์šฉ๋ˆ', icon: moneyIcon }, + { label: '๊ธฐํƒ€', icon: etcIcon }, +]; + +const CashIcon = () => {cashIcon}; +const DebitCardIcon = () => {debitCardIcon}; +const CreditCardIcon = () => {creditCardIcon}; + +export const PaymentTags = [ + { label: 'ํ˜„๊ธˆ', icon: }, + { label: '์ฒดํฌ์นด๋“œ', icon: }, + { label: '์‹ ์šฉ์นด๋“œ', icon: } +]; + +const StyledCashIcon = styled.span ` + color: green; +`; + +const StyledDebitCardIcon = styled.span ` + color: blue; +`; + +const StyledCreditCardIcon = styled.span ` + color: red; +`; diff --git a/src/lib/utils/weekNumFn.ts b/src/lib/utils/weekNumFn.ts new file mode 100644 index 00000000..474494a4 --- /dev/null +++ b/src/lib/utils/weekNumFn.ts @@ -0,0 +1,33 @@ +// year(์—ฐ), month(์›”), day(์ผ)์„ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์•„, ํ˜„์žฌ ๋‚ ์งœ๊ฐ€ ํ•ด๋‹น ์—ฐ๋„์˜ ๋ช‡ ์ฃผ์ฐจ์ธ์ง€ ๊ตฌํ•˜๋Š” ํ•จ์ˆ˜. + +function weekNumFn(year: number, month: number, day: number): number { + const date = new Date(year, month - 1, day); + const firstDayOfYear = new Date(year, 0, 1); // ํ•ด๋‹น ์—ฐ๋„์˜ ์ฒซ ๋‚  (****-01-01) + const daysDifference = + // (date.valueof() - firstDayOfYear.valueOf()): ๊ตฌํ•˜๊ณ ์ž ํ•˜๋Š” ๋‚ ์งœ์™€ ํ•ด๋‹น ๋…„๋„ ์ฒซ์งธ ๋‚ ์˜ ์‹œ๊ฐ„ ์ฐจ์ด ๊ณ„์‚ฐ + // ์‹œ๊ฐ„ ์ฐจ์ด๋ฅผ ์ผ ๋‹จ์œ„๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ ์œ„ํ•ด (1000(ms) * 60(s) * 60(m) + 24(H))๋กœ ๋‚˜๋ˆ”. + // daysDiffernece = ๋‘ ๋‚ ์งœ ์‚ฌ์ด์˜ ์ฐจ (์ผ) + (date.valueOf() - firstDayOfYear.valueOf()) / (1000 * 60 * 60 * 24); + + // 1์›” 1์ผ์ด 1์ฃผ์ฐจ์ด๋ฏ€๋กœ, 1๋ฅผ ๋”ํ•œ ๋’ค, 7๋กœ ๋‚˜๋ˆ„์–ด ์ฃผ์ฐจ ๊ณ„์‚ฐ + const weekNumber = Math.ceil((daysDifference + 1) / 7); + + return weekNumber; +} + +function weekToNumFn(year: number, month: number, week: number): number { + const firstDayOfYear = new Date(year, 0, 1); + const firstWeekDay = firstDayOfYear.getDay(); // ํ•ด๋‹น ์—ฐ๋„์˜ ์ฒซ์งธ ๋‚ ์˜ ์š”์ผ (0-6) + const daysOffset = (week - 1) * 7 - firstWeekDay; // ํ•ด๋‹น ์—ฐ๋„์˜ ์ฒซ์งธ ๋‚ ๋กœ๋ถ€ํ„ฐ์˜ ๋‚ ์งœ ์ฐจ์ด ๊ณ„์‚ฐ์„ ์œ„ํ•œ ์˜คํ”„์…‹ + + const date = new Date(year, month - 1, 1); // ์ง€์ •๋œ ์›”์˜ ์ฒซ์งธ ๋‚ ๋กœ ์‹œ์ž‘ + date.setDate(date.getDate() + daysOffset); // ๊ณ„์‚ฐ๋œ ๋‚ ์งœ ์ฐจ์ด๋งŒํผ ๋‚ ์งœ ์˜คํ”„์…‹ + + const daysDifference = + (date.valueOf() - firstDayOfYear.valueOf()) / (1000 * 60 * 60 * 24); // ์˜คํ”„์…‹๋œ ๋‚ ์งœ์™€ ํ•ด๋‹น ์—ฐ๋„์˜ ์ฒซ์งธ ๋‚  ์‚ฌ์ด์˜ ๋‚ ์งœ ์ฐจ์ด ๊ณ„์‚ฐ + + const weekNumber = Math.ceil((daysDifference + 1) / 7); // ์ฃผ์ฐจ ๊ณ„์‚ฐ + + return weekNumber; +} +export { weekNumFn, weekToNumFn }; diff --git a/src/main.tsx b/src/main.tsx new file mode 100644 index 00000000..f2afc7b5 --- /dev/null +++ b/src/main.tsx @@ -0,0 +1,15 @@ +import React from 'react'; +import App from '@/App.tsx'; +import { theme } from '@/styles/theme'; +import ReactDOM from 'react-dom/client'; +import GlobalStyle from '@/styles/GlobalStyle'; +import { ThemeProvider } from 'styled-components'; + +ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render( + + + + + + , +); diff --git a/src/styles/GlobalStyle.ts b/src/styles/GlobalStyle.ts new file mode 100644 index 00000000..31e8dbdf --- /dev/null +++ b/src/styles/GlobalStyle.ts @@ -0,0 +1,68 @@ +import { createGlobalStyle } from 'styled-components'; + +const GlobalStyle = createGlobalStyle` + html, body, div, span, applet, object, iframe, + h1, h2, h3, h4, h5, h6, p, blockquote, pre, + a, abbr, acronym, address, big, cite, code, + del, dfn, em, img, ins, kbd, q, s, samp, + small, strike, strong, sub, sup, tt, var, + b, u, i, center, + dl, dt, dd, ol, ul, li, + fieldset, form, label, legend, + table, caption, tbody, tfoot, thead, tr, th, td, + article, aside, canvas, details, embed, + figure, figcaption, footer, header, hgroup, + menu, nav, output, ruby, section, summary, + time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; + box-sizing: border-box; + } + /* HTML5 display-role reset for older browsers */ + article, aside, details, figcaption, figure, + footer, header, hgroup, menu, nav, section { + display: block; + } + body { + font-family: 'NanumSquare', sans-serif; + line-height: 1; + -ms-overflow-style: none; + ::-webkit-scrollbar { + display: none !important; + } + } + ol, ul { + list-style: none; + } + blockquote, q { + quotes: none; + } + blockquote:before, blockquote:after, + q:before, q:after { + content: ''; + content: none; + } + table { + border-collapse: collapse; + border-spacing: 0; + } + a { + text-decoration: none; + color: inherit; + display: block; + } + button { + border: none; + cursor: pointer; + background: none; + } + * { + box-sizing: inherit; + } +`; + +export default GlobalStyle; diff --git a/src/styles/styled.d.ts b/src/styles/styled.d.ts new file mode 100644 index 00000000..b8fcb3de --- /dev/null +++ b/src/styles/styled.d.ts @@ -0,0 +1,15 @@ +import 'styled-components'; + +declare module 'styled-components' { + export interface DefaultTheme { + colors: { + green: string; + lightGreen: string; + deepGreen: string; + red: string; + gray: string[]; + blue: string; + deepBlue: string; + }; + } +} diff --git a/src/styles/theme.ts b/src/styles/theme.ts new file mode 100644 index 00000000..6b226b6b --- /dev/null +++ b/src/styles/theme.ts @@ -0,0 +1,14 @@ +import { DefaultTheme } from 'styled-components'; + +//์ƒ์„ธ ๋””์ž์ธ ์Šคํƒ€์ผ์€ ์šฐ์ฃผ๋ถ€๋™์‚ฐ ํ”ผ๊ทธ๋งˆ์— ์ •๋ฆฌ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. +export const theme: DefaultTheme = { + colors: { + green: '#33ff99', + lightGreen: '#b9fad9', + deepGreen: '#13bd7e', + red: '#e73273', + gray: ['#eaeaea96', '#B2B2B2', '#3C4048'], + blue: '#8CC0DE', + deepBlue: '#0000ff', + }, +}; diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts new file mode 100644 index 00000000..11f02fe2 --- /dev/null +++ b/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/tsconfig.node.json b/tsconfig.node.json new file mode 100644 index 00000000..42872c59 --- /dev/null +++ b/tsconfig.node.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 00000000..170ba466 --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,41 @@ +import { defineConfig } from 'vite'; +import react from '@vitejs/plugin-react'; +import * as path from 'path'; + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [react()], + resolve: { + alias: { + '@': path.resolve(__dirname, './src'), + }, + }, + + build: { + rollupOptions: { + output: { + manualChunks(id) { + if (id.includes('node_modules')) { + return id + .toString() + .split('node_modules/')[1] + .split('/')[0] + .toString(); + } + }, + }, + }, + }, + + server: { + proxy: { + '/api': { + target: 'https://chickenlecture.xyz/', + changeOrigin: true, + rewrite: (path) => path.replace(/^\/api/, ''), + }, + }, + port: 3000, + }, + envDir: '.', +}); \ No newline at end of file