build(deps):增加一些基本的项目配置和基础代码结构。
This commit is contained in:
		
							
								
								
									
										20
									
								
								.editorconfig
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								.editorconfig
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,20 @@ | |||||||
|  | # http://editorconfig.org | ||||||
|  | root = true | ||||||
|  |  | ||||||
|  | [*] | ||||||
|  | indent_style = space | ||||||
|  | indent_size = 2 | ||||||
|  | end_of_line = lf | ||||||
|  | trim_trailing_whitespace = true | ||||||
|  | insert_final_newline = true | ||||||
|  | charset = utf-8 | ||||||
|  | spaces_around_operators = true | ||||||
|  |  | ||||||
|  | [*.rs] | ||||||
|  | indent_size = 4 | ||||||
|  | indent_style = space | ||||||
|  | end_of_line = lf | ||||||
|  | trim_trailing_whitespace = true | ||||||
|  | insert_final_newline = true | ||||||
|  | charset = utf-8 | ||||||
|  | spaces_around_operators = true | ||||||
							
								
								
									
										34
									
								
								.eslintrc.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								.eslintrc.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,34 @@ | |||||||
|  | module.exports = { | ||||||
|  |   root: true, | ||||||
|  |   env: { | ||||||
|  |     node: true, | ||||||
|  |     browser: true, | ||||||
|  |     commonjs: true, | ||||||
|  |     es6: true, | ||||||
|  |     amd: true | ||||||
|  |   }, | ||||||
|  |   parser: '@typescript-eslint/parser', | ||||||
|  |   parserOptions: { | ||||||
|  |     tsconfigRootDir: __dirname, | ||||||
|  |     project: ['./tsconfig.eslint.json'] | ||||||
|  |   }, | ||||||
|  |   plugins: ['@typescript-eslint'], | ||||||
|  |   extends: [ | ||||||
|  |     'eslint:recommended', | ||||||
|  |     'plugin:@typescript-eslint/recommended', | ||||||
|  |     'plugin:@typescript-eslint/recommended-requiring-type-checking' | ||||||
|  |   ], | ||||||
|  |   overrides: [ | ||||||
|  |     { | ||||||
|  |       files: ['**/*.tsx', '**/*.ts', '**/*.js'], | ||||||
|  |       rules: { | ||||||
|  |         '@typescript-eslint/no-misused-promises': 'off', | ||||||
|  |         '@typescript-eslint/no-unsafe-return': 'off', | ||||||
|  |         '@typescript-eslint/no-unsafe-argument': 'off', | ||||||
|  |         '@typescript-eslint/restrict-template-expressions': 'off', | ||||||
|  |         '@typescript-eslint/no-unsafe-assignment': 'off', | ||||||
|  |         '@typescript-eslint/ban-ts-comment': 'off' | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   ] | ||||||
|  | }; | ||||||
							
								
								
									
										18
									
								
								.prettierignore
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								.prettierignore
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,18 @@ | |||||||
|  | *.min.js | ||||||
|  | /node_modules | ||||||
|  | /dist | ||||||
|  | # OS | ||||||
|  | .DS_Store | ||||||
|  | .idea | ||||||
|  | .editorconfig | ||||||
|  | .npmrc | ||||||
|  | package-lock.json | ||||||
|  | # Ignored suffix | ||||||
|  | *.log | ||||||
|  | *.md | ||||||
|  | *.svg | ||||||
|  | *.png | ||||||
|  | *ignore | ||||||
|  | ## Built-files | ||||||
|  | .cache | ||||||
|  | dist | ||||||
							
								
								
									
										18
									
								
								.prettierrc.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								.prettierrc.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,18 @@ | |||||||
|  | { | ||||||
|  |   "printWidth": 100, | ||||||
|  |   "tabWidth": 2, | ||||||
|  |   "useTabs": false, | ||||||
|  |   "semi": true, | ||||||
|  |   "singleQuote": true, | ||||||
|  |   "quoteProps": "as-needed", | ||||||
|  |   "jsxSingleQuote": false, | ||||||
|  |   "trailingComma": "none", | ||||||
|  |   "bracketSpacing": true, | ||||||
|  |   "jsxBracketSameLine": false, | ||||||
|  |   "arrowParens": "avoid", | ||||||
|  |   "requirePragma": false, | ||||||
|  |   "insertPragma": false, | ||||||
|  |   "proseWrap": "preserve", | ||||||
|  |   "htmlWhitespaceSensitivity": "css", | ||||||
|  |   "endOfLine": "lf" | ||||||
|  | } | ||||||
							
								
								
									
										16
									
								
								package.json
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								package.json
									
									
									
									
									
								
							| @@ -7,7 +7,8 @@ | |||||||
|     "dev": "vite", |     "dev": "vite", | ||||||
|     "build": "tsc && vite build", |     "build": "tsc && vite build", | ||||||
|     "preview": "vite preview", |     "preview": "vite preview", | ||||||
|     "tauri": "tauri" |     "tauri": "tauri", | ||||||
|  |     "tauri-dev": "tauri dev" | ||||||
|   }, |   }, | ||||||
|   "dependencies": { |   "dependencies": { | ||||||
|     "@emotion/css": "^11.10.6", |     "@emotion/css": "^11.10.6", | ||||||
| @@ -21,17 +22,26 @@ | |||||||
|     "@mantine/nprogress": "^6.0.0", |     "@mantine/nprogress": "^6.0.0", | ||||||
|     "@tabler/icons-react": "^2.8.0", |     "@tabler/icons-react": "^2.8.0", | ||||||
|     "@tauri-apps/api": "^1.2.0", |     "@tauri-apps/api": "^1.2.0", | ||||||
|  |     "@tanstack/react-virtual": "3.0.0-beta.35", | ||||||
|  |     "framer-motion": "^8.1.1", | ||||||
|  |     "immer": "^9.0.17", | ||||||
|  |     "ramda": "^0.28.0", | ||||||
|     "react": "^18.2.0", |     "react": "^18.2.0", | ||||||
|     "react-dom": "^18.2.0", |     "react-dom": "^18.2.0", | ||||||
|     "react-router-dom": "^6.8.2" |     "react-router-dom": "^6.8.2", | ||||||
|  |     "react-use": "^17.4.0", | ||||||
|  |     "use-immer": "^0.8.1", | ||||||
|  |     "zustand": "^4.2.0" | ||||||
|   }, |   }, | ||||||
|   "devDependencies": { |   "devDependencies": { | ||||||
|  |     "@babel/core": "^7.0.0", | ||||||
|     "@tauri-apps/cli": "^1.2.2", |     "@tauri-apps/cli": "^1.2.2", | ||||||
|     "@types/node": "^18.7.10", |     "@types/node": "^18.7.10", | ||||||
|  |     "@types/ramda": "^0.28.20", | ||||||
|     "@types/react": "^18.0.15", |     "@types/react": "^18.0.15", | ||||||
|     "@types/react-dom": "^18.0.6", |     "@types/react-dom": "^18.0.6", | ||||||
|     "@vitejs/plugin-react": "^3.0.0", |     "@vitejs/plugin-react": "^3.0.0", | ||||||
|     "typescript": "^4.6.4", |     "typescript": "^4.6.4", | ||||||
|     "vite": "^4.0.0" |     "vite": "^4.0.0" | ||||||
|   } |   } | ||||||
| } | } | ||||||
							
								
								
									
										353
									
								
								pnpm-lock.yaml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										353
									
								
								pnpm-lock.yaml
									
									
									
										generated
									
									
									
								
							| @@ -1,6 +1,7 @@ | |||||||
| lockfileVersion: 5.4 | lockfileVersion: 5.4 | ||||||
|  |  | ||||||
| specifiers: | specifiers: | ||||||
|  |   '@babel/core': ^7.0.0 | ||||||
|   '@emotion/css': ^11.10.6 |   '@emotion/css': ^11.10.6 | ||||||
|   '@emotion/react': ^11.10.6 |   '@emotion/react': ^11.10.6 | ||||||
|   '@emotion/styled': ^11.10.6 |   '@emotion/styled': ^11.10.6 | ||||||
| @@ -11,17 +12,25 @@ specifiers: | |||||||
|   '@mantine/notifications': ^6.0.0 |   '@mantine/notifications': ^6.0.0 | ||||||
|   '@mantine/nprogress': ^6.0.0 |   '@mantine/nprogress': ^6.0.0 | ||||||
|   '@tabler/icons-react': ^2.8.0 |   '@tabler/icons-react': ^2.8.0 | ||||||
|  |   '@tanstack/react-virtual': 3.0.0-beta.35 | ||||||
|   '@tauri-apps/api': ^1.2.0 |   '@tauri-apps/api': ^1.2.0 | ||||||
|   '@tauri-apps/cli': ^1.2.2 |   '@tauri-apps/cli': ^1.2.2 | ||||||
|   '@types/node': ^18.7.10 |   '@types/node': ^18.7.10 | ||||||
|  |   '@types/ramda': ^0.28.20 | ||||||
|   '@types/react': ^18.0.15 |   '@types/react': ^18.0.15 | ||||||
|   '@types/react-dom': ^18.0.6 |   '@types/react-dom': ^18.0.6 | ||||||
|   '@vitejs/plugin-react': ^3.0.0 |   '@vitejs/plugin-react': ^3.0.0 | ||||||
|  |   framer-motion: ^8.1.1 | ||||||
|  |   immer: ^9.0.17 | ||||||
|  |   ramda: ^0.28.0 | ||||||
|   react: ^18.2.0 |   react: ^18.2.0 | ||||||
|   react-dom: ^18.2.0 |   react-dom: ^18.2.0 | ||||||
|   react-router-dom: ^6.8.2 |   react-router-dom: ^6.8.2 | ||||||
|  |   react-use: ^17.4.0 | ||||||
|   typescript: ^4.6.4 |   typescript: ^4.6.4 | ||||||
|  |   use-immer: ^0.8.1 | ||||||
|   vite: ^4.0.0 |   vite: ^4.0.0 | ||||||
|  |   zustand: ^4.2.0 | ||||||
|  |  | ||||||
| dependencies: | dependencies: | ||||||
|   '@emotion/css': 11.10.6 |   '@emotion/css': 11.10.6 | ||||||
| @@ -34,14 +43,23 @@ dependencies: | |||||||
|   '@mantine/notifications': 6.0.0_uziugpv5zwkk3pqsn64qbjkxrm |   '@mantine/notifications': 6.0.0_uziugpv5zwkk3pqsn64qbjkxrm | ||||||
|   '@mantine/nprogress': 6.0.0_uziugpv5zwkk3pqsn64qbjkxrm |   '@mantine/nprogress': 6.0.0_uziugpv5zwkk3pqsn64qbjkxrm | ||||||
|   '@tabler/icons-react': 2.8.0_react@18.2.0 |   '@tabler/icons-react': 2.8.0_react@18.2.0 | ||||||
|  |   '@tanstack/react-virtual': 3.0.0-beta.35_react@18.2.0 | ||||||
|   '@tauri-apps/api': 1.2.0 |   '@tauri-apps/api': 1.2.0 | ||||||
|  |   framer-motion: 8.5.5_biqbaboplfbrettd7655fr4n2y | ||||||
|  |   immer: 9.0.19 | ||||||
|  |   ramda: 0.28.0 | ||||||
|   react: 18.2.0 |   react: 18.2.0 | ||||||
|   react-dom: 18.2.0_react@18.2.0 |   react-dom: 18.2.0_react@18.2.0 | ||||||
|   react-router-dom: 6.8.2_biqbaboplfbrettd7655fr4n2y |   react-router-dom: 6.8.2_biqbaboplfbrettd7655fr4n2y | ||||||
|  |   react-use: 17.4.0_biqbaboplfbrettd7655fr4n2y | ||||||
|  |   use-immer: 0.8.1_immer@9.0.19+react@18.2.0 | ||||||
|  |   zustand: 4.3.6_immer@9.0.19+react@18.2.0 | ||||||
|  |  | ||||||
| devDependencies: | devDependencies: | ||||||
|  |   '@babel/core': 7.21.0 | ||||||
|   '@tauri-apps/cli': 1.2.3 |   '@tauri-apps/cli': 1.2.3 | ||||||
|   '@types/node': 18.14.6 |   '@types/node': 18.14.6 | ||||||
|  |   '@types/ramda': 0.28.23 | ||||||
|   '@types/react': 18.0.28 |   '@types/react': 18.0.28 | ||||||
|   '@types/react-dom': 18.0.11 |   '@types/react-dom': 18.0.11 | ||||||
|   '@vitejs/plugin-react': 3.1.0_vite@4.1.4 |   '@vitejs/plugin-react': 3.1.0_vite@4.1.4 | ||||||
| @@ -319,12 +337,25 @@ packages: | |||||||
|     resolution: {integrity: sha512-14FtKiHhy2QoPIzdTcvh//8OyBlknNs2nXRwIhG904opCby3l+9Xaf/wuPvICBF0rc1ZCNBd3nKe9cd2mecVkQ==} |     resolution: {integrity: sha512-14FtKiHhy2QoPIzdTcvh//8OyBlknNs2nXRwIhG904opCby3l+9Xaf/wuPvICBF0rc1ZCNBd3nKe9cd2mecVkQ==} | ||||||
|     dev: false |     dev: false | ||||||
|  |  | ||||||
|  |   /@emotion/is-prop-valid/0.8.8: | ||||||
|  |     resolution: {integrity: sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==} | ||||||
|  |     requiresBuild: true | ||||||
|  |     dependencies: | ||||||
|  |       '@emotion/memoize': 0.7.4 | ||||||
|  |     dev: false | ||||||
|  |     optional: true | ||||||
|  |  | ||||||
|   /@emotion/is-prop-valid/1.2.0: |   /@emotion/is-prop-valid/1.2.0: | ||||||
|     resolution: {integrity: sha512-3aDpDprjM0AwaxGE09bOPkNxHpBd+kA6jty3RnaEXdweX1DF1U3VQpPYb0g1IStAuK7SVQ1cy+bNBBKp4W3Fjg==} |     resolution: {integrity: sha512-3aDpDprjM0AwaxGE09bOPkNxHpBd+kA6jty3RnaEXdweX1DF1U3VQpPYb0g1IStAuK7SVQ1cy+bNBBKp4W3Fjg==} | ||||||
|     dependencies: |     dependencies: | ||||||
|       '@emotion/memoize': 0.8.0 |       '@emotion/memoize': 0.8.0 | ||||||
|     dev: false |     dev: false | ||||||
|  |  | ||||||
|  |   /@emotion/memoize/0.7.4: | ||||||
|  |     resolution: {integrity: sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==} | ||||||
|  |     dev: false | ||||||
|  |     optional: true | ||||||
|  |  | ||||||
|   /@emotion/memoize/0.8.0: |   /@emotion/memoize/0.8.0: | ||||||
|     resolution: {integrity: sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA==} |     resolution: {integrity: sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA==} | ||||||
|     dev: false |     dev: false | ||||||
| @@ -782,6 +813,53 @@ packages: | |||||||
|       react: 18.2.0 |       react: 18.2.0 | ||||||
|     dev: false |     dev: false | ||||||
|  |  | ||||||
|  |   /@motionone/animation/10.15.1: | ||||||
|  |     resolution: {integrity: sha512-mZcJxLjHor+bhcPuIFErMDNyrdb2vJur8lSfMCsuCB4UyV8ILZLvK+t+pg56erv8ud9xQGK/1OGPt10agPrCyQ==} | ||||||
|  |     dependencies: | ||||||
|  |       '@motionone/easing': 10.15.1 | ||||||
|  |       '@motionone/types': 10.15.1 | ||||||
|  |       '@motionone/utils': 10.15.1 | ||||||
|  |       tslib: 2.5.0 | ||||||
|  |     dev: false | ||||||
|  |  | ||||||
|  |   /@motionone/dom/10.15.5: | ||||||
|  |     resolution: {integrity: sha512-Xc5avlgyh3xukU9tydh9+8mB8+2zAq+WlLsC3eEIp7Ax7DnXgY7Bj/iv0a4X2R9z9ZFZiaXK3BO0xMYHKbAAdA==} | ||||||
|  |     dependencies: | ||||||
|  |       '@motionone/animation': 10.15.1 | ||||||
|  |       '@motionone/generators': 10.15.1 | ||||||
|  |       '@motionone/types': 10.15.1 | ||||||
|  |       '@motionone/utils': 10.15.1 | ||||||
|  |       hey-listen: 1.0.8 | ||||||
|  |       tslib: 2.5.0 | ||||||
|  |     dev: false | ||||||
|  |  | ||||||
|  |   /@motionone/easing/10.15.1: | ||||||
|  |     resolution: {integrity: sha512-6hIHBSV+ZVehf9dcKZLT7p5PEKHGhDwky2k8RKkmOvUoYP3S+dXsKupyZpqx5apjd9f+php4vXk4LuS+ADsrWw==} | ||||||
|  |     dependencies: | ||||||
|  |       '@motionone/utils': 10.15.1 | ||||||
|  |       tslib: 2.5.0 | ||||||
|  |     dev: false | ||||||
|  |  | ||||||
|  |   /@motionone/generators/10.15.1: | ||||||
|  |     resolution: {integrity: sha512-67HLsvHJbw6cIbLA/o+gsm7h+6D4Sn7AUrB/GPxvujse1cGZ38F5H7DzoH7PhX+sjvtDnt2IhFYF2Zp1QTMKWQ==} | ||||||
|  |     dependencies: | ||||||
|  |       '@motionone/types': 10.15.1 | ||||||
|  |       '@motionone/utils': 10.15.1 | ||||||
|  |       tslib: 2.5.0 | ||||||
|  |     dev: false | ||||||
|  |  | ||||||
|  |   /@motionone/types/10.15.1: | ||||||
|  |     resolution: {integrity: sha512-iIUd/EgUsRZGrvW0jqdst8st7zKTzS9EsKkP+6c6n4MPZoQHwiHuVtTQLD6Kp0bsBLhNzKIBlHXponn/SDT4hA==} | ||||||
|  |     dev: false | ||||||
|  |  | ||||||
|  |   /@motionone/utils/10.15.1: | ||||||
|  |     resolution: {integrity: sha512-p0YncgU+iklvYr/Dq4NobTRdAPv9PveRDUXabPEeOjBLSO/1FNB2phNTZxOxpi1/GZwYpAoECEa0Wam+nsmhSw==} | ||||||
|  |     dependencies: | ||||||
|  |       '@motionone/types': 10.15.1 | ||||||
|  |       hey-listen: 1.0.8 | ||||||
|  |       tslib: 2.5.0 | ||||||
|  |     dev: false | ||||||
|  |  | ||||||
|   /@radix-ui/number/1.0.0: |   /@radix-ui/number/1.0.0: | ||||||
|     resolution: {integrity: sha512-Ofwh/1HX69ZfJRiRBMTy7rgjAzHmwe4kW9C9Y99HTRUcYLUuVT0KESFj15rPjRgKJs20GPq8Bm5aEDJ8DuA3vA==} |     resolution: {integrity: sha512-Ofwh/1HX69ZfJRiRBMTy7rgjAzHmwe4kW9C9Y99HTRUcYLUuVT0KESFj15rPjRgKJs20GPq8Bm5aEDJ8DuA3vA==} | ||||||
|     dependencies: |     dependencies: | ||||||
| @@ -913,6 +991,19 @@ packages: | |||||||
|     resolution: {integrity: sha512-8diABuB3J+NEUtdwIXJF0bJSE5VpnnyzWeiZGFq/XlcTYJNEF+36ijiPNUGpsV/QXY6syesJKmmPkUUwD+LxdA==} |     resolution: {integrity: sha512-8diABuB3J+NEUtdwIXJF0bJSE5VpnnyzWeiZGFq/XlcTYJNEF+36ijiPNUGpsV/QXY6syesJKmmPkUUwD+LxdA==} | ||||||
|     dev: false |     dev: false | ||||||
|  |  | ||||||
|  |   /@tanstack/react-virtual/3.0.0-beta.35_react@18.2.0: | ||||||
|  |     resolution: {integrity: sha512-x4dicQTGao3p7wA1bGJyKsbtabO6UJKNUJdMWbxzrdc9CvpFl+ASOBtQHReDRjjAy7Z5/4loTLle8RtZu+2c2A==} | ||||||
|  |     peerDependencies: | ||||||
|  |       react: ^16.8.0 || ^17.0.0 || ^18.0.0 | ||||||
|  |     dependencies: | ||||||
|  |       '@tanstack/virtual-core': 3.0.0-beta.35 | ||||||
|  |       react: 18.2.0 | ||||||
|  |     dev: false | ||||||
|  |  | ||||||
|  |   /@tanstack/virtual-core/3.0.0-beta.35: | ||||||
|  |     resolution: {integrity: sha512-p+dNBkN70nz3RzsfJImpmg1eoEHoX3X49lOk1N4I6jtUttKzZ/0U2+LqDmErNa5q/ksWD45zegOU4MnHwKRp2w==} | ||||||
|  |     dev: false | ||||||
|  |  | ||||||
|   /@tauri-apps/api/1.2.0: |   /@tauri-apps/api/1.2.0: | ||||||
|     resolution: {integrity: sha512-lsI54KI6HGf7VImuf/T9pnoejfgkNoXveP14pVV7XarrQ46rOejIVJLFqHI9sRReJMGdh2YuCoI3cc/yCWCsrw==} |     resolution: {integrity: sha512-lsI54KI6HGf7VImuf/T9pnoejfgkNoXveP14pVV7XarrQ46rOejIVJLFqHI9sRReJMGdh2YuCoI3cc/yCWCsrw==} | ||||||
|     engines: {node: '>= 14.6.0', npm: '>= 6.6.0', yarn: '>= 1.19.1'} |     engines: {node: '>= 14.6.0', npm: '>= 6.6.0', yarn: '>= 1.19.1'} | ||||||
| @@ -1015,6 +1106,10 @@ packages: | |||||||
|       '@tauri-apps/cli-win32-x64-msvc': 1.2.3 |       '@tauri-apps/cli-win32-x64-msvc': 1.2.3 | ||||||
|     dev: true |     dev: true | ||||||
|  |  | ||||||
|  |   /@types/js-cookie/2.2.7: | ||||||
|  |     resolution: {integrity: sha512-aLkWa0C0vO5b4Sr798E26QgOkss68Un0bLjs7u9qxzPT5CG+8DuNTffWES58YzJs3hrVAOs1wonycqEBqNJubA==} | ||||||
|  |     dev: false | ||||||
|  |  | ||||||
|   /@types/node/18.14.6: |   /@types/node/18.14.6: | ||||||
|     resolution: {integrity: sha512-93+VvleD3mXwlLI/xASjw0FzKcwzl3OdTCzm1LaRfqgS21gfFtK3zDXM5Op9TeeMsJVOaJ2VRDpT9q4Y3d0AvA==} |     resolution: {integrity: sha512-93+VvleD3mXwlLI/xASjw0FzKcwzl3OdTCzm1LaRfqgS21gfFtK3zDXM5Op9TeeMsJVOaJ2VRDpT9q4Y3d0AvA==} | ||||||
|     dev: true |     dev: true | ||||||
| @@ -1026,6 +1121,12 @@ packages: | |||||||
|   /@types/prop-types/15.7.5: |   /@types/prop-types/15.7.5: | ||||||
|     resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} |     resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} | ||||||
|  |  | ||||||
|  |   /@types/ramda/0.28.23: | ||||||
|  |     resolution: {integrity: sha512-9TYWiwkew+mCMsL7jZ+kkzy6QXn8PL5/SKmBPmjgUlTpkokZWTBr+OhiIUDztpAEbslWyt24NNfEmZUBFmnXig==} | ||||||
|  |     dependencies: | ||||||
|  |       ts-toolbelt: 6.15.5 | ||||||
|  |     dev: true | ||||||
|  |  | ||||||
|   /@types/react-dom/18.0.11: |   /@types/react-dom/18.0.11: | ||||||
|     resolution: {integrity: sha512-O38bPbI2CWtgw/OoQoY+BRelw7uysmXbWvw3nLWO21H1HSh+GOlqPuXshJfjmpNlKiiSDG9cc1JZAaMmVdcTlw==} |     resolution: {integrity: sha512-O38bPbI2CWtgw/OoQoY+BRelw7uysmXbWvw3nLWO21H1HSh+GOlqPuXshJfjmpNlKiiSDG9cc1JZAaMmVdcTlw==} | ||||||
|     dependencies: |     dependencies: | ||||||
| @@ -1058,6 +1159,10 @@ packages: | |||||||
|       - supports-color |       - supports-color | ||||||
|     dev: true |     dev: true | ||||||
|  |  | ||||||
|  |   /@xobotyi/scrollbar-width/1.9.5: | ||||||
|  |     resolution: {integrity: sha512-N8tkAACJx2ww8vFMneJmaAgmjAG1tnVBZJRLRcx061tmsLRZHSEZSLuGWnwPtunsSLvSqXQ2wfp7Mgqg1I+2dQ==} | ||||||
|  |     dev: false | ||||||
|  |  | ||||||
|   /ansi-styles/3.2.1: |   /ansi-styles/3.2.1: | ||||||
|     resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} |     resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} | ||||||
|     engines: {node: '>=4'} |     engines: {node: '>=4'} | ||||||
| @@ -1124,6 +1229,12 @@ packages: | |||||||
|   /convert-source-map/1.9.0: |   /convert-source-map/1.9.0: | ||||||
|     resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} |     resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} | ||||||
|  |  | ||||||
|  |   /copy-to-clipboard/3.3.3: | ||||||
|  |     resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==} | ||||||
|  |     dependencies: | ||||||
|  |       toggle-selection: 1.0.6 | ||||||
|  |     dev: false | ||||||
|  |  | ||||||
|   /cosmiconfig/7.1.0: |   /cosmiconfig/7.1.0: | ||||||
|     resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} |     resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} | ||||||
|     engines: {node: '>=10'} |     engines: {node: '>=10'} | ||||||
| @@ -1135,6 +1246,20 @@ packages: | |||||||
|       yaml: 1.10.2 |       yaml: 1.10.2 | ||||||
|     dev: false |     dev: false | ||||||
|  |  | ||||||
|  |   /css-in-js-utils/3.1.0: | ||||||
|  |     resolution: {integrity: sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A==} | ||||||
|  |     dependencies: | ||||||
|  |       hyphenate-style-name: 1.0.4 | ||||||
|  |     dev: false | ||||||
|  |  | ||||||
|  |   /css-tree/1.1.3: | ||||||
|  |     resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==} | ||||||
|  |     engines: {node: '>=8.0.0'} | ||||||
|  |     dependencies: | ||||||
|  |       mdn-data: 2.0.14 | ||||||
|  |       source-map: 0.6.1 | ||||||
|  |     dev: false | ||||||
|  |  | ||||||
|   /csstype/3.0.9: |   /csstype/3.0.9: | ||||||
|     resolution: {integrity: sha512-rpw6JPxK6Rfg1zLOYCSwle2GFOOsnjmDYDaBwEcwoOg4qlsIVCN789VkBZDJAGi4T07gI4YSutR43t9Zz4Lzuw==} |     resolution: {integrity: sha512-rpw6JPxK6Rfg1zLOYCSwle2GFOOsnjmDYDaBwEcwoOg4qlsIVCN789VkBZDJAGi4T07gI4YSutR43t9Zz4Lzuw==} | ||||||
|     dev: false |     dev: false | ||||||
| @@ -1175,6 +1300,12 @@ packages: | |||||||
|       is-arrayish: 0.2.1 |       is-arrayish: 0.2.1 | ||||||
|     dev: false |     dev: false | ||||||
|  |  | ||||||
|  |   /error-stack-parser/2.1.4: | ||||||
|  |     resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} | ||||||
|  |     dependencies: | ||||||
|  |       stackframe: 1.3.4 | ||||||
|  |     dev: false | ||||||
|  |  | ||||||
|   /esbuild/0.16.17: |   /esbuild/0.16.17: | ||||||
|     resolution: {integrity: sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==} |     resolution: {integrity: sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==} | ||||||
|     engines: {node: '>=12'} |     engines: {node: '>=12'} | ||||||
| @@ -1223,10 +1354,37 @@ packages: | |||||||
|     resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} |     resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} | ||||||
|     dev: false |     dev: false | ||||||
|  |  | ||||||
|  |   /fast-loops/1.1.3: | ||||||
|  |     resolution: {integrity: sha512-8EZzEP0eKkEEVX+drtd9mtuQ+/QrlfW/5MlwcwK5Nds6EkZ/tRzEexkzUY2mIssnAyVLT+TKHuRXmFNNXYUd6g==} | ||||||
|  |     dev: false | ||||||
|  |  | ||||||
|  |   /fast-shallow-equal/1.0.0: | ||||||
|  |     resolution: {integrity: sha512-HPtaa38cPgWvaCFmRNhlc6NG7pv6NUHqjPgVAkWGoB9mQMwYB27/K0CvOM5Czy+qpT3e8XJ6Q4aPAnzpNpzNaw==} | ||||||
|  |     dev: false | ||||||
|  |  | ||||||
|  |   /fastest-stable-stringify/2.0.2: | ||||||
|  |     resolution: {integrity: sha512-bijHueCGd0LqqNK9b5oCMHc0MluJAx0cwqASgbWMvkO01lCYgIhacVRLcaDz3QnyYIRNJRDwMb41VuT6pHJ91Q==} | ||||||
|  |     dev: false | ||||||
|  |  | ||||||
|   /find-root/1.1.0: |   /find-root/1.1.0: | ||||||
|     resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} |     resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} | ||||||
|     dev: false |     dev: false | ||||||
|  |  | ||||||
|  |   /framer-motion/8.5.5_biqbaboplfbrettd7655fr4n2y: | ||||||
|  |     resolution: {integrity: sha512-5IDx5bxkjWHWUF3CVJoSyUVOtrbAxtzYBBowRE2uYI/6VYhkEBD+rbTHEGuUmbGHRj6YqqSfoG7Aa1cLyWCrBA==} | ||||||
|  |     peerDependencies: | ||||||
|  |       react: ^18.0.0 | ||||||
|  |       react-dom: ^18.0.0 | ||||||
|  |     dependencies: | ||||||
|  |       '@motionone/dom': 10.15.5 | ||||||
|  |       hey-listen: 1.0.8 | ||||||
|  |       react: 18.2.0 | ||||||
|  |       react-dom: 18.2.0_react@18.2.0 | ||||||
|  |       tslib: 2.5.0 | ||||||
|  |     optionalDependencies: | ||||||
|  |       '@emotion/is-prop-valid': 0.8.8 | ||||||
|  |     dev: false | ||||||
|  |  | ||||||
|   /fsevents/2.3.2: |   /fsevents/2.3.2: | ||||||
|     resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} |     resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} | ||||||
|     engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} |     engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} | ||||||
| @@ -1263,12 +1421,24 @@ packages: | |||||||
|     dependencies: |     dependencies: | ||||||
|       function-bind: 1.1.1 |       function-bind: 1.1.1 | ||||||
|  |  | ||||||
|  |   /hey-listen/1.0.8: | ||||||
|  |     resolution: {integrity: sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==} | ||||||
|  |     dev: false | ||||||
|  |  | ||||||
|   /hoist-non-react-statics/3.3.2: |   /hoist-non-react-statics/3.3.2: | ||||||
|     resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} |     resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} | ||||||
|     dependencies: |     dependencies: | ||||||
|       react-is: 16.13.1 |       react-is: 16.13.1 | ||||||
|     dev: false |     dev: false | ||||||
|  |  | ||||||
|  |   /hyphenate-style-name/1.0.4: | ||||||
|  |     resolution: {integrity: sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==} | ||||||
|  |     dev: false | ||||||
|  |  | ||||||
|  |   /immer/9.0.19: | ||||||
|  |     resolution: {integrity: sha512-eY+Y0qcsB4TZKwgQzLaE/lqYMlKhv5J9dyd2RhhtGhNo2njPXDqU9XPfcNfa3MIDsdtZt5KlkIsirlo4dHsWdQ==} | ||||||
|  |     dev: false | ||||||
|  |  | ||||||
|   /import-fresh/3.3.0: |   /import-fresh/3.3.0: | ||||||
|     resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} |     resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} | ||||||
|     engines: {node: '>=6'} |     engines: {node: '>=6'} | ||||||
| @@ -1277,6 +1447,13 @@ packages: | |||||||
|       resolve-from: 4.0.0 |       resolve-from: 4.0.0 | ||||||
|     dev: false |     dev: false | ||||||
|  |  | ||||||
|  |   /inline-style-prefixer/6.0.4: | ||||||
|  |     resolution: {integrity: sha512-FwXmZC2zbeeS7NzGjJ6pAiqRhXR0ugUShSNb6GApMl6da0/XGc4MOJsoWAywia52EEWbXNSy0pzkwz/+Y+swSg==} | ||||||
|  |     dependencies: | ||||||
|  |       css-in-js-utils: 3.1.0 | ||||||
|  |       fast-loops: 1.1.3 | ||||||
|  |     dev: false | ||||||
|  |  | ||||||
|   /invariant/2.2.4: |   /invariant/2.2.4: | ||||||
|     resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} |     resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} | ||||||
|     dependencies: |     dependencies: | ||||||
| @@ -1292,6 +1469,10 @@ packages: | |||||||
|     dependencies: |     dependencies: | ||||||
|       has: 1.0.3 |       has: 1.0.3 | ||||||
|  |  | ||||||
|  |   /js-cookie/2.2.1: | ||||||
|  |     resolution: {integrity: sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==} | ||||||
|  |     dev: false | ||||||
|  |  | ||||||
|   /js-tokens/4.0.0: |   /js-tokens/4.0.0: | ||||||
|     resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} |     resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} | ||||||
|  |  | ||||||
| @@ -1340,10 +1521,32 @@ packages: | |||||||
|       '@jridgewell/sourcemap-codec': 1.4.14 |       '@jridgewell/sourcemap-codec': 1.4.14 | ||||||
|     dev: true |     dev: true | ||||||
|  |  | ||||||
|  |   /mdn-data/2.0.14: | ||||||
|  |     resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} | ||||||
|  |     dev: false | ||||||
|  |  | ||||||
|   /ms/2.1.2: |   /ms/2.1.2: | ||||||
|     resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} |     resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} | ||||||
|     dev: true |     dev: true | ||||||
|  |  | ||||||
|  |   /nano-css/5.3.5_biqbaboplfbrettd7655fr4n2y: | ||||||
|  |     resolution: {integrity: sha512-vSB9X12bbNu4ALBu7nigJgRViZ6ja3OU7CeuiV1zMIbXOdmkLahgtPmh3GBOlDxbKY0CitqlPdOReGlBLSp+yg==} | ||||||
|  |     peerDependencies: | ||||||
|  |       react: '*' | ||||||
|  |       react-dom: '*' | ||||||
|  |     dependencies: | ||||||
|  |       css-tree: 1.1.3 | ||||||
|  |       csstype: 3.1.1 | ||||||
|  |       fastest-stable-stringify: 2.0.2 | ||||||
|  |       inline-style-prefixer: 6.0.4 | ||||||
|  |       react: 18.2.0 | ||||||
|  |       react-dom: 18.2.0_react@18.2.0 | ||||||
|  |       rtl-css-js: 1.16.1 | ||||||
|  |       sourcemap-codec: 1.4.8 | ||||||
|  |       stacktrace-js: 2.0.2 | ||||||
|  |       stylis: 4.1.3 | ||||||
|  |     dev: false | ||||||
|  |  | ||||||
|   /nanoid/3.3.4: |   /nanoid/3.3.4: | ||||||
|     resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==} |     resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==} | ||||||
|     engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} |     engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} | ||||||
| @@ -1405,6 +1608,10 @@ packages: | |||||||
|       react-is: 16.13.1 |       react-is: 16.13.1 | ||||||
|     dev: false |     dev: false | ||||||
|  |  | ||||||
|  |   /ramda/0.28.0: | ||||||
|  |     resolution: {integrity: sha512-9QnLuG/kPVgWvMQ4aODhsBUFKOUmnbUnsSXACv+NCQZcHbeb+v8Lodp8OVxtRULN1/xOyYLLaL6npE6dMq5QTA==} | ||||||
|  |     dev: false | ||||||
|  |  | ||||||
|   /react-dom/18.2.0_react@18.2.0: |   /react-dom/18.2.0_react@18.2.0: | ||||||
|     resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} |     resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} | ||||||
|     peerDependencies: |     peerDependencies: | ||||||
| @@ -1527,6 +1734,40 @@ packages: | |||||||
|       react-dom: 18.2.0_react@18.2.0 |       react-dom: 18.2.0_react@18.2.0 | ||||||
|     dev: false |     dev: false | ||||||
|  |  | ||||||
|  |   /react-universal-interface/0.6.2_react@18.2.0+tslib@2.5.0: | ||||||
|  |     resolution: {integrity: sha512-dg8yXdcQmvgR13RIlZbTRQOoUrDciFVoSBZILwjE2LFISxZZ8loVJKAkuzswl5js8BHda79bIb2b84ehU8IjXw==} | ||||||
|  |     peerDependencies: | ||||||
|  |       react: '*' | ||||||
|  |       tslib: '*' | ||||||
|  |     dependencies: | ||||||
|  |       react: 18.2.0 | ||||||
|  |       tslib: 2.5.0 | ||||||
|  |     dev: false | ||||||
|  |  | ||||||
|  |   /react-use/17.4.0_biqbaboplfbrettd7655fr4n2y: | ||||||
|  |     resolution: {integrity: sha512-TgbNTCA33Wl7xzIJegn1HndB4qTS9u03QUwyNycUnXaweZkE4Kq2SB+Yoxx8qbshkZGYBDvUXbXWRUmQDcZZ/Q==} | ||||||
|  |     peerDependencies: | ||||||
|  |       react: ^16.8.0  || ^17.0.0 || ^18.0.0 | ||||||
|  |       react-dom: ^16.8.0  || ^17.0.0 || ^18.0.0 | ||||||
|  |     dependencies: | ||||||
|  |       '@types/js-cookie': 2.2.7 | ||||||
|  |       '@xobotyi/scrollbar-width': 1.9.5 | ||||||
|  |       copy-to-clipboard: 3.3.3 | ||||||
|  |       fast-deep-equal: 3.1.3 | ||||||
|  |       fast-shallow-equal: 1.0.0 | ||||||
|  |       js-cookie: 2.2.1 | ||||||
|  |       nano-css: 5.3.5_biqbaboplfbrettd7655fr4n2y | ||||||
|  |       react: 18.2.0 | ||||||
|  |       react-dom: 18.2.0_react@18.2.0 | ||||||
|  |       react-universal-interface: 0.6.2_react@18.2.0+tslib@2.5.0 | ||||||
|  |       resize-observer-polyfill: 1.5.1 | ||||||
|  |       screenfull: 5.2.0 | ||||||
|  |       set-harmonic-interval: 1.0.1 | ||||||
|  |       throttle-debounce: 3.0.1 | ||||||
|  |       ts-easing: 0.2.0 | ||||||
|  |       tslib: 2.5.0 | ||||||
|  |     dev: false | ||||||
|  |  | ||||||
|   /react/18.2.0: |   /react/18.2.0: | ||||||
|     resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} |     resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} | ||||||
|     engines: {node: '>=0.10.0'} |     engines: {node: '>=0.10.0'} | ||||||
| @@ -1538,6 +1779,10 @@ packages: | |||||||
|     resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} |     resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} | ||||||
|     dev: false |     dev: false | ||||||
|  |  | ||||||
|  |   /resize-observer-polyfill/1.5.1: | ||||||
|  |     resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==} | ||||||
|  |     dev: false | ||||||
|  |  | ||||||
|   /resolve-from/4.0.0: |   /resolve-from/4.0.0: | ||||||
|     resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} |     resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} | ||||||
|     engines: {node: '>=4'} |     engines: {node: '>=4'} | ||||||
| @@ -1559,27 +1804,83 @@ packages: | |||||||
|       fsevents: 2.3.2 |       fsevents: 2.3.2 | ||||||
|     dev: true |     dev: true | ||||||
|  |  | ||||||
|  |   /rtl-css-js/1.16.1: | ||||||
|  |     resolution: {integrity: sha512-lRQgou1mu19e+Ya0LsTvKrVJ5TYUbqCVPAiImX3UfLTenarvPUl1QFdvu5Z3PYmHT9RCcwIfbjRQBntExyj3Zg==} | ||||||
|  |     dependencies: | ||||||
|  |       '@babel/runtime': 7.21.0 | ||||||
|  |     dev: false | ||||||
|  |  | ||||||
|   /scheduler/0.23.0: |   /scheduler/0.23.0: | ||||||
|     resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} |     resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} | ||||||
|     dependencies: |     dependencies: | ||||||
|       loose-envify: 1.4.0 |       loose-envify: 1.4.0 | ||||||
|     dev: false |     dev: false | ||||||
|  |  | ||||||
|  |   /screenfull/5.2.0: | ||||||
|  |     resolution: {integrity: sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA==} | ||||||
|  |     engines: {node: '>=0.10.0'} | ||||||
|  |     dev: false | ||||||
|  |  | ||||||
|   /semver/6.3.0: |   /semver/6.3.0: | ||||||
|     resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} |     resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} | ||||||
|     hasBin: true |     hasBin: true | ||||||
|     dev: true |     dev: true | ||||||
|  |  | ||||||
|  |   /set-harmonic-interval/1.0.1: | ||||||
|  |     resolution: {integrity: sha512-AhICkFV84tBP1aWqPwLZqFvAwqEoVA9kxNMniGEUvzOlm4vLmOFLiTT3UZ6bziJTy4bOVpzWGTfSCbmaayGx8g==} | ||||||
|  |     engines: {node: '>=6.9'} | ||||||
|  |     dev: false | ||||||
|  |  | ||||||
|   /source-map-js/1.0.2: |   /source-map-js/1.0.2: | ||||||
|     resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} |     resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} | ||||||
|     engines: {node: '>=0.10.0'} |     engines: {node: '>=0.10.0'} | ||||||
|     dev: true |     dev: true | ||||||
|  |  | ||||||
|  |   /source-map/0.5.6: | ||||||
|  |     resolution: {integrity: sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA==} | ||||||
|  |     engines: {node: '>=0.10.0'} | ||||||
|  |     dev: false | ||||||
|  |  | ||||||
|   /source-map/0.5.7: |   /source-map/0.5.7: | ||||||
|     resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} |     resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} | ||||||
|     engines: {node: '>=0.10.0'} |     engines: {node: '>=0.10.0'} | ||||||
|     dev: false |     dev: false | ||||||
|  |  | ||||||
|  |   /source-map/0.6.1: | ||||||
|  |     resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} | ||||||
|  |     engines: {node: '>=0.10.0'} | ||||||
|  |     dev: false | ||||||
|  |  | ||||||
|  |   /sourcemap-codec/1.4.8: | ||||||
|  |     resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} | ||||||
|  |     deprecated: Please use @jridgewell/sourcemap-codec instead | ||||||
|  |     dev: false | ||||||
|  |  | ||||||
|  |   /stack-generator/2.0.10: | ||||||
|  |     resolution: {integrity: sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ==} | ||||||
|  |     dependencies: | ||||||
|  |       stackframe: 1.3.4 | ||||||
|  |     dev: false | ||||||
|  |  | ||||||
|  |   /stackframe/1.3.4: | ||||||
|  |     resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} | ||||||
|  |     dev: false | ||||||
|  |  | ||||||
|  |   /stacktrace-gps/3.1.2: | ||||||
|  |     resolution: {integrity: sha512-GcUgbO4Jsqqg6RxfyTHFiPxdPqF+3LFmQhm7MgCuYQOYuWyqxo5pwRPz5d/u6/WYJdEnWfK4r+jGbyD8TSggXQ==} | ||||||
|  |     dependencies: | ||||||
|  |       source-map: 0.5.6 | ||||||
|  |       stackframe: 1.3.4 | ||||||
|  |     dev: false | ||||||
|  |  | ||||||
|  |   /stacktrace-js/2.0.2: | ||||||
|  |     resolution: {integrity: sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg==} | ||||||
|  |     dependencies: | ||||||
|  |       error-stack-parser: 2.1.4 | ||||||
|  |       stack-generator: 2.0.10 | ||||||
|  |       stacktrace-gps: 3.1.2 | ||||||
|  |     dev: false | ||||||
|  |  | ||||||
|   /stylis/4.1.3: |   /stylis/4.1.3: | ||||||
|     resolution: {integrity: sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA==} |     resolution: {integrity: sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA==} | ||||||
|     dev: false |     dev: false | ||||||
| @@ -1598,10 +1899,27 @@ packages: | |||||||
|     resolution: {integrity: sha512-4kl5w+nCB44EVRdO0g/UGoOp3vlwgycUVtkk/7DPyeLZUCuNFFKCFG6/t/DgHLrUPHjrZg6s5tNm+56Q2B0xyg==} |     resolution: {integrity: sha512-4kl5w+nCB44EVRdO0g/UGoOp3vlwgycUVtkk/7DPyeLZUCuNFFKCFG6/t/DgHLrUPHjrZg6s5tNm+56Q2B0xyg==} | ||||||
|     dev: false |     dev: false | ||||||
|  |  | ||||||
|  |   /throttle-debounce/3.0.1: | ||||||
|  |     resolution: {integrity: sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg==} | ||||||
|  |     engines: {node: '>=10'} | ||||||
|  |     dev: false | ||||||
|  |  | ||||||
|   /to-fast-properties/2.0.0: |   /to-fast-properties/2.0.0: | ||||||
|     resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} |     resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} | ||||||
|     engines: {node: '>=4'} |     engines: {node: '>=4'} | ||||||
|  |  | ||||||
|  |   /toggle-selection/1.0.6: | ||||||
|  |     resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==} | ||||||
|  |     dev: false | ||||||
|  |  | ||||||
|  |   /ts-easing/0.2.0: | ||||||
|  |     resolution: {integrity: sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ==} | ||||||
|  |     dev: false | ||||||
|  |  | ||||||
|  |   /ts-toolbelt/6.15.5: | ||||||
|  |     resolution: {integrity: sha512-FZIXf1ksVyLcfr7M317jbB67XFJhOO1YqdTcuGaq9q5jLUoTikukZ+98TPjKiP2jC5CgmYdWWYs0s2nLSU0/1A==} | ||||||
|  |     dev: true | ||||||
|  |  | ||||||
|   /tslib/2.5.0: |   /tslib/2.5.0: | ||||||
|     resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} |     resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} | ||||||
|     dev: false |     dev: false | ||||||
| @@ -1646,6 +1964,16 @@ packages: | |||||||
|       react: 18.2.0 |       react: 18.2.0 | ||||||
|     dev: false |     dev: false | ||||||
|  |  | ||||||
|  |   /use-immer/0.8.1_immer@9.0.19+react@18.2.0: | ||||||
|  |     resolution: {integrity: sha512-OfTFf1pL+ICjjcLPn9+ZnaJO/Yg4MBzYZtACEe2mZ/W2A5col28PNUnwowOAaBuOogACOK/37TU17KgsIhUpOw==} | ||||||
|  |     peerDependencies: | ||||||
|  |       immer: '>=2.0.0' | ||||||
|  |       react: ^16.8.0 || ^17.0.1 || ^18.0.0 | ||||||
|  |     dependencies: | ||||||
|  |       immer: 9.0.19 | ||||||
|  |       react: 18.2.0 | ||||||
|  |     dev: false | ||||||
|  |  | ||||||
|   /use-isomorphic-layout-effect/1.1.2_pmekkgnqduwlme35zpnqhenc34: |   /use-isomorphic-layout-effect/1.1.2_pmekkgnqduwlme35zpnqhenc34: | ||||||
|     resolution: {integrity: sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==} |     resolution: {integrity: sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==} | ||||||
|     peerDependencies: |     peerDependencies: | ||||||
| @@ -1689,6 +2017,14 @@ packages: | |||||||
|       tslib: 2.5.0 |       tslib: 2.5.0 | ||||||
|     dev: false |     dev: false | ||||||
|  |  | ||||||
|  |   /use-sync-external-store/1.2.0_react@18.2.0: | ||||||
|  |     resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} | ||||||
|  |     peerDependencies: | ||||||
|  |       react: ^16.8.0 || ^17.0.0 || ^18.0.0 | ||||||
|  |     dependencies: | ||||||
|  |       react: 18.2.0 | ||||||
|  |     dev: false | ||||||
|  |  | ||||||
|   /vite/4.1.4_@types+node@18.14.6: |   /vite/4.1.4_@types+node@18.14.6: | ||||||
|     resolution: {integrity: sha512-3knk/HsbSTKEin43zHu7jTwYWv81f8kgAL99G5NWBcA1LKvtvcVAC4JjBH1arBunO9kQka+1oGbrMKOjk4ZrBg==} |     resolution: {integrity: sha512-3knk/HsbSTKEin43zHu7jTwYWv81f8kgAL99G5NWBcA1LKvtvcVAC4JjBH1arBunO9kQka+1oGbrMKOjk4ZrBg==} | ||||||
|     engines: {node: ^14.18.0 || >=16.0.0} |     engines: {node: ^14.18.0 || >=16.0.0} | ||||||
| @@ -1731,3 +2067,20 @@ packages: | |||||||
|     resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} |     resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} | ||||||
|     engines: {node: '>= 6'} |     engines: {node: '>= 6'} | ||||||
|     dev: false |     dev: false | ||||||
|  |  | ||||||
|  |   /zustand/4.3.6_immer@9.0.19+react@18.2.0: | ||||||
|  |     resolution: {integrity: sha512-6J5zDxjxLE+yukC2XZWf/IyWVKnXT9b9HUv09VJ/bwGCpKNcaTqp7Ws28Xr8jnbvnZcdRaidztAPsXFBIqufiw==} | ||||||
|  |     engines: {node: '>=12.7.0'} | ||||||
|  |     peerDependencies: | ||||||
|  |       immer: '>=9.0' | ||||||
|  |       react: '>=16.8' | ||||||
|  |     peerDependenciesMeta: | ||||||
|  |       immer: | ||||||
|  |         optional: true | ||||||
|  |       react: | ||||||
|  |         optional: true | ||||||
|  |     dependencies: | ||||||
|  |       immer: 9.0.19 | ||||||
|  |       react: 18.2.0 | ||||||
|  |       use-sync-external-store: 1.2.0_react@18.2.0 | ||||||
|  |     dev: false | ||||||
|   | |||||||
| @@ -1,7 +0,0 @@ | |||||||
| .logo.vite:hover { |  | ||||||
|   filter: drop-shadow(0 0 2em #747bff); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| .logo.react:hover { |  | ||||||
|   filter: drop-shadow(0 0 2em #61dafb); |  | ||||||
| } |  | ||||||
							
								
								
									
										15
									
								
								src/MainLayout.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								src/MainLayout.tsx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,15 @@ | |||||||
|  | import { Box, Group } from "@mantine/core"; | ||||||
|  | import { FC } from "react"; | ||||||
|  | import { Outlet } from "react-router-dom"; | ||||||
|  | import { NavMenu } from "./NavMenu"; | ||||||
|  |  | ||||||
|  | export const MainLayout: FC = () => { | ||||||
|  |   return ( | ||||||
|  |     <Group grow noWrap spacing={0} h="100%" w="100%"> | ||||||
|  |       <NavMenu /> | ||||||
|  |       <Box h="inherit" w="inherit" maw="100%" sx={{ flexGrow: 5 }}> | ||||||
|  |         <Outlet /> | ||||||
|  |       </Box> | ||||||
|  |     </Group> | ||||||
|  |   ); | ||||||
|  | }; | ||||||
							
								
								
									
										32
									
								
								src/NavMenu.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								src/NavMenu.tsx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,32 @@ | |||||||
|  | import { Stack, useMantineTheme } from "@mantine/core"; | ||||||
|  | import { ifElse, path, propEq } from "ramda"; | ||||||
|  | import { FC, useMemo } from "react"; | ||||||
|  |  | ||||||
|  | const bgSelectFn = ifElse( | ||||||
|  |   propEq("colorScheme", "dark"), | ||||||
|  |   path(["colors", "cbg", 2]), | ||||||
|  |   path(["colors", "cbg", 7]) | ||||||
|  | ); | ||||||
|  |  | ||||||
|  | export const NavMenu: FC = () => { | ||||||
|  |   const theme = useMantineTheme(); | ||||||
|  |   const normalColor = useMemo(() => path(["violet", 7])(theme.colors), [theme.colors]); | ||||||
|  |   const activatedColor = useMemo(() => path<string>(["violet", 3])(theme.colors), [theme.colors]); | ||||||
|  |   const disabledColor = useMemo(() => path<string>(["gray", 7])(theme.colors), [theme.colors]); | ||||||
|  |   const navMenuBg = useMemo(() => bgSelectFn(theme), [theme, theme]); | ||||||
|  |  | ||||||
|  |   return ( | ||||||
|  |     <Stack | ||||||
|  |       spacing={24} | ||||||
|  |       maw={64} | ||||||
|  |       h="inherit" | ||||||
|  |       sx={(theme) => ({ | ||||||
|  |         flexGrow: 1, | ||||||
|  |         backgroundColor: navMenuBg, | ||||||
|  |       })} | ||||||
|  |       align="center" | ||||||
|  |       px={16} | ||||||
|  |       py={16} | ||||||
|  |     ></Stack> | ||||||
|  |   ); | ||||||
|  | }; | ||||||
							
								
								
									
										28
									
								
								src/main.tsx
									
									
									
									
									
								
							
							
						
						
									
										28
									
								
								src/main.tsx
									
									
									
									
									
								
							| @@ -1,10 +1,30 @@ | |||||||
| import React from "react"; | import { NotificationsProvider } from "@mantine/notifications"; | ||||||
|  | import React, { FC, useState } from "react"; | ||||||
| import ReactDOM from "react-dom/client"; | import ReactDOM from "react-dom/client"; | ||||||
| import App from "./App"; | import { RouterProvider } from "react-router-dom"; | ||||||
| import "./styles.css"; | import { appRouter } from "./router"; | ||||||
|  | import { useAppTheme } from "./theme"; | ||||||
|  |  | ||||||
|  | const AppMain: FC = () => { | ||||||
|  |   const preferredColorScheme = useColorScheme(); | ||||||
|  |   const [colorScheme, setColorScheme] = useState<ColorScheme>(preferredColorScheme); | ||||||
|  |   const theme = useAppTheme(); | ||||||
|  |  | ||||||
|  |   return ( | ||||||
|  |     <React.StrictMode> | ||||||
|  |       <ColorSchemeProvider colorScheme={colorScheme} toggleColorScheme={setColorScheme}> | ||||||
|  |         <MantineProvider theme={theme} withGlobalStyles withNormalizeCSS> | ||||||
|  |           <NotificationsProvider position="bottom-right" limit={5} zIndex={999}> | ||||||
|  |             <RouterProvider router={appRouter} /> | ||||||
|  |           </NotificationsProvider> | ||||||
|  |         </MantineProvider> | ||||||
|  |       </ColorSchemeProvider> | ||||||
|  |     </React.StrictMode> | ||||||
|  |   ); | ||||||
|  | }; | ||||||
|  |  | ||||||
| ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render( | ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render( | ||||||
|   <React.StrictMode> |   <React.StrictMode> | ||||||
|     <App /> |     <AppMain /> | ||||||
|   </React.StrictMode> |   </React.StrictMode> | ||||||
| ); | ); | ||||||
|   | |||||||
							
								
								
									
										9
									
								
								src/router.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								src/router.tsx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | |||||||
|  | import { createBrowserRouter } from "react-router-dom"; | ||||||
|  | import { MainLayout } from "./MainLayout"; | ||||||
|  |  | ||||||
|  | export const appRouter = createBrowserRouter([ | ||||||
|  |   { | ||||||
|  |     path: "/", | ||||||
|  |     element: <MainLayout />, | ||||||
|  |   }, | ||||||
|  | ]); | ||||||
							
								
								
									
										109
									
								
								src/styles.css
									
									
									
									
									
								
							
							
						
						
									
										109
									
								
								src/styles.css
									
									
									
									
									
								
							| @@ -1,109 +0,0 @@ | |||||||
| :root { |  | ||||||
|   font-family: Inter, Avenir, Helvetica, Arial, sans-serif; |  | ||||||
|   font-size: 16px; |  | ||||||
|   line-height: 24px; |  | ||||||
|   font-weight: 400; |  | ||||||
|  |  | ||||||
|   color: #0f0f0f; |  | ||||||
|   background-color: #f6f6f6; |  | ||||||
|  |  | ||||||
|   font-synthesis: none; |  | ||||||
|   text-rendering: optimizeLegibility; |  | ||||||
|   -webkit-font-smoothing: antialiased; |  | ||||||
|   -moz-osx-font-smoothing: grayscale; |  | ||||||
|   -webkit-text-size-adjust: 100%; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| .container { |  | ||||||
|   margin: 0; |  | ||||||
|   padding-top: 10vh; |  | ||||||
|   display: flex; |  | ||||||
|   flex-direction: column; |  | ||||||
|   justify-content: center; |  | ||||||
|   text-align: center; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| .logo { |  | ||||||
|   height: 6em; |  | ||||||
|   padding: 1.5em; |  | ||||||
|   will-change: filter; |  | ||||||
|   transition: 0.75s; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| .logo.tauri:hover { |  | ||||||
|   filter: drop-shadow(0 0 2em #24c8db); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| .row { |  | ||||||
|   display: flex; |  | ||||||
|   justify-content: center; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| a { |  | ||||||
|   font-weight: 500; |  | ||||||
|   color: #646cff; |  | ||||||
|   text-decoration: inherit; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| a:hover { |  | ||||||
|   color: #535bf2; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| h1 { |  | ||||||
|   text-align: center; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| input, |  | ||||||
| button { |  | ||||||
|   border-radius: 8px; |  | ||||||
|   border: 1px solid transparent; |  | ||||||
|   padding: 0.6em 1.2em; |  | ||||||
|   font-size: 1em; |  | ||||||
|   font-weight: 500; |  | ||||||
|   font-family: inherit; |  | ||||||
|   color: #0f0f0f; |  | ||||||
|   background-color: #ffffff; |  | ||||||
|   transition: border-color 0.25s; |  | ||||||
|   box-shadow: 0 2px 2px rgba(0, 0, 0, 0.2); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| button { |  | ||||||
|   cursor: pointer; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| button:hover { |  | ||||||
|   border-color: #396cd8; |  | ||||||
| } |  | ||||||
| button:active { |  | ||||||
|   border-color: #396cd8; |  | ||||||
|   background-color: #e8e8e8; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| input, |  | ||||||
| button { |  | ||||||
|   outline: none; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| #greet-input { |  | ||||||
|   margin-right: 5px; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| @media (prefers-color-scheme: dark) { |  | ||||||
|   :root { |  | ||||||
|     color: #f6f6f6; |  | ||||||
|     background-color: #2f2f2f; |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   a:hover { |  | ||||||
|     color: #24c8db; |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   input, |  | ||||||
|   button { |  | ||||||
|     color: #ffffff; |  | ||||||
|     background-color: #0f0f0f98; |  | ||||||
|   } |  | ||||||
|   button:active { |  | ||||||
|     background-color: #0f0f0f69; |  | ||||||
|   } |  | ||||||
| } |  | ||||||
							
								
								
									
										61
									
								
								src/theme.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								src/theme.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,61 @@ | |||||||
|  | import { MantineTheme } from '@mantine/core'; | ||||||
|  | import { useColorScheme } from '@mantine/hooks'; | ||||||
|  | import { ifElse, path, propEq } from 'ramda'; | ||||||
|  |  | ||||||
|  | const bgColorSelectFn = ifElse( | ||||||
|  |   propEq('colorScheme', 'light'), | ||||||
|  |   path(['colors', 'cbg', 8]), | ||||||
|  |   path(['colors', 'cbg', 0]) | ||||||
|  | ); | ||||||
|  | const fgColorSelectFn = ifElse( | ||||||
|  |   propEq('colorScheme', 'light'), | ||||||
|  |   path(['colors', 'cfg', 0]), | ||||||
|  |   path(['colors', 'cfg', 8]) | ||||||
|  | ); | ||||||
|  |  | ||||||
|  | export function useAppTheme(): Partial<MantineTheme> { | ||||||
|  |   const colorScheme = useColorScheme(); | ||||||
|  |  | ||||||
|  |   return { | ||||||
|  |     colorScheme, | ||||||
|  |     focusRing: 'never', | ||||||
|  |     defaultRadius: 'xs', | ||||||
|  |     colors: { | ||||||
|  |       cfg: [ | ||||||
|  |         '#0f0f0f', | ||||||
|  |         '#151515', | ||||||
|  |         '#262626', | ||||||
|  |         '#414141', | ||||||
|  |         '#626262', | ||||||
|  |         '#878787', | ||||||
|  |         '#acacac', | ||||||
|  |         '#cecece', | ||||||
|  |         '#e8e8e8', | ||||||
|  |         '#f9f9f9' | ||||||
|  |       ], | ||||||
|  |       cbg: [ | ||||||
|  |         '#1a202c', | ||||||
|  |         '#1e2533', | ||||||
|  |         '#2a3446', | ||||||
|  |         '#3c4a65', | ||||||
|  |         '#53678b', | ||||||
|  |         '#7689ad', | ||||||
|  |         '#a0adc6', | ||||||
|  |         '#c6cedd', | ||||||
|  |         '#e5e8ef', | ||||||
|  |         '#f8f9fb' | ||||||
|  |       ] | ||||||
|  |     }, | ||||||
|  |     primaryColor: 'violet', | ||||||
|  |     globalStyles: theme => ({ | ||||||
|  |       'html, body': { | ||||||
|  |         height: '100vh', | ||||||
|  |         color: fgColorSelectFn(theme), | ||||||
|  |         backgroundColor: bgColorSelectFn(theme) | ||||||
|  |       }, | ||||||
|  |       '#root': { | ||||||
|  |         height: '100%' | ||||||
|  |       } | ||||||
|  |     }) | ||||||
|  |   }; | ||||||
|  | } | ||||||
							
								
								
									
										216
									
								
								src/types.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										216
									
								
								src/types.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,216 @@ | |||||||
|  | /** | ||||||
|  |  * 不需要任何参数即可以生成指定类型对象的工厂函数类型。 | ||||||
|  |  */ | ||||||
|  | export type Factory<T> = () => T; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 接受一个参数来生成一个指定类型的新对象的工厂函数类型。 | ||||||
|  |  */ | ||||||
|  | export type MapFactory<T, P = unknown> = (obj: P) => T; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 可能接受一个参数也可以不使用任何参数来生成指定类型新对象的工厂函数类型。 | ||||||
|  |  */ | ||||||
|  | export type MaybeParamFactory<T, P = unknown> = (obj?: P) => T; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 可能接受一组任意类型的参数集合来生成指定类型新对象的工厂函数类型。 | ||||||
|  |  */ | ||||||
|  | export type ParamFactory<T, P = unknown> = (...args: P[]) => T; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 接受一个对象(默认是字符串)作为参数的回调函数,可以是同步函数也可以是异步函数。 | ||||||
|  |  */ | ||||||
|  | export type ObjectCallback<P = string, T = void> = (obj: P) => T | Promise<T>; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 接受一个对象(默认是字符串)作为参数的回调函数,仅可以是同步函数。 | ||||||
|  |  */ | ||||||
|  | export type SyncObjectCallback<P = string, T = void> = (obj: P) => T; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 接受一个对象(默认是字符串)作为参数的回调函数,仅可以是异步函数。 | ||||||
|  |  */ | ||||||
|  | export type AsyncObjectCallback<P = string, T = void> = (obj: P) => Promise<T>; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 接受一个对象(默认是字符串)或者零个对象作为参数的回调函数,可以是同步函数也可以是异步函数。 | ||||||
|  |  */ | ||||||
|  | export type MaybeObjectCallback<P = string, T = void> = ObjectCallback<P | undefined, T>; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 接受一个对象(默认是字符串)或者零个对象作为参数的回调函数,仅可以是同步函数。 | ||||||
|  |  */ | ||||||
|  | export type SyncMaybeObjectCallback<P = string, T = void> = SyncObjectCallback<P | undefined, T>; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 接受一个对象(默认是字符串)或者零个对象作为参数的回调函数,仅可以是异步函数。 | ||||||
|  |  */ | ||||||
|  | export type AsyncMaybeObjectCallback<P = string, T = void> = AsyncObjectCallback<P | undefined, T>; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 接受一个对象数组(默认是字符串数组)作为参数的回调函数,可以是同步函数也可以是异步函数。 | ||||||
|  |  */ | ||||||
|  | export type ObjectsCallback<P = string, T = void> = ObjectCallback<P[], T>; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 接受一个对象数组(默认是字符串数组)作为参数的回调函数,仅可以是同步函数。 | ||||||
|  |  */ | ||||||
|  | export type SyncObjectsCallback<P = string, T = void> = SyncObjectCallback<P[], T>; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 接受一个对象数组(默认是字符串数组)作为参数的回调函数,仅可以是异步函数。 | ||||||
|  |  */ | ||||||
|  | export type AsyncObjectsCallback<P = string, T = void> = AsyncObjectCallback<P[], T>; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 接收一个对象数组(默认是字符串数组)或者零个对象作为参数的回调函数,可以是同步函数也可以是异步函数。 | ||||||
|  |  */ | ||||||
|  | export type MaybeObjectsCallback<P = string, T = void> = ObjectCallback<P[] | undefined, T>; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 接收一个对象数组(默认是字符串数组)或者零个对象作为参数的回调函数,仅可以是同步函数。 | ||||||
|  |  */ | ||||||
|  | export type SyncMaybeObjectsCallback<P = string, T = void> = SyncObjectCallback<P[] | undefined, T>; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 接收一个对象数组(默认是字符串数组)或者零个对象作为参数的回调函数,仅可以是异步函数。 | ||||||
|  |  */ | ||||||
|  | export type AsyncMaybeObjectsCallback<P = string, T = void> = AsyncObjectCallback< | ||||||
|  |   P[] | undefined, | ||||||
|  |   T | ||||||
|  | >; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 可以接受任意数量任意参数类型的回调函数。 | ||||||
|  |  */ | ||||||
|  | export type ExtendParamCallback<P = unknown, T = void> = (...args: P[]) => T | Promise<T>; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 可以接受任意数量任意参数类型的仅支持同步的回调函数。 | ||||||
|  |  */ | ||||||
|  | export type SyncExtendParamCallback<P = unknown, T = void> = (...args: P[]) => T; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 可以接受任意数量任意参数类型的仅支持异步的回调函数。 | ||||||
|  |  */ | ||||||
|  | export type AsyncExtendParamCallback<P = unknown, T = void> = (...args: P[]) => Promise<T>; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 不接受任何参数内容的回调函数,可以是同步函数也可以是异步函数。 | ||||||
|  |  */ | ||||||
|  | export type Callback<T = void> = () => T | Promise<T>; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 不接受任何参数内容的回调函数,仅可以是同步函数。 | ||||||
|  |  */ | ||||||
|  | export type SyncCallback<T = void> = () => T; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 不接受任何参数内容的回调函数,仅可以是异步函数。 | ||||||
|  |  */ | ||||||
|  | export type AsyncCallback<T = void> = () => Promise<T>; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 用于在Store中定义状态操作Action的无参同步Action类型。 | ||||||
|  |  */ | ||||||
|  | export type SyncAction = SyncCallback<void>; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 用于在Store中定义状态操作Action的无参可异步Action类型。 | ||||||
|  |  */ | ||||||
|  | export type AsyncAction = Callback<void>; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 用于在Store中定义状态操作Action的单一参数同步Action类型。 | ||||||
|  |  */ | ||||||
|  | export type SyncParamAction<T> = SyncObjectCallback<T, void>; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 用于在Store中定义状态操作Action的单一参数异步Action类型。 | ||||||
|  |  */ | ||||||
|  | export type AsyncParamAction<T> = AsyncObjectCallback<T, void>; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 用于在Store中定义状态操作Action的不定参同步Action类型。 | ||||||
|  |  */ | ||||||
|  | export type SyncMaybeAction<T> = SyncMaybeObjectCallback<T>; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 用于在Store中定义状态操作Action的不定参可异步Action类型。 | ||||||
|  |  */ | ||||||
|  | export type AsyncMaybeAction<T> = AsyncMaybeObjectCallback<T>; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 用于在Store中定义状态操作Action的展开参同步Action类型。 | ||||||
|  |  */ | ||||||
|  | export type SyncExtendParamAction<T> = SyncExtendParamCallback<T>; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 用于在Store中定义状态操作Action的展开参可异步Action类型。 | ||||||
|  |  */ | ||||||
|  | export type AsyncExtendParamAction<T> = AsyncExtendParamCallback<T>; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 用于定义可以接受重置事件的Ref组件。 | ||||||
|  |  */ | ||||||
|  | export interface Resetable { | ||||||
|  |   /** | ||||||
|  |    * 组件可以接受的重置方法。 | ||||||
|  |    */ | ||||||
|  |   reset: Callback; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 用于定义可执行打开动作的Ref组件。 | ||||||
|  |  */ | ||||||
|  | export interface Openable { | ||||||
|  |   /** | ||||||
|  |    * 组件可以接受的打开方法。 | ||||||
|  |    */ | ||||||
|  |   open: Callback; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 用于定义可执行关闭动作的Ref组件。 | ||||||
|  |  */ | ||||||
|  | export interface Closeable { | ||||||
|  |   /** | ||||||
|  |    * 组件可以接受的关闭方法。 | ||||||
|  |    */ | ||||||
|  |   close: Callback; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 用于定义可以执行特定动作的Ref组件。 | ||||||
|  |  * 组件所执行的动作可以接受任意数量的参数,但不会返回任何结果。 | ||||||
|  |  */ | ||||||
|  | export interface Actionable<T = unknown> { | ||||||
|  |   /** | ||||||
|  |    * 组件可以接受的执行特定动作的方法。 | ||||||
|  |    */ | ||||||
|  |   action?: ExtendParamCallback<T>; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 用于记录可以发生修改的脏数据。 | ||||||
|  |  */ | ||||||
|  | export interface DirtyableValue<T> { | ||||||
|  |   /** | ||||||
|  |    * 记录数据当前的值。 | ||||||
|  |    */ | ||||||
|  |   value: T; | ||||||
|  |   /** | ||||||
|  |    * 记录数据在修改前的全部历史值。 | ||||||
|  |    */ | ||||||
|  |   lastValues: T[]; | ||||||
|  |   /** | ||||||
|  |    * 记录数据是否发生了更改。 | ||||||
|  |    */ | ||||||
|  |   dirty: boolean; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 转换一般的数据记录类型成为可记录修改的脏数据类型。 | ||||||
|  |  */ | ||||||
|  | export type Dirtyable<T> = { [P in keyof T]: DirtyableValue<T[P]> }; | ||||||
							
								
								
									
										56
									
								
								src/utils/store_creator.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								src/utils/store_creator.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,56 @@ | |||||||
|  | //@ts-nocheck | ||||||
|  | /* eslint-disable @typescript-eslint/no-unsafe-call */ | ||||||
|  | /* eslint-disable @typescript-eslint/no-unsafe-member-access */ | ||||||
|  | import { create, State, StateCreator, StoreApi, UseBoundStore } from 'zustand'; | ||||||
|  | import { immer } from 'zustand/middleware/immer'; | ||||||
|  |  | ||||||
|  | interface EnhancedStoreType<StoreType> { | ||||||
|  |   use: { | ||||||
|  |     [key in keyof StoreType]: () => StoreType[key]; | ||||||
|  |   }; | ||||||
|  |   reset: () => void; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type CreateStoreHookOptions = { | ||||||
|  |   debug?: boolean; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 自动为一个Store Hook创建快速访问其中状态和Action的选择器。 | ||||||
|  |  */ | ||||||
|  | function createSelectors<StoreType extends State>( | ||||||
|  |   store: UseBoundStore<StoreApi<StoreType>>, | ||||||
|  |   debug?: boolean | ||||||
|  | ): UseBoundStore<StoreApi<StoreType>> & EnhancedStoreType<StoreType> { | ||||||
|  |   const initialState = store.getState(); | ||||||
|  |   (store as unknown).use = {}; | ||||||
|  |  | ||||||
|  |   Object.keys(store.getState()).forEach(key => { | ||||||
|  |     const selector = (state: StoreType) => state[key as keyof StoreType]; | ||||||
|  |     (store as unknown).use[key] = () => store(selector); | ||||||
|  |   }); | ||||||
|  |   (store as unknown).reset = () => store.setState(initialState, true); | ||||||
|  |  | ||||||
|  |   if (debug ?? false) { | ||||||
|  |     store.subscribe((current, previous) => { | ||||||
|  |       console.log('[状态调试]Action应用前: ', previous); | ||||||
|  |       console.log('[状态调试]Action应用后: ', current); | ||||||
|  |     }); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   return store as UseBoundStore<StoreType> & EnhancedStoreType<StoreType>; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 自动嵌套使用Devtools和Immer中间件的Zustand创建Store Hook的函数。 | ||||||
|  |  * 同时将会自动应用创建快速访问状态和Action的选择器。 | ||||||
|  |  */ | ||||||
|  | export const createStoreHook = < | ||||||
|  |   T extends State, | ||||||
|  |   Mps extends [StoreMutatorIdentifier, unknown][] = [], | ||||||
|  |   Mcs extends [StoreMutatorIdentifier, unknown][] = [] | ||||||
|  | >( | ||||||
|  |   initializer: StateCreator<T, [...Mps, ['zustand/immer', never]], Mcs>, | ||||||
|  |   options?: CreateStoreHookOptions | ||||||
|  | ): UseBoundStore<StoreApi<T>> & EnhancedStoreType<T> => | ||||||
|  |   createSelectors(create<T>()(immer(initializer)), options?.debug ?? false); | ||||||
							
								
								
									
										11
									
								
								tsconfig.eslint.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								tsconfig.eslint.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | |||||||
|  | { | ||||||
|  |   "extends": "./tsconfig.json", | ||||||
|  |   "include": [ | ||||||
|  |     "./src", | ||||||
|  |     ".eslintrc.js", | ||||||
|  |   ], | ||||||
|  |   "exclude": [ | ||||||
|  |     "node_modules", | ||||||
|  |     "dist" | ||||||
|  |   ] | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user