diff --git a/web/package.json b/web/package.json index ca958f88..5ca3a90b 100644 --- a/web/package.json +++ b/web/package.json @@ -17,13 +17,16 @@ } }, "dependencies": { + "@emotion/cache": "11.9.3", + "@emotion/react": "11.9.3", + "@emotion/styled": "11.9.3", "@fortawesome/fontawesome-svg-core": "6.1.1", "@fortawesome/free-regular-svg-icons": "6.1.1", "@fortawesome/free-solid-svg-icons": "6.1.1", "@fortawesome/react-fontawesome": "0.1.18", - "@material-ui/core": "4.12.4", - "@material-ui/icons": "4.11.3", - "@material-ui/styles": "4.11.5", + "@mui/icons-material": "5.8.4", + "@mui/material": "5.8.4", + "@mui/styles": "5.8.4", "axios": "0.27.2", "classnames": "2.3.1", "i18next": "21.8.10", @@ -151,7 +154,7 @@ "@typescript-eslint/eslint-plugin": "5.29.0", "@typescript-eslint/parser": "5.29.0", "@vitejs/plugin-react": "1.3.2", - "esbuild": "0.14.46", + "esbuild": "0.14.17", "esbuild-jest": "0.5.0", "eslint": "8.18.0", "eslint-config-prettier": "8.5.0", diff --git a/web/pnpm-lock.yaml b/web/pnpm-lock.yaml index bf6a1453..885e5fb0 100644 --- a/web/pnpm-lock.yaml +++ b/web/pnpm-lock.yaml @@ -3,13 +3,16 @@ lockfileVersion: 5.4 specifiers: '@commitlint/cli': 17.0.2 '@commitlint/config-conventional': 17.0.2 + '@emotion/cache': 11.9.3 + '@emotion/react': 11.9.3 + '@emotion/styled': 11.9.3 '@fortawesome/fontawesome-svg-core': 6.1.1 '@fortawesome/free-regular-svg-icons': 6.1.1 '@fortawesome/free-solid-svg-icons': 6.1.1 '@fortawesome/react-fontawesome': 0.1.18 - '@material-ui/core': 4.12.4 - '@material-ui/icons': 4.11.3 - '@material-ui/styles': 4.11.5 + '@mui/icons-material': 5.8.4 + '@mui/material': 5.8.4 + '@mui/styles': 5.8.4 '@testing-library/jest-dom': 5.16.4 '@testing-library/react': 13.3.0 '@types/jest': 28.1.2 @@ -23,7 +26,7 @@ specifiers: '@vitejs/plugin-react': 1.3.2 axios: 0.27.2 classnames: 2.3.1 - esbuild: 0.14.46 + esbuild: 0.14.17 esbuild-jest: 0.5.0 eslint: 8.18.0 eslint-config-prettier: 8.5.0 @@ -62,13 +65,16 @@ specifiers: zxcvbn: 4.4.2 dependencies: + '@emotion/cache': 11.9.3 + '@emotion/react': 11.9.3_luyos4mouogwq6z3wafb3re4ce + '@emotion/styled': 11.9.3_mtgmvqaicd2yfw2b4v4o2ssbiu '@fortawesome/fontawesome-svg-core': 6.1.1 '@fortawesome/free-regular-svg-icons': 6.1.1 '@fortawesome/free-solid-svg-icons': 6.1.1 '@fortawesome/react-fontawesome': 0.1.18_sdfg7szeivrzzj63kiqxwaxkwu - '@material-ui/core': 4.12.4_twyhzqqpkwvvgrmyeapdo6i4my - '@material-ui/icons': 4.11.3_xfab57qepcdrxdxif4xlv2kdgm - '@material-ui/styles': 4.11.5_twyhzqqpkwvvgrmyeapdo6i4my + '@mui/icons-material': 5.8.4_yu5sa4rzeyws3lc2nzea5ulemm + '@mui/material': 5.8.4_h2u6a3oivtyocvjxeke7xcvlfa + '@mui/styles': 5.8.4_luyos4mouogwq6z3wafb3re4ce axios: 0.27.2 classnames: 2.3.1 i18next: 21.8.10 @@ -98,8 +104,8 @@ devDependencies: '@typescript-eslint/eslint-plugin': 5.29.0_qqmbkyiaixvppdwswpytuf2hgm '@typescript-eslint/parser': 5.29.0_b5e7v2qnwxfo6hmiq56u52mz3e '@vitejs/plugin-react': 1.3.2 - esbuild: 0.14.46 - esbuild-jest: 0.5.0_esbuild@0.14.46 + esbuild: 0.14.17 + esbuild-jest: 0.5.0_esbuild@0.14.17 eslint: 8.18.0 eslint-config-prettier: 8.5.0_eslint@8.18.0 eslint-config-react-app: 7.0.1_ag33aw3cn4hz6vomfcndkvqj3q @@ -138,13 +144,17 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/highlight': 7.16.10 - dev: true /@babel/compat-data/7.17.10: resolution: {integrity: sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw==} engines: {node: '>=6.9.0'} dev: true + /@babel/compat-data/7.17.7: + resolution: {integrity: sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ==} + engines: {node: '>=6.9.0'} + dev: true + /@babel/core/7.17.10: resolution: {integrity: sha512-liKoppandF3ZcBnIYFjfSDHZLKdLHGJRkoWtG8zQyGJBQfIYobpnVGI5+pLBNtS6psFLDzyq8+h5HiVljW9PNA==} engines: {node: '>=6.9.0'} @@ -181,7 +191,7 @@ packages: '@babel/parser': 7.17.9 '@babel/template': 7.16.7 '@babel/traverse': 7.17.9 - '@babel/types': 7.17.0 + '@babel/types': 7.17.10 convert-source-map: 1.8.0 debug: 4.3.4 gensync: 1.0.0-beta.2 @@ -257,7 +267,7 @@ packages: peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/compat-data': 7.17.10 + '@babel/compat-data': 7.17.7 '@babel/core': 7.17.8 '@babel/helper-validator-option': 7.16.7 browserslist: 4.20.2 @@ -352,7 +362,6 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.17.10 - dev: true /@babel/helper-module-transforms/7.17.7: resolution: {integrity: sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==} @@ -364,7 +373,7 @@ packages: '@babel/helper-split-export-declaration': 7.16.7 '@babel/helper-validator-identifier': 7.16.7 '@babel/template': 7.16.7 - '@babel/traverse': 7.17.10 + '@babel/traverse': 7.17.9 '@babel/types': 7.17.10 transitivePeerDependencies: - supports-color @@ -380,7 +389,6 @@ packages: /@babel/helper-plugin-utils/7.16.7: resolution: {integrity: sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==} engines: {node: '>=6.9.0'} - dev: true /@babel/helper-remap-async-to-generator/7.16.8: resolution: {integrity: sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw==} @@ -430,7 +438,6 @@ packages: /@babel/helper-validator-identifier/7.16.7: resolution: {integrity: sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==} engines: {node: '>=6.9.0'} - dev: true /@babel/helper-validator-option/7.16.7: resolution: {integrity: sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==} @@ -454,7 +461,7 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/template': 7.16.7 - '@babel/traverse': 7.17.10 + '@babel/traverse': 7.17.9 '@babel/types': 7.17.10 transitivePeerDependencies: - supports-color @@ -467,7 +474,6 @@ packages: '@babel/helper-validator-identifier': 7.16.7 chalk: 2.4.2 js-tokens: 4.0.0 - dev: true /@babel/parser/7.17.10: resolution: {integrity: sha512-n2Q6i+fnJqzOaq2VkdXxy2TCPCWQZHiCo0XqmrCvDWcZQKRyZzYi4Z0yxlBuN0w+r2ZHmre+Q087DSrw3pbJDQ==} @@ -636,7 +642,7 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.17.10 + '@babel/compat-data': 7.17.7 '@babel/core': 7.17.10 '@babel/helper-compilation-targets': 7.17.10_@babel+core@7.17.10 '@babel/helper-plugin-utils': 7.16.7 @@ -844,6 +850,15 @@ packages: '@babel/helper-plugin-utils': 7.16.7 dev: true + /@babel/plugin-syntax-jsx/7.16.7: + resolution: {integrity: sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/helper-plugin-utils': 7.16.7 + dev: false + /@babel/plugin-syntax-jsx/7.16.7_@babel+core@7.17.10: resolution: {integrity: sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q==} engines: {node: '>=6.9.0'} @@ -1490,7 +1505,7 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.17.10 + '@babel/compat-data': 7.17.7 '@babel/core': 7.17.10 '@babel/helper-compilation-targets': 7.17.10_@babel+core@7.17.10 '@babel/helper-plugin-utils': 7.16.7 @@ -1630,7 +1645,7 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.16.7 - '@babel/parser': 7.17.10 + '@babel/parser': 7.17.9 '@babel/types': 7.17.10 dev: true @@ -1657,12 +1672,12 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.16.7 - '@babel/generator': 7.17.10 + '@babel/generator': 7.17.9 '@babel/helper-environment-visitor': 7.16.7 '@babel/helper-function-name': 7.17.9 '@babel/helper-hoist-variables': 7.16.7 '@babel/helper-split-export-declaration': 7.16.7 - '@babel/parser': 7.17.10 + '@babel/parser': 7.17.9 '@babel/types': 7.17.10 debug: 4.3.4 globals: 11.12.0 @@ -1670,21 +1685,12 @@ packages: - supports-color dev: true - /@babel/types/7.17.0: - resolution: {integrity: sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-validator-identifier': 7.16.7 - to-fast-properties: 2.0.0 - dev: true - /@babel/types/7.17.10: resolution: {integrity: sha512-9O26jG0mBYfGkUYCYZRnBwbVLd1UZOICEr2Em6InB6jVfsAv1GKgwXHmrSg+WFWDmeKTA6vyTZiN8tCSM5Oo3A==} engines: {node: '>=6.9.0'} dependencies: '@babel/helper-validator-identifier': 7.16.7 to-fast-properties: 2.0.0 - dev: true /@bcoe/v8-coverage/0.2.3: resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} @@ -1875,10 +1881,121 @@ packages: resolution: {integrity: sha512-RpfLEtTlyIxeNPGKcokS+p3BZII/Q3bYxryFRglh5H3A3T8q9fsLYm72VYAMEOOIBLEa8o93kFLiBDUWKrwXZA==} dev: true + /@emotion/babel-plugin/11.9.2: + resolution: {integrity: sha512-Pr/7HGH6H6yKgnVFNEj2MVlreu3ADqftqjqwUvDy/OJzKFgxKeTQ+eeUf20FOTuHVkDON2iNa25rAXVYtWJCjw==} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/helper-module-imports': 7.16.7 + '@babel/plugin-syntax-jsx': 7.16.7 + '@babel/runtime': 7.17.8 + '@emotion/hash': 0.8.0 + '@emotion/memoize': 0.7.5 + '@emotion/serialize': 1.0.4 + babel-plugin-macros: 2.8.0 + convert-source-map: 1.8.0 + escape-string-regexp: 4.0.0 + find-root: 1.1.0 + source-map: 0.5.7 + stylis: 4.0.13 + dev: false + + /@emotion/cache/11.9.3: + resolution: {integrity: sha512-0dgkI/JKlCXa+lEXviaMtGBL0ynpx4osh7rjOXE71q9bIF8G+XhJgvi+wDu0B0IdCVx37BffiwXlN9I3UuzFvg==} + dependencies: + '@emotion/memoize': 0.7.5 + '@emotion/sheet': 1.1.1 + '@emotion/utils': 1.1.0 + '@emotion/weak-memoize': 0.2.5 + stylis: 4.0.13 + dev: false + /@emotion/hash/0.8.0: resolution: {integrity: sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==} dev: false + /@emotion/is-prop-valid/1.1.3: + resolution: {integrity: sha512-RFg04p6C+1uO19uG8N+vqanzKqiM9eeV1LDOG3bmkYmuOj7NbKNlFC/4EZq5gnwAIlcC/jOT24f8Td0iax2SXA==} + dependencies: + '@emotion/memoize': 0.7.5 + dev: false + + /@emotion/memoize/0.7.5: + resolution: {integrity: sha512-igX9a37DR2ZPGYtV6suZ6whr8pTFtyHL3K/oLUotxpSVO2ASaprmAe2Dkq7tBo7CRY7MMDrAa9nuQP9/YG8FxQ==} + dev: false + + /@emotion/react/11.9.3_luyos4mouogwq6z3wafb3re4ce: + resolution: {integrity: sha512-g9Q1GcTOlzOEjqwuLF/Zd9LC+4FljjPjDfxSM7KmEakm+hsHXk+bYZ2q+/hTJzr0OUNkujo72pXLQvXj6H+GJQ==} + peerDependencies: + '@babel/core': ^7.0.0 + '@types/react': '*' + react: '>=16.8.0 || 18' + peerDependenciesMeta: + '@babel/core': + optional: true + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.17.8 + '@emotion/babel-plugin': 11.9.2 + '@emotion/cache': 11.9.3 + '@emotion/serialize': 1.0.4 + '@emotion/utils': 1.1.0 + '@emotion/weak-memoize': 0.2.5 + '@types/react': 18.0.14 + hoist-non-react-statics: 3.3.2 + react: 18.2.0 + dev: false + + /@emotion/serialize/1.0.4: + resolution: {integrity: sha512-1JHamSpH8PIfFwAMryO2bNka+y8+KA5yga5Ocf2d7ZEiJjb7xlLW7aknBGZqJLajuLOvJ+72vN+IBSwPlXD1Pg==} + dependencies: + '@emotion/hash': 0.8.0 + '@emotion/memoize': 0.7.5 + '@emotion/unitless': 0.7.5 + '@emotion/utils': 1.1.0 + csstype: 3.1.0 + dev: false + + /@emotion/sheet/1.1.1: + resolution: {integrity: sha512-J3YPccVRMiTZxYAY0IOq3kd+hUP8idY8Kz6B/Cyo+JuXq52Ek+zbPbSQUrVQp95aJ+lsAW7DPL1P2Z+U1jGkKA==} + dev: false + + /@emotion/styled/11.9.3_mtgmvqaicd2yfw2b4v4o2ssbiu: + resolution: {integrity: sha512-o3sBNwbtoVz9v7WB1/Y/AmXl69YHmei2mrVnK7JgyBJ//Rst5yqPZCecEJlMlJrFeWHp+ki/54uN265V2pEcXA==} + peerDependencies: + '@babel/core': ^7.0.0 + '@emotion/react': ^11.0.0-rc.0 + '@types/react': '*' + react: '>=16.8.0 || 18' + peerDependenciesMeta: + '@babel/core': + optional: true + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.17.8 + '@emotion/babel-plugin': 11.9.2 + '@emotion/is-prop-valid': 1.1.3 + '@emotion/react': 11.9.3_luyos4mouogwq6z3wafb3re4ce + '@emotion/serialize': 1.0.4 + '@emotion/utils': 1.1.0 + '@types/react': 18.0.14 + react: 18.2.0 + dev: false + + /@emotion/unitless/0.7.5: + resolution: {integrity: sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==} + dev: false + + /@emotion/utils/1.1.0: + resolution: {integrity: sha512-iRLa/Y4Rs5H/f2nimczYmS5kFJEbpiVvgN3XVfZ022IYhuNA1IRSHEizcof88LtCTXtl9S2Cxt32KgaXEu72JQ==} + dev: false + + /@emotion/weak-memoize/0.2.5: + resolution: {integrity: sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==} + dev: false + /@eslint/eslintrc/1.3.0: resolution: {integrity: sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -1968,6 +2085,18 @@ packages: engines: {node: '>=8'} dev: true + /@jest/console/28.0.2: + resolution: {integrity: sha512-tiRpnMeeyQuuzgL5UNSeiqMwF8UOWPbAE5rzcu/1zyq4oPG2Ox6xm4YCOruwbp10F8odWc+XwVxTyGzMSLMqxA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/types': 28.1.1 + '@types/node': 16.11.41 + chalk: 4.1.2 + jest-message-util: 28.1.1 + jest-util: 28.1.1 + slash: 3.0.0 + dev: true + /@jest/console/28.1.1: resolution: {integrity: sha512-0RiUocPVFEm3WRMOStIHbRWllG6iW6E3/gUPnf4lkrVFyXIIDeCe+vlKeYyFOMhB2EPE6FLFCNADSOOQMaqvyA==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} @@ -2127,6 +2256,16 @@ packages: graceful-fs: 4.2.9 dev: true + /@jest/test-result/28.0.2: + resolution: {integrity: sha512-4EUqgjq9VzyUiVTvZfI9IRJD6t3NYBNP4f+Eq8Zr93+hkJ0RrGU4OBTw8tfNzidKX+bmuYzn8FxqpxOPIGGCMA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/console': 28.0.2 + '@jest/types': 28.1.1 + '@types/istanbul-lib-coverage': 2.0.4 + collect-v8-coverage: 1.0.1 + dev: true + /@jest/test-result/28.1.1: resolution: {integrity: sha512-hPmkugBktqL6rRzwWAtp1JtYT4VHwv8OQ+9lE5Gymj6dHzubI/oJHMUpPOt8NrdVWSrz9S7bHjJUmv2ggFoUNQ==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} @@ -2204,6 +2343,18 @@ packages: chalk: 4.1.2 dev: true + /@jest/types/28.0.2: + resolution: {integrity: sha512-hi3jUdm9iht7I2yrV5C4s3ucCJHUP8Eh3W6rQ1s4n/Qw9rQgsda4eqCt+r3BKRi7klVmZfQlMx1nGlzNMP2d8A==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/schemas': 28.0.2 + '@types/istanbul-lib-coverage': 2.0.4 + '@types/istanbul-reports': 3.0.1 + '@types/node': 16.11.41 + '@types/yargs': 17.0.10 + chalk: 4.1.2 + dev: true + /@jest/types/28.1.1: resolution: {integrity: sha512-vRXVqSg1VhDnB8bWcmvLzmg0Bt9CRKVgHPXqYwvWMX3TvAjeO+nRuK6+VdTKCtWOvYlmkF/HqNAL/z+N3B53Kw==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} @@ -2220,7 +2371,7 @@ packages: resolution: {integrity: sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==} engines: {node: '>=6.0.0'} dependencies: - '@jridgewell/set-array': 1.1.0 + '@jridgewell/set-array': 1.1.1 '@jridgewell/sourcemap-codec': 1.4.11 dev: true @@ -2229,8 +2380,8 @@ packages: engines: {node: '>=6.0.0'} dev: true - /@jridgewell/set-array/1.1.0: - resolution: {integrity: sha512-SfJxIxNVYLTsKwzB3MoOQ1yxf4w/E6MdkvTgrgAt1bfxjSrLUoHMKrDOykwN14q65waezZIdqDneUIPh4/sKxg==} + /@jridgewell/set-array/1.1.1: + resolution: {integrity: sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ==} engines: {node: '>=6.0.0'} dev: true @@ -2245,27 +2396,75 @@ packages: '@jridgewell/sourcemap-codec': 1.4.11 dev: true - /@material-ui/core/4.12.4_twyhzqqpkwvvgrmyeapdo6i4my: - resolution: {integrity: sha512-tr7xekNlM9LjA6pagJmL8QCgZXaubWUwkJnoYcMKd4gw/t4XiyvnTkjdGrUVicyB2BsdaAv1tvow45bPM4sSwQ==} - engines: {node: '>=8.0.0'} + /@mui/base/5.0.0-alpha.85_twyhzqqpkwvvgrmyeapdo6i4my: + resolution: {integrity: sha512-ONlQJOmQrxmR+pYF9AqH69FOG4ofwzVzNltwb2xKAQIW3VbsNZahcHIpzhFd70W6EIU+QHzB9TzamSM+Fg/U7w==} + engines: {node: '>=12.0.0'} peerDependencies: - '@types/react': ^16.8.6 || ^17.0.0 || 18 - react: ^16.8.0 || ^17.0.0 || 18 - react-dom: ^16.8.0 || ^17.0.0 || 18 + '@types/react': ^17.0.0 || ^18.0.0 || 18 + react: ^17.0.0 || ^18.0.0 || 18 + react-dom: ^17.0.0 || ^18.0.0 || 18 peerDependenciesMeta: '@types/react': optional: true dependencies: '@babel/runtime': 7.17.8 - '@material-ui/styles': 4.11.5_twyhzqqpkwvvgrmyeapdo6i4my - '@material-ui/system': 4.12.2_twyhzqqpkwvvgrmyeapdo6i4my - '@material-ui/types': 5.1.0_@types+react@18.0.14 - '@material-ui/utils': 4.11.3_biqbaboplfbrettd7655fr4n2y + '@emotion/is-prop-valid': 1.1.3 + '@mui/types': 7.1.4_@types+react@18.0.14 + '@mui/utils': 5.8.4_react@18.2.0 + '@popperjs/core': 2.11.5 + '@types/react': 18.0.14 + clsx: 1.1.1 + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0_react@18.2.0 + react-is: 17.0.2 + dev: false + + /@mui/icons-material/5.8.4_yu5sa4rzeyws3lc2nzea5ulemm: + resolution: {integrity: sha512-9Z/vyj2szvEhGWDvb+gG875bOGm8b8rlHBKOD1+nA3PcgC3fV6W1AU6pfOorPeBfH2X4mb9Boe97vHvaSndQvA==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@mui/material': ^5.0.0 + '@types/react': ^17.0.0 || ^18.0.0 || 18 + react: ^17.0.0 || ^18.0.0 || 18 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.17.8 + '@mui/material': 5.8.4_h2u6a3oivtyocvjxeke7xcvlfa + '@types/react': 18.0.14 + react: 18.2.0 + dev: false + + /@mui/material/5.8.4_h2u6a3oivtyocvjxeke7xcvlfa: + resolution: {integrity: sha512-KlOJS1JGhwuhdoF4fulmz41h/YxyMdZSc+ncz+HAah0GKn8ovAs5774f1w0lIasxbtI1Ziunwvmnu9PvvUKdMw==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@emotion/react': ^11.5.0 + '@emotion/styled': ^11.3.0 + '@types/react': ^17.0.0 || ^18.0.0 || 18 + react: ^17.0.0 || ^18.0.0 || 18 + react-dom: ^17.0.0 || ^18.0.0 || 18 + peerDependenciesMeta: + '@emotion/react': + optional: true + '@emotion/styled': + optional: true + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.17.8 + '@emotion/react': 11.9.3_luyos4mouogwq6z3wafb3re4ce + '@emotion/styled': 11.9.3_mtgmvqaicd2yfw2b4v4o2ssbiu + '@mui/base': 5.0.0-alpha.85_twyhzqqpkwvvgrmyeapdo6i4my + '@mui/system': 5.8.4_2n63gx4a5hafw7crejwh35wbou + '@mui/types': 7.1.4_@types+react@18.0.14 + '@mui/utils': 5.8.4_react@18.2.0 '@types/react': 18.0.14 '@types/react-transition-group': 4.4.4 clsx: 1.1.1 - hoist-non-react-statics: 3.3.2 - popper.js: 1.16.1-lts + csstype: 3.1.0 prop-types: 15.8.1 react: 18.2.0 react-dom: 18.2.0_react@18.2.0 @@ -2273,43 +2472,62 @@ packages: react-transition-group: 4.4.2_biqbaboplfbrettd7655fr4n2y dev: false - /@material-ui/icons/4.11.3_xfab57qepcdrxdxif4xlv2kdgm: - resolution: {integrity: sha512-IKHlyx6LDh8n19vzwH5RtHIOHl9Tu90aAAxcbWME6kp4dmvODM3UvOHJeMIDzUbd4muuJKHmlNoBN+mDY4XkBA==} - engines: {node: '>=8.0.0'} + /@mui/private-theming/5.8.4_luyos4mouogwq6z3wafb3re4ce: + resolution: {integrity: sha512-3Lp0VAEjtQygJ70MWEyHkKvg327O6YoBH6ZNEy6fIsrK6gmRIj+YrlvJ7LQCbowY+qDGnbdMrTBd1hfThlI8lg==} + engines: {node: '>=12.0.0'} peerDependencies: - '@material-ui/core': ^4.0.0 - '@types/react': ^16.8.6 || ^17.0.0 || 18 - react: ^16.8.0 || ^17.0.0 || 18 - react-dom: ^16.8.0 || ^17.0.0 || 18 + '@types/react': ^17.0.0 || ^18.0.0 || 18 + react: ^17.0.0 || ^18.0.0 || 18 peerDependenciesMeta: '@types/react': optional: true dependencies: '@babel/runtime': 7.17.8 - '@material-ui/core': 4.12.4_twyhzqqpkwvvgrmyeapdo6i4my + '@mui/utils': 5.8.4_react@18.2.0 '@types/react': 18.0.14 + prop-types: 15.8.1 react: 18.2.0 - react-dom: 18.2.0_react@18.2.0 dev: false - /@material-ui/styles/4.11.5_twyhzqqpkwvvgrmyeapdo6i4my: - resolution: {integrity: sha512-o/41ot5JJiUsIETME9wVLAJrmIWL3j0R0Bj2kCOLbSfqEkKf0fmaPt+5vtblUh5eXr2S+J/8J3DaCb10+CzPGA==} - engines: {node: '>=8.0.0'} + /@mui/styled-engine/5.8.0_fdnqutfacy7v3gmlcm66flps3q: + resolution: {integrity: sha512-Q3spibB8/EgeMYHc+/o3RRTnAYkSl7ROCLhXJ830W8HZ2/iDiyYp16UcxKPurkXvLhUaILyofPVrP3Su2uKsAw==} + engines: {node: '>=12.0.0'} peerDependencies: - '@types/react': ^16.8.6 || ^17.0.0 || 18 - react: ^16.8.0 || ^17.0.0 || 18 - react-dom: ^16.8.0 || ^17.0.0 || 18 + '@emotion/react': ^11.4.1 + '@emotion/styled': ^11.3.0 + react: ^17.0.0 || ^18.0.0 || 18 + peerDependenciesMeta: + '@emotion/react': + optional: true + '@emotion/styled': + optional: true + dependencies: + '@babel/runtime': 7.17.8 + '@emotion/cache': 11.9.3 + '@emotion/react': 11.9.3_luyos4mouogwq6z3wafb3re4ce + '@emotion/styled': 11.9.3_mtgmvqaicd2yfw2b4v4o2ssbiu + prop-types: 15.8.1 + react: 18.2.0 + dev: false + + /@mui/styles/5.8.4_luyos4mouogwq6z3wafb3re4ce: + resolution: {integrity: sha512-Td7dafJDgpdzObT0z5CH/ihOh22MG2vZ7p2tpnrKaq3We50f8l3T69XeTNcy2OH0TWnXJJuASZS/0uMJmVPfag==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@types/react': ^17.0.0 || 18 + react: ^17.0.0 || 18 peerDependenciesMeta: '@types/react': optional: true dependencies: '@babel/runtime': 7.17.8 '@emotion/hash': 0.8.0 - '@material-ui/types': 5.1.0_@types+react@18.0.14 - '@material-ui/utils': 4.11.3_biqbaboplfbrettd7655fr4n2y + '@mui/private-theming': 5.8.4_luyos4mouogwq6z3wafb3re4ce + '@mui/types': 7.1.4_@types+react@18.0.14 + '@mui/utils': 5.8.4_react@18.2.0 '@types/react': 18.0.14 clsx: 1.1.1 - csstype: 2.6.20 + csstype: 3.1.0 hoist-non-react-statics: 3.3.2 jss: 10.9.0 jss-plugin-camel-case: 10.9.0 @@ -2321,31 +2539,40 @@ packages: jss-plugin-vendor-prefixer: 10.9.0 prop-types: 15.8.1 react: 18.2.0 - react-dom: 18.2.0_react@18.2.0 dev: false - /@material-ui/system/4.12.2_twyhzqqpkwvvgrmyeapdo6i4my: - resolution: {integrity: sha512-6CSKu2MtmiJgcCGf6nBQpM8fLkuB9F55EKfbdTC80NND5wpTmKzwdhLYLH3zL4cLlK0gVaaltW7/wMuyTnN0Lw==} - engines: {node: '>=8.0.0'} + /@mui/system/5.8.4_2n63gx4a5hafw7crejwh35wbou: + resolution: {integrity: sha512-eeYZXlOn4p+tYwqqDlci6wW4knJ68aGx5A24YU9ubYZ5o0IwveoNP3LC9sHAMxigk/mUTqL4bpSMJ2HbTn2aQg==} + engines: {node: '>=12.0.0'} peerDependencies: - '@types/react': ^16.8.6 || ^17.0.0 || 18 - react: ^16.8.0 || ^17.0.0 || 18 - react-dom: ^16.8.0 || ^17.0.0 || 18 + '@emotion/react': ^11.5.0 + '@emotion/styled': ^11.3.0 + '@types/react': ^17.0.0 || ^18.0.0 || 18 + react: ^17.0.0 || ^18.0.0 || 18 peerDependenciesMeta: + '@emotion/react': + optional: true + '@emotion/styled': + optional: true '@types/react': optional: true dependencies: '@babel/runtime': 7.17.8 - '@material-ui/utils': 4.11.3_biqbaboplfbrettd7655fr4n2y + '@emotion/react': 11.9.3_luyos4mouogwq6z3wafb3re4ce + '@emotion/styled': 11.9.3_mtgmvqaicd2yfw2b4v4o2ssbiu + '@mui/private-theming': 5.8.4_luyos4mouogwq6z3wafb3re4ce + '@mui/styled-engine': 5.8.0_fdnqutfacy7v3gmlcm66flps3q + '@mui/types': 7.1.4_@types+react@18.0.14 + '@mui/utils': 5.8.4_react@18.2.0 '@types/react': 18.0.14 - csstype: 2.6.20 + clsx: 1.1.1 + csstype: 3.1.0 prop-types: 15.8.1 react: 18.2.0 - react-dom: 18.2.0_react@18.2.0 dev: false - /@material-ui/types/5.1.0_@types+react@18.0.14: - resolution: {integrity: sha512-7cqRjrY50b8QzRSYyhSpx4WRw2YuO0KKIGQEVk5J8uoz2BanawykgZGoWEqKm7pVIbzFDN0SpPcVV4IhOFkl8A==} + /@mui/types/7.1.4_@types+react@18.0.14: + resolution: {integrity: sha512-uveM3byMbthO+6tXZ1n2zm0W3uJCQYtwt/v5zV5I77v2v18u0ITkb8xwhsDD2i3V2Kye7SaNR6FFJ6lMuY/WqQ==} peerDependencies: '@types/react': '*' peerDependenciesMeta: @@ -2355,17 +2582,17 @@ packages: '@types/react': 18.0.14 dev: false - /@material-ui/utils/4.11.3_biqbaboplfbrettd7655fr4n2y: - resolution: {integrity: sha512-ZuQPV4rBK/V1j2dIkSSEcH5uT6AaHuKWFfotADHsC0wVL1NLd2WkFCm4ZZbX33iO4ydl6V0GPngKm8HZQ2oujg==} - engines: {node: '>=8.0.0'} + /@mui/utils/5.8.4_react@18.2.0: + resolution: {integrity: sha512-BHYErfrjqqh76KaDAm8wZlhEip1Uj7Cmco65NcsF3BWrAl3FWngACpaPZeEbTgmaEwyWAQEE6LZhsmy43hfyqQ==} + engines: {node: '>=12.0.0'} peerDependencies: - react: ^16.8.0 || ^17.0.0 || 18 - react-dom: ^16.8.0 || ^17.0.0 || 18 + react: ^17.0.0 || ^18.0.0 || 18 dependencies: '@babel/runtime': 7.17.8 + '@types/prop-types': 15.7.5 + '@types/react-is': 17.0.3 prop-types: 15.8.1 react: 18.2.0 - react-dom: 18.2.0_react@18.2.0 react-is: 17.0.2 dev: false @@ -2390,6 +2617,10 @@ packages: fastq: 1.13.0 dev: true + /@popperjs/core/2.11.5: + resolution: {integrity: sha512-9X2obfABZuDVLCgPK9aX0a/x4jaOEweTTWE2+9sr0Qqqevj2Uv5XorvusThmc9XGYpS9yI+fhh8RTafBtGposw==} + dev: false + /@rollup/pluginutils/4.2.1: resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} engines: {node: '>= 8.0.0'} @@ -2708,7 +2939,6 @@ packages: /@types/parse-json/4.0.0: resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} - dev: true /@types/parse5/6.0.3: resolution: {integrity: sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==} @@ -2718,8 +2948,8 @@ packages: resolution: {integrity: sha512-ReVR2rLTV1kvtlWFyuot+d1pkpG2Fw/XKE3PDAdj57rbM97ttSp9JZ2UsP+2EHTylra9cUf6JA7tGwW1INzUrA==} dev: true - /@types/prop-types/15.7.4: - resolution: {integrity: sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ==} + /@types/prop-types/15.7.5: + resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} /@types/qrcode.react/1.0.2: resolution: {integrity: sha512-I9Oq5Cjlkgy3Tw7krCnCXLw2/zMhizkTere49OOcta23tkvH0xBTP0yInimTh0gstLRtb8Ki9NZVujE5UI6ffQ==} @@ -2733,6 +2963,12 @@ packages: '@types/react': 18.0.14 dev: true + /@types/react-is/17.0.3: + resolution: {integrity: sha512-aBTIWg1emtu95bLTLx0cpkxwGW3ueZv71nE2YFBpL8k/z5czEW8yYpOo8Dp+UUAFAtKwNaOsh/ioSeQnWlZcfw==} + dependencies: + '@types/react': 18.0.14 + dev: false + /@types/react-transition-group/4.4.4: resolution: {integrity: sha512-7gAPz7anVK5xzbeQW9wFBDg7G++aPLAFY0QaSMOou9rJZpbuI58WAuJrgu+qR92l61grlnCUe7AFX8KGahAgug==} dependencies: @@ -2742,9 +2978,9 @@ packages: /@types/react/18.0.14: resolution: {integrity: sha512-x4gGuASSiWmo0xjDLpm5mPb52syZHJx02VKbqUKdLmKtAwIh63XClGsiTI1K6DO5q7ox4xAsQrU+Gl3+gGXF9Q==} dependencies: - '@types/prop-types': 15.7.4 + '@types/prop-types': 15.7.5 '@types/scheduler': 0.16.2 - csstype: 3.0.11 + csstype: 3.1.0 /@types/scheduler/0.16.2: resolution: {integrity: sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==} @@ -3087,7 +3323,6 @@ packages: engines: {node: '>=4'} dependencies: color-convert: 1.9.3 - dev: true /ansi-styles/4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} @@ -3169,8 +3404,8 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.1.3 - es-abstract: 1.19.2 + define-properties: 1.1.4 + es-abstract: 1.20.1 get-intrinsic: 1.1.1 is-string: 1.0.7 dev: true @@ -3201,8 +3436,8 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.1.3 - es-abstract: 1.19.2 + define-properties: 1.1.4 + es-abstract: 1.20.1 dev: true /array.prototype.flatmap/1.3.0: @@ -3332,6 +3567,14 @@ packages: '@types/babel__traverse': 7.14.2 dev: true + /babel-plugin-macros/2.8.0: + resolution: {integrity: sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==} + dependencies: + '@babel/runtime': 7.17.8 + cosmiconfig: 6.0.0 + resolve: 1.22.0 + dev: false + /babel-plugin-macros/3.1.0: resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} engines: {node: '>=10', npm: '>=6'} @@ -3346,7 +3589,7 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.17.10 + '@babel/compat-data': 7.17.7 '@babel/core': 7.17.10 '@babel/helper-define-polyfill-provider': 0.3.1_@babel+core@7.17.10 semver: 6.3.0 @@ -3567,7 +3810,6 @@ packages: /callsites/3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - dev: true /camelcase-keys/6.2.2: resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} @@ -3606,7 +3848,6 @@ packages: ansi-styles: 3.2.1 escape-string-regexp: 1.0.5 supports-color: 5.5.0 - dev: true /chalk/3.0.0: resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} @@ -3699,7 +3940,6 @@ packages: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} dependencies: color-name: 1.1.3 - dev: true /color-convert/2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} @@ -3710,7 +3950,6 @@ packages: /color-name/1.1.3: resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - dev: true /color-name/1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} @@ -3775,7 +4014,6 @@ packages: resolution: {integrity: sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==} dependencies: safe-buffer: 5.1.2 - dev: true /copy-descriptor/0.1.1: resolution: {integrity: sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=} @@ -3810,6 +4048,17 @@ packages: - '@swc/wasm' dev: true + /cosmiconfig/6.0.0: + resolution: {integrity: sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==} + engines: {node: '>=8'} + dependencies: + '@types/parse-json': 4.0.0 + import-fresh: 3.3.0 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.2 + dev: false + /cosmiconfig/7.0.1: resolution: {integrity: sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==} engines: {node: '>=10'} @@ -3887,12 +4136,8 @@ packages: cssom: 0.3.8 dev: true - /csstype/2.6.20: - resolution: {integrity: sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA==} - dev: false - - /csstype/3.0.11: - resolution: {integrity: sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==} + /csstype/3.1.0: + resolution: {integrity: sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==} /damerau-levenshtein/1.0.8: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} @@ -4065,7 +4310,7 @@ packages: resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} dependencies: '@babel/runtime': 7.17.8 - csstype: 3.0.11 + csstype: 3.1.0 dev: false /domexception/4.0.0: @@ -4114,7 +4359,6 @@ packages: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} dependencies: is-arrayish: 0.2.1 - dev: true /es-abstract/1.19.2: resolution: {integrity: sha512-gfSBJoZdlL2xRiOCy0g8gLMryhoe1TlimjzU99L/31Z8QEGIhVQI+EWwt5lT+AuU9SnorVupXFqqOGqGfsyO6w==} @@ -4195,6 +4439,15 @@ packages: dev: true optional: true + /esbuild-android-arm64/0.14.17: + resolution: {integrity: sha512-y7EJm8ADC9qKbo/dJ2zBXwNdIILJ76tTv7JDGvOkbLT8HJXIsgbpa0NJk7iFhyvP4GpsYvXTbvEQNn0DhyBhLA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + /esbuild-android-arm64/0.14.46: resolution: {integrity: sha512-BKcnUksvCijO9ONv6b4SikZE/OZftwJvX91XROODZGQmuwGVg97jmLDVu3lxuHdFlMNNzxh8taJ2mbCWZzH/Iw==} engines: {node: '>=12'} @@ -4204,6 +4457,15 @@ packages: dev: true optional: true + /esbuild-darwin-64/0.14.17: + resolution: {integrity: sha512-V2JAP8yyVbW6qR4SVXsEDqRicYM0x5niUuB05IFiE5itPI45k8j2dA2l+DtirR2SGXr+LEqgX347+2VA6eyTiA==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + /esbuild-darwin-64/0.14.46: resolution: {integrity: sha512-/ss2kO92sUJ9/1nHnMb3+oab8w6dyqKrMtPMvSYJ9KZIYGAZxz/WYxfFprY7Xk+ZxWnnlASSyZlG+If1nVmFYg==} engines: {node: '>=12'} @@ -4213,6 +4475,15 @@ packages: dev: true optional: true + /esbuild-darwin-arm64/0.14.17: + resolution: {integrity: sha512-ENkSKpjF4SImyA2TdHhKiZqtYc1DkMykICe1KSBw0YNF1sentjFI6wu+CRiYMpC7REf/3TQXoems2XPqIqDMlQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + /esbuild-darwin-arm64/0.14.46: resolution: {integrity: sha512-WX0JOaEFf6t+rIjXO6THsf/0fhQAt2Zb0/PSYlvXnuQQAmOmFAfPsuRNocp5ME0NGaUqZd4FxqqmLEVK3RzPAg==} engines: {node: '>=12'} @@ -4222,6 +4493,15 @@ packages: dev: true optional: true + /esbuild-freebsd-64/0.14.17: + resolution: {integrity: sha512-2i0nTNJM8ftNTvtR00vdqkru8XpHwAbkR2MBLoK2IDSzjsLStwCj+mxf6v83eVM9Abe3QA8xP+irqOdBlwDQ2g==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + /esbuild-freebsd-64/0.14.46: resolution: {integrity: sha512-o+ozPFuHRCAGCVWU2bLurOUgVkT0jcPEu082VBUY2Q/yLf+B+/3nXzh4Fjp5O21tOvJRTn7hUVydG9j5+vYE6A==} engines: {node: '>=12'} @@ -4231,6 +4511,15 @@ packages: dev: true optional: true + /esbuild-freebsd-arm64/0.14.17: + resolution: {integrity: sha512-QOmRi1n+uly2G7BbMbHb86YiFA5aM7B2T96A6OF1VG57LNwXwy8LPVM0PVjl7f9cV3pE3fy3VtXPJHJo8XggTA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + /esbuild-freebsd-arm64/0.14.46: resolution: {integrity: sha512-9zicZ0X43WDKz3sjNfcqYO38xbfJpSWYXB+FxvYYkmBwGA52K0SAu4oKuTTLi8od8X2IIo1x5C5TUNvKDSVJww==} engines: {node: '>=12'} @@ -4240,7 +4529,7 @@ packages: dev: true optional: true - /esbuild-jest/0.5.0_esbuild@0.14.46: + /esbuild-jest/0.5.0_esbuild@0.14.17: resolution: {integrity: sha512-AMZZCdEpXfNVOIDvURlqYyHwC8qC1/BFjgsrOiSL1eyiIArVtHL8YAC83Shhn16cYYoAWEW17yZn0W/RJKJKHQ==} peerDependencies: esbuild: '>=0.8.50' @@ -4248,11 +4537,20 @@ packages: '@babel/core': 7.17.8 '@babel/plugin-transform-modules-commonjs': 7.17.7_@babel+core@7.17.8 babel-jest: 26.6.3_@babel+core@7.17.8 - esbuild: 0.14.46 + esbuild: 0.14.17 transitivePeerDependencies: - supports-color dev: true + /esbuild-linux-32/0.14.17: + resolution: {integrity: sha512-qG5NDk7FHHUVw01rjHESON0HvigF2X80b645TUlgTKsWRlrbzzHhMCmQguA01O5PiCimKnyoxti8aJIFNHpQnQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + /esbuild-linux-32/0.14.46: resolution: {integrity: sha512-ZnTpZMVb0VGvL99R5eh4OrJwbUyvpM6M88VAMuHP4LvFjuvZrhgefjKqEGuWZZW7JRnAjKqjXLjWdhdSjwMFnQ==} engines: {node: '>=12'} @@ -4262,6 +4560,15 @@ packages: dev: true optional: true + /esbuild-linux-64/0.14.17: + resolution: {integrity: sha512-De8OcmNvfNyFfQRLWbfuZqau6NpYBJxNTLP7Ls/PqQcw0HAwfaYThutY8ozHpPbKFPa7wgqabXlIC4NVSWT0/A==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /esbuild-linux-64/0.14.46: resolution: {integrity: sha512-ECCRRZtX6l4ubeVhHhiVoK/uYAkvzNqfmR4gP4N/9H9RPu+b8YCcN4bQGp7xCuYIV6Xd41WpOMyO+xpcQvjtQQ==} engines: {node: '>=12'} @@ -4271,6 +4578,15 @@ packages: dev: true optional: true + /esbuild-linux-arm/0.14.17: + resolution: {integrity: sha512-ZwsgFUk3gR2pEMJdh5z4Ds18fvGETgElPqmNdx1NtZTCOVlFMAwFB5u/tOR2FrXbMFv+LkGnNxPDh48PYPDz9A==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + /esbuild-linux-arm/0.14.46: resolution: {integrity: sha512-RvTJEi4vj13c5FP9YPp+8Y6x6HK1E7uSqfy3y9UoeaNAzNZWA7fN1U3hQjTL/dy5zTJH5KE64mrt5k5+he+CQA==} engines: {node: '>=12'} @@ -4280,6 +4596,15 @@ packages: dev: true optional: true + /esbuild-linux-arm64/0.14.17: + resolution: {integrity: sha512-WDEOD/YRA4J1lxhETKZff3gRxGYqqZEiVwIOqNfvCh2YcwWU2y6UmNGZsxcuKk18wot4dAXCXQyNZgBkVUTCLw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /esbuild-linux-arm64/0.14.46: resolution: {integrity: sha512-HX0TXCHyI0NEWG4jg8LlW1PbZQbnz+PUH56yjx996cgM5pC90u32drKs/tyJiyyQmNk9OXOogjKw7LEdp/Qc1w==} engines: {node: '>=12'} @@ -4289,6 +4614,15 @@ packages: dev: true optional: true + /esbuild-linux-mips64le/0.14.17: + resolution: {integrity: sha512-Lf4X9NB7r6imzp/11TaGs4kWL0DUn1JxI9gAAKotnKh6T8Y/0sLvZSvQS8WvSZcr0V8RRCrRZwiQqjOALUU/9g==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + /esbuild-linux-mips64le/0.14.46: resolution: {integrity: sha512-jnb2NDwGqJUVmxn1v0f7seNdDm0nRNWHP9Z3MrWAGnBCdnnDlsjqRFDnbKoaQvWONEa+rOOr/giK+VL0hgQExA==} engines: {node: '>=12'} @@ -4298,6 +4632,15 @@ packages: dev: true optional: true + /esbuild-linux-ppc64le/0.14.17: + resolution: {integrity: sha512-aExhxbrK7/Mh9FArdiC9MbvrQz2bGCDI8cBALKJbmhKg0h7LNt6y1E1S9GGBZ/ZXkHDvV9FFVrXXZKFVU5Qpiw==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /esbuild-linux-ppc64le/0.14.46: resolution: {integrity: sha512-uu3JTQUrwwauKY9z8yq5MnDyOlT3f2DNOzBcYz4dB78HqwEqilCsifoBGd0WcbED5n57dc59X+LZMTZ8Ose44w==} engines: {node: '>=12'} @@ -4316,6 +4659,15 @@ packages: dev: true optional: true + /esbuild-linux-s390x/0.14.17: + resolution: {integrity: sha512-b0T20rNcS7POi5YLw5dFlsiC+riobR5IfppQGn5NWer6QiIkdL1vOx9eC9CUD3z1itpkLboRAZYieZfKfhCA2Q==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + /esbuild-linux-s390x/0.14.46: resolution: {integrity: sha512-XQ/U9TueMSGYyPTKyZsJVraiuvxhwCDIMn/QwFXCRCJ6H/Cy/Rq33u9qhpeSziinHKfzJROGx5A8mQY6aYamdQ==} engines: {node: '>=12'} @@ -4325,6 +4677,15 @@ packages: dev: true optional: true + /esbuild-netbsd-64/0.14.17: + resolution: {integrity: sha512-pFgTaAa2JF18nqNfCND9wOu1jbZ/mbDSaMxUp5fTkLlofyHhXeb5aChgXUkeipty2Pgq0OwOnxjHmiAxMI7N4g==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + /esbuild-netbsd-64/0.14.46: resolution: {integrity: sha512-i15BwqHaAIFp1vBJkitAbHtwXcLk9TdHs/Ia1xGIAutQYXSJNPLM3Z4B4hyfHNEFl2yBqBIYpglMohv2ClNdOQ==} engines: {node: '>=12'} @@ -4334,6 +4695,15 @@ packages: dev: true optional: true + /esbuild-openbsd-64/0.14.17: + resolution: {integrity: sha512-K5+plb6gsAfBcFqB0EG4KvLbgBKslVAfEyJggicwt/QoDwQGJAzao4M6zOA4PG7LlXOwWSqv7VmSFbH+b6DyKw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + /esbuild-openbsd-64/0.14.46: resolution: {integrity: sha512-XwOIFCE140Y/PvjrwjFfa/QLWBuvhR1mPCOa35mKx02jt++wPNgf0qhn6HfdVC3vQe7R46RwTp4q2cp99fepEg==} engines: {node: '>=12'} @@ -4343,6 +4713,15 @@ packages: dev: true optional: true + /esbuild-sunos-64/0.14.17: + resolution: {integrity: sha512-o1FINkbHRi9JB1YteOSXZdkDOmVUbmnCxRmTLkHvk8pfCFNpv/5/7ktt95teYKbEiJna2dEt3M4ckJ/+UVnW+w==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + /esbuild-sunos-64/0.14.46: resolution: {integrity: sha512-+kV3JnmfdxBVpHyFvuGXWtu6tXxXApOLPkSrVkMJf6+ns/3PLtPndpzwCzHjD+qYUEk8ln4MA+ufQ2qmjW5mZg==} engines: {node: '>=12'} @@ -4352,6 +4731,15 @@ packages: dev: true optional: true + /esbuild-windows-32/0.14.17: + resolution: {integrity: sha512-Qutilz0I7OADWBtWrC/FD+2O/TNAkhwbZ+wIns7kF87lxIMtmqpBt3KnMk1e4F47aTrZRr0oH55Zhztd7m2PAA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + /esbuild-windows-32/0.14.46: resolution: {integrity: sha512-gzGC1Q11B/Bo5A2EX4N22oigWmhL7Z0eDyc8kbSoJjqSrGQuRE7B0uMpluO+q0O/gZ1S3zdw+M4PCWlqOIeXLA==} engines: {node: '>=12'} @@ -4361,6 +4749,15 @@ packages: dev: true optional: true + /esbuild-windows-64/0.14.17: + resolution: {integrity: sha512-b21/oRV+PHrav0HkRpKjbM2yNRVe34gAfbdMppbZFea416wa8SrjcmVfSd7n4jgqoTQG0xe+MGgOpwXtjiB3DQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + /esbuild-windows-64/0.14.46: resolution: {integrity: sha512-Do2daaskfOjmCB7o3ygz6fD3K6SPjZLERiZLktzHz2oUCwsebKu/gmop0+j/XdrVIXC32wFzHzDS+9CTu9OShw==} engines: {node: '>=12'} @@ -4370,6 +4767,15 @@ packages: dev: true optional: true + /esbuild-windows-arm64/0.14.17: + resolution: {integrity: sha512-4HN9E1idllewYvptcrrdfTA6DIWgg11kK0Zrv6yjxstJZLJeKxfilGBEaksLGs4Pst2rAYMx3H2vbYq7AWLQNA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + /esbuild-windows-arm64/0.14.46: resolution: {integrity: sha512-VEzMy6bM60/HT/URTDElyhfi2Pk0quCCrEhRlI4MRno/AIqYUGw0rZwkPl6PeoqVI6BgoBHGY576GWTiPmshCA==} engines: {node: '>=12'} @@ -4379,6 +4785,32 @@ packages: dev: true optional: true + /esbuild/0.14.17: + resolution: {integrity: sha512-JLgyC6Uv31mv9T9Mm2xF1LntUMCNBSzvg2n32d8cTKZMwFr1wmMFY2FkVum98TSoEsDff0cR+Aj49H2sbBcjKQ==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + esbuild-android-arm64: 0.14.17 + esbuild-darwin-64: 0.14.17 + esbuild-darwin-arm64: 0.14.17 + esbuild-freebsd-64: 0.14.17 + esbuild-freebsd-arm64: 0.14.17 + esbuild-linux-32: 0.14.17 + esbuild-linux-64: 0.14.17 + esbuild-linux-arm: 0.14.17 + esbuild-linux-arm64: 0.14.17 + esbuild-linux-mips64le: 0.14.17 + esbuild-linux-ppc64le: 0.14.17 + esbuild-linux-s390x: 0.14.17 + esbuild-netbsd-64: 0.14.17 + esbuild-openbsd-64: 0.14.17 + esbuild-sunos-64: 0.14.17 + esbuild-windows-32: 0.14.17 + esbuild-windows-64: 0.14.17 + esbuild-windows-arm64: 0.14.17 + dev: true + /esbuild/0.14.46: resolution: {integrity: sha512-vdm5G1JdZBktva8dwQci/s44VbeBUg8g907xoZx77mqFZ4gU5GlMULNsdGeID+qXCXocsfYSGtE0LvqH3eiNQg==} engines: {node: '>=12'} @@ -4415,7 +4847,6 @@ packages: /escape-string-regexp/1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} - dev: true /escape-string-regexp/2.0.0: resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} @@ -4425,7 +4856,6 @@ packages: /escape-string-regexp/4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - dev: true /escodegen/2.0.0: resolution: {integrity: sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==} @@ -4965,7 +5395,7 @@ packages: dev: true /fill-range/4.0.0: - resolution: {integrity: sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==} + resolution: {integrity: sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=} engines: {node: '>=0.10.0'} dependencies: extend-shallow: 2.0.1 @@ -4986,8 +5416,12 @@ packages: engines: {node: '>=0.10.0'} dev: false + /find-root/1.1.0: + resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} + dev: false + /find-up/2.1.0: - resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} + resolution: {integrity: sha1-RdG35QbHF93UgndaK3eSCjwMV6c=} engines: {node: '>=4'} dependencies: locate-path: 2.0.0 @@ -5074,7 +5508,6 @@ packages: /function-bind/1.1.1: resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} - dev: true /function.prototype.name/1.1.5: resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} @@ -5238,7 +5671,6 @@ packages: /has-flag/3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} - dev: true /has-flag/4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} @@ -5299,7 +5731,6 @@ packages: engines: {node: '>= 0.4.0'} dependencies: function-bind: 1.1.1 - dev: true /history/5.3.0: resolution: {integrity: sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ==} @@ -5414,7 +5845,6 @@ packages: dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 - dev: true /import-local/3.1.0: resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} @@ -5474,8 +5904,7 @@ packages: dev: true /is-arrayish/0.2.1: - resolution: {integrity: sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=} - dev: true + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} /is-bigint/1.0.4: resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} @@ -5511,7 +5940,6 @@ packages: resolution: {integrity: sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==} dependencies: has: 1.0.3 - dev: true /is-data-descriptor/0.1.4: resolution: {integrity: sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=} @@ -5565,7 +5993,7 @@ packages: dev: true /is-extglob/2.1.1: - resolution: {integrity: sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=} + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} dev: true @@ -5587,7 +6015,7 @@ packages: dev: true /is-in-browser/1.1.3: - resolution: {integrity: sha1-Vv9NtoOgeMYILrldrX3GLh0E+DU=} + resolution: {integrity: sha512-FeXIBgG/CPGd/WUxuEyvgGTEfwiG9Z4EKGxjNMRqviiIIfsmgrpnHLffEDdwUHqNva1VEW91o3xBT/m8Elgl9g==} dev: false /is-negative-zero/2.0.2: @@ -5603,7 +6031,7 @@ packages: dev: true /is-number/3.0.0: - resolution: {integrity: sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==} + resolution: {integrity: sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=} engines: {node: '>=0.10.0'} dependencies: kind-of: 3.2.2 @@ -5650,7 +6078,7 @@ packages: dev: true /is-stream/1.1.0: - resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} + resolution: {integrity: sha1-EtSj3U5o4Lec6428hBc66A2RykQ=} engines: {node: '>=0.10.0'} dev: true @@ -5725,7 +6153,7 @@ packages: engines: {node: '>=8'} dependencies: '@babel/core': 7.17.10 - '@babel/parser': 7.17.10 + '@babel/parser': 7.17.9 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.0 semver: 6.3.0 @@ -6171,6 +6599,18 @@ packages: micromatch: 4.0.5 dev: true + /jest-util/28.0.2: + resolution: {integrity: sha512-EVdpIRCC8lzqhp9A0u0aAKlsFIzufK6xKxNK7awsnebTdOP4hpyQW5o6Ox2qPl8gbeUKYF+POLyItaND53kpGA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/types': 28.1.1 + '@types/node': 16.11.41 + chalk: 4.1.2 + ci-info: 3.3.0 + graceful-fs: 4.2.9 + picomatch: 2.3.1 + dev: true + /jest-util/28.1.1: resolution: {integrity: sha512-FktOu7ca1DZSyhPAxgxB6hfh2+9zMoJ7aEQA759Z6p45NuO8mWcqujH+UdHlCm/V6JTWwDztM2ITCzU1ijJAfw==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} @@ -6215,13 +6655,13 @@ packages: resolution: {integrity: sha512-uIVJLpQ/5VTGQWBiBatHsi7jrCqHjHl0e0dFHMWzwuIfUbdW/muk0DtSr0fteY2T7QTFylv+7a5Rm8sBKrE12Q==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: - '@jest/test-result': 28.1.1 - '@jest/types': 28.1.1 + '@jest/test-result': 28.0.2 + '@jest/types': 28.0.2 '@types/node': 16.11.41 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.10.2 - jest-util: 28.1.1 + jest-util: 28.0.2 string-length: 4.0.2 dev: true @@ -6350,7 +6790,6 @@ packages: /json-parse-even-better-errors/2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - dev: true /json-schema-traverse/0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} @@ -6443,7 +6882,7 @@ packages: resolution: {integrity: sha512-YpzpreB6kUunQBbrlArlsMpXYyndt9JATbt95tajx0t4MTJJcCJdd4hdNpHmOIDiUJrF/oX5wtVFrS3uofWfGw==} dependencies: '@babel/runtime': 7.17.8 - csstype: 3.0.11 + csstype: 3.1.0 is-in-browser: 1.1.3 tiny-warning: 1.0.3 dev: false @@ -6457,14 +6896,14 @@ packages: dev: true /kind-of/3.2.2: - resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} + resolution: {integrity: sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=} engines: {node: '>=0.10.0'} dependencies: is-buffer: 1.1.6 dev: true /kind-of/4.0.0: - resolution: {integrity: sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==} + resolution: {integrity: sha1-IIE989cSkosgc3hpGkUGb65y3Vc=} engines: {node: '>=0.10.0'} dependencies: is-buffer: 1.1.6 @@ -6518,10 +6957,9 @@ packages: /lines-and-columns/1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - dev: true /locate-path/2.0.0: - resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} + resolution: {integrity: sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=} engines: {node: '>=4'} dependencies: p-locate: 2.0.0 @@ -6714,7 +7152,7 @@ packages: dev: true /ms/2.0.0: - resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + resolution: {integrity: sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=} dev: true /ms/2.1.2: @@ -6725,8 +7163,8 @@ packages: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} dev: true - /nanoid/3.3.3: - resolution: {integrity: sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==} + /nanoid/3.3.4: + resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true dev: true @@ -6771,7 +7209,7 @@ packages: dev: false /node-int64/0.4.0: - resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + resolution: {integrity: sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=} dev: true /node-releases/2.0.2: @@ -6798,7 +7236,7 @@ packages: dev: true /normalize-path/2.1.1: - resolution: {integrity: sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==} + resolution: {integrity: sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=} engines: {node: '>=0.10.0'} dependencies: remove-trailing-separator: 1.1.0 @@ -6810,7 +7248,7 @@ packages: dev: true /npm-run-path/2.0.2: - resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} + resolution: {integrity: sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=} engines: {node: '>=4'} dependencies: path-key: 2.0.1 @@ -6828,7 +7266,7 @@ packages: dev: true /object-assign/4.1.1: - resolution: {integrity: sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=} + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} /object-copy/0.1.0: @@ -6861,7 +7299,7 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.1.3 + define-properties: 1.1.4 has-symbols: 1.0.3 object-keys: 1.1.1 dev: true @@ -7006,7 +7444,6 @@ packages: engines: {node: '>=6'} dependencies: callsites: 3.1.0 - dev: true /parse-json/5.2.0: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} @@ -7016,7 +7453,6 @@ packages: error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 - dev: true /parse5/6.0.1: resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} @@ -7054,12 +7490,10 @@ packages: /path-parse/1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - dev: true /path-type/4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} - dev: true /picocolors/1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} @@ -7082,10 +7516,6 @@ packages: find-up: 4.1.0 dev: true - /popper.js/1.16.1-lts: - resolution: {integrity: sha512-Kjw8nKRl1m+VrSFCoVGPph93W/qrSO7ZkqPpTf7F4bk/sqcfWK019dWBUpE/fBOsOQY1dks/Bmcbfn1heM/IsA==} - dev: false - /posix-character-classes/0.1.1: resolution: {integrity: sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=} engines: {node: '>=0.10.0'} @@ -7095,7 +7525,7 @@ packages: resolution: {integrity: sha512-jtL6eTBrza5MPzy8oJLFuUscHDXTV5KcLlqAWHl5q5WYRfnNRGSmOZmOZ1T6Gy7A99mOZfqungmZMpMmCVJ8ZA==} engines: {node: ^10 || ^12 || >=14} dependencies: - nanoid: 3.3.3 + nanoid: 3.3.4 picocolors: 1.0.0 source-map-js: 1.0.2 dev: true @@ -7174,7 +7604,7 @@ packages: dev: true /q/1.5.1: - resolution: {integrity: sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=} + resolution: {integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==} engines: {node: '>=0.6.0', teleport: '>=0.2.0'} dev: true @@ -7481,7 +7911,6 @@ packages: /resolve-from/4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} - dev: true /resolve-from/5.0.0: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} @@ -7512,7 +7941,6 @@ packages: is-core-module: 2.8.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - dev: true /resolve/2.0.0-next.3: resolution: {integrity: sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q==} @@ -7559,7 +7987,6 @@ packages: /safe-buffer/5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - dev: true /safe-buffer/5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} @@ -7758,9 +8185,8 @@ packages: dev: true /source-map/0.5.7: - resolution: {integrity: sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=} + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} engines: {node: '>=0.10.0'} - dev: true /source-map/0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} @@ -7864,8 +8290,8 @@ packages: resolution: {integrity: sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg==} dependencies: call-bind: 1.0.2 - define-properties: 1.1.3 - es-abstract: 1.19.2 + define-properties: 1.1.4 + es-abstract: 1.20.1 get-intrinsic: 1.1.1 has-symbols: 1.0.3 internal-slot: 1.0.3 @@ -7955,12 +8381,15 @@ packages: engines: {node: '>=8'} dev: true + /stylis/4.0.13: + resolution: {integrity: sha512-xGPXiFVl4YED9Jh7Euv2V220mriG9u4B2TA6Ybjc1catrstKD2PpIdU3U0RKpkVBC2EhmL/F0sPCr9vrFTNRag==} + dev: false + /supports-color/5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} dependencies: has-flag: 3.0.0 - dev: true /supports-color/7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} @@ -7987,7 +8416,6 @@ packages: /supports-preserve-symlinks-flag/1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - dev: true /svg-parser/2.0.4: resolution: {integrity: sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==} @@ -8046,9 +8474,8 @@ packages: dev: true /to-fast-properties/2.0.0: - resolution: {integrity: sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=} + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} engines: {node: '>=4'} - dev: true /to-object-path/0.3.0: resolution: {integrity: sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=} @@ -8411,7 +8838,7 @@ packages: dev: true /void-elements/3.1.0: - resolution: {integrity: sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==} + resolution: {integrity: sha1-YU9/v42AHwu18GYfWy9XhXUOTwk=} engines: {node: '>=0.10.0'} dev: false @@ -8572,7 +8999,6 @@ packages: /yaml/1.10.2: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} - dev: true /yargs-parser/20.2.9: resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} diff --git a/web/src/App.tsx b/web/src/App.tsx index a1b181b8..b9e60954 100644 --- a/web/src/App.tsx +++ b/web/src/App.tsx @@ -1,7 +1,9 @@ import React, { useState, useEffect, Suspense } from "react"; +import createCache from "@emotion/cache"; +import { CacheProvider } from "@emotion/react"; import { config as faConfig } from "@fortawesome/fontawesome-svg-core"; -import { CssBaseline, ThemeProvider } from "@material-ui/core"; +import { CssBaseline, ThemeProvider } from "@mui/material"; import { BrowserRouter as Router, Route, Routes } from "react-router-dom"; import NotificationBar from "@components/NotificationBar"; @@ -51,9 +53,20 @@ function Theme() { } } -const App: React.FC = () => { +export interface Props { + nonce?: string; +} + +const App: React.FC = (props: Props) => { const [notification, setNotification] = useState(null as Notification | null); const [theme, setTheme] = useState(Theme()); + + const cache = createCache({ + key: "authelia", + nonce: props.nonce, + prepend: true, + }); + useEffect(() => { if (getTheme() === "auto") { const query = window.matchMedia("(prefers-color-scheme: dark)"); @@ -66,35 +79,37 @@ const App: React.FC = () => { } }, []); return ( - - }> - - - - setNotification(null)} /> - - } /> - } /> - } /> - } /> - } /> - } /> - - } - /> - - - - - + + + }> + + + + setNotification(null)} /> + + } /> + } /> + } /> + } /> + } /> + } /> + + } + /> + + + + + + ); }; diff --git a/web/src/components/AppStoreBadges.tsx b/web/src/components/AppStoreBadges.tsx index 048c7068..1ef2adde 100644 --- a/web/src/components/AppStoreBadges.tsx +++ b/web/src/components/AppStoreBadges.tsx @@ -1,6 +1,7 @@ import React from "react"; -import { Link } from "@material-ui/core"; +import { Box, Link, Theme } from "@mui/material"; +import makeStyles from "@mui/styles/makeStyles"; import AppleStore from "@assets/images/applestore-badge.svg"; import GooglePlay from "@assets/images/googleplay-badge.svg"; @@ -17,17 +18,21 @@ export interface Props { const AppStoreBadges = function (props: Props) { const target = props.targetBlank ? "_blank" : undefined; - const width = props.iconSize; + const styles = makeStyles((theme: Theme) => ({ + badge: { + width: props.iconSize, + }, + }))(); return ( -
- - google play + + + google play - - apple store + + apple store -
+ ); }; diff --git a/web/src/components/ColoredSnackbarContent.test.tsx b/web/src/components/ColoredSnackbarContent.test.tsx deleted file mode 100644 index 02af9bbc..00000000 --- a/web/src/components/ColoredSnackbarContent.test.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import React from "react"; - -import { render, screen } from "@testing-library/react"; - -import ColoredSnackbarContent from "@components/ColoredSnackbarContent"; - -it("renders without crashing", () => { - render(); - expect(screen.getByRole("alert")).toHaveTextContent(""); -}); - -it("should contain the message", () => { - render(); - expect(screen.getByRole("alert")).toHaveTextContent("this is a success"); -}); diff --git a/web/src/components/ColoredSnackbarContent.tsx b/web/src/components/ColoredSnackbarContent.tsx deleted file mode 100644 index 4cb5b5e4..00000000 --- a/web/src/components/ColoredSnackbarContent.tsx +++ /dev/null @@ -1,73 +0,0 @@ -import React from "react"; - -import { makeStyles, SnackbarContent } from "@material-ui/core"; -import { amber, green } from "@material-ui/core/colors"; -import { SnackbarContentProps } from "@material-ui/core/SnackbarContent"; -import CheckCircleIcon from "@material-ui/icons/CheckCircle"; -import ErrorIcon from "@material-ui/icons/Error"; -import InfoIcon from "@material-ui/icons/Info"; -import WarningIcon from "@material-ui/icons/Warning"; -import classnames from "classnames"; - -const variantIcon = { - success: CheckCircleIcon, - warning: WarningIcon, - error: ErrorIcon, - info: InfoIcon, -}; - -export type Level = keyof typeof variantIcon; - -export interface Props extends SnackbarContentProps { - className?: string; - level: Level; - message: string; -} - -const ColoredSnackbarContent = function (props: Props) { - const classes = useStyles(); - const Icon = variantIcon[props.level]; - - const { className, variant, message, ...others } = props; - - return ( - - - {message} - - } - {...others} - /> - ); -}; - -export default ColoredSnackbarContent; - -const useStyles = makeStyles((theme) => ({ - success: { - backgroundColor: green[600], - }, - error: { - backgroundColor: theme.palette.error.dark, - }, - info: { - backgroundColor: theme.palette.primary.main, - }, - warning: { - backgroundColor: amber[700], - }, - icon: { - fontSize: 20, - }, - iconVariant: { - opacity: 0.9, - marginRight: theme.spacing(1), - }, - message: { - display: "flex", - alignItems: "center", - }, -})); diff --git a/web/src/components/FixedTextField.test.tsx b/web/src/components/FixedTextField.test.tsx index c5e158c1..f722bfdb 100644 --- a/web/src/components/FixedTextField.test.tsx +++ b/web/src/components/FixedTextField.test.tsx @@ -1,9 +1,15 @@ import React from "react"; +import { createTheme } from "@mui/material/styles"; +import { ThemeProvider } from "@mui/styles"; import { render } from "@testing-library/react"; import FixedTextField from "@components/FixedTextField"; it("renders without crashing", () => { - render(); + render( + + + , + ); }); diff --git a/web/src/components/FixedTextField.tsx b/web/src/components/FixedTextField.tsx index 54febc1d..f877ccab 100644 --- a/web/src/components/FixedTextField.tsx +++ b/web/src/components/FixedTextField.tsx @@ -1,7 +1,8 @@ import React from "react"; -import { makeStyles } from "@material-ui/core"; -import TextField, { TextFieldProps } from "@material-ui/core/TextField"; +import { Theme } from "@mui/material/styles"; +import TextField, { TextFieldProps } from "@mui/material/TextField"; +import makeStyles from "@mui/styles/makeStyles"; /** * This component fixes outlined TextField @@ -10,16 +11,16 @@ import TextField, { TextFieldProps } from "@material-ui/core/TextField"; * @param props the TextField props */ const FixedTextField = function (props: TextFieldProps) { - const style = useStyles(); + const styles = useStyles(); + return ( {props.children} @@ -28,7 +29,7 @@ const FixedTextField = function (props: TextFieldProps) { export default FixedTextField; -const useStyles = makeStyles((theme) => ({ +const useStyles = makeStyles((theme: Theme) => ({ label: { backgroundColor: theme.palette.background.default, paddingLeft: theme.spacing(0.1), diff --git a/web/src/components/LinearProgressBar.test.tsx b/web/src/components/LinearProgressBar.test.tsx index 4eb26ac9..84d6d035 100644 --- a/web/src/components/LinearProgressBar.test.tsx +++ b/web/src/components/LinearProgressBar.test.tsx @@ -1,13 +1,23 @@ import React from "react"; +import { createTheme } from "@mui/material/styles"; +import { ThemeProvider } from "@mui/styles"; import { render } from "@testing-library/react"; import LinearProgressBar from "@components/LinearProgressBar"; it("renders without crashing", () => { - render(); + render( + + ) + , + ); }); it("renders adjusted height without crashing", () => { - render(); + render( + + + , + ); }); diff --git a/web/src/components/LinearProgressBar.tsx b/web/src/components/LinearProgressBar.tsx index 96fae97a..632b1ca1 100644 --- a/web/src/components/LinearProgressBar.tsx +++ b/web/src/components/LinearProgressBar.tsx @@ -1,17 +1,16 @@ import React from "react"; -import { makeStyles, LinearProgress } from "@material-ui/core"; -import { CSSProperties } from "@material-ui/styles"; +import { LinearProgress, Theme } from "@mui/material"; +import makeStyles from "@mui/styles/makeStyles"; export interface Props { value: number; - height?: number; + height?: string | number; className?: string; - style?: CSSProperties; } const LinearProgressBar = function (props: Props) { - const style = makeStyles((theme) => ({ + const styles = makeStyles((theme: Theme) => ({ progressRoot: { height: props.height ? props.height : theme.spacing(), }, @@ -19,13 +18,13 @@ const LinearProgressBar = function (props: Props) { transition: "transform .2s linear", }, }))(); + return ( void; } +type NotificationBarTransitionProps = Omit; + +function NotificationBarTransition(props: NotificationBarTransitionProps) { + return ; +} + const NotificationBar = function (props: Props) { const [tmpNotification, setTmpNotification] = useState(null as Notification | null); const { notification } = useNotifications(); useEffect(() => { - if (notification && notification !== null) { + if (notification) { setTmpNotification(notification); } }, [notification, setTmpNotification]); @@ -28,15 +33,18 @@ const NotificationBar = function (props: Props) { anchorOrigin={{ vertical: "top", horizontal: "right" }} autoHideDuration={tmpNotification ? tmpNotification.timeout * 1000 : 10000} onClose={props.onClose} + TransitionComponent={NotificationBarTransition} TransitionProps={{ onExited: () => setTmpNotification(null), }} > - + {tmpNotification ? ( + + {tmpNotification.message} + + ) : ( + + )} ); }; diff --git a/web/src/components/PasswordMeter.tsx b/web/src/components/PasswordMeter.tsx index 43b26143..52c6551c 100644 --- a/web/src/components/PasswordMeter.tsx +++ b/web/src/components/PasswordMeter.tsx @@ -1,6 +1,7 @@ import React, { useEffect, useState } from "react"; -import { makeStyles } from "@material-ui/core"; +import { Box, Theme } from "@mui/material"; +import makeStyles from "@mui/styles/makeStyles"; import classnames from "classnames"; import { useTranslation } from "react-i18next"; import zxcvbn from "zxcvbn"; @@ -13,20 +14,12 @@ export interface Props { } const PasswordMeter = function (props: Props) { + const { t: translate } = useTranslation(); + const [progressColor] = useState(["#D32F2F", "#FF5722", "#FFEB3B", "#AFB42B", "#62D32F"]); const [passwordScore, setPasswordScore] = useState(0); const [maxScores, setMaxScores] = useState(0); const [feedback, setFeedback] = useState(""); - const { t: translate } = useTranslation(); - const style = makeStyles((theme) => ({ - progressBar: { - height: "5px", - marginTop: "2px", - backgroundColor: "red", - width: "50%", - transition: "width .5s linear", - }, - }))(); useEffect(() => { const password = props.value; @@ -106,17 +99,23 @@ const PasswordMeter = function (props: Props) { } }, [props, translate]); + const styles = makeStyles((theme: Theme) => ({ + progressBar: { + height: "5px", + marginTop: "2px", + backgroundColor: progressColor[passwordScore], + width: `${(passwordScore + 1) * (100 / maxScores)}%`, + transition: "width .5s linear", + }, + progressContainer: { + width: "100%", + }, + }))(); + return ( -
-
-
+ + + ); }; diff --git a/web/src/components/TypographyWithTootip.tsx b/web/src/components/TypographyWithTootip.tsx index 5c8e633a..1a876bf8 100644 --- a/web/src/components/TypographyWithTootip.tsx +++ b/web/src/components/TypographyWithTootip.tsx @@ -1,32 +1,25 @@ import React, { Fragment } from "react"; -import { Tooltip, Typography } from "@material-ui/core"; -import { Variant } from "@material-ui/core/styles/createTypography"; -import { CSSProperties } from "@material-ui/styles"; +import { Tooltip, Typography } from "@mui/material"; +import { Variant } from "@mui/material/styles/createTypography"; export interface Props { variant: Variant; value?: string; - style?: CSSProperties; tooltip?: string; - tooltipStyle?: CSSProperties; } export default function TypographyWithTooltip(props: Props): JSX.Element { return ( {props.tooltip ? ( - - - {props.value} - + + {props.value} ) : ( - - {props.value} - + {props.value} )} ); diff --git a/web/src/hooks/NotificationsContext.ts b/web/src/hooks/NotificationsContext.ts index 0b87f186..06d51241 100644 --- a/web/src/hooks/NotificationsContext.ts +++ b/web/src/hooks/NotificationsContext.ts @@ -1,6 +1,7 @@ import { createContext, useContext, useRef } from "react"; -import { Level } from "@components/ColoredSnackbarContent"; +import { AlertColor } from "@mui/material"; + import { Notification } from "@models/Notifications"; const defaultOptions = { @@ -19,7 +20,7 @@ export default NotificationsContext; export function useNotifications() { let useNotificationsProps = useContext(NotificationsContext); - const notificationBuilder = (level: Level) => { + const notificationBuilder = (level: AlertColor) => { return (message: string, timeout?: number) => { useNotificationsProps.setNotification({ level, diff --git a/web/src/index.tsx b/web/src/index.tsx index 942f0ab4..1c2255e9 100644 --- a/web/src/index.tsx +++ b/web/src/index.tsx @@ -7,8 +7,9 @@ import App from "@root/App"; import * as serviceWorker from "@root/serviceWorker"; import "@i18n/index.ts"; +const nonce = document.head.querySelector("[property=csp-nonce][content]")?.getAttribute("content") || undefined; const root = createRoot(document.getElementById("root")!); -root.render(); +root.render(); // If you want your app to work offline and load faster, you can change // unregister() to register() below. Note this comes with some pitfalls. diff --git a/web/src/layouts/LoginLayout.tsx b/web/src/layouts/LoginLayout.tsx index 6a780ce6..56744cd6 100644 --- a/web/src/layouts/LoginLayout.tsx +++ b/web/src/layouts/LoginLayout.tsx @@ -1,7 +1,8 @@ import React, { ReactNode, useEffect } from "react"; -import { Grid, makeStyles, Container, Link } from "@material-ui/core"; -import { grey } from "@material-ui/core/colors"; +import { Grid, Container, Link, Theme } from "@mui/material"; +import { grey } from "@mui/material/colors"; +import makeStyles from "@mui/styles/makeStyles"; import { useTranslation } from "react-i18next"; import { ReactComponent as UserSvg } from "@assets/images/user.svg"; @@ -18,20 +19,22 @@ export interface Props { showBrand?: boolean; } +const url = "https://www.authelia.com"; + const LoginLayout = function (props: Props) { - const style = useStyles(); + const styles = useStyles(); const logo = getLogoOverride() ? ( - Logo + Logo ) : ( - + ); const { t: translate } = useTranslation(); useEffect(() => { document.title = `${translate("Login")} - Authelia`; }, [translate]); return ( - - + + {logo} @@ -50,16 +53,12 @@ const LoginLayout = function (props: Props) { /> ) : null} - + {props.children} {props.showBrand ? ( - + {translate("Powered by")} Authelia @@ -72,7 +71,7 @@ const LoginLayout = function (props: Props) { export default LoginLayout; -const useStyles = makeStyles((theme) => ({ +const useStyles = makeStyles((theme: Theme) => ({ root: { minHeight: "90vh", textAlign: "center", diff --git a/web/src/models/Notifications.ts b/web/src/models/Notifications.ts index b97e1f1f..138536c5 100644 --- a/web/src/models/Notifications.ts +++ b/web/src/models/Notifications.ts @@ -1,7 +1,7 @@ -import { Level } from "@components/ColoredSnackbarContent"; +import { AlertColor } from "@mui/material"; export interface Notification { message: string; - level: Level; + level: AlertColor; timeout: number; } diff --git a/web/src/themes/Dark.ts b/web/src/themes/Dark.ts index 85547aff..3f6f5f74 100644 --- a/web/src/themes/Dark.ts +++ b/web/src/themes/Dark.ts @@ -1,4 +1,4 @@ -import { createTheme } from "@material-ui/core/styles"; +import { createTheme } from "@mui/material/styles"; const Dark = createTheme({ custom: { @@ -6,10 +6,81 @@ const Dark = createTheme({ loadingBar: "#fff", }, palette: { - type: "dark", + mode: "dark", primary: { main: "#1976d2", }, + secondary: { + light: "#ff4081", + main: "#f50057", + dark: "#c51162", + contrastText: "#ffffff", + }, + error: { + light: "#e57373", + main: "#f44336", + dark: "#d32f2f", + contrastText: "#ffffff", + }, + warning: { + light: "#ffb74d", + main: "#ff9800", + dark: "#f57c00", + contrastText: "rgba(0, 0, 0, 0.87)", + }, + info: { + light: "#64b5f6", + main: "#2196f3", + dark: "#1976d2", + contrastText: "#ffffff", + }, + success: { + light: "#81c784", + main: "#4caf50", + dark: "#388e3c", + contrastText: "rgba(0, 0, 0, 0.87)", + }, + grey: { + "50": "#fafafa", + "100": "#f5f5f5", + "200": "#eeeeee", + "300": "#e0e0e0", + "400": "#bdbdbd", + "500": "#9e9e9e", + "600": "#757575", + "700": "#616161", + "800": "#424242", + "900": "#212121", + A100: "#d5d5d5", + A200: "#aaaaaa", + A400: "#303030", + A700: "#616161", + }, + contrastThreshold: 3, + tonalOffset: 0.2, + text: { + primary: "#fff", + secondary: "rgba(255, 255, 255, 0.7)", + disabled: "rgba(255, 255, 255, 0.5)", + }, + divider: "rgba(255, 255, 255, 0.12)", + background: { + paper: "#424242", + default: "#303030", + }, + action: { + active: "#fff", + hover: "rgba(255, 255, 255, 0.08)", + hoverOpacity: 0.08, + selected: "rgba(255, 255, 255, 0.16)", + selectedOpacity: 0.16, + disabled: "rgba(255, 255, 255, 0.3)", + disabledBackground: "rgba(255, 255, 255, 0.12)", + disabledOpacity: 0.38, + focus: "rgba(255, 255, 255, 0.12)", + focusOpacity: 0.12, + activatedOpacity: 0.24, + }, }, }); diff --git a/web/src/themes/Grey.ts b/web/src/themes/Grey.ts index 86a6f213..c79ff3ab 100644 --- a/web/src/themes/Grey.ts +++ b/web/src/themes/Grey.ts @@ -1,4 +1,4 @@ -import { createTheme } from "@material-ui/core/styles"; +import { createTheme } from "@mui/material/styles"; const Grey = createTheme({ custom: { @@ -6,51 +6,129 @@ const Grey = createTheme({ loadingBar: "#929aa5", }, palette: { + mode: "dark", primary: { main: "#929aa5", }, + secondary: { + light: "#ff4081", + main: "#f50057", + dark: "#c51162", + contrastText: "#ffffff", + }, + error: { + light: "#e57373", + main: "#f44336", + dark: "#d32f2f", + contrastText: "#ffffff", + }, + warning: { + light: "#ffb74d", + main: "#ff9800", + dark: "#f57c00", + contrastText: "rgba(0, 0, 0, 0.87)", + }, + info: { + light: "#64b5f6", + main: "#2196f3", + dark: "#1976d2", + contrastText: "#ffffff", + }, + success: { + light: "#81c784", + main: "#4caf50", + dark: "#388e3c", + contrastText: "rgba(0, 0, 0, 0.87)", + }, + grey: { + "50": "#fafafa", + "100": "#f5f5f5", + "200": "#eeeeee", + "300": "#e0e0e0", + "400": "#bdbdbd", + "500": "#9e9e9e", + "600": "#757575", + "700": "#616161", + "800": "#424242", + "900": "#212121", + A100: "#d5d5d5", + A200: "#aaaaaa", + A400: "#303030", + A700: "#616161", + }, + contrastThreshold: 3, + tonalOffset: 0.2, + text: { + primary: "#929aa5", + secondary: "rgba(0, 0, 0, 0.54)", + disabled: "rgba(0, 0, 0, 0.38)", + }, + divider: "rgba(0, 0, 0, 0.12)", background: { - default: "#2f343e", paper: "#2f343e", + default: "#2f343e", + }, + action: { + active: "#929aa5", + hover: "#929aa5", + hoverOpacity: 0.04, + selected: "#929aa5", + selectedOpacity: 0.08, + disabled: "rgba(0, 0, 0, 0.26)", + disabledBackground: "rgba(0, 0, 0, 0.12)", + disabledOpacity: 0.38, + focus: "rgba(0, 0, 0, 0.12)", + focusOpacity: 0.12, + activatedOpacity: 0.12, }, }, - overrides: { + components: { MuiCssBaseline: { - "@global": { - body: { - backgroundColor: "#2f343e", - color: "#929aa5", + styleOverrides: { + "@global": { + body: { + backgroundColor: "#2f343e", + color: "#929aa5", + }, }, }, }, MuiOutlinedInput: { - root: { - "& $notchedOutline": { - borderColor: "#929aa5", - }, - "&:hover:not($disabled):not($focused):not($error) $notchedOutline": { - borderColor: "#929aa5", - borderWidth: 2, - }, - "&$focused $notchedOutline": { - borderColor: "#929aa5", + styleOverrides: { + root: { + "& $notchedOutline": { + borderColor: "#929aa5", + }, + "&:hover:not($disabled):not($focused):not($error) $notchedOutline": { + borderColor: "#929aa5", + borderWidth: 2, + }, + "&$focused $notchedOutline": { + borderColor: "#929aa5", + }, }, + notchedOutline: {}, }, - notchedOutline: {}, }, MuiCheckbox: { - root: { - color: "#929aa5", + styleOverrides: { + root: { + color: "#929aa5", + }, }, }, MuiInputBase: { - input: { - color: "#929aa5", + styleOverrides: { + input: { + color: "#929aa5", + }, }, }, MuiInputLabel: { - root: { - color: "#929aa5", + styleOverrides: { + root: { + color: "#929aa5", + }, }, }, }, diff --git a/web/src/themes/Light.ts b/web/src/themes/Light.ts index a2493961..88fa8eb3 100644 --- a/web/src/themes/Light.ts +++ b/web/src/themes/Light.ts @@ -1,4 +1,4 @@ -import { createTheme } from "@material-ui/core/styles"; +import { createTheme } from "@mui/material/styles"; const Light = createTheme({ custom: { @@ -6,12 +6,80 @@ const Light = createTheme({ loadingBar: "#000", }, palette: { + mode: "light", primary: { main: "#1976d2", }, + secondary: { + light: "#ff4081", + main: "#f50057", + dark: "#c51162", + contrastText: "#ffffff", + }, + error: { + light: "#e57373", + main: "#f44336", + dark: "#d32f2f", + contrastText: "#ffffff", + }, + warning: { + light: "#ffb74d", + main: "#ff9800", + dark: "#f57c00", + contrastText: "rgba(0, 0, 0, 0.87)", + }, + info: { + light: "#64b5f6", + main: "#2196f3", + dark: "#1976d2", + contrastText: "#ffffff", + }, + success: { + light: "#81c784", + main: "#4caf50", + dark: "#388e3c", + contrastText: "rgba(0, 0, 0, 0.87)", + }, + grey: { + "50": "#fafafa", + "100": "#f5f5f5", + "200": "#eeeeee", + "300": "#e0e0e0", + "400": "#bdbdbd", + "500": "#9e9e9e", + "600": "#757575", + "700": "#616161", + "800": "#424242", + "900": "#212121", + A100: "#d5d5d5", + A200: "#aaaaaa", + A400: "#303030", + A700: "#616161", + }, + contrastThreshold: 3, + tonalOffset: 0.2, + text: { + primary: "rgba(0, 0, 0, 0.87)", + secondary: "rgba(0, 0, 0, 0.54)", + disabled: "rgba(0, 0, 0, 0.38)", + }, + divider: "rgba(0, 0, 0, 0.12)", background: { - default: "#fff", paper: "#fff", + default: "#fff", + }, + action: { + active: "rgba(0, 0, 0, 0.54)", + hover: "rgba(0, 0, 0, 0.04)", + hoverOpacity: 0.04, + selected: "rgba(0, 0, 0, 0.08)", + selectedOpacity: 0.08, + disabled: "rgba(0, 0, 0, 0.26)", + disabledBackground: "rgba(0, 0, 0, 0.12)", + disabledOpacity: 0.38, + focus: "rgba(0, 0, 0, 0.12)", + focusOpacity: 0.12, + activatedOpacity: 0.12, }, }, }); diff --git a/web/src/themes/index.ts b/web/src/themes/index.ts index 8e157764..bacf78bb 100644 --- a/web/src/themes/index.ts +++ b/web/src/themes/index.ts @@ -1,18 +1,28 @@ -declare module "@material-ui/core/styles/createTheme" { +import React from "react"; + +import { Theme } from "@mui/material"; + +declare module "@mui/material/styles" { interface Theme { custom: { icon: React.CSSProperties["color"]; loadingBar: React.CSSProperties["color"]; }; } + interface ThemeOptions { - custom: { - icon: React.CSSProperties["color"]; - loadingBar: React.CSSProperties["color"]; + custom?: { + icon?: React.CSSProperties["color"]; + loadingBar?: React.CSSProperties["color"]; }; } } +declare module "@mui/styles/defaultTheme" { + // eslint-disable-next-line @typescript-eslint/no-empty-interface + interface DefaultTheme extends Theme {} +} + export { default as Light } from "@themes/Light"; export { default as Dark } from "@themes/Dark"; export { default as Grey } from "@themes/Grey"; diff --git a/web/src/views/DeviceRegistration/RegisterOneTimePassword.tsx b/web/src/views/DeviceRegistration/RegisterOneTimePassword.tsx index aec29e1e..9c34acdb 100644 --- a/web/src/views/DeviceRegistration/RegisterOneTimePassword.tsx +++ b/web/src/views/DeviceRegistration/RegisterOneTimePassword.tsx @@ -2,10 +2,11 @@ import React, { useEffect, useCallback, useState } from "react"; import { IconDefinition, faCopy, faKey, faTimesCircle } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import { makeStyles, Typography, Button, IconButton, Link, CircularProgress, TextField } from "@material-ui/core"; -import { red } from "@material-ui/core/colors"; +import { Typography, Button, IconButton, Link, CircularProgress, TextField, Theme } from "@mui/material"; +import { red } from "@mui/material/colors"; +import makeStyles from "@mui/styles/makeStyles"; import classnames from "classnames"; -import QRCode from "qrcode.react"; +import { QRCodeSVG } from "qrcode.react"; import { useTranslation } from "react-i18next"; import { useLocation, useNavigate } from "react-router-dom"; @@ -18,7 +19,7 @@ import { completeTOTPRegistrationProcess } from "@services/RegisterDevice"; import { extractIdentityToken } from "@utils/IdentityToken"; const RegisterOneTimePassword = function () { - const style = useStyles(); + const styles = useStyles(); const navigate = useNavigate(); const location = useLocation(); // The secret retrieved from the API is all is ok. @@ -72,39 +73,40 @@ const RegisterOneTimePassword = function () { function SecretButton(text: string | undefined, action: string, icon: IconDefinition) { return ( { navigator.clipboard.writeText(`${text}`); createSuccessNotification(`${action}`); }} + size="large" > ); } - const qrcodeFuzzyStyle = isLoading || hasErrored ? style.fuzzy : undefined; + const qrcodeFuzzyStyle = isLoading || hasErrored ? styles.fuzzy : undefined; return ( -
-
- +
+
+ {translate("Need Google Authenticator?")}
-
- - - {!hasErrored && isLoading ? : null} - {hasErrored ? : null} +
+ + + {!hasErrored && isLoading ? : null} + {hasErrored ? : null}
@@ -112,7 +114,7 @@ const RegisterOneTimePassword = function () { @@ -142,7 +144,7 @@ const RegisterOneTimePassword = function () { export default RegisterOneTimePassword; -const useStyles = makeStyles((theme) => ({ +const useStyles = makeStyles((theme: Theme) => ({ root: { paddingTop: theme.spacing(4), paddingBottom: theme.spacing(4), diff --git a/web/src/views/DeviceRegistration/RegisterWebauthn.tsx b/web/src/views/DeviceRegistration/RegisterWebauthn.tsx index 1c4ef2df..ec66f0f8 100644 --- a/web/src/views/DeviceRegistration/RegisterWebauthn.tsx +++ b/web/src/views/DeviceRegistration/RegisterWebauthn.tsx @@ -1,6 +1,7 @@ import React, { useCallback, useEffect, useState } from "react"; -import { Button, makeStyles, Typography } from "@material-ui/core"; +import { Button, Theme, Typography } from "@mui/material"; +import makeStyles from "@mui/styles/makeStyles"; import { useLocation, useNavigate } from "react-router-dom"; import FingerTouchIcon from "@components/FingerTouchIcon"; @@ -12,7 +13,7 @@ import { performAttestationCeremony } from "@services/Webauthn"; import { extractIdentityToken } from "@utils/IdentityToken"; const RegisterWebauthn = function () { - const style = useStyles(); + const styles = useStyles(); const navigate = useNavigate(); const location = useLocation(); const { createErrorNotification } = useNotifications(); @@ -84,10 +85,10 @@ const RegisterWebauthn = function () { return ( -
+
- Touch the token on your security key + Touch the token on your security key @@ -100,7 +101,7 @@ const RegisterWebauthn = function () { export default RegisterWebauthn; -const useStyles = makeStyles((theme) => ({ +const useStyles = makeStyles((theme: Theme) => ({ icon: { paddingTop: theme.spacing(4), paddingBottom: theme.spacing(4), diff --git a/web/src/views/LoadingPage/BaseLoadingPage.tsx b/web/src/views/LoadingPage/BaseLoadingPage.tsx index 39dd5813..cf53cb91 100644 --- a/web/src/views/LoadingPage/BaseLoadingPage.tsx +++ b/web/src/views/LoadingPage/BaseLoadingPage.tsx @@ -1,6 +1,7 @@ import React from "react"; -import { Grid, Typography, useTheme } from "@material-ui/core"; +import { Grid, Theme, Typography, useTheme } from "@mui/material"; +import makeStyles from "@mui/styles/makeStyles"; import ReactLoading from "react-loading"; export interface Props { @@ -9,9 +10,11 @@ export interface Props { const BaseLoadingPage = function (props: Props) { const theme = useTheme(); + const styles = useStyles(); + return ( - - + + {props.message}... @@ -20,3 +23,15 @@ const BaseLoadingPage = function (props: Props) { }; export default BaseLoadingPage; + +const useStyles = makeStyles((theme: Theme) => ({ + gridOuter: { + alignItems: "center", + justifyContent: "center", + minHeight: "100vh", + }, + gridInner: { + textAlign: "center", + display: "inline-block", + }, +})); diff --git a/web/src/views/LoginPortal/Authenticated.tsx b/web/src/views/LoginPortal/Authenticated.tsx index 42aa714a..64f5acce 100644 --- a/web/src/views/LoginPortal/Authenticated.tsx +++ b/web/src/views/LoginPortal/Authenticated.tsx @@ -1,16 +1,17 @@ import React from "react"; -import { Typography, makeStyles } from "@material-ui/core"; +import { Theme, Typography } from "@mui/material"; +import makeStyles from "@mui/styles/makeStyles"; import { useTranslation } from "react-i18next"; import SuccessIcon from "@components/SuccessIcon"; const Authenticated = function () { - const classes = useStyles(); + const styles = useStyles(); const { t: translate } = useTranslation(); return (
-
+
{translate("Authenticated")} @@ -20,7 +21,7 @@ const Authenticated = function () { export default Authenticated; -const useStyles = makeStyles((theme) => ({ +const useStyles = makeStyles((theme: Theme) => ({ iconContainer: { marginBottom: theme.spacing(2), flex: "0 0 100%", diff --git a/web/src/views/LoginPortal/AuthenticatedView/AuthenticatedView.tsx b/web/src/views/LoginPortal/AuthenticatedView/AuthenticatedView.tsx index 9033745d..3ee651c0 100644 --- a/web/src/views/LoginPortal/AuthenticatedView/AuthenticatedView.tsx +++ b/web/src/views/LoginPortal/AuthenticatedView/AuthenticatedView.tsx @@ -1,6 +1,7 @@ import React from "react"; -import { Grid, makeStyles, Button } from "@material-ui/core"; +import { Grid, Button, Theme } from "@mui/material"; +import makeStyles from "@mui/styles/makeStyles"; import { useTranslation } from "react-i18next"; import { useNavigate } from "react-router-dom"; @@ -13,7 +14,7 @@ export interface Props { } const AuthenticatedView = function (props: Props) { - const style = useStyles(); + const styles = useStyles(); const navigate = useNavigate(); const { t: translate } = useTranslation(); @@ -29,7 +30,7 @@ const AuthenticatedView = function (props: Props) { {translate("Logout")} - + @@ -39,7 +40,7 @@ const AuthenticatedView = function (props: Props) { export default AuthenticatedView; -const useStyles = makeStyles((theme) => ({ +const useStyles = makeStyles((theme: Theme) => ({ mainContainer: { border: "1px solid #d6d6d6", borderRadius: "10px", diff --git a/web/src/views/LoginPortal/ConsentView/ConsentView.tsx b/web/src/views/LoginPortal/ConsentView/ConsentView.tsx index 2178b1ef..a8fa246f 100644 --- a/web/src/views/LoginPortal/ConsentView/ConsentView.tsx +++ b/web/src/views/LoginPortal/ConsentView/ConsentView.tsx @@ -1,5 +1,6 @@ import React, { useEffect, Fragment, ReactNode, useState } from "react"; +import { AccountBox, CheckBox, Contacts, Drafts, Group } from "@mui/icons-material"; import { Button, Grid, @@ -9,11 +10,11 @@ import { ListItemText, Tooltip, Typography, - makeStyles, Checkbox, FormControlLabel, -} from "@material-ui/core"; -import { AccountBox, CheckBox, Contacts, Drafts, Group } from "@material-ui/icons"; + Theme, +} from "@mui/material"; +import makeStyles from "@mui/styles/makeStyles"; import { useTranslation } from "react-i18next"; import { useNavigate } from "react-router-dom"; @@ -44,7 +45,7 @@ function scopeNameToAvatar(id: string) { } const ConsentView = function (props: Props) { - const classes = useStyles(); + const styles = useStyles(); const navigate = useNavigate(); const redirect = useRedirector(); const { createErrorNotification, resetNotification } = useNotifications(); @@ -137,7 +138,7 @@ const ConsentView = function (props: Props) { "Client ID: " + resp?.client_id } > - + {resp !== undefined && resp.client_description !== "" ? resp.client_description : resp?.client_id} @@ -149,8 +150,8 @@ const ConsentView = function (props: Props) {
{translate("The above application is requesting the following permissions")}:
-
- +
+ {resp?.scopes.map((scope: string) => ( @@ -180,7 +181,7 @@ const ConsentView = function (props: Props) { color="primary" /> } - className={classes.preConfigure} + className={styles.preConfigure} label={translate("Remember Consent")} /> @@ -191,7 +192,7 @@ const ConsentView = function (props: Props) { {props.resetPassword ? ( - + {translate("Reset password?")} @@ -228,7 +230,7 @@ const FirstFactorForm = function (props: Props) { export default FirstFactorForm; -const useStyles = makeStyles((theme) => ({ +const useStyles = makeStyles((theme: Theme) => ({ actionRow: { display: "flex", flexDirection: "row", diff --git a/web/src/views/LoginPortal/SecondFactor/DeviceSelectionContainer.tsx b/web/src/views/LoginPortal/SecondFactor/DeviceSelectionContainer.tsx index eb7ec10f..6e60d9c4 100644 --- a/web/src/views/LoginPortal/SecondFactor/DeviceSelectionContainer.tsx +++ b/web/src/views/LoginPortal/SecondFactor/DeviceSelectionContainer.tsx @@ -1,6 +1,7 @@ import React, { ReactNode, useState } from "react"; -import { makeStyles, Typography, Grid, Button, Container } from "@material-ui/core"; +import { Typography, Grid, Button, Container, Theme } from "@mui/material"; +import makeStyles from "@mui/styles/makeStyles"; import PushNotificationIcon from "@components/PushNotificationIcon"; @@ -102,7 +103,7 @@ interface DeviceItemProps { function DeviceItem(props: DeviceItemProps) { const className = "device-option-" + props.id; const idName = "device-" + props.device.id; - const style = makeStyles((theme) => ({ + const style = makeStyles((theme: Theme) => ({ item: { paddingTop: theme.spacing(4), paddingBottom: theme.spacing(4), @@ -147,7 +148,7 @@ interface MethodItemProps { function MethodItem(props: MethodItemProps) { const className = "method-option-" + props.id; const idName = "method-" + props.method; - const style = makeStyles((theme) => ({ + const style = makeStyles((theme: Theme) => ({ item: { paddingTop: theme.spacing(4), paddingBottom: theme.spacing(4), diff --git a/web/src/views/LoginPortal/SecondFactor/IconWithContext.tsx b/web/src/views/LoginPortal/SecondFactor/IconWithContext.tsx index c7d0d6c3..143b052b 100644 --- a/web/src/views/LoginPortal/SecondFactor/IconWithContext.tsx +++ b/web/src/views/LoginPortal/SecondFactor/IconWithContext.tsx @@ -1,6 +1,7 @@ import React, { ReactNode } from "react"; -import { makeStyles } from "@material-ui/core"; +import { Theme } from "@mui/material"; +import makeStyles from "@mui/styles/makeStyles"; import classnames from "classnames"; interface IconWithContextProps { @@ -12,7 +13,7 @@ interface IconWithContextProps { const IconWithContext = function (props: IconWithContextProps) { const iconSize = 64; - const style = makeStyles((theme) => ({ + const styles = makeStyles((theme: Theme) => ({ root: {}, iconContainer: { display: "flex", @@ -29,11 +30,11 @@ const IconWithContext = function (props: IconWithContextProps) { }))(); return ( -
-
-
{props.icon}
+
+
+
{props.icon}
-
{props.children}
+
{props.children}
); }; diff --git a/web/src/views/LoginPortal/SecondFactor/MethodContainer.tsx b/web/src/views/LoginPortal/SecondFactor/MethodContainer.tsx index ff4ae927..18463791 100644 --- a/web/src/views/LoginPortal/SecondFactor/MethodContainer.tsx +++ b/web/src/views/LoginPortal/SecondFactor/MethodContainer.tsx @@ -1,6 +1,7 @@ import React, { ReactNode, Fragment } from "react"; -import { makeStyles, Typography, Link, useTheme } from "@material-ui/core"; +import { Typography, Link, Theme, Box } from "@mui/material"; +import makeStyles from "@mui/styles/makeStyles"; import classnames from "classnames"; import { useTranslation } from "react-i18next"; @@ -27,7 +28,7 @@ export interface Props { } const DefaultMethodContainer = function (props: Props) { - const style = useStyles(); + const styles = useStyles(); const { t: translate } = useTranslation(); const registerMessage = props.registered ? props.title === "Push Notification" @@ -56,17 +57,17 @@ const DefaultMethodContainer = function (props: Props) { return (
{props.title} -
-
{container}
+
+
{container}
{props.onSelectClick && props.registered ? ( - + {selectMessage} ) : null} {(props.onRegisterClick && props.title !== "Push Notification") || (props.onRegisterClick && props.title === "Push Notification" && props.duoSelfEnrollment) ? ( - + {registerMessage} ) : null} @@ -76,7 +77,7 @@ const DefaultMethodContainer = function (props: Props) { export default DefaultMethodContainer; -const useStyles = makeStyles(() => ({ +const useStyles = makeStyles((theme: Theme) => ({ container: { height: "200px", }, @@ -89,6 +90,16 @@ const useStyles = makeStyles(() => ({ alignContent: "center", justifyContent: "center", }, + containerMethod: { + marginBottom: theme.spacing(2), + }, + info: { + marginBottom: theme.spacing(2), + flex: "0 0 100%", + }, + infoTypography: { + color: "#5858ff", + }, })); interface NotRegisteredContainerProps { @@ -98,16 +109,17 @@ interface NotRegisteredContainerProps { function NotRegisteredContainer(props: NotRegisteredContainerProps) { const { t: translate } = useTranslation(); - const theme = useTheme(); + const styles = useStyles(); + return ( -
+ -
- + + {translate("The resource you're attempting to access requires two-factor authentication")} - + {props.title === "Push Notification" ? props.duoSelfEnrollment ? translate("Register your first device by clicking on the link below") @@ -124,10 +136,11 @@ interface MethodContainerProps { } function MethodContainer(props: MethodContainerProps) { - const theme = useTheme(); + const styles = useStyles(); + return ( -
{props.children}
+ {props.children} {props.explanation}
); diff --git a/web/src/views/LoginPortal/SecondFactor/MethodSelectionDialog.tsx b/web/src/views/LoginPortal/SecondFactor/MethodSelectionDialog.tsx index cae62a64..d4c92e17 100644 --- a/web/src/views/LoginPortal/SecondFactor/MethodSelectionDialog.tsx +++ b/web/src/views/LoginPortal/SecondFactor/MethodSelectionDialog.tsx @@ -1,15 +1,7 @@ import React, { ReactNode } from "react"; -import { - Dialog, - Grid, - makeStyles, - DialogContent, - Button, - DialogActions, - Typography, - useTheme, -} from "@material-ui/core"; +import { Dialog, Grid, DialogContent, Button, DialogActions, Typography, useTheme, Theme } from "@mui/material"; +import makeStyles from "@mui/styles/makeStyles"; import { useTranslation } from "react-i18next"; import FingerTouchIcon from "@components/FingerTouchIcon"; @@ -27,7 +19,7 @@ export interface Props { } const MethodSelectionDialog = function (props: Props) { - const style = useStyles(); + const styles = useStyles(); const theme = useTheme(); const { t: translate } = useTranslation(); @@ -36,7 +28,7 @@ const MethodSelectionDialog = function (props: Props) { ); return ( - + {props.methods.has(SecondFactorMethod.TOTP) ? ( @@ -76,7 +68,7 @@ const MethodSelectionDialog = function (props: Props) { export default MethodSelectionDialog; -const useStyles = makeStyles(() => ({ +const useStyles = makeStyles((theme: Theme) => ({ root: { textAlign: "center", }, @@ -91,7 +83,7 @@ interface MethodItemProps { } function MethodItem(props: MethodItemProps) { - const style = makeStyles((theme) => ({ + const style = makeStyles((theme: Theme) => ({ item: { paddingTop: theme.spacing(4), paddingBottom: theme.spacing(4), diff --git a/web/src/views/LoginPortal/SecondFactor/OTPDial.tsx b/web/src/views/LoginPortal/SecondFactor/OTPDial.tsx index 5c6486d8..4694688c 100644 --- a/web/src/views/LoginPortal/SecondFactor/OTPDial.tsx +++ b/web/src/views/LoginPortal/SecondFactor/OTPDial.tsx @@ -1,6 +1,7 @@ import React, { Fragment } from "react"; -import { makeStyles } from "@material-ui/core"; +import { Theme } from "@mui/material"; +import makeStyles from "@mui/styles/makeStyles"; import classnames from "classnames"; import OtpInput from "react-otp-input"; @@ -20,11 +21,11 @@ export interface Props { } const OTPDial = function (props: Props) { - const style = useStyles(); + const styles = useStyles(); return ( }> - + @@ -42,7 +46,7 @@ const OTPDial = function (props: Props) { export default OTPDial; -const useStyles = makeStyles((theme) => ({ +const useStyles = makeStyles((theme: Theme) => ({ timeProgress: {}, register: { marginTop: theme.spacing(), diff --git a/web/src/views/LoginPortal/SecondFactor/PushNotificationMethod.tsx b/web/src/views/LoginPortal/SecondFactor/PushNotificationMethod.tsx index f3ff7279..6a080348 100644 --- a/web/src/views/LoginPortal/SecondFactor/PushNotificationMethod.tsx +++ b/web/src/views/LoginPortal/SecondFactor/PushNotificationMethod.tsx @@ -1,6 +1,7 @@ import React, { useEffect, useCallback, useRef, useState, ReactNode } from "react"; -import { Button, makeStyles } from "@material-ui/core"; +import { Button, Theme } from "@mui/material"; +import makeStyles from "@mui/styles/makeStyles"; import FailureIcon from "@components/FailureIcon"; import PushNotificationIcon from "@components/PushNotificationIcon"; @@ -40,7 +41,7 @@ export interface Props { } const PushNotificationMethod = function (props: Props) { - const style = useStyles(); + const styles = useStyles(); const [state, setState] = useState(State.SignInInProgress); const redirectionURL = useRedirectionURL(); const mounted = useIsMountedRef(); @@ -216,7 +217,7 @@ const PushNotificationMethod = function (props: Props) { onSelectClick={fetchDuoDevicesFunc} onRegisterClick={() => window.open(enroll_url, "_blank")} > -
{icon}
+
{icon}
) : null} - + ({ +const useStyles = makeStyles((theme: Theme) => ({ methodContainer: { border: "1px solid #d6d6d6", borderRadius: "10px", diff --git a/web/src/views/LoginPortal/SecondFactor/WebauthnMethod.tsx b/web/src/views/LoginPortal/SecondFactor/WebauthnMethod.tsx index 3ac06d38..6b42dd1c 100644 --- a/web/src/views/LoginPortal/SecondFactor/WebauthnMethod.tsx +++ b/web/src/views/LoginPortal/SecondFactor/WebauthnMethod.tsx @@ -1,7 +1,7 @@ import React, { Fragment, useCallback, useEffect, useRef, useState } from "react"; -import { Button, makeStyles, useTheme } from "@material-ui/core"; -import { CSSProperties } from "@material-ui/styles"; +import { Button, Theme, useTheme } from "@mui/material"; +import makeStyles from "@mui/styles/makeStyles"; import FailureIcon from "@components/FailureIcon"; import FingerTouchIcon from "@components/FingerTouchIcon"; @@ -38,7 +38,7 @@ export interface Props { const WebauthnMethod = function (props: Props) { const signInTimeout = 30; const [state, setState] = useState(State.WaitTouch); - const style = useStyles(); + const styles = useStyles(); const redirectionURL = useRedirectionURL(); const mounted = useIsMountedRef(); const [timerPercent, triggerTimer] = useTimer(signInTimeout * 1000 - 500); @@ -162,7 +162,7 @@ const WebauthnMethod = function (props: Props) { state={methodState} onRegisterClick={props.onRegisterClick} > -
+
@@ -171,7 +171,7 @@ const WebauthnMethod = function (props: Props) { export default WebauthnMethod; -const useStyles = makeStyles(() => ({ +const useStyles = makeStyles((theme: Theme) => ({ icon: { display: "inline-block", }, @@ -188,16 +188,18 @@ function Icon(props: IconProps) { const state = props.state as State; const theme = useTheme(); - const progressBarStyle: CSSProperties = { - marginTop: theme.spacing(), - }; + const styles = makeStyles((theme: Theme) => ({ + progressBar: { + marginTop: theme.spacing(), + }, + }))(); const touch = ( } className={state === State.WaitTouch ? undefined : "hidden"} > - + ); diff --git a/web/src/views/LoginPortal/SignOut/SignOut.tsx b/web/src/views/LoginPortal/SignOut/SignOut.tsx index 39422217..9ea9b5bd 100644 --- a/web/src/views/LoginPortal/SignOut/SignOut.tsx +++ b/web/src/views/LoginPortal/SignOut/SignOut.tsx @@ -1,6 +1,7 @@ import React, { useEffect, useCallback, useState } from "react"; -import { Typography, makeStyles } from "@material-ui/core"; +import { Theme, Typography } from "@mui/material"; +import makeStyles from "@mui/styles/makeStyles"; import { useTranslation } from "react-i18next"; import { Navigate } from "react-router-dom"; @@ -16,7 +17,7 @@ export interface Props {} const SignOut = function (props: Props) { const mounted = useIsMountedRef(); - const style = useStyles(); + const styles = useStyles(); const { createErrorNotification } = useNotifications(); const redirectionURL = useRedirectionURL(); const redirector = useRedirector(); @@ -56,14 +57,14 @@ const SignOut = function (props: Props) { return ( - {translate("You're being signed out and redirected")}... + {translate("You're being signed out and redirected")}... ); }; export default SignOut; -const useStyles = makeStyles((theme) => ({ +const useStyles = makeStyles((theme: Theme) => ({ typo: { padding: theme.spacing(), }, diff --git a/web/src/views/ResetPassword/ResetPasswordStep1.tsx b/web/src/views/ResetPassword/ResetPasswordStep1.tsx index 0c1d3c67..e7a2ad4a 100644 --- a/web/src/views/ResetPassword/ResetPasswordStep1.tsx +++ b/web/src/views/ResetPassword/ResetPasswordStep1.tsx @@ -1,6 +1,7 @@ import React, { useState } from "react"; -import { Grid, Button, makeStyles } from "@material-ui/core"; +import { Grid, Button, Theme } from "@mui/material"; +import makeStyles from "@mui/styles/makeStyles"; import { useTranslation } from "react-i18next"; import { useNavigate } from "react-router-dom"; @@ -11,7 +12,7 @@ import LoginLayout from "@layouts/LoginLayout"; import { initiateResetPasswordProcess } from "@services/ResetPassword"; const ResetPasswordStep1 = function () { - const style = useStyles(); + const styles = useStyles(); const [username, setUsername] = useState(""); const [error, setError] = useState(false); const { createInfoNotification, createErrorNotification } = useNotifications(); @@ -42,7 +43,7 @@ const ResetPasswordStep1 = function () { return ( - + ({ +const useStyles = makeStyles((theme: Theme) => ({ root: { marginTop: theme.spacing(2), marginBottom: theme.spacing(2), diff --git a/web/src/views/ResetPassword/ResetPasswordStep2.tsx b/web/src/views/ResetPassword/ResetPasswordStep2.tsx index bf1e6146..0319c502 100644 --- a/web/src/views/ResetPassword/ResetPasswordStep2.tsx +++ b/web/src/views/ResetPassword/ResetPasswordStep2.tsx @@ -1,7 +1,8 @@ import React, { useCallback, useEffect, useState } from "react"; -import { Button, Grid, IconButton, InputAdornment, makeStyles } from "@material-ui/core"; -import { Visibility, VisibilityOff } from "@material-ui/icons"; +import { Visibility, VisibilityOff } from "@mui/icons-material"; +import { Button, Grid, IconButton, InputAdornment, Theme } from "@mui/material"; +import makeStyles from "@mui/styles/makeStyles"; import classnames from "classnames"; import { useTranslation } from "react-i18next"; import { useLocation, useNavigate } from "react-router-dom"; @@ -17,7 +18,7 @@ import { completeResetPasswordProcess, resetPassword } from "@services/ResetPass import { extractIdentityToken } from "@utils/IdentityToken"; const ResetPasswordStep2 = function () { - const style = useStyles(); + const styles = useStyles(); const location = useLocation(); const [formDisabled, setFormDisabled] = useState(true); const [password1, setPassword1] = useState(""); @@ -110,7 +111,7 @@ const ResetPasswordStep2 = function () { return ( - + setPassword1(e.target.value)} error={errorPassword1} - className={classnames(style.fullWidth)} + className={classnames(styles.fullWidth)} autoComplete="new-password" InputProps={{ endAdornment: ( @@ -130,6 +131,7 @@ const ResetPasswordStep2 = function () { aria-label="toggle password visibility" onClick={(e) => setShowPassword(!showPassword)} edge="end" + size="large" > {showPassword ? : } @@ -157,7 +159,7 @@ const ResetPasswordStep2 = function () { ev.preventDefault(); } }} - className={classnames(style.fullWidth)} + className={classnames(styles.fullWidth)} autoComplete="new-password" /> @@ -169,7 +171,7 @@ const ResetPasswordStep2 = function () { name="password1" disabled={formDisabled} onClick={handleResetClick} - className={style.fullWidth} + className={styles.fullWidth} > {translate("Reset")} @@ -181,7 +183,7 @@ const ResetPasswordStep2 = function () { color="primary" name="password2" onClick={handleCancelClick} - className={style.fullWidth} + className={styles.fullWidth} > {translate("Cancel")} @@ -193,7 +195,7 @@ const ResetPasswordStep2 = function () { export default ResetPasswordStep2; -const useStyles = makeStyles((theme) => ({ +const useStyles = makeStyles((theme: Theme) => ({ root: { marginTop: theme.spacing(2), marginBottom: theme.spacing(2),