diff --git a/package-lock.json b/package-lock.json
index a9545fd..eb0ca95 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -8,16 +8,32 @@
"name": "refactor-platform-fe",
"version": "0.1.0",
"dependencies": {
+ "@emotion/cache": "11.10.5",
"@emotion/react": "^11.11.1",
+ "@emotion/server": "11.10.0",
"@emotion/styled": "^11.11.0",
"@fontsource/roboto": "^5.0.8",
+ "@heroicons/react": "2.0.16",
+ "@mui/lab": "5.0.0-alpha.120",
"@mui/material": "^5.14.18",
- "next": "14.0.1",
+ "@mui/system": "5.11.9",
+ "@mui/x-date-pickers": "5.0.19",
+ "apexcharts": "3.37.0",
+ "date-fns": "2.29.3",
+ "formik": "2.2.9",
+ "next": "^14.0.3",
+ "nprogress": "0.2.0",
+ "prop-types": "15.8.1",
"react": "^18",
- "react-dom": "^18"
+ "react-apexcharts": "1.4.0",
+ "react-dom": "^18",
+ "simplebar-react": "^3.2.1",
+ "yup": "1.0.0"
},
"devDependencies": {
"@types/node": "^20",
+ "@types/nprogress": "0.2.0",
+ "@types/numeral": "2.0.2",
"@types/react": "^18",
"@types/react-dom": "^18",
"autoprefixer": "^10.0.1",
@@ -240,6 +256,75 @@
"node": ">=6.9.0"
}
},
+ "node_modules/@date-io/core": {
+ "version": "2.17.0",
+ "resolved": "https://registry.npmjs.org/@date-io/core/-/core-2.17.0.tgz",
+ "integrity": "sha512-+EQE8xZhRM/hsY0CDTVyayMDDY5ihc4MqXCrPxooKw19yAzUIC6uUqsZeaOFNL9YKTNxYKrJP5DFgE8o5xRCOw=="
+ },
+ "node_modules/@date-io/date-fns": {
+ "version": "2.17.0",
+ "resolved": "https://registry.npmjs.org/@date-io/date-fns/-/date-fns-2.17.0.tgz",
+ "integrity": "sha512-L0hWZ/mTpy3Gx/xXJ5tq5CzHo0L7ry6KEO9/w/JWiFWFLZgiNVo3ex92gOl3zmzjHqY/3Ev+5sehAr8UnGLEng==",
+ "dependencies": {
+ "@date-io/core": "^2.17.0"
+ },
+ "peerDependencies": {
+ "date-fns": "^2.0.0"
+ },
+ "peerDependenciesMeta": {
+ "date-fns": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@date-io/dayjs": {
+ "version": "2.17.0",
+ "resolved": "https://registry.npmjs.org/@date-io/dayjs/-/dayjs-2.17.0.tgz",
+ "integrity": "sha512-Iq1wjY5XzBh0lheFA0it6Dsyv94e8mTiNR8vuTai+KopxDkreL3YjwTmZHxkgB7/vd0RMIACStzVgWvPATnDCA==",
+ "dependencies": {
+ "@date-io/core": "^2.17.0"
+ },
+ "peerDependencies": {
+ "dayjs": "^1.8.17"
+ },
+ "peerDependenciesMeta": {
+ "dayjs": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@date-io/luxon": {
+ "version": "2.17.0",
+ "resolved": "https://registry.npmjs.org/@date-io/luxon/-/luxon-2.17.0.tgz",
+ "integrity": "sha512-l712Vdm/uTddD2XWt9TlQloZUiTiRQtY5TCOG45MQ/8u0tu8M17BD6QYHar/3OrnkGybALAMPzCy1r5D7+0HBg==",
+ "dependencies": {
+ "@date-io/core": "^2.17.0"
+ },
+ "peerDependencies": {
+ "luxon": "^1.21.3 || ^2.x || ^3.x"
+ },
+ "peerDependenciesMeta": {
+ "luxon": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@date-io/moment": {
+ "version": "2.17.0",
+ "resolved": "https://registry.npmjs.org/@date-io/moment/-/moment-2.17.0.tgz",
+ "integrity": "sha512-e4nb4CDZU4k0WRVhz1Wvl7d+hFsedObSauDHKtZwU9kt7gdYEAzKgnrSCTHsEaXrDumdrkCYTeZ0Tmyk7uV4tw==",
+ "dependencies": {
+ "@date-io/core": "^2.17.0"
+ },
+ "peerDependencies": {
+ "moment": "^2.24.0"
+ },
+ "peerDependenciesMeta": {
+ "moment": {
+ "optional": true
+ }
+ }
+ },
"node_modules/@emotion/babel-plugin": {
"version": "11.11.0",
"resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz",
@@ -259,17 +344,22 @@
}
},
"node_modules/@emotion/cache": {
- "version": "11.11.0",
- "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz",
- "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==",
+ "version": "11.10.5",
+ "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.10.5.tgz",
+ "integrity": "sha512-dGYHWyzTdmK+f2+EnIGBpkz1lKc4Zbj2KHd4cX3Wi8/OWr5pKslNjc3yABKH4adRGCvSX4VDC0i04mrrq0aiRA==",
"dependencies": {
- "@emotion/memoize": "^0.8.1",
- "@emotion/sheet": "^1.2.2",
- "@emotion/utils": "^1.2.1",
- "@emotion/weak-memoize": "^0.3.1",
- "stylis": "4.2.0"
+ "@emotion/memoize": "^0.8.0",
+ "@emotion/sheet": "^1.2.1",
+ "@emotion/utils": "^1.2.0",
+ "@emotion/weak-memoize": "^0.3.0",
+ "stylis": "4.1.3"
}
},
+ "node_modules/@emotion/cache/node_modules/stylis": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.1.3.tgz",
+ "integrity": "sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA=="
+ },
"node_modules/@emotion/hash": {
"version": "0.9.1",
"resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz",
@@ -311,6 +401,18 @@
}
}
},
+ "node_modules/@emotion/react/node_modules/@emotion/cache": {
+ "version": "11.11.0",
+ "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz",
+ "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==",
+ "dependencies": {
+ "@emotion/memoize": "^0.8.1",
+ "@emotion/sheet": "^1.2.2",
+ "@emotion/utils": "^1.2.1",
+ "@emotion/weak-memoize": "^0.3.1",
+ "stylis": "4.2.0"
+ }
+ },
"node_modules/@emotion/serialize": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.2.tgz",
@@ -323,6 +425,25 @@
"csstype": "^3.0.2"
}
},
+ "node_modules/@emotion/server": {
+ "version": "11.10.0",
+ "resolved": "https://registry.npmjs.org/@emotion/server/-/server-11.10.0.tgz",
+ "integrity": "sha512-MTvJ21JPo9aS02GdjFW4nhdwOi2tNNpMmAM/YED0pkxzjDNi5WbiTwXqaCnvLc2Lr8NFtjhT0az1vTJyLIHYcw==",
+ "dependencies": {
+ "@emotion/utils": "^1.2.0",
+ "html-tokenize": "^2.0.0",
+ "multipipe": "^1.0.2",
+ "through": "^2.3.8"
+ },
+ "peerDependencies": {
+ "@emotion/css": "^11.0.0-rc.0"
+ },
+ "peerDependenciesMeta": {
+ "@emotion/css": {
+ "optional": true
+ }
+ }
+ },
"node_modules/@emotion/sheet": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz",
@@ -468,6 +589,14 @@
"resolved": "https://registry.npmjs.org/@fontsource/roboto/-/roboto-5.0.8.tgz",
"integrity": "sha512-XxPltXs5R31D6UZeLIV1td3wTXU3jzd3f2DLsXI8tytMGBkIsGcc9sIyiupRtA8y73HAhuSCeweOoBqf6DbWCA=="
},
+ "node_modules/@heroicons/react": {
+ "version": "2.0.16",
+ "resolved": "https://registry.npmjs.org/@heroicons/react/-/react-2.0.16.tgz",
+ "integrity": "sha512-x89rFxH3SRdYaA+JCXwfe+RkE1SFTo9GcOkZettHer71Y3T7V+ogKmfw5CjTazgS3d0ClJ7p1NA+SP7VQLQcLw==",
+ "peerDependencies": {
+ "react": ">= 16"
+ }
+ },
"node_modules/@humanwhocodes/config-array": {
"version": "0.11.13",
"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz",
@@ -541,6 +670,92 @@
"url": "https://opencollective.com/mui"
}
},
+ "node_modules/@mui/lab": {
+ "version": "5.0.0-alpha.120",
+ "resolved": "https://registry.npmjs.org/@mui/lab/-/lab-5.0.0-alpha.120.tgz",
+ "integrity": "sha512-vjlF2jTKSZnNxtUO0xxHEDfpL5cG0LLNRsfKv8TYOiPs0Q1bbqO3YfqJsqxv8yh+wx7EFZc8lwJ4NSAQdenW3A==",
+ "dependencies": {
+ "@babel/runtime": "^7.20.13",
+ "@mui/base": "5.0.0-alpha.118",
+ "@mui/system": "^5.11.9",
+ "@mui/types": "^7.2.3",
+ "@mui/utils": "^5.11.9",
+ "clsx": "^1.2.1",
+ "prop-types": "^15.8.1",
+ "react-is": "^18.2.0"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mui"
+ },
+ "peerDependencies": {
+ "@emotion/react": "^11.5.0",
+ "@emotion/styled": "^11.3.0",
+ "@mui/material": "^5.0.0",
+ "@types/react": "^17.0.0 || ^18.0.0",
+ "react": "^17.0.0 || ^18.0.0",
+ "react-dom": "^17.0.0 || ^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@emotion/react": {
+ "optional": true
+ },
+ "@emotion/styled": {
+ "optional": true
+ },
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@mui/lab/node_modules/@mui/base": {
+ "version": "5.0.0-alpha.118",
+ "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.118.tgz",
+ "integrity": "sha512-GAEpqhnuHjRaAZLdxFNuOf2GDTp9sUawM46oHZV4VnYPFjXJDkIYFWfIQLONb0nga92OiqS5DD/scGzVKCL0Mw==",
+ "dependencies": {
+ "@babel/runtime": "^7.20.13",
+ "@emotion/is-prop-valid": "^1.2.0",
+ "@mui/types": "^7.2.3",
+ "@mui/utils": "^5.11.9",
+ "@popperjs/core": "^2.11.6",
+ "clsx": "^1.2.1",
+ "prop-types": "^15.8.1",
+ "react-is": "^18.2.0"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mui"
+ },
+ "peerDependencies": {
+ "@types/react": "^17.0.0 || ^18.0.0",
+ "react": "^17.0.0 || ^18.0.0",
+ "react-dom": "^17.0.0 || ^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@mui/lab/node_modules/clsx": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz",
+ "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/@mui/lab/node_modules/react-is": {
+ "version": "18.2.0",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz",
+ "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w=="
+ },
"node_modules/@mui/material": {
"version": "5.14.18",
"resolved": "https://registry.npmjs.org/@mui/material/-/material-5.14.18.tgz",
@@ -585,6 +800,45 @@
}
}
},
+ "node_modules/@mui/material/node_modules/@mui/system": {
+ "version": "5.14.18",
+ "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.14.18.tgz",
+ "integrity": "sha512-hSQQdb3KF72X4EN2hMEiv8EYJZSflfdd1TRaGPoR7CIAG347OxCslpBUwWngYobaxgKvq6xTrlIl+diaactVww==",
+ "dependencies": {
+ "@babel/runtime": "^7.23.2",
+ "@mui/private-theming": "^5.14.18",
+ "@mui/styled-engine": "^5.14.18",
+ "@mui/types": "^7.2.9",
+ "@mui/utils": "^5.14.18",
+ "clsx": "^2.0.0",
+ "csstype": "^3.1.2",
+ "prop-types": "^15.8.1"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mui"
+ },
+ "peerDependencies": {
+ "@emotion/react": "^11.5.0",
+ "@emotion/styled": "^11.3.0",
+ "@types/react": "^17.0.0 || ^18.0.0",
+ "react": "^17.0.0 || ^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@emotion/react": {
+ "optional": true
+ },
+ "@emotion/styled": {
+ "optional": true
+ },
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
"node_modules/@mui/material/node_modules/react-is": {
"version": "18.2.0",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz",
@@ -647,18 +901,30 @@
}
}
},
- "node_modules/@mui/system": {
- "version": "5.14.18",
- "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.14.18.tgz",
- "integrity": "sha512-hSQQdb3KF72X4EN2hMEiv8EYJZSflfdd1TRaGPoR7CIAG347OxCslpBUwWngYobaxgKvq6xTrlIl+diaactVww==",
+ "node_modules/@mui/styled-engine/node_modules/@emotion/cache": {
+ "version": "11.11.0",
+ "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz",
+ "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==",
"dependencies": {
- "@babel/runtime": "^7.23.2",
- "@mui/private-theming": "^5.14.18",
- "@mui/styled-engine": "^5.14.18",
- "@mui/types": "^7.2.9",
- "@mui/utils": "^5.14.18",
- "clsx": "^2.0.0",
- "csstype": "^3.1.2",
+ "@emotion/memoize": "^0.8.1",
+ "@emotion/sheet": "^1.2.2",
+ "@emotion/utils": "^1.2.1",
+ "@emotion/weak-memoize": "^0.3.1",
+ "stylis": "4.2.0"
+ }
+ },
+ "node_modules/@mui/system": {
+ "version": "5.11.9",
+ "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.11.9.tgz",
+ "integrity": "sha512-h6uarf+l3FO6l75Nf7yO+qDGrIoa1DM9nAMCUFZQsNCDKOInRzcptnm8M1w/Z3gVetfeeGoIGAYuYKbft6KZZA==",
+ "dependencies": {
+ "@babel/runtime": "^7.20.13",
+ "@mui/private-theming": "^5.11.9",
+ "@mui/styled-engine": "^5.11.9",
+ "@mui/types": "^7.2.3",
+ "@mui/utils": "^5.11.9",
+ "clsx": "^1.2.1",
+ "csstype": "^3.1.1",
"prop-types": "^15.8.1"
},
"engines": {
@@ -686,6 +952,14 @@
}
}
},
+ "node_modules/@mui/system/node_modules/clsx": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz",
+ "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/@mui/types": {
"version": "7.2.9",
"resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.9.tgz",
@@ -731,10 +1005,76 @@
"resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz",
"integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w=="
},
+ "node_modules/@mui/x-date-pickers": {
+ "version": "5.0.19",
+ "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-5.0.19.tgz",
+ "integrity": "sha512-D8zFyFgwA6faPCTM//3SG17RqCegczKQS9wF/toemhjsP7Ps4ape/llHqowL/BZLbi14OXV0Ud10tfUyVP7Q/Q==",
+ "dependencies": {
+ "@babel/runtime": "^7.18.9",
+ "@date-io/core": "^2.15.0",
+ "@date-io/date-fns": "^2.15.0",
+ "@date-io/dayjs": "^2.15.0",
+ "@date-io/luxon": "^2.15.0",
+ "@date-io/moment": "^2.15.0",
+ "@mui/utils": "^5.10.3",
+ "@types/react-transition-group": "^4.4.5",
+ "clsx": "^1.2.1",
+ "prop-types": "^15.7.2",
+ "react-transition-group": "^4.4.5",
+ "rifm": "^0.12.1"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mui"
+ },
+ "peerDependencies": {
+ "@emotion/react": "^11.9.0",
+ "@emotion/styled": "^11.8.1",
+ "@mui/material": "^5.4.1",
+ "@mui/system": "^5.4.1",
+ "date-fns": "^2.25.0",
+ "dayjs": "^1.10.7",
+ "luxon": "^1.28.0 || ^2.0.0 || ^3.0.0",
+ "moment": "^2.29.1",
+ "react": "^17.0.2 || ^18.0.0",
+ "react-dom": "^17.0.2 || ^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@emotion/react": {
+ "optional": true
+ },
+ "@emotion/styled": {
+ "optional": true
+ },
+ "date-fns": {
+ "optional": true
+ },
+ "dayjs": {
+ "optional": true
+ },
+ "luxon": {
+ "optional": true
+ },
+ "moment": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@mui/x-date-pickers/node_modules/clsx": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz",
+ "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/@next/env": {
- "version": "14.0.1",
- "resolved": "https://registry.npmjs.org/@next/env/-/env-14.0.1.tgz",
- "integrity": "sha512-Ms8ZswqY65/YfcjrlcIwMPD7Rg/dVjdLapMcSHG26W6O67EJDF435ShW4H4LXi1xKO1oRc97tLXUpx8jpLe86A=="
+ "version": "14.0.3",
+ "resolved": "https://registry.npmjs.org/@next/env/-/env-14.0.3.tgz",
+ "integrity": "sha512-7xRqh9nMvP5xrW4/+L0jgRRX+HoNRGnfJpD+5Wq6/13j3dsdzxO3BCXn7D3hMqsDb+vjZnJq+vI7+EtgrYZTeA=="
},
"node_modules/@next/eslint-plugin-next": {
"version": "14.0.1",
@@ -746,9 +1086,9 @@
}
},
"node_modules/@next/swc-darwin-arm64": {
- "version": "14.0.1",
- "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.0.1.tgz",
- "integrity": "sha512-JyxnGCS4qT67hdOKQ0CkgFTp+PXub5W1wsGvIq98TNbF3YEIN7iDekYhYsZzc8Ov0pWEsghQt+tANdidITCLaw==",
+ "version": "14.0.3",
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.0.3.tgz",
+ "integrity": "sha512-64JbSvi3nbbcEtyitNn2LEDS/hcleAFpHdykpcnrstITFlzFgB/bW0ER5/SJJwUPj+ZPY+z3e+1jAfcczRLVGw==",
"cpu": [
"arm64"
],
@@ -761,9 +1101,9 @@
}
},
"node_modules/@next/swc-darwin-x64": {
- "version": "14.0.1",
- "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.0.1.tgz",
- "integrity": "sha512-625Z7bb5AyIzswF9hvfZWa+HTwFZw+Jn3lOBNZB87lUS0iuCYDHqk3ujuHCkiyPtSC0xFBtYDLcrZ11mF/ap3w==",
+ "version": "14.0.3",
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.0.3.tgz",
+ "integrity": "sha512-RkTf+KbAD0SgYdVn1XzqE/+sIxYGB7NLMZRn9I4Z24afrhUpVJx6L8hsRnIwxz3ERE2NFURNliPjJ2QNfnWicQ==",
"cpu": [
"x64"
],
@@ -776,9 +1116,9 @@
}
},
"node_modules/@next/swc-linux-arm64-gnu": {
- "version": "14.0.1",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.0.1.tgz",
- "integrity": "sha512-iVpn3KG3DprFXzVHM09kvb//4CNNXBQ9NB/pTm8LO+vnnnaObnzFdS5KM+w1okwa32xH0g8EvZIhoB3fI3mS1g==",
+ "version": "14.0.3",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.0.3.tgz",
+ "integrity": "sha512-3tBWGgz7M9RKLO6sPWC6c4pAw4geujSwQ7q7Si4d6bo0l6cLs4tmO+lnSwFp1Tm3lxwfMk0SgkJT7EdwYSJvcg==",
"cpu": [
"arm64"
],
@@ -791,9 +1131,9 @@
}
},
"node_modules/@next/swc-linux-arm64-musl": {
- "version": "14.0.1",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.0.1.tgz",
- "integrity": "sha512-mVsGyMxTLWZXyD5sen6kGOTYVOO67lZjLApIj/JsTEEohDDt1im2nkspzfV5MvhfS7diDw6Rp/xvAQaWZTv1Ww==",
+ "version": "14.0.3",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.0.3.tgz",
+ "integrity": "sha512-v0v8Kb8j8T23jvVUWZeA2D8+izWspeyeDGNaT2/mTHWp7+37fiNfL8bmBWiOmeumXkacM/AB0XOUQvEbncSnHA==",
"cpu": [
"arm64"
],
@@ -806,9 +1146,9 @@
}
},
"node_modules/@next/swc-linux-x64-gnu": {
- "version": "14.0.1",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.0.1.tgz",
- "integrity": "sha512-wMqf90uDWN001NqCM/auRl3+qVVeKfjJdT9XW+RMIOf+rhUzadmYJu++tp2y+hUbb6GTRhT+VjQzcgg/QTD9NQ==",
+ "version": "14.0.3",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.0.3.tgz",
+ "integrity": "sha512-VM1aE1tJKLBwMGtyBR21yy+STfl0MapMQnNrXkxeyLs0GFv/kZqXS5Jw/TQ3TSUnbv0QPDf/X8sDXuMtSgG6eg==",
"cpu": [
"x64"
],
@@ -821,9 +1161,9 @@
}
},
"node_modules/@next/swc-linux-x64-musl": {
- "version": "14.0.1",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.0.1.tgz",
- "integrity": "sha512-ol1X1e24w4j4QwdeNjfX0f+Nza25n+ymY0T2frTyalVczUmzkVD7QGgPTZMHfR1aLrO69hBs0G3QBYaj22J5GQ==",
+ "version": "14.0.3",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.0.3.tgz",
+ "integrity": "sha512-64EnmKy18MYFL5CzLaSuUn561hbO1Gk16jM/KHznYP3iCIfF9e3yULtHaMy0D8zbHfxset9LTOv6cuYKJgcOxg==",
"cpu": [
"x64"
],
@@ -836,9 +1176,9 @@
}
},
"node_modules/@next/swc-win32-arm64-msvc": {
- "version": "14.0.1",
- "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.0.1.tgz",
- "integrity": "sha512-WEmTEeWs6yRUEnUlahTgvZteh5RJc4sEjCQIodJlZZ5/VJwVP8p2L7l6VhzQhT4h7KvLx/Ed4UViBdne6zpIsw==",
+ "version": "14.0.3",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.0.3.tgz",
+ "integrity": "sha512-WRDp8QrmsL1bbGtsh5GqQ/KWulmrnMBgbnb+59qNTW1kVi1nG/2ndZLkcbs2GX7NpFLlToLRMWSQXmPzQm4tog==",
"cpu": [
"arm64"
],
@@ -851,9 +1191,9 @@
}
},
"node_modules/@next/swc-win32-ia32-msvc": {
- "version": "14.0.1",
- "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.0.1.tgz",
- "integrity": "sha512-oFpHphN4ygAgZUKjzga7SoH2VGbEJXZa/KL8bHCAwCjDWle6R1SpiGOdUdA8EJ9YsG1TYWpzY6FTbUA+iAJeww==",
+ "version": "14.0.3",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.0.3.tgz",
+ "integrity": "sha512-EKffQeqCrj+t6qFFhIFTRoqb2QwX1mU7iTOvMyLbYw3QtqTw9sMwjykyiMlZlrfm2a4fA84+/aeW+PMg1MjuTg==",
"cpu": [
"ia32"
],
@@ -866,9 +1206,9 @@
}
},
"node_modules/@next/swc-win32-x64-msvc": {
- "version": "14.0.1",
- "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.0.1.tgz",
- "integrity": "sha512-FFp3nOJ/5qSpeWT0BZQ+YE1pSMk4IMpkME/1DwKBwhg4mJLB9L+6EXuJi4JEwaJdl5iN+UUlmUD3IsR1kx5fAg==",
+ "version": "14.0.3",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.0.3.tgz",
+ "integrity": "sha512-ERhKPSJ1vQrPiwrs15Pjz/rvDHZmkmvbf/BjPN/UCOI++ODftT0GtasDPi0j+y6PPJi5HsXw+dpRaXUaw4vjuQ==",
"cpu": [
"x64"
],
@@ -944,6 +1284,19 @@
"integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==",
"dev": true
},
+ "node_modules/@types/lodash": {
+ "version": "4.14.201",
+ "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.201.tgz",
+ "integrity": "sha512-y9euML0cim1JrykNxADLfaG0FgD1g/yTHwUs/Jg9ZIU7WKj2/4IW9Lbb1WZbvck78W/lfGXFfe+u2EGfIJXdLQ=="
+ },
+ "node_modules/@types/lodash-es": {
+ "version": "4.17.11",
+ "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.11.tgz",
+ "integrity": "sha512-eCw8FYAWHt2DDl77s+AMLLzPn310LKohruumpucZI4oOFJkIgnlaJcy23OKMJxx4r9PeTF13Gv6w+jqjWQaYUg==",
+ "dependencies": {
+ "@types/lodash": "*"
+ }
+ },
"node_modules/@types/node": {
"version": "20.8.10",
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.10.tgz",
@@ -953,6 +1306,18 @@
"undici-types": "~5.26.4"
}
},
+ "node_modules/@types/nprogress": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/@types/nprogress/-/nprogress-0.2.0.tgz",
+ "integrity": "sha512-1cYJrqq9GezNFPsWTZpFut/d4CjpZqA0vhqDUPFWYKF1oIyBz5qnoYMzR+0C/T96t3ebLAC1SSnwrVOm5/j74A==",
+ "dev": true
+ },
+ "node_modules/@types/numeral": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/@types/numeral/-/numeral-2.0.2.tgz",
+ "integrity": "sha512-A8F30k2gYJ/6e07spSCPpkuZu79LCnkPTvqmIWQzNGcrzwFKpVOydG41lNt5wZXjSI149qjyzC2L1+F2PD/NUA==",
+ "dev": true
+ },
"node_modules/@types/parse-json": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz",
@@ -1164,6 +1529,19 @@
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
+ "node_modules/apexcharts": {
+ "version": "3.37.0",
+ "resolved": "https://registry.npmjs.org/apexcharts/-/apexcharts-3.37.0.tgz",
+ "integrity": "sha512-0mg1gDKUo3JG00Q//LK0jEXBS6OLjpuglqZ8ec9cqfA5oP8owopD9n5EhfARbWROb5o8GSPzFuohTJiCm2ecWw==",
+ "dependencies": {
+ "svg.draggable.js": "^2.2.2",
+ "svg.easing.js": "^2.0.0",
+ "svg.filter.js": "^2.0.2",
+ "svg.pathmorphing.js": "^0.1.3",
+ "svg.resize.js": "^1.4.3",
+ "svg.select.js": "^3.0.1"
+ }
+ },
"node_modules/argparse": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
@@ -1465,6 +1843,11 @@
"node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
}
},
+ "node_modules/buffer-from": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-0.1.2.tgz",
+ "integrity": "sha512-RiWIenusJsmI2KcvqQABB83tLxCByE3upSP8QU3rJDMVFGPWLvPQJt/O1Su9moRWeH7d+Q2HYb68f6+v+tw2vg=="
+ },
"node_modules/busboy": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz",
@@ -1498,6 +1881,11 @@
"node": ">=6"
}
},
+ "node_modules/can-use-dom": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/can-use-dom/-/can-use-dom-0.1.0.tgz",
+ "integrity": "sha512-ceOhN1DL7Y4O6M0j9ICgmTYziV89WMd96SvSl0REd8PMgrY0B/WBOPoed5S1KUmJqXgUXh8gzSe6E3ae27upsQ=="
+ },
"node_modules/caniuse-lite": {
"version": "1.0.30001559",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001559.tgz",
@@ -1575,6 +1963,11 @@
"resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
"integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A=="
},
+ "node_modules/core-util-is": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
+ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
+ },
"node_modules/cosmiconfig": {
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz",
@@ -1623,6 +2016,18 @@
"integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==",
"dev": true
},
+ "node_modules/date-fns": {
+ "version": "2.29.3",
+ "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz",
+ "integrity": "sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==",
+ "engines": {
+ "node": ">=0.11"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/date-fns"
+ }
+ },
"node_modules/debug": {
"version": "4.3.4",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
@@ -1646,6 +2051,14 @@
"integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
"dev": true
},
+ "node_modules/deepmerge": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.2.1.tgz",
+ "integrity": "sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/define-data-property": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz",
@@ -1719,6 +2132,41 @@
"csstype": "^3.0.2"
}
},
+ "node_modules/duplexer2": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz",
+ "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==",
+ "dependencies": {
+ "readable-stream": "^2.0.2"
+ }
+ },
+ "node_modules/duplexer2/node_modules/isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="
+ },
+ "node_modules/duplexer2/node_modules/readable-stream": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
+ "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+ "dependencies": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "node_modules/duplexer2/node_modules/string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "dependencies": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
"node_modules/electron-to-chromium": {
"version": "1.4.575",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.575.tgz",
@@ -2426,6 +2874,34 @@
"is-callable": "^1.1.3"
}
},
+ "node_modules/formik": {
+ "version": "2.2.9",
+ "resolved": "https://registry.npmjs.org/formik/-/formik-2.2.9.tgz",
+ "integrity": "sha512-LQLcISMmf1r5at4/gyJigGn0gOwFbeEAlji+N9InZF6LIMXnFNkO42sCI8Jt84YZggpD4cPWObAZaxpEFtSzNA==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://opencollective.com/formik"
+ }
+ ],
+ "dependencies": {
+ "deepmerge": "^2.1.1",
+ "hoist-non-react-statics": "^3.3.0",
+ "lodash": "^4.17.21",
+ "lodash-es": "^4.17.21",
+ "react-fast-compare": "^2.0.1",
+ "tiny-warning": "^1.0.2",
+ "tslib": "^1.10.0"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0"
+ }
+ },
+ "node_modules/formik/node_modules/tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
+ },
"node_modules/fraction.js": {
"version": "4.3.7",
"resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz",
@@ -2721,6 +3197,21 @@
"react-is": "^16.7.0"
}
},
+ "node_modules/html-tokenize": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/html-tokenize/-/html-tokenize-2.0.1.tgz",
+ "integrity": "sha512-QY6S+hZ0f5m1WT8WffYN+Hg+xm/w5I8XeUcAq/ZYP5wVC8xbKi4Whhru3FtrAebD5EhBW8rmFzkDI6eCAuFe2w==",
+ "dependencies": {
+ "buffer-from": "~0.1.1",
+ "inherits": "~2.0.1",
+ "minimist": "~1.2.5",
+ "readable-stream": "~1.0.27-1",
+ "through2": "~0.4.1"
+ },
+ "bin": {
+ "html-tokenize": "bin/cmd.js"
+ }
+ },
"node_modules/ignore": {
"version": "5.2.4",
"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz",
@@ -2767,8 +3258,7 @@
"node_modules/inherits": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
- "dev": true
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
},
"node_modules/internal-slot": {
"version": "1.0.6",
@@ -3254,6 +3744,16 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
+ },
+ "node_modules/lodash-es": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz",
+ "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw=="
+ },
"node_modules/lodash.merge": {
"version": "4.6.2",
"resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
@@ -3321,7 +3821,6 @@
"version": "1.2.8",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
"integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
- "dev": true,
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
@@ -3332,6 +3831,15 @@
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
"dev": true
},
+ "node_modules/multipipe": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-1.0.2.tgz",
+ "integrity": "sha512-6uiC9OvY71vzSGX8lZvSqscE7ft9nPupJ8fMjrCNRAUy2LREUW42UL+V/NTrogr6rFgRydUrCX4ZitfpSNkSCQ==",
+ "dependencies": {
+ "duplexer2": "^0.1.2",
+ "object-assign": "^4.1.0"
+ }
+ },
"node_modules/nanoid": {
"version": "3.3.6",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz",
@@ -3356,11 +3864,11 @@
"dev": true
},
"node_modules/next": {
- "version": "14.0.1",
- "resolved": "https://registry.npmjs.org/next/-/next-14.0.1.tgz",
- "integrity": "sha512-s4YaLpE4b0gmb3ggtmpmV+wt+lPRuGtANzojMQ2+gmBpgX9w5fTbjsy6dXByBuENsdCX5pukZH/GxdFgO62+pA==",
+ "version": "14.0.3",
+ "resolved": "https://registry.npmjs.org/next/-/next-14.0.3.tgz",
+ "integrity": "sha512-AbYdRNfImBr3XGtvnwOxq8ekVCwbFTv/UJoLwmaX89nk9i051AEY4/HAWzU0YpaTDw8IofUpmuIlvzWF13jxIw==",
"dependencies": {
- "@next/env": "14.0.1",
+ "@next/env": "14.0.3",
"@swc/helpers": "0.5.2",
"busboy": "1.6.0",
"caniuse-lite": "^1.0.30001406",
@@ -3375,15 +3883,15 @@
"node": ">=18.17.0"
},
"optionalDependencies": {
- "@next/swc-darwin-arm64": "14.0.1",
- "@next/swc-darwin-x64": "14.0.1",
- "@next/swc-linux-arm64-gnu": "14.0.1",
- "@next/swc-linux-arm64-musl": "14.0.1",
- "@next/swc-linux-x64-gnu": "14.0.1",
- "@next/swc-linux-x64-musl": "14.0.1",
- "@next/swc-win32-arm64-msvc": "14.0.1",
- "@next/swc-win32-ia32-msvc": "14.0.1",
- "@next/swc-win32-x64-msvc": "14.0.1"
+ "@next/swc-darwin-arm64": "14.0.3",
+ "@next/swc-darwin-x64": "14.0.3",
+ "@next/swc-linux-arm64-gnu": "14.0.3",
+ "@next/swc-linux-arm64-musl": "14.0.3",
+ "@next/swc-linux-x64-gnu": "14.0.3",
+ "@next/swc-linux-x64-musl": "14.0.3",
+ "@next/swc-win32-arm64-msvc": "14.0.3",
+ "@next/swc-win32-ia32-msvc": "14.0.3",
+ "@next/swc-win32-x64-msvc": "14.0.3"
},
"peerDependencies": {
"@opentelemetry/api": "^1.1.0",
@@ -3415,6 +3923,11 @@
"node": ">=0.10.0"
}
},
+ "node_modules/nprogress": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz",
+ "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA=="
+ },
"node_modules/object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
@@ -3715,6 +4228,11 @@
"node": ">= 0.8.0"
}
},
+ "node_modules/process-nextick-args": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
+ },
"node_modules/prop-types": {
"version": "15.8.1",
"resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
@@ -3725,6 +4243,11 @@
"react-is": "^16.13.1"
}
},
+ "node_modules/property-expr": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-2.0.6.tgz",
+ "integrity": "sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA=="
+ },
"node_modules/punycode": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
@@ -3765,6 +4288,18 @@
"node": ">=0.10.0"
}
},
+ "node_modules/react-apexcharts": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/react-apexcharts/-/react-apexcharts-1.4.0.tgz",
+ "integrity": "sha512-DrcMV4aAMrUG+n6412yzyATWEyCDWlpPBBhVbpzBC4PDeuYU6iF84SmExbck+jx5MUm4U5PM3/T307Mc3kzc9Q==",
+ "dependencies": {
+ "prop-types": "^15.5.7"
+ },
+ "peerDependencies": {
+ "apexcharts": "^3.18.0",
+ "react": ">=0.13"
+ }
+ },
"node_modules/react-dom": {
"version": "18.2.0",
"resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz",
@@ -3777,6 +4312,11 @@
"react": "^18.2.0"
}
},
+ "node_modules/react-fast-compare": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-2.0.4.tgz",
+ "integrity": "sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw=="
+ },
"node_modules/react-is": {
"version": "16.13.1",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
@@ -3797,6 +4337,22 @@
"react-dom": ">=16.6.0"
}
},
+ "node_modules/readable-stream": {
+ "version": "1.0.34",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+ "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==",
+ "dependencies": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.1",
+ "isarray": "0.0.1",
+ "string_decoder": "~0.10.x"
+ }
+ },
+ "node_modules/readable-stream/node_modules/isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ=="
+ },
"node_modules/reflect.getprototypeof": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz",
@@ -3882,6 +4438,14 @@
"node": ">=0.10.0"
}
},
+ "node_modules/rifm": {
+ "version": "0.12.1",
+ "resolved": "https://registry.npmjs.org/rifm/-/rifm-0.12.1.tgz",
+ "integrity": "sha512-OGA1Bitg/dSJtI/c4dh90svzaUPt228kzFsUkJbtA2c964IqEAwWXeL9ZJi86xWv3j5SMqRvGULl7bA6cK0Bvg==",
+ "peerDependencies": {
+ "react": ">=16.8"
+ }
+ },
"node_modules/rimraf": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
@@ -3938,6 +4502,11 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+ },
"node_modules/safe-regex-test": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz",
@@ -4039,6 +4608,28 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/simplebar-core": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/simplebar-core/-/simplebar-core-1.2.4.tgz",
+ "integrity": "sha512-P+Sqshef4fq3++gQ82TgNYcgl3qZFSCP5jS2/8NMmw18oagXOijMzs1G+vm6RUY3oMvpwH3wGoqh9u6SyDjHfQ==",
+ "dependencies": {
+ "@types/lodash-es": "^4.17.6",
+ "can-use-dom": "^0.1.0",
+ "lodash": "^4.17.21",
+ "lodash-es": "^4.17.21"
+ }
+ },
+ "node_modules/simplebar-react": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/simplebar-react/-/simplebar-react-3.2.4.tgz",
+ "integrity": "sha512-ogLN79e7JUm82wJChD7NSUB+4EHCFvDkjXpiu8hT1Alk7DnCekUWds61NXcsP9jC97KOgF5To/AVjYFbX0olgg==",
+ "dependencies": {
+ "simplebar-core": "^1.2.4"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0"
+ }
+ },
"node_modules/slash": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
@@ -4072,6 +4663,11 @@
"node": ">=10.0.0"
}
},
+ "node_modules/string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ=="
+ },
"node_modules/string.prototype.matchall": {
"version": "4.0.10",
"resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz",
@@ -4220,6 +4816,89 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/svg.draggable.js": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/svg.draggable.js/-/svg.draggable.js-2.2.2.tgz",
+ "integrity": "sha512-JzNHBc2fLQMzYCZ90KZHN2ohXL0BQJGQimK1kGk6AvSeibuKcIdDX9Kr0dT9+UJ5O8nYA0RB839Lhvk4CY4MZw==",
+ "dependencies": {
+ "svg.js": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/svg.easing.js": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/svg.easing.js/-/svg.easing.js-2.0.0.tgz",
+ "integrity": "sha512-//ctPdJMGy22YoYGV+3HEfHbm6/69LJUTAqI2/5qBvaNHZ9uUFVC82B0Pl299HzgH13rKrBgi4+XyXXyVWWthA==",
+ "dependencies": {
+ "svg.js": ">=2.3.x"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/svg.filter.js": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/svg.filter.js/-/svg.filter.js-2.0.2.tgz",
+ "integrity": "sha512-xkGBwU+dKBzqg5PtilaTb0EYPqPfJ9Q6saVldX+5vCRy31P6TlRCP3U9NxH3HEufkKkpNgdTLBJnmhDHeTqAkw==",
+ "dependencies": {
+ "svg.js": "^2.2.5"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/svg.js": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/svg.js/-/svg.js-2.7.1.tgz",
+ "integrity": "sha512-ycbxpizEQktk3FYvn/8BH+6/EuWXg7ZpQREJvgacqn46gIddG24tNNe4Son6omdXCnSOaApnpZw6MPCBA1dODA=="
+ },
+ "node_modules/svg.pathmorphing.js": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/svg.pathmorphing.js/-/svg.pathmorphing.js-0.1.3.tgz",
+ "integrity": "sha512-49HWI9X4XQR/JG1qXkSDV8xViuTLIWm/B/7YuQELV5KMOPtXjiwH4XPJvr/ghEDibmLQ9Oc22dpWpG0vUDDNww==",
+ "dependencies": {
+ "svg.js": "^2.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/svg.resize.js": {
+ "version": "1.4.3",
+ "resolved": "https://registry.npmjs.org/svg.resize.js/-/svg.resize.js-1.4.3.tgz",
+ "integrity": "sha512-9k5sXJuPKp+mVzXNvxz7U0uC9oVMQrrf7cFsETznzUDDm0x8+77dtZkWdMfRlmbkEEYvUn9btKuZ3n41oNA+uw==",
+ "dependencies": {
+ "svg.js": "^2.6.5",
+ "svg.select.js": "^2.1.2"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/svg.resize.js/node_modules/svg.select.js": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/svg.select.js/-/svg.select.js-2.1.2.tgz",
+ "integrity": "sha512-tH6ABEyJsAOVAhwcCjF8mw4crjXSI1aa7j2VQR8ZuJ37H2MBUbyeqYr5nEO7sSN3cy9AR9DUwNg0t/962HlDbQ==",
+ "dependencies": {
+ "svg.js": "^2.2.5"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/svg.select.js": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/svg.select.js/-/svg.select.js-3.0.1.tgz",
+ "integrity": "sha512-h5IS/hKkuVCbKSieR9uQCj9w+zLHoPh+ce19bBYyqF53g6mnPB8sAtIbe1s9dh2S2fCmYX2xel1Ln3PJBbK4kw==",
+ "dependencies": {
+ "svg.js": "^2.6.5"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
"node_modules/tapable": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
@@ -4235,6 +4914,30 @@
"integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
"dev": true
},
+ "node_modules/through": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+ "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg=="
+ },
+ "node_modules/through2": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-0.4.2.tgz",
+ "integrity": "sha512-45Llu+EwHKtAZYTPPVn3XZHBgakWMN3rokhEv5hu596XP+cNgplMg+Gj+1nmAvj+L0K7+N49zBKx5rah5u0QIQ==",
+ "dependencies": {
+ "readable-stream": "~1.0.17",
+ "xtend": "~2.1.1"
+ }
+ },
+ "node_modules/tiny-case": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/tiny-case/-/tiny-case-1.0.3.tgz",
+ "integrity": "sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q=="
+ },
+ "node_modules/tiny-warning": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz",
+ "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA=="
+ },
"node_modules/to-fast-properties": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
@@ -4255,6 +4958,11 @@
"node": ">=8.0"
}
},
+ "node_modules/toposort": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz",
+ "integrity": "sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg=="
+ },
"node_modules/ts-api-utils": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz",
@@ -4446,6 +5154,11 @@
"punycode": "^2.1.0"
}
},
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
+ },
"node_modules/watchpack": {
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz",
@@ -4555,6 +5268,22 @@
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
"dev": true
},
+ "node_modules/xtend": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz",
+ "integrity": "sha512-vMNKzr2rHP9Dp/e1NQFnLQlwlhp9L/LfvnsVdHxN1f+uggyVI3i08uD14GPvCToPkdsRfyPqIyYGmIk58V98ZQ==",
+ "dependencies": {
+ "object-keys": "~0.4.0"
+ },
+ "engines": {
+ "node": ">=0.4"
+ }
+ },
+ "node_modules/xtend/node_modules/object-keys": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz",
+ "integrity": "sha512-ncrLw+X55z7bkl5PnUvHwFK9FcGuFYo9gtjws2XtSzL+aZ8tm830P60WJ0dSmFVaSalWieW5MD7kEdnXda9yJw=="
+ },
"node_modules/yallist": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
@@ -4572,6 +5301,28 @@
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
+ },
+ "node_modules/yup": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/yup/-/yup-1.0.0.tgz",
+ "integrity": "sha512-bRZIyMkoe212ahGJTE32cr2dLkJw53Va+Uw5mzsBKpcef9zCGQ23k/xtpQUfGwdWPKvCIlR8CzFwchs2rm2XpQ==",
+ "dependencies": {
+ "property-expr": "^2.0.5",
+ "tiny-case": "^1.0.3",
+ "toposort": "^2.0.2",
+ "type-fest": "^2.19.0"
+ }
+ },
+ "node_modules/yup/node_modules/type-fest": {
+ "version": "2.19.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz",
+ "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==",
+ "engines": {
+ "node": ">=12.20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
}
}
}
diff --git a/package.json b/package.json
index d785a1f..fde986e 100644
--- a/package.json
+++ b/package.json
@@ -9,16 +9,33 @@
"lint": "next lint"
},
"dependencies": {
+ "@emotion/cache": "11.10.5",
"@emotion/react": "^11.11.1",
+ "@emotion/server": "11.10.0",
"@emotion/styled": "^11.11.0",
"@fontsource/roboto": "^5.0.8",
+ "@heroicons/react": "2.0.16",
+ "@mui/lab": "5.0.0-alpha.120",
"@mui/material": "^5.14.18",
- "next": "14.0.1",
+ "@mui/system": "5.11.9",
+ "@mui/x-date-pickers": "5.0.19",
+ "apexcharts": "3.37.0",
+ "date-fns": "2.29.3",
+ "formik": "2.2.9",
+ "nprogress": "0.2.0",
+ "prop-types": "15.8.1",
+ "next": "^14.0.3",
"react": "^18",
- "react-dom": "^18"
+ "react-apexcharts": "1.4.0",
+ "react-dom": "^18",
+ "simplebar-react": "^3.2.1",
+ "yup": "1.0.0"
+
},
"devDependencies": {
"@types/node": "^20",
+ "@types/nprogress": "0.2.0",
+ "@types/numeral": "2.0.2",
"@types/react": "^18",
"@types/react-dom": "^18",
"autoprefixer": "^10.0.1",
diff --git a/postcss.config.js b/postcss.config.js
index 33ad091..90d9fff 100644
--- a/postcss.config.js
+++ b/postcss.config.js
@@ -1,6 +1,5 @@
module.exports = {
plugins: {
- tailwindcss: {},
autoprefixer: {},
},
}
diff --git a/public/assets/auth-illustration.svg b/public/assets/auth-illustration.svg
new file mode 100644
index 0000000..a6ea438
--- /dev/null
+++ b/public/assets/auth-illustration.svg
@@ -0,0 +1,94 @@
+
diff --git a/public/assets/avatars/avatar-alcides-antonio.png b/public/assets/avatars/avatar-alcides-antonio.png
new file mode 100644
index 0000000..9b6afd8
Binary files /dev/null and b/public/assets/avatars/avatar-alcides-antonio.png differ
diff --git a/public/assets/avatars/avatar-anika-visser.png b/public/assets/avatars/avatar-anika-visser.png
new file mode 100644
index 0000000..5c7db9c
Binary files /dev/null and b/public/assets/avatars/avatar-anika-visser.png differ
diff --git a/public/assets/avatars/avatar-cao-yu.png b/public/assets/avatars/avatar-cao-yu.png
new file mode 100644
index 0000000..7ab13c1
Binary files /dev/null and b/public/assets/avatars/avatar-cao-yu.png differ
diff --git a/public/assets/avatars/avatar-carson-darrin.png b/public/assets/avatars/avatar-carson-darrin.png
new file mode 100644
index 0000000..a6c3d20
Binary files /dev/null and b/public/assets/avatars/avatar-carson-darrin.png differ
diff --git a/public/assets/avatars/avatar-chinasa-neo.png b/public/assets/avatars/avatar-chinasa-neo.png
new file mode 100644
index 0000000..753169a
Binary files /dev/null and b/public/assets/avatars/avatar-chinasa-neo.png differ
diff --git a/public/assets/avatars/avatar-fran-perez.png b/public/assets/avatars/avatar-fran-perez.png
new file mode 100644
index 0000000..3545069
Binary files /dev/null and b/public/assets/avatars/avatar-fran-perez.png differ
diff --git a/public/assets/avatars/avatar-iulia-albu.png b/public/assets/avatars/avatar-iulia-albu.png
new file mode 100644
index 0000000..fcbbc1c
Binary files /dev/null and b/public/assets/avatars/avatar-iulia-albu.png differ
diff --git a/public/assets/avatars/avatar-jane-rotanson.png b/public/assets/avatars/avatar-jane-rotanson.png
new file mode 100644
index 0000000..a9b1e25
Binary files /dev/null and b/public/assets/avatars/avatar-jane-rotanson.png differ
diff --git a/public/assets/avatars/avatar-jie-yan-song.png b/public/assets/avatars/avatar-jie-yan-song.png
new file mode 100644
index 0000000..7ab13c1
Binary files /dev/null and b/public/assets/avatars/avatar-jie-yan-song.png differ
diff --git a/public/assets/avatars/avatar-marcus-finn.png b/public/assets/avatars/avatar-marcus-finn.png
new file mode 100644
index 0000000..80d8241
Binary files /dev/null and b/public/assets/avatars/avatar-marcus-finn.png differ
diff --git a/public/assets/avatars/avatar-miron-vitold.png b/public/assets/avatars/avatar-miron-vitold.png
new file mode 100644
index 0000000..a535df0
Binary files /dev/null and b/public/assets/avatars/avatar-miron-vitold.png differ
diff --git a/public/assets/avatars/avatar-nasimiyu-danai.png b/public/assets/avatars/avatar-nasimiyu-danai.png
new file mode 100644
index 0000000..093983d
Binary files /dev/null and b/public/assets/avatars/avatar-nasimiyu-danai.png differ
diff --git a/public/assets/avatars/avatar-neha-punita.png b/public/assets/avatars/avatar-neha-punita.png
new file mode 100644
index 0000000..6fddf28
Binary files /dev/null and b/public/assets/avatars/avatar-neha-punita.png differ
diff --git a/public/assets/avatars/avatar-omar-darboe.png b/public/assets/avatars/avatar-omar-darboe.png
new file mode 100644
index 0000000..0cab267
Binary files /dev/null and b/public/assets/avatars/avatar-omar-darboe.png differ
diff --git a/public/assets/avatars/avatar-penjani-inyene.png b/public/assets/avatars/avatar-penjani-inyene.png
new file mode 100644
index 0000000..ede0a6c
Binary files /dev/null and b/public/assets/avatars/avatar-penjani-inyene.png differ
diff --git a/public/assets/avatars/avatar-seo-hyeon-ji.png b/public/assets/avatars/avatar-seo-hyeon-ji.png
new file mode 100644
index 0000000..e8aae1d
Binary files /dev/null and b/public/assets/avatars/avatar-seo-hyeon-ji.png differ
diff --git a/public/assets/avatars/avatar-siegbert-gottfried.png b/public/assets/avatars/avatar-siegbert-gottfried.png
new file mode 100644
index 0000000..c6993a1
Binary files /dev/null and b/public/assets/avatars/avatar-siegbert-gottfried.png differ
diff --git a/public/assets/devias-kit-pro.png b/public/assets/devias-kit-pro.png
new file mode 100644
index 0000000..4a3bc34
Binary files /dev/null and b/public/assets/devias-kit-pro.png differ
diff --git a/public/assets/errors/error-401.png b/public/assets/errors/error-401.png
new file mode 100644
index 0000000..f51381a
Binary files /dev/null and b/public/assets/errors/error-401.png differ
diff --git a/public/assets/errors/error-404.png b/public/assets/errors/error-404.png
new file mode 100644
index 0000000..301010c
Binary files /dev/null and b/public/assets/errors/error-404.png differ
diff --git a/public/assets/errors/error-500.png b/public/assets/errors/error-500.png
new file mode 100644
index 0000000..f951ebf
Binary files /dev/null and b/public/assets/errors/error-500.png differ
diff --git a/public/assets/logos/logo-dropbox.png b/public/assets/logos/logo-dropbox.png
new file mode 100644
index 0000000..27b5031
Binary files /dev/null and b/public/assets/logos/logo-dropbox.png differ
diff --git a/public/assets/logos/logo-github.png b/public/assets/logos/logo-github.png
new file mode 100644
index 0000000..cf13db0
Binary files /dev/null and b/public/assets/logos/logo-github.png differ
diff --git a/public/assets/logos/logo-lyft.png b/public/assets/logos/logo-lyft.png
new file mode 100644
index 0000000..142ec74
Binary files /dev/null and b/public/assets/logos/logo-lyft.png differ
diff --git a/public/assets/logos/logo-medium.png b/public/assets/logos/logo-medium.png
new file mode 100644
index 0000000..b4b103b
Binary files /dev/null and b/public/assets/logos/logo-medium.png differ
diff --git a/public/assets/logos/logo-slack.png b/public/assets/logos/logo-slack.png
new file mode 100644
index 0000000..5bfd2d9
Binary files /dev/null and b/public/assets/logos/logo-slack.png differ
diff --git a/public/assets/logos/logo-squarespace.png b/public/assets/logos/logo-squarespace.png
new file mode 100644
index 0000000..bd98092
Binary files /dev/null and b/public/assets/logos/logo-squarespace.png differ
diff --git a/public/assets/products/product-1.png b/public/assets/products/product-1.png
new file mode 100644
index 0000000..a2c5271
Binary files /dev/null and b/public/assets/products/product-1.png differ
diff --git a/public/assets/products/product-2.png b/public/assets/products/product-2.png
new file mode 100644
index 0000000..dde7db4
Binary files /dev/null and b/public/assets/products/product-2.png differ
diff --git a/public/assets/products/product-4.png b/public/assets/products/product-4.png
new file mode 100644
index 0000000..0b99ad4
Binary files /dev/null and b/public/assets/products/product-4.png differ
diff --git a/public/assets/products/product-5.png b/public/assets/products/product-5.png
new file mode 100644
index 0000000..631be13
Binary files /dev/null and b/public/assets/products/product-5.png differ
diff --git a/public/assets/products/product-6.png b/public/assets/products/product-6.png
new file mode 100644
index 0000000..6ffece6
Binary files /dev/null and b/public/assets/products/product-6.png differ
diff --git a/public/assets/products/product-7.png b/public/assets/products/product-7.png
new file mode 100644
index 0000000..9229198
Binary files /dev/null and b/public/assets/products/product-7.png differ
diff --git a/public/assets/thumbnail.png b/public/assets/thumbnail.png
new file mode 100644
index 0000000..4b95246
Binary files /dev/null and b/public/assets/thumbnail.png differ
diff --git a/public/favicon-16x16.png b/public/favicon-16x16.png
new file mode 100644
index 0000000..a06f223
Binary files /dev/null and b/public/favicon-16x16.png differ
diff --git a/public/favicon-32x32.png b/public/favicon-32x32.png
new file mode 100644
index 0000000..7112bba
Binary files /dev/null and b/public/favicon-32x32.png differ
diff --git a/public/favicon.ico b/public/favicon.ico
new file mode 100644
index 0000000..f94df3f
Binary files /dev/null and b/public/favicon.ico differ
diff --git a/public/manifest.json b/public/manifest.json
new file mode 100644
index 0000000..cacfcfb
--- /dev/null
+++ b/public/manifest.json
@@ -0,0 +1,15 @@
+{
+ "short_name": "Devias Kit",
+ "name": "Devias Kit",
+ "icons": [
+ {
+ "src": "favicon.ico",
+ "sizes": "64x64 32x32 24x24 16x16",
+ "type": "image/x-icon"
+ }
+ ],
+ "start_url": ".",
+ "display": "standalone",
+ "theme_color": "#000000",
+ "background_color": "#ffffff"
+}
diff --git a/src/app/favicon.ico b/src/app/favicon.ico
deleted file mode 100644
index 718d6fe..0000000
Binary files a/src/app/favicon.ico and /dev/null differ
diff --git a/src/app/globals.css b/src/app/globals.css
deleted file mode 100644
index fd81e88..0000000
--- a/src/app/globals.css
+++ /dev/null
@@ -1,27 +0,0 @@
-@tailwind base;
-@tailwind components;
-@tailwind utilities;
-
-:root {
- --foreground-rgb: 0, 0, 0;
- --background-start-rgb: 214, 219, 220;
- --background-end-rgb: 255, 255, 255;
-}
-
-@media (prefers-color-scheme: dark) {
- :root {
- --foreground-rgb: 255, 255, 255;
- --background-start-rgb: 0, 0, 0;
- --background-end-rgb: 0, 0, 0;
- }
-}
-
-body {
- color: rgb(var(--foreground-rgb));
- background: linear-gradient(
- to bottom,
- transparent,
- rgb(var(--background-end-rgb))
- )
- rgb(var(--background-start-rgb));
-}
diff --git a/src/app/layout.tsx b/src/app/layout.tsx
deleted file mode 100644
index 40e027f..0000000
--- a/src/app/layout.tsx
+++ /dev/null
@@ -1,22 +0,0 @@
-import type { Metadata } from 'next'
-import { Inter } from 'next/font/google'
-import './globals.css'
-
-const inter = Inter({ subsets: ['latin'] })
-
-export const metadata: Metadata = {
- title: 'Create Next App',
- description: 'Generated by create next app',
-}
-
-export default function RootLayout({
- children,
-}: {
- children: React.ReactNode
-}) {
- return (
-
-
{children}
-
- )
-}
diff --git a/src/app/page.tsx b/src/app/page.tsx
deleted file mode 100644
index e38c626..0000000
--- a/src/app/page.tsx
+++ /dev/null
@@ -1,113 +0,0 @@
-import Image from 'next/image'
-
-export default function Home() {
- return (
-
-
-
- Get started by editing
- src/app/page.tsx
-
-
-
-
-
-
-
-
-
-
- )
-}
diff --git a/src/components/chart.js b/src/components/chart.js
new file mode 100644
index 0000000..f782ef4
--- /dev/null
+++ b/src/components/chart.js
@@ -0,0 +1,9 @@
+import dynamic from 'next/dynamic';
+import { styled } from '@mui/material/styles';
+
+const ApexChart = dynamic(() => import('react-apexcharts'), {
+ ssr: false,
+ loading: () => null
+});
+
+export const Chart = styled(ApexChart)``;
diff --git a/src/components/logo.js b/src/components/logo.js
new file mode 100644
index 0000000..affd27c
--- /dev/null
+++ b/src/components/logo.js
@@ -0,0 +1,26 @@
+import { useTheme } from '@mui/material/styles';
+
+export const Logo = () => {
+ const theme = useTheme();
+ const fillColor = theme.palette.primary.main;
+
+ return (
+
+ );
+};
diff --git a/src/components/scrollbar.js b/src/components/scrollbar.js
new file mode 100644
index 0000000..8ce7d49
--- /dev/null
+++ b/src/components/scrollbar.js
@@ -0,0 +1,4 @@
+import SimpleBar from 'simplebar-react';
+import { styled } from '@mui/material/styles';
+
+export const Scrollbar = styled(SimpleBar)``;
diff --git a/src/components/severity-pill.js b/src/components/severity-pill.js
new file mode 100644
index 0000000..4f3be32
--- /dev/null
+++ b/src/components/severity-pill.js
@@ -0,0 +1,58 @@
+import PropTypes from 'prop-types';
+import { styled } from '@mui/material/styles';
+
+const SeverityPillRoot = styled('span')(({ theme, ownerState }) => {
+ const backgroundColor = theme.palette[ownerState.color].alpha12;
+ const color = theme.palette.mode === 'dark'
+ ? theme.palette[ownerState.color].main
+ : theme.palette[ownerState.color].dark;
+
+ return {
+ alignItems: 'center',
+ backgroundColor,
+ borderRadius: 12,
+ color,
+ cursor: 'default',
+ display: 'inline-flex',
+ flexGrow: 0,
+ flexShrink: 0,
+ fontFamily: theme.typography.fontFamily,
+ fontSize: theme.typography.pxToRem(12),
+ lineHeight: 2,
+ fontWeight: 600,
+ justifyContent: 'center',
+ letterSpacing: 0.5,
+ minWidth: 20,
+ paddingLeft: theme.spacing(1),
+ paddingRight: theme.spacing(1),
+ textTransform: 'uppercase',
+ whiteSpace: 'nowrap'
+ };
+});
+
+export const SeverityPill = (props) => {
+ const { color = 'primary', children, ...other } = props;
+
+ const ownerState = { color };
+
+ return (
+
+ {children}
+
+ );
+};
+
+SeverityPill.propTypes = {
+ children: PropTypes.node,
+ color: PropTypes.oneOf([
+ 'primary',
+ 'secondary',
+ 'error',
+ 'info',
+ 'warning',
+ 'success'
+ ])
+};
diff --git a/src/contexts/auth-context.js b/src/contexts/auth-context.js
new file mode 100644
index 0000000..d79f0fb
--- /dev/null
+++ b/src/contexts/auth-context.js
@@ -0,0 +1,185 @@
+import { createContext, useContext, useEffect, useReducer, useRef } from 'react';
+import PropTypes from 'prop-types';
+
+const HANDLERS = {
+ INITIALIZE: 'INITIALIZE',
+ SIGN_IN: 'SIGN_IN',
+ SIGN_OUT: 'SIGN_OUT'
+};
+
+const initialState = {
+ isAuthenticated: false,
+ isLoading: true,
+ user: null
+};
+
+const handlers = {
+ [HANDLERS.INITIALIZE]: (state, action) => {
+ const user = action.payload;
+
+ return {
+ ...state,
+ ...(
+ // if payload (user) is provided, then is authenticated
+ user
+ ? ({
+ isAuthenticated: true,
+ isLoading: false,
+ user
+ })
+ : ({
+ isLoading: false
+ })
+ )
+ };
+ },
+ [HANDLERS.SIGN_IN]: (state, action) => {
+ const user = action.payload;
+
+ return {
+ ...state,
+ isAuthenticated: true,
+ user
+ };
+ },
+ [HANDLERS.SIGN_OUT]: (state) => {
+ return {
+ ...state,
+ isAuthenticated: false,
+ user: null
+ };
+ }
+};
+
+const reducer = (state, action) => (
+ handlers[action.type] ? handlers[action.type](state, action) : state
+);
+
+// The role of this context is to propagate authentication state through the App tree.
+
+export const AuthContext = createContext({ undefined });
+
+export const AuthProvider = (props) => {
+ const { children } = props;
+ const [state, dispatch] = useReducer(reducer, initialState);
+ const initialized = useRef(false);
+
+ const initialize = async () => {
+ // Prevent from calling twice in development mode with React.StrictMode enabled
+ if (initialized.current) {
+ return;
+ }
+
+ initialized.current = true;
+
+ let isAuthenticated = false;
+
+ try {
+ isAuthenticated = window.sessionStorage.getItem('authenticated') === 'true';
+ } catch (err) {
+ console.error(err);
+ }
+
+ if (isAuthenticated) {
+ const user = {
+ id: '5e86809283e28b96d2d38537',
+ avatar: '/assets/avatars/avatar-anika-visser.png',
+ name: 'Anika Visser',
+ email: 'anika.visser@devias.io'
+ };
+
+ dispatch({
+ type: HANDLERS.INITIALIZE,
+ payload: user
+ });
+ } else {
+ dispatch({
+ type: HANDLERS.INITIALIZE
+ });
+ }
+ };
+
+ useEffect(
+ () => {
+ initialize();
+ },
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ []
+ );
+
+ const skip = () => {
+ try {
+ window.sessionStorage.setItem('authenticated', 'true');
+ } catch (err) {
+ console.error(err);
+ }
+
+ const user = {
+ id: '5e86809283e28b96d2d38537',
+ avatar: '/assets/avatars/avatar-anika-visser.png',
+ name: 'Anika Visser',
+ email: 'anika.visser@devias.io'
+ };
+
+ dispatch({
+ type: HANDLERS.SIGN_IN,
+ payload: user
+ });
+ };
+
+ const signIn = async (email, password) => {
+ if (email !== 'demo@devias.io' || password !== 'Password123!') {
+ throw new Error('Please check your email and password');
+ }
+
+ try {
+ window.sessionStorage.setItem('authenticated', 'true');
+ } catch (err) {
+ console.error(err);
+ }
+
+ const user = {
+ id: '5e86809283e28b96d2d38537',
+ avatar: '/assets/avatars/avatar-anika-visser.png',
+ name: 'Anika Visser',
+ email: 'anika.visser@devias.io'
+ };
+
+ dispatch({
+ type: HANDLERS.SIGN_IN,
+ payload: user
+ });
+ };
+
+ const signUp = async (email, name, password) => {
+ throw new Error('Sign up is not implemented');
+ };
+
+ const signOut = () => {
+ dispatch({
+ type: HANDLERS.SIGN_OUT
+ });
+ };
+
+ return (
+
+ {children}
+
+ );
+};
+
+AuthProvider.propTypes = {
+ children: PropTypes.node
+};
+
+export const AuthConsumer = AuthContext.Consumer;
+
+export const useAuthContext = () => useContext(AuthContext);
diff --git a/src/guards/auth-guard.js b/src/guards/auth-guard.js
new file mode 100644
index 0000000..2986068
--- /dev/null
+++ b/src/guards/auth-guard.js
@@ -0,0 +1,57 @@
+import { useEffect, useRef, useState } from 'react';
+import { useRouter } from 'next/router';
+import PropTypes from 'prop-types';
+import { useAuthContext } from 'src/contexts/auth-context';
+
+export const AuthGuard = (props) => {
+ const { children } = props;
+ const router = useRouter();
+ const { isAuthenticated } = useAuthContext();
+ const ignore = useRef(false);
+ const [checked, setChecked] = useState(false);
+
+ // Only do authentication check on component mount.
+ // This flow allows you to manually redirect the user after sign-out, otherwise this will be
+ // triggered and will automatically redirect to sign-in page.
+
+ useEffect(
+ () => {
+ if (!router.isReady) {
+ return;
+ }
+
+ // Prevent from calling twice in development mode with React.StrictMode enabled
+ if (ignore.current) {
+ return;
+ }
+
+ ignore.current = true;
+
+ if (!isAuthenticated) {
+ console.log('Not authenticated, redirecting');
+ router
+ .replace({
+ pathname: '/auth/login',
+ query: router.asPath !== '/' ? { continueUrl: router.asPath } : undefined
+ })
+ .catch(console.error);
+ } else {
+ setChecked(true);
+ }
+ },
+ [router.isReady]
+ );
+
+ if (!checked) {
+ return null;
+ }
+
+ // If got here, it means that the redirect did not occur, and that tells us that the user is
+ // authenticated / authorized.
+
+ return children;
+};
+
+AuthGuard.propTypes = {
+ children: PropTypes.node
+};
diff --git a/src/hocs/with-auth-guard.js b/src/hocs/with-auth-guard.js
new file mode 100644
index 0000000..32a7518
--- /dev/null
+++ b/src/hocs/with-auth-guard.js
@@ -0,0 +1,7 @@
+import { AuthGuard } from 'src/guards/auth-guard';
+
+export const withAuthGuard = (Component) => (props) => (
+
+
+
+);
diff --git a/src/hooks/use-auth.js b/src/hooks/use-auth.js
new file mode 100644
index 0000000..7cf048c
--- /dev/null
+++ b/src/hooks/use-auth.js
@@ -0,0 +1,4 @@
+import { useContext } from 'react';
+import { AuthContext } from 'src/contexts/auth-context';
+
+export const useAuth = () => useContext(AuthContext);
diff --git a/src/hooks/use-mocked-user.js b/src/hooks/use-mocked-user.js
new file mode 100644
index 0000000..d533ccd
--- /dev/null
+++ b/src/hooks/use-mocked-user.js
@@ -0,0 +1,10 @@
+export const useMockedUser = () => {
+ // To get the user from the authContext, you can use
+ // `const { user } = useAuth();`
+ return {
+ id: '5e86809283e28b96d2d38537',
+ avatar: '/assets/avatars/avatar-anika-visser.png',
+ name: 'Anika Visser',
+ email: 'anika.visser@devias.io'
+ };
+};
diff --git a/src/hooks/use-nprogress.js b/src/hooks/use-nprogress.js
new file mode 100644
index 0000000..701228a
--- /dev/null
+++ b/src/hooks/use-nprogress.js
@@ -0,0 +1,17 @@
+import { useEffect } from 'react';
+import Router from 'next/router';
+import nProgress from 'nprogress';
+
+export function useNProgress() {
+ useEffect(() => {
+ Router.events.on('routeChangeStart', nProgress.start);
+ Router.events.on('routeChangeError', nProgress.done);
+ Router.events.on('routeChangeComplete', nProgress.done);
+
+ return () => {
+ Router.events.off('routeChangeStart', nProgress.start);
+ Router.events.off('routeChangeError', nProgress.done);
+ Router.events.off('routeChangeComplete', nProgress.done);
+ };
+ }, []);
+}
diff --git a/src/hooks/use-popover.js b/src/hooks/use-popover.js
new file mode 100644
index 0000000..a374004
--- /dev/null
+++ b/src/hooks/use-popover.js
@@ -0,0 +1,26 @@
+import { useCallback, useRef, useState } from 'react';
+
+export function usePopover() {
+ const anchorRef = useRef(null);
+ const [open, setOpen] = useState(false);
+
+ const handleOpen = useCallback(() => {
+ setOpen(true);
+ }, []);
+
+ const handleClose = useCallback(() => {
+ setOpen(false);
+ }, []);
+
+ const handleToggle = useCallback(() => {
+ setOpen((prevState) => !prevState);
+ }, []);
+
+ return {
+ anchorRef,
+ handleClose,
+ handleOpen,
+ handleToggle,
+ open
+ };
+}
diff --git a/src/hooks/use-selection.js b/src/hooks/use-selection.js
new file mode 100644
index 0000000..f6b5fef
--- /dev/null
+++ b/src/hooks/use-selection.js
@@ -0,0 +1,35 @@
+import { useCallback, useEffect, useState } from 'react';
+
+export const useSelection = (items = []) => {
+ const [selected, setSelected] = useState([]);
+
+ useEffect(() => {
+ setSelected([]);
+ }, [items]);
+
+ const handleSelectAll = useCallback(() => {
+ setSelected([...items]);
+ }, [items]);
+
+ const handleSelectOne = useCallback((item) => {
+ setSelected((prevState) => [...prevState, item]);
+ }, []);
+
+ const handleDeselectAll = useCallback(() => {
+ setSelected([]);
+ }, []);
+
+ const handleDeselectOne = useCallback((item) => {
+ setSelected((prevState) => {
+ return prevState.filter((_item) => _item !== item);
+ });
+ }, []);
+
+ return {
+ handleDeselectAll,
+ handleDeselectOne,
+ handleSelectAll,
+ handleSelectOne,
+ selected
+ };
+};
diff --git a/src/layouts/auth/layout.js b/src/layouts/auth/layout.js
new file mode 100644
index 0000000..0708f3a
--- /dev/null
+++ b/src/layouts/auth/layout.js
@@ -0,0 +1,111 @@
+import PropTypes from 'prop-types';
+import NextLink from 'next/link';
+import { Box, Typography, Unstable_Grid2 as Grid } from '@mui/material';
+import { Logo } from 'src/components/logo';
+
+// TODO: Change subtitle text
+
+export const Layout = (props) => {
+ const { children } = props;
+
+ return (
+
+
+
+
+
+
+
+
+ {children}
+
+
+
+
+ Welcome to{' '}
+
+ Refactor SE Coaching Platform
+
+
+
+ Refactor your professional skills under the professional guidance of a coach.
+
+
+
+
+
+
+ );
+};
+
+Layout.prototypes = {
+ children: PropTypes.node
+};
\ No newline at end of file
diff --git a/src/layouts/dashboard/account-popover.js b/src/layouts/dashboard/account-popover.js
new file mode 100644
index 0000000..4f03272
--- /dev/null
+++ b/src/layouts/dashboard/account-popover.js
@@ -0,0 +1,71 @@
+import { useCallback } from 'react';
+import { useRouter } from 'next/navigation';
+import PropTypes from 'prop-types';
+import { Box, Divider, MenuItem, MenuList, Popover, Typography } from '@mui/material';
+import { useAuth } from 'src/hooks/use-auth';
+
+export const AccountPopover = (props) => {
+ const { anchorEl, onClose, open } = props;
+ const router = useRouter();
+ const auth = useAuth();
+
+ const handleSignOut = useCallback(
+ () => {
+ onClose?.();
+ auth.signOut();
+ router.push('/auth/login');
+ },
+ [onClose, auth, router]
+ );
+
+ return (
+
+
+
+ Account
+
+
+ Anika Visser
+
+
+
+ *': {
+ borderRadius: 1
+ }
+ }}
+ >
+
+
+
+ );
+};
+
+AccountPopover.propTypes = {
+ anchorEl: PropTypes.any,
+ onClose: PropTypes.func,
+ open: PropTypes.bool.isRequired
+};
diff --git a/src/layouts/dashboard/config.js b/src/layouts/dashboard/config.js
new file mode 100644
index 0000000..0e7896a
--- /dev/null
+++ b/src/layouts/dashboard/config.js
@@ -0,0 +1,84 @@
+import ChartBarIcon from '@heroicons/react/24/solid/ChartBarIcon';
+import CogIcon from '@heroicons/react/24/solid/CogIcon';
+import LockClosedIcon from '@heroicons/react/24/solid/LockClosedIcon';
+import ShoppingBagIcon from '@heroicons/react/24/solid/ShoppingBagIcon';
+import UserIcon from '@heroicons/react/24/solid/UserIcon';
+import UserPlusIcon from '@heroicons/react/24/solid/UserPlusIcon';
+import UsersIcon from '@heroicons/react/24/solid/UsersIcon';
+import XCircleIcon from '@heroicons/react/24/solid/XCircleIcon';
+import { SvgIcon } from '@mui/material';
+
+export const items = [
+ {
+ title: 'Overview',
+ path: '/',
+ icon: (
+
+
+
+ )
+ },
+ {
+ title: 'Customers',
+ path: '/customers',
+ icon: (
+
+
+
+ )
+ },
+ {
+ title: 'Companies',
+ path: '/companies',
+ icon: (
+
+
+
+ )
+ },
+ {
+ title: 'Account',
+ path: '/account',
+ icon: (
+
+
+
+ )
+ },
+ {
+ title: 'Settings',
+ path: '/settings',
+ icon: (
+
+
+
+ )
+ },
+ {
+ title: 'Login',
+ path: '/auth/login',
+ icon: (
+
+
+
+ )
+ },
+ {
+ title: 'Register',
+ path: '/auth/register',
+ icon: (
+
+
+
+ )
+ },
+ {
+ title: 'Error',
+ path: '/404',
+ icon: (
+
+
+
+ )
+ }
+];
diff --git a/src/layouts/dashboard/layout.js b/src/layouts/dashboard/layout.js
new file mode 100644
index 0000000..511839e
--- /dev/null
+++ b/src/layouts/dashboard/layout.js
@@ -0,0 +1,62 @@
+import { useCallback, useEffect, useState } from 'react';
+import { usePathname } from 'next/navigation';
+import { styled } from '@mui/material/styles';
+import { withAuthGuard } from 'src/hocs/with-auth-guard';
+import { SideNav } from './side-nav';
+import { TopNav } from './top-nav';
+
+const SIDE_NAV_WIDTH = 280;
+
+const LayoutRoot = styled('div')(({ theme }) => ({
+ display: 'flex',
+ flex: '1 1 auto',
+ maxWidth: '100%',
+ [theme.breakpoints.up('lg')]: {
+ paddingLeft: SIDE_NAV_WIDTH
+ }
+}));
+
+const LayoutContainer = styled('div')({
+ display: 'flex',
+ flex: '1 1 auto',
+ flexDirection: 'column',
+ width: '100%'
+});
+
+export const Layout = withAuthGuard((props) => {
+ const { children } = props;
+ const pathname = usePathname();
+ const [openNav, setOpenNav] = useState(false);
+
+ const handlePathnameChange = useCallback(
+ () => {
+ if (openNav) {
+ setOpenNav(false);
+ }
+ },
+ [openNav]
+ );
+
+ useEffect(
+ () => {
+ handlePathnameChange();
+ },
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ [pathname]
+ );
+
+ return (
+ <>
+ setOpenNav(true)} />
+ setOpenNav(false)}
+ open={openNav}
+ />
+
+
+ {children}
+
+
+ >
+ );
+});
diff --git a/src/layouts/dashboard/side-nav-item.js b/src/layouts/dashboard/side-nav-item.js
new file mode 100644
index 0000000..560be19
--- /dev/null
+++ b/src/layouts/dashboard/side-nav-item.js
@@ -0,0 +1,92 @@
+import NextLink from 'next/link';
+import PropTypes from 'prop-types';
+import { Box, ButtonBase } from '@mui/material';
+
+export const SideNavItem = (props) => {
+ const { active = false, disabled, external, icon, path, title } = props;
+
+ const linkProps = path
+ ? external
+ ? {
+ component: 'a',
+ href: path,
+ target: '_blank'
+ }
+ : {
+ component: NextLink,
+ href: path
+ }
+ : {};
+
+ return (
+
+
+ {icon && (
+
+ {icon}
+
+ )}
+ theme.typography.fontFamily,
+ fontSize: 14,
+ fontWeight: 600,
+ lineHeight: '24px',
+ whiteSpace: 'nowrap',
+ ...(active && {
+ color: 'common.white'
+ }),
+ ...(disabled && {
+ color: 'neutral.500'
+ })
+ }}
+ >
+ {title}
+
+
+
+ );
+};
+
+SideNavItem.propTypes = {
+ active: PropTypes.bool,
+ disabled: PropTypes.bool,
+ external: PropTypes.bool,
+ icon: PropTypes.node,
+ path: PropTypes.string,
+ title: PropTypes.string.isRequired
+};
diff --git a/src/layouts/dashboard/side-nav.js b/src/layouts/dashboard/side-nav.js
new file mode 100644
index 0000000..a50ba61
--- /dev/null
+++ b/src/layouts/dashboard/side-nav.js
@@ -0,0 +1,223 @@
+import NextLink from 'next/link';
+import { usePathname } from 'next/navigation';
+import PropTypes from 'prop-types';
+import ArrowTopRightOnSquareIcon from '@heroicons/react/24/solid/ArrowTopRightOnSquareIcon';
+import ChevronUpDownIcon from '@heroicons/react/24/solid/ChevronUpDownIcon';
+import {
+ Box,
+ Button,
+ Divider,
+ Drawer,
+ Stack,
+ SvgIcon,
+ Typography,
+ useMediaQuery
+} from '@mui/material';
+import { Logo } from 'src/components/logo';
+import { Scrollbar } from 'src/components/scrollbar';
+import { items } from './config';
+import { SideNavItem } from './side-nav-item';
+
+export const SideNav = (props) => {
+ const { open, onClose } = props;
+ const pathname = usePathname();
+ const lgUp = useMediaQuery((theme) => theme.breakpoints.up('lg'));
+
+ const content = (
+
+
+
+
+
+
+
+
+
+ Devias
+
+
+ Production
+
+
+
+
+
+
+
+
+
+
+ {items.map((item) => {
+ const active = item.path ? (pathname === item.path) : false;
+
+ return (
+
+ );
+ })}
+
+
+
+
+
+ Need more features?
+
+
+ Check out our Pro solution template.
+
+
+
+
+
+
+
+
+ );
+
+ if (lgUp) {
+ return (
+
+ {content}
+
+ );
+ }
+
+ return (
+ theme.zIndex.appBar + 100 }}
+ variant="temporary"
+ >
+ {content}
+
+ );
+};
+
+SideNav.propTypes = {
+ onClose: PropTypes.func,
+ open: PropTypes.bool
+};
diff --git a/src/layouts/dashboard/top-nav.js b/src/layouts/dashboard/top-nav.js
new file mode 100644
index 0000000..d5a0623
--- /dev/null
+++ b/src/layouts/dashboard/top-nav.js
@@ -0,0 +1,125 @@
+import PropTypes from 'prop-types';
+import BellIcon from '@heroicons/react/24/solid/BellIcon';
+import UsersIcon from '@heroicons/react/24/solid/UsersIcon';
+import Bars3Icon from '@heroicons/react/24/solid/Bars3Icon';
+import MagnifyingGlassIcon from '@heroicons/react/24/solid/MagnifyingGlassIcon';
+import {
+ Avatar,
+ Badge,
+ Box,
+ IconButton,
+ Stack,
+ SvgIcon,
+ Tooltip,
+ useMediaQuery
+} from '@mui/material';
+import { alpha } from '@mui/material/styles';
+import { usePopover } from 'src/hooks/use-popover';
+import { AccountPopover } from './account-popover';
+
+const SIDE_NAV_WIDTH = 280;
+const TOP_NAV_HEIGHT = 64;
+
+export const TopNav = (props) => {
+ const { onNavOpen } = props;
+ const lgUp = useMediaQuery((theme) => theme.breakpoints.up('lg'));
+ const accountPopover = usePopover();
+
+ return (
+ <>
+ alpha(theme.palette.background.default, 0.8),
+ position: 'sticky',
+ left: {
+ lg: `${SIDE_NAV_WIDTH}px`
+ },
+ top: 0,
+ width: {
+ lg: `calc(100% - ${SIDE_NAV_WIDTH}px)`
+ },
+ zIndex: (theme) => theme.zIndex.appBar
+ }}
+ >
+
+
+ {!lgUp && (
+
+
+
+
+
+ )}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ >
+ );
+};
+
+TopNav.propTypes = {
+ onNavOpen: PropTypes.func
+};
diff --git a/src/pages/404.js b/src/pages/404.js
new file mode 100644
index 0000000..e07e7df
--- /dev/null
+++ b/src/pages/404.js
@@ -0,0 +1,80 @@
+import Head from 'next/head';
+import NextLink from 'next/link';
+import ArrowLeftIcon from '@heroicons/react/24/solid/ArrowLeftIcon';
+import { Box, Button, Container, SvgIcon, Typography } from '@mui/material';
+
+const Page = () => (
+ <>
+
+
+ 404 | Devias Kit
+
+
+
+
+
+
+
+
+
+ 404: The page you are looking for isn’t here
+
+
+ You either tried some shady route or you came here by mistake.
+ Whichever it is, try using the navigation
+
+
+
+
+
+ >
+);
+
+export default Page;
diff --git a/src/pages/_app.js b/src/pages/_app.js
new file mode 100644
index 0000000..98756d1
--- /dev/null
+++ b/src/pages/_app.js
@@ -0,0 +1,55 @@
+import Head from 'next/head';
+import { CacheProvider } from '@emotion/react';
+import { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider';
+import { AdapterDateFns } from '@mui/x-date-pickers/AdapterDateFns';
+import { CssBaseline } from '@mui/material';
+import { ThemeProvider } from '@mui/material/styles';
+import { AuthConsumer, AuthProvider } from 'src/contexts/auth-context';
+import { useNProgress } from 'src/hooks/use-nprogress';
+import { createTheme } from 'src/theme';
+import { createEmotionCache } from 'src/utils/create-emotion-cache';
+import 'simplebar-react/dist/simplebar.min.css';
+
+const clientSideEmotionCache = createEmotionCache();
+
+const SplashScreen = () => null;
+
+const App = (props) => {
+ const { Component, emotionCache = clientSideEmotionCache, pageProps } = props;
+
+ useNProgress();
+
+ const getLayout = Component.getLayout ?? ((page) => page);
+
+ const theme = createTheme();
+
+ return (
+
+
+
+ Devias Kit
+
+
+
+
+
+
+
+
+ {
+ (auth) => auth.isLoading
+ ?
+ : getLayout()
+ }
+
+
+
+
+
+ );
+};
+
+export default App;
diff --git a/src/pages/_document.js b/src/pages/_document.js
new file mode 100644
index 0000000..4c67eaa
--- /dev/null
+++ b/src/pages/_document.js
@@ -0,0 +1,105 @@
+import { Children } from 'react';
+import Document, { Head, Html, Main, NextScript } from 'next/document';
+import createEmotionServer from '@emotion/server/create-instance';
+import { createEmotionCache } from 'src/utils/create-emotion-cache';
+
+const Favicon = () => (
+ <>
+
+
+
+
+ >
+);
+
+const Fonts = () => (
+ <>
+
+
+
+
+
+ >
+);
+
+class CustomDocument extends Document {
+ render() {
+ return (
+
+
+
+
+
+
+
+
+
+
+ );
+ }
+}
+
+CustomDocument.getInitialProps = async (ctx) => {
+ const originalRenderPage = ctx.renderPage;
+ const cache = createEmotionCache();
+ const { extractCriticalToChunks } = createEmotionServer(cache);
+
+ ctx.renderPage = () => originalRenderPage({
+ enhanceApp: (App) => (props) => (
+
+ )
+ });
+
+ const initialProps = await Document.getInitialProps(ctx);
+ const emotionStyles = extractCriticalToChunks(initialProps.html);
+ const emotionStyleTags = emotionStyles.styles.map((style) => (
+
+ ));
+
+ return {
+ ...initialProps,
+ styles: [...Children.toArray(initialProps.styles), ...emotionStyleTags]
+ };
+};
+
+export default CustomDocument;
diff --git a/src/pages/account.js b/src/pages/account.js
new file mode 100644
index 0000000..81e1866
--- /dev/null
+++ b/src/pages/account.js
@@ -0,0 +1,61 @@
+import Head from 'next/head';
+import { Box, Container, Stack, Typography, Unstable_Grid2 as Grid } from '@mui/material';
+import { Layout as DashboardLayout } from 'src/layouts/dashboard/layout';
+import { AccountProfile } from 'src/sections/account/account-profile';
+import { AccountProfileDetails } from 'src/sections/account/account-profile-details';
+
+const Page = () => (
+ <>
+
+
+ Account | Devias Kit
+
+
+
+
+
+
+
+ Account
+
+
+
+
+
+
+ >
+);
+
+Page.getLayout = (page) => (
+
+ {page}
+
+);
+
+export default Page;
diff --git a/src/pages/auth/login.js b/src/pages/auth/login.js
new file mode 100644
index 0000000..f4df102
--- /dev/null
+++ b/src/pages/auth/login.js
@@ -0,0 +1,227 @@
+import { useCallback, useState } from 'react';
+import Head from 'next/head';
+import NextLink from 'next/link';
+import { useRouter } from 'next/navigation';
+import { useFormik } from 'formik';
+import * as Yup from 'yup';
+import {
+ Alert,
+ Box,
+ Button,
+ FormHelperText,
+ Link,
+ Stack,
+ Tab,
+ Tabs,
+ TextField,
+ Typography
+} from '@mui/material';
+import { useAuth } from 'src/hooks/use-auth';
+import { Layout as AuthLayout } from 'src/layouts/auth/layout';
+
+const Page = () => {
+ const router = useRouter();
+ const auth = useAuth();
+ const [method, setMethod] = useState('email');
+ const formik = useFormik({
+ initialValues: {
+ email: 'demo@devias.io',
+ password: 'Password123!',
+ submit: null
+ },
+ validationSchema: Yup.object({
+ email: Yup
+ .string()
+ .email('Must be a valid email')
+ .max(255)
+ .required('Email is required'),
+ password: Yup
+ .string()
+ .max(255)
+ .required('Password is required')
+ }),
+ onSubmit: async (values, helpers) => {
+ try {
+ await auth.signIn(values.email, values.password);
+ router.push('/');
+ } catch (err) {
+ helpers.setStatus({ success: false });
+ helpers.setErrors({ submit: err.message });
+ helpers.setSubmitting(false);
+ }
+ }
+ });
+
+ const handleMethodChange = useCallback(
+ (event, value) => {
+ setMethod(value);
+ },
+ []
+ );
+
+ const handleSkip = useCallback(
+ () => {
+ auth.skip();
+ router.push('/');
+ },
+ [auth, router]
+ );
+
+ return (
+ <>
+
+
+ Login | Devias Kit
+
+
+
+
+
+
+
+ Login
+
+
+ Don't have an account?
+
+
+ Register
+
+
+
+
+
+
+
+ {method === 'email' && (
+
+ )}
+ {method === 'phoneNumber' && (
+
+
+ Not available in the demo
+
+
+ To prevent unnecessary costs we disabled this feature in the demo.
+
+
+ )}
+
+
+
+ >
+ );
+};
+
+Page.getLayout = (page) => (
+
+ {page}
+
+);
+
+export default Page;
diff --git a/src/pages/auth/register.js b/src/pages/auth/register.js
new file mode 100644
index 0000000..028e4f4
--- /dev/null
+++ b/src/pages/auth/register.js
@@ -0,0 +1,164 @@
+import Head from 'next/head';
+import NextLink from 'next/link';
+import { useRouter } from 'next/navigation';
+import { useFormik } from 'formik';
+import * as Yup from 'yup';
+import { Box, Button, Link, Stack, TextField, Typography } from '@mui/material';
+import { useAuth } from 'src/hooks/use-auth';
+import { Layout as AuthLayout } from 'src/layouts/auth/layout';
+
+const Page = () => {
+ const router = useRouter();
+ const auth = useAuth();
+ const formik = useFormik({
+ initialValues: {
+ email: '',
+ name: '',
+ password: '',
+ submit: null
+ },
+ validationSchema: Yup.object({
+ email: Yup
+ .string()
+ .email('Must be a valid email')
+ .max(255)
+ .required('Email is required'),
+ name: Yup
+ .string()
+ .max(255)
+ .required('Name is required'),
+ password: Yup
+ .string()
+ .max(255)
+ .required('Password is required')
+ }),
+ onSubmit: async (values, helpers) => {
+ try {
+ await auth.signUp(values.email, values.name, values.password);
+ router.push('/');
+ } catch (err) {
+ helpers.setStatus({ success: false });
+ helpers.setErrors({ submit: err.message });
+ helpers.setSubmitting(false);
+ }
+ }
+ });
+
+ return (
+ <>
+
+
+ Register | Devias Kit
+
+
+
+
+
+
+
+ Register
+
+
+ Already have an account?
+
+
+ Log in
+
+
+
+
+
+
+
+ >
+ );
+};
+
+Page.getLayout = (page) => (
+
+ {page}
+
+);
+
+export default Page;
diff --git a/src/pages/companies.js b/src/pages/companies.js
new file mode 100644
index 0000000..c8cfcea
--- /dev/null
+++ b/src/pages/companies.js
@@ -0,0 +1,174 @@
+import Head from 'next/head';
+import ArrowUpOnSquareIcon from '@heroicons/react/24/solid/ArrowUpOnSquareIcon';
+import ArrowDownOnSquareIcon from '@heroicons/react/24/solid/ArrowDownOnSquareIcon';
+import PlusIcon from '@heroicons/react/24/solid/PlusIcon';
+import {
+ Box,
+ Button,
+ Container,
+ Pagination,
+ Stack,
+ SvgIcon,
+ Typography,
+ Unstable_Grid2 as Grid
+} from '@mui/material';
+import { Layout as DashboardLayout } from 'src/layouts/dashboard/layout';
+import { CompanyCard } from 'src/sections/companies/company-card';
+import { CompaniesSearch } from 'src/sections/companies/companies-search';
+
+const companies = [
+ {
+ id: '2569ce0d517a7f06d3ea1f24',
+ createdAt: '27/03/2019',
+ description: 'Dropbox is a file hosting service that offers cloud storage, file synchronization, a personal cloud.',
+ logo: '/assets/logos/logo-dropbox.png',
+ title: 'Dropbox',
+ downloads: '594'
+ },
+ {
+ id: 'ed2b900870ceba72d203ec15',
+ createdAt: '31/03/2019',
+ description: 'Medium is an online publishing platform developed by Evan Williams, and launched in August 2012.',
+ logo: '/assets/logos/logo-medium.png',
+ title: 'Medium Corporation',
+ downloads: '625'
+ },
+ {
+ id: 'a033e38768c82fca90df3db7',
+ createdAt: '03/04/2019',
+ description: 'Slack is a cloud-based set of team collaboration tools and services, founded by Stewart Butterfield.',
+ logo: '/assets/logos/logo-slack.png',
+ title: 'Slack',
+ downloads: '857'
+ },
+ {
+ id: '1efecb2bf6a51def9869ab0f',
+ createdAt: '04/04/2019',
+ description: 'Lyft is an on-demand transportation company based in San Francisco, California.',
+ logo: '/assets/logos/logo-lyft.png',
+ title: 'Lyft',
+ downloads: '406'
+ },
+ {
+ id: '1ed68149f65fbc6089b5fd07',
+ createdAt: '04/04/2019',
+ description: 'GitHub is a web-based hosting service for version control of code using Git.',
+ logo: '/assets/logos/logo-github.png',
+ title: 'GitHub',
+ downloads: '835'
+ },
+ {
+ id: '5dab321376eff6177407e887',
+ createdAt: '04/04/2019',
+ description: 'Squarespace provides software as a service for website building and hosting. Headquartered in NYC.',
+ logo: '/assets/logos/logo-squarespace.png',
+ title: 'Squarespace',
+ downloads: '835'
+ }
+];
+
+const Page = () => (
+ <>
+
+
+ Companies | Devias Kit
+
+
+
+
+
+
+
+
+ Companies
+
+
+
+
+
+
+
+
+
+
+
+
+ {companies.map((company) => (
+
+
+
+ ))}
+
+
+
+
+
+
+
+ >
+);
+
+Page.getLayout = (page) => (
+
+ {page}
+
+);
+
+export default Page;
diff --git a/src/pages/customers.js b/src/pages/customers.js
new file mode 100644
index 0000000..d31a34a
--- /dev/null
+++ b/src/pages/customers.js
@@ -0,0 +1,290 @@
+import { useCallback, useMemo, useState } from 'react';
+import Head from 'next/head';
+import { subDays, subHours } from 'date-fns';
+import ArrowDownOnSquareIcon from '@heroicons/react/24/solid/ArrowDownOnSquareIcon';
+import ArrowUpOnSquareIcon from '@heroicons/react/24/solid/ArrowUpOnSquareIcon';
+import PlusIcon from '@heroicons/react/24/solid/PlusIcon';
+import { Box, Button, Container, Stack, SvgIcon, Typography } from '@mui/material';
+import { useSelection } from 'src/hooks/use-selection';
+import { Layout as DashboardLayout } from 'src/layouts/dashboard/layout';
+import { CustomersTable } from 'src/sections/customer/customers-table';
+import { CustomersSearch } from 'src/sections/customer/customers-search';
+import { applyPagination } from 'src/utils/apply-pagination';
+
+const now = new Date();
+
+const data = [
+ {
+ id: '5e887ac47eed253091be10cb',
+ address: {
+ city: 'Cleveland',
+ country: 'USA',
+ state: 'Ohio',
+ street: '2849 Fulton Street'
+ },
+ avatar: '/assets/avatars/avatar-carson-darrin.png',
+ createdAt: subDays(subHours(now, 7), 1).getTime(),
+ email: 'carson.darrin@devias.io',
+ name: 'Carson Darrin',
+ phone: '304-428-3097'
+ },
+ {
+ id: '5e887b209c28ac3dd97f6db5',
+ address: {
+ city: 'Atlanta',
+ country: 'USA',
+ state: 'Georgia',
+ street: '1865 Pleasant Hill Road'
+ },
+ avatar: '/assets/avatars/avatar-fran-perez.png',
+ createdAt: subDays(subHours(now, 1), 2).getTime(),
+ email: 'fran.perez@devias.io',
+ name: 'Fran Perez',
+ phone: '712-351-5711'
+ },
+ {
+ id: '5e887b7602bdbc4dbb234b27',
+ address: {
+ city: 'North Canton',
+ country: 'USA',
+ state: 'Ohio',
+ street: '4894 Lakeland Park Drive'
+ },
+ avatar: '/assets/avatars/avatar-jie-yan-song.png',
+ createdAt: subDays(subHours(now, 4), 2).getTime(),
+ email: 'jie.yan.song@devias.io',
+ name: 'Jie Yan Song',
+ phone: '770-635-2682'
+ },
+ {
+ id: '5e86809283e28b96d2d38537',
+ address: {
+ city: 'Madrid',
+ country: 'Spain',
+ name: 'Anika Visser',
+ street: '4158 Hedge Street'
+ },
+ avatar: '/assets/avatars/avatar-anika-visser.png',
+ createdAt: subDays(subHours(now, 11), 2).getTime(),
+ email: 'anika.visser@devias.io',
+ name: 'Anika Visser',
+ phone: '908-691-3242'
+ },
+ {
+ id: '5e86805e2bafd54f66cc95c3',
+ address: {
+ city: 'San Diego',
+ country: 'USA',
+ state: 'California',
+ street: '75247'
+ },
+ avatar: '/assets/avatars/avatar-miron-vitold.png',
+ createdAt: subDays(subHours(now, 7), 3).getTime(),
+ email: 'miron.vitold@devias.io',
+ name: 'Miron Vitold',
+ phone: '972-333-4106'
+ },
+ {
+ id: '5e887a1fbefd7938eea9c981',
+ address: {
+ city: 'Berkeley',
+ country: 'USA',
+ state: 'California',
+ street: '317 Angus Road'
+ },
+ avatar: '/assets/avatars/avatar-penjani-inyene.png',
+ createdAt: subDays(subHours(now, 5), 4).getTime(),
+ email: 'penjani.inyene@devias.io',
+ name: 'Penjani Inyene',
+ phone: '858-602-3409'
+ },
+ {
+ id: '5e887d0b3d090c1b8f162003',
+ address: {
+ city: 'Carson City',
+ country: 'USA',
+ state: 'Nevada',
+ street: '2188 Armbrester Drive'
+ },
+ avatar: '/assets/avatars/avatar-omar-darboe.png',
+ createdAt: subDays(subHours(now, 15), 4).getTime(),
+ email: 'omar.darobe@devias.io',
+ name: 'Omar Darobe',
+ phone: '415-907-2647'
+ },
+ {
+ id: '5e88792be2d4cfb4bf0971d9',
+ address: {
+ city: 'Los Angeles',
+ country: 'USA',
+ state: 'California',
+ street: '1798 Hickory Ridge Drive'
+ },
+ avatar: '/assets/avatars/avatar-siegbert-gottfried.png',
+ createdAt: subDays(subHours(now, 2), 5).getTime(),
+ email: 'siegbert.gottfried@devias.io',
+ name: 'Siegbert Gottfried',
+ phone: '702-661-1654'
+ },
+ {
+ id: '5e8877da9a65442b11551975',
+ address: {
+ city: 'Murray',
+ country: 'USA',
+ state: 'Utah',
+ street: '3934 Wildrose Lane'
+ },
+ avatar: '/assets/avatars/avatar-iulia-albu.png',
+ createdAt: subDays(subHours(now, 8), 6).getTime(),
+ email: 'iulia.albu@devias.io',
+ name: 'Iulia Albu',
+ phone: '313-812-8947'
+ },
+ {
+ id: '5e8680e60cba5019c5ca6fda',
+ address: {
+ city: 'Salt Lake City',
+ country: 'USA',
+ state: 'Utah',
+ street: '368 Lamberts Branch Road'
+ },
+ avatar: '/assets/avatars/avatar-nasimiyu-danai.png',
+ createdAt: subDays(subHours(now, 1), 9).getTime(),
+ email: 'nasimiyu.danai@devias.io',
+ name: 'Nasimiyu Danai',
+ phone: '801-301-7894'
+ }
+];
+
+const useCustomers = (page, rowsPerPage) => {
+ return useMemo(
+ () => {
+ return applyPagination(data, page, rowsPerPage);
+ },
+ [page, rowsPerPage]
+ );
+};
+
+const useCustomerIds = (customers) => {
+ return useMemo(
+ () => {
+ return customers.map((customer) => customer.id);
+ },
+ [customers]
+ );
+};
+
+const Page = () => {
+ const [page, setPage] = useState(0);
+ const [rowsPerPage, setRowsPerPage] = useState(5);
+ const customers = useCustomers(page, rowsPerPage);
+ const customersIds = useCustomerIds(customers);
+ const customersSelection = useSelection(customersIds);
+
+ const handlePageChange = useCallback(
+ (event, value) => {
+ setPage(value);
+ },
+ []
+ );
+
+ const handleRowsPerPageChange = useCallback(
+ (event) => {
+ setRowsPerPage(event.target.value);
+ },
+ []
+ );
+
+ return (
+ <>
+
+
+ Customers | Devias Kit
+
+
+
+
+
+
+
+
+ Customers
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ >
+ );
+};
+
+Page.getLayout = (page) => (
+
+ {page}
+
+);
+
+export default Page;
diff --git a/src/pages/index.js b/src/pages/index.js
new file mode 100644
index 0000000..bbac09a
--- /dev/null
+++ b/src/pages/index.js
@@ -0,0 +1,232 @@
+import Head from 'next/head';
+import { subDays, subHours } from 'date-fns';
+import { Box, Container, Unstable_Grid2 as Grid } from '@mui/material';
+import { Layout as DashboardLayout } from 'src/layouts/dashboard/layout';
+import { OverviewBudget } from 'src/sections/overview/overview-budget';
+import { OverviewLatestOrders } from 'src/sections/overview/overview-latest-orders';
+import { OverviewLatestProducts } from 'src/sections/overview/overview-latest-products';
+import { OverviewSales } from 'src/sections/overview/overview-sales';
+import { OverviewTasksProgress } from 'src/sections/overview/overview-tasks-progress';
+import { OverviewTotalCustomers } from 'src/sections/overview/overview-total-customers';
+import { OverviewTotalProfit } from 'src/sections/overview/overview-total-profit';
+import { OverviewTraffic } from 'src/sections/overview/overview-traffic';
+
+const now = new Date();
+
+const Page = () => (
+ <>
+
+
+ Overview | Devias Kit
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ >
+);
+
+Page.getLayout = (page) => (
+
+ {page}
+
+);
+
+export default Page;
diff --git a/src/pages/settings.js b/src/pages/settings.js
new file mode 100644
index 0000000..6e8e24d
--- /dev/null
+++ b/src/pages/settings.js
@@ -0,0 +1,40 @@
+import Head from 'next/head';
+import { Box, Container, Stack, Typography } from '@mui/material';
+import { SettingsNotifications } from 'src/sections/settings/settings-notifications';
+import { SettingsPassword } from 'src/sections/settings/settings-password';
+import { Layout as DashboardLayout } from 'src/layouts/dashboard/layout';
+
+const Page = () => (
+ <>
+
+
+ Settings | Devias Kit
+
+
+
+
+
+
+ Settings
+
+
+
+
+
+
+ >
+);
+
+Page.getLayout = (page) => (
+
+ {page}
+
+);
+
+export default Page;
diff --git a/src/sections/account/account-profile-details.js b/src/sections/account/account-profile-details.js
new file mode 100644
index 0000000..0d29bc9
--- /dev/null
+++ b/src/sections/account/account-profile-details.js
@@ -0,0 +1,179 @@
+import { useCallback, useState } from 'react';
+import {
+ Box,
+ Button,
+ Card,
+ CardActions,
+ CardContent,
+ CardHeader,
+ Divider,
+ TextField,
+ Unstable_Grid2 as Grid
+} from '@mui/material';
+
+const states = [
+ {
+ value: 'alabama',
+ label: 'Alabama'
+ },
+ {
+ value: 'new-york',
+ label: 'New York'
+ },
+ {
+ value: 'san-francisco',
+ label: 'San Francisco'
+ },
+ {
+ value: 'los-angeles',
+ label: 'Los Angeles'
+ }
+];
+
+export const AccountProfileDetails = () => {
+ const [values, setValues] = useState({
+ firstName: 'Anika',
+ lastName: 'Visser',
+ email: 'demo@devias.io',
+ phone: '',
+ state: 'los-angeles',
+ country: 'USA'
+ });
+
+ const handleChange = useCallback(
+ (event) => {
+ setValues((prevState) => ({
+ ...prevState,
+ [event.target.name]: event.target.value
+ }));
+ },
+ []
+ );
+
+ const handleSubmit = useCallback(
+ (event) => {
+ event.preventDefault();
+ },
+ []
+ );
+
+ return (
+
+ );
+};
diff --git a/src/sections/account/account-profile.js b/src/sections/account/account-profile.js
new file mode 100644
index 0000000..4679ebd
--- /dev/null
+++ b/src/sections/account/account-profile.js
@@ -0,0 +1,69 @@
+import {
+ Avatar,
+ Box,
+ Button,
+ Card,
+ CardActions,
+ CardContent,
+ Divider,
+ Typography
+} from '@mui/material';
+
+const user = {
+ avatar: '/assets/avatars/avatar-anika-visser.png',
+ city: 'Los Angeles',
+ country: 'USA',
+ jobTitle: 'Senior Developer',
+ name: 'Anika Visser',
+ timezone: 'GTM-7'
+};
+
+export const AccountProfile = () => (
+
+
+
+
+
+ {user.name}
+
+
+ {user.city} {user.country}
+
+
+ {user.timezone}
+
+
+
+
+
+
+
+
+);
diff --git a/src/sections/companies/companies-search.js b/src/sections/companies/companies-search.js
new file mode 100644
index 0000000..55af302
--- /dev/null
+++ b/src/sections/companies/companies-search.js
@@ -0,0 +1,23 @@
+import MagnifyingGlassIcon from '@heroicons/react/24/solid/MagnifyingGlassIcon';
+import { Card, InputAdornment, OutlinedInput, SvgIcon } from '@mui/material';
+
+export const CompaniesSearch = () => (
+
+
+
+
+
+
+ )}
+ sx={{ maxWidth: 500 }}
+ />
+
+);
diff --git a/src/sections/companies/company-card.js b/src/sections/companies/company-card.js
new file mode 100644
index 0000000..3c5bf0d
--- /dev/null
+++ b/src/sections/companies/company-card.js
@@ -0,0 +1,98 @@
+import PropTypes from 'prop-types';
+import ArrowDownOnSquareIcon from '@heroicons/react/24/solid/ArrowDownOnSquareIcon';
+import ClockIcon from '@heroicons/react/24/solid/ClockIcon';
+import { Avatar, Box, Card, CardContent, Divider, Stack, SvgIcon, Typography } from '@mui/material';
+
+export const CompanyCard = (props) => {
+ const { company } = props;
+
+ return (
+
+
+
+
+
+
+ {company.title}
+
+
+ {company.description}
+
+
+
+
+
+
+
+
+
+
+ Updated 2hr ago
+
+
+
+
+
+
+
+ {company.downloads} Downloads
+
+
+
+
+ );
+};
+
+CompanyCard.propTypes = {
+ company: PropTypes.object.isRequired
+};
diff --git a/src/sections/customer/customers-search.js b/src/sections/customer/customers-search.js
new file mode 100644
index 0000000..7f42bf3
--- /dev/null
+++ b/src/sections/customer/customers-search.js
@@ -0,0 +1,23 @@
+import MagnifyingGlassIcon from '@heroicons/react/24/solid/MagnifyingGlassIcon';
+import { Card, InputAdornment, OutlinedInput, SvgIcon } from '@mui/material';
+
+export const CustomersSearch = () => (
+
+
+
+
+
+
+ )}
+ sx={{ maxWidth: 500 }}
+ />
+
+);
diff --git a/src/sections/customer/customers-table.js b/src/sections/customer/customers-table.js
new file mode 100644
index 0000000..2d1fe88
--- /dev/null
+++ b/src/sections/customer/customers-table.js
@@ -0,0 +1,156 @@
+import PropTypes from 'prop-types';
+import { format } from 'date-fns';
+import {
+ Avatar,
+ Box,
+ Card,
+ Checkbox,
+ Stack,
+ Table,
+ TableBody,
+ TableCell,
+ TableHead,
+ TablePagination,
+ TableRow,
+ Typography
+} from '@mui/material';
+import { Scrollbar } from 'src/components/scrollbar';
+import { getInitials } from 'src/utils/get-initials';
+
+export const CustomersTable = (props) => {
+ const {
+ count = 0,
+ items = [],
+ onDeselectAll,
+ onDeselectOne,
+ onPageChange = () => {},
+ onRowsPerPageChange,
+ onSelectAll,
+ onSelectOne,
+ page = 0,
+ rowsPerPage = 0,
+ selected = []
+ } = props;
+
+ const selectedSome = (selected.length > 0) && (selected.length < items.length);
+ const selectedAll = (items.length > 0) && (selected.length === items.length);
+
+ return (
+
+
+
+
+
+
+
+ {
+ if (event.target.checked) {
+ onSelectAll?.();
+ } else {
+ onDeselectAll?.();
+ }
+ }}
+ />
+
+
+ Name
+
+
+ Email
+
+
+ Location
+
+
+ Phone
+
+
+ Signed Up
+
+
+
+
+ {items.map((customer) => {
+ const isSelected = selected.includes(customer.id);
+ const createdAt = format(customer.createdAt, 'dd/MM/yyyy');
+
+ return (
+
+
+ {
+ if (event.target.checked) {
+ onSelectOne?.(customer.id);
+ } else {
+ onDeselectOne?.(customer.id);
+ }
+ }}
+ />
+
+
+
+
+ {getInitials(customer.name)}
+
+
+ {customer.name}
+
+
+
+
+ {customer.email}
+
+
+ {customer.address.city}, {customer.address.state}, {customer.address.country}
+
+
+ {customer.phone}
+
+
+ {createdAt}
+
+
+ );
+ })}
+
+
+
+
+
+
+ );
+};
+
+CustomersTable.propTypes = {
+ count: PropTypes.number,
+ items: PropTypes.array,
+ onDeselectAll: PropTypes.func,
+ onDeselectOne: PropTypes.func,
+ onPageChange: PropTypes.func,
+ onRowsPerPageChange: PropTypes.func,
+ onSelectAll: PropTypes.func,
+ onSelectOne: PropTypes.func,
+ page: PropTypes.number,
+ rowsPerPage: PropTypes.number,
+ selected: PropTypes.array
+};
diff --git a/src/sections/overview/overview-budget.js b/src/sections/overview/overview-budget.js
new file mode 100644
index 0000000..8a834ab
--- /dev/null
+++ b/src/sections/overview/overview-budget.js
@@ -0,0 +1,85 @@
+import PropTypes from 'prop-types';
+import ArrowDownIcon from '@heroicons/react/24/solid/ArrowDownIcon';
+import ArrowUpIcon from '@heroicons/react/24/solid/ArrowUpIcon';
+import CurrencyDollarIcon from '@heroicons/react/24/solid/CurrencyDollarIcon';
+import { Avatar, Card, CardContent, Stack, SvgIcon, Typography } from '@mui/material';
+
+export const OverviewBudget = (props) => {
+ const { difference, positive = false, sx, value } = props;
+
+ return (
+
+
+
+
+
+ Budget
+
+
+ {value}
+
+
+
+
+
+
+
+
+ {difference && (
+
+
+
+ {positive ? : }
+
+
+ {difference}%
+
+
+
+ Since last month
+
+
+ )}
+
+
+ );
+};
+
+OverviewBudget.prototypes = {
+ difference: PropTypes.number,
+ positive: PropTypes.bool,
+ sx: PropTypes.object,
+ value: PropTypes.string.isRequired
+};
diff --git a/src/sections/overview/overview-latest-orders.js b/src/sections/overview/overview-latest-orders.js
new file mode 100644
index 0000000..6d61d0d
--- /dev/null
+++ b/src/sections/overview/overview-latest-orders.js
@@ -0,0 +1,104 @@
+import { format } from 'date-fns';
+import PropTypes from 'prop-types';
+import ArrowRightIcon from '@heroicons/react/24/solid/ArrowRightIcon';
+import {
+ Box,
+ Button,
+ Card,
+ CardActions,
+ CardHeader,
+ Divider,
+ SvgIcon,
+ Table,
+ TableBody,
+ TableCell,
+ TableHead,
+ TableRow
+} from '@mui/material';
+import { Scrollbar } from 'src/components/scrollbar';
+import { SeverityPill } from 'src/components/severity-pill';
+
+const statusMap = {
+ pending: 'warning',
+ delivered: 'success',
+ refunded: 'error'
+};
+
+export const OverviewLatestOrders = (props) => {
+ const { orders = [], sx } = props;
+
+ return (
+
+
+
+
+
+
+
+
+ Order
+
+
+ Customer
+
+
+ Date
+
+
+ Status
+
+
+
+
+ {orders.map((order) => {
+ const createdAt = format(order.createdAt, 'dd/MM/yyyy');
+
+ return (
+
+
+ {order.ref}
+
+
+ {order.customer.name}
+
+
+ {createdAt}
+
+
+
+ {order.status}
+
+
+
+ );
+ })}
+
+
+
+
+
+
+
+
+
+ );
+};
+
+OverviewLatestOrders.prototype = {
+ orders: PropTypes.array,
+ sx: PropTypes.object
+};
diff --git a/src/sections/overview/overview-latest-products.js b/src/sections/overview/overview-latest-products.js
new file mode 100644
index 0000000..72bff92
--- /dev/null
+++ b/src/sections/overview/overview-latest-products.js
@@ -0,0 +1,99 @@
+import { formatDistanceToNow } from 'date-fns';
+import PropTypes from 'prop-types';
+import ArrowRightIcon from '@heroicons/react/24/solid/ArrowRightIcon';
+import EllipsisVerticalIcon from '@heroicons/react/24/solid/EllipsisVerticalIcon';
+import {
+ Box,
+ Button,
+ Card,
+ CardActions,
+ CardHeader,
+ Divider,
+ IconButton,
+ List,
+ ListItem,
+ ListItemAvatar,
+ ListItemText,
+ SvgIcon
+} from '@mui/material';
+
+export const OverviewLatestProducts = (props) => {
+ const { products = [], sx } = props;
+
+ return (
+
+
+
+ {products.map((product, index) => {
+ const hasDivider = index < products.length - 1;
+ const ago = formatDistanceToNow(product.updatedAt);
+
+ return (
+
+
+ {
+ product.image
+ ? (
+
+ )
+ : (
+
+ )
+ }
+
+
+
+
+
+
+
+
+ );
+ })}
+
+
+
+
+
+
+ );
+};
+
+OverviewLatestProducts.propTypes = {
+ products: PropTypes.array,
+ sx: PropTypes.object
+};
diff --git a/src/sections/overview/overview-sales.js b/src/sections/overview/overview-sales.js
new file mode 100644
index 0000000..eb8aaf5
--- /dev/null
+++ b/src/sections/overview/overview-sales.js
@@ -0,0 +1,159 @@
+import PropTypes from 'prop-types';
+import ArrowPathIcon from '@heroicons/react/24/solid/ArrowPathIcon';
+import ArrowRightIcon from '@heroicons/react/24/solid/ArrowRightIcon';
+import {
+ Button,
+ Card,
+ CardActions,
+ CardContent,
+ CardHeader,
+ Divider,
+ SvgIcon
+} from '@mui/material';
+import { alpha, useTheme } from '@mui/material/styles';
+import { Chart } from 'src/components/chart';
+
+const useChartOptions = () => {
+ const theme = useTheme();
+
+ return {
+ chart: {
+ background: 'transparent',
+ stacked: false,
+ toolbar: {
+ show: false
+ }
+ },
+ colors: [theme.palette.primary.main, alpha(theme.palette.primary.main, 0.25)],
+ dataLabels: {
+ enabled: false
+ },
+ fill: {
+ opacity: 1,
+ type: 'solid'
+ },
+ grid: {
+ borderColor: theme.palette.divider,
+ strokeDashArray: 2,
+ xaxis: {
+ lines: {
+ show: false
+ }
+ },
+ yaxis: {
+ lines: {
+ show: true
+ }
+ }
+ },
+ legend: {
+ show: false
+ },
+ plotOptions: {
+ bar: {
+ columnWidth: '40px'
+ }
+ },
+ stroke: {
+ colors: ['transparent'],
+ show: true,
+ width: 2
+ },
+ theme: {
+ mode: theme.palette.mode
+ },
+ xaxis: {
+ axisBorder: {
+ color: theme.palette.divider,
+ show: true
+ },
+ axisTicks: {
+ color: theme.palette.divider,
+ show: true
+ },
+ categories: [
+ 'Jan',
+ 'Feb',
+ 'Mar',
+ 'Apr',
+ 'May',
+ 'Jun',
+ 'Jul',
+ 'Aug',
+ 'Sep',
+ 'Oct',
+ 'Nov',
+ 'Dec'
+ ],
+ labels: {
+ offsetY: 5,
+ style: {
+ colors: theme.palette.text.secondary
+ }
+ }
+ },
+ yaxis: {
+ labels: {
+ formatter: (value) => (value > 0 ? `${value}K` : `${value}`),
+ offsetX: -10,
+ style: {
+ colors: theme.palette.text.secondary
+ }
+ }
+ }
+ };
+};
+
+export const OverviewSales = (props) => {
+ const { chartSeries, sx } = props;
+ const chartOptions = useChartOptions();
+
+ return (
+
+
+
+
+ )}
+ >
+ Sync
+
+ )}
+ title="Sales"
+ />
+
+
+
+
+
+
+
+
+ );
+};
+
+OverviewSales.protoTypes = {
+ chartSeries: PropTypes.array.isRequired,
+ sx: PropTypes.object
+};
diff --git a/src/sections/overview/overview-tasks-progress.js b/src/sections/overview/overview-tasks-progress.js
new file mode 100644
index 0000000..955b7e0
--- /dev/null
+++ b/src/sections/overview/overview-tasks-progress.js
@@ -0,0 +1,64 @@
+import PropTypes from 'prop-types';
+import ListBulletIcon from '@heroicons/react/24/solid/ListBulletIcon';
+import {
+ Avatar,
+ Box,
+ Card,
+ CardContent,
+ LinearProgress,
+ Stack,
+ SvgIcon,
+ Typography
+} from '@mui/material';
+
+export const OverviewTasksProgress = (props) => {
+ const { value, sx } = props;
+
+ return (
+
+
+
+
+
+ Task Progress
+
+
+ {value}%
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+OverviewTasksProgress.propTypes = {
+ value: PropTypes.number.isRequired,
+ sx: PropTypes.object
+};
diff --git a/src/sections/overview/overview-total-customers.js b/src/sections/overview/overview-total-customers.js
new file mode 100644
index 0000000..10949c0
--- /dev/null
+++ b/src/sections/overview/overview-total-customers.js
@@ -0,0 +1,86 @@
+import PropTypes from 'prop-types';
+import ArrowDownIcon from '@heroicons/react/24/solid/ArrowDownIcon';
+import ArrowUpIcon from '@heroicons/react/24/solid/ArrowUpIcon';
+import UsersIcon from '@heroicons/react/24/solid/UsersIcon';
+import { Avatar, Card, CardContent, Stack, SvgIcon, Typography } from '@mui/material';
+
+export const OverviewTotalCustomers = (props) => {
+ const { difference, positive = false, sx, value } = props;
+
+ return (
+
+
+
+
+
+ Total Customers
+
+
+ {value}
+
+
+
+
+
+
+
+
+ {difference && (
+
+
+
+ {positive ? : }
+
+
+ {difference}%
+
+
+
+ Since last month
+
+
+ )}
+
+
+ );
+};
+
+OverviewTotalCustomers.propTypes = {
+ difference: PropTypes.number,
+ positive: PropTypes.bool,
+ value: PropTypes.string.isRequired,
+ sx: PropTypes.object
+};
+
diff --git a/src/sections/overview/overview-total-profit.js b/src/sections/overview/overview-total-profit.js
new file mode 100644
index 0000000..b551413
--- /dev/null
+++ b/src/sections/overview/overview-total-profit.js
@@ -0,0 +1,48 @@
+import PropTypes from 'prop-types';
+import CurrencyDollarIcon from '@heroicons/react/24/solid/CurrencyDollarIcon';
+import { Avatar, Card, CardContent, Stack, SvgIcon, Typography } from '@mui/material';
+
+export const OverviewTotalProfit = (props) => {
+ const { value, sx } = props;
+
+ return (
+
+
+
+
+
+ Total Profit
+
+
+ {value}
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+OverviewTotalProfit.propTypes = {
+ value: PropTypes.string,
+ sx: PropTypes.object
+};
diff --git a/src/sections/overview/overview-traffic.js b/src/sections/overview/overview-traffic.js
new file mode 100644
index 0000000..98f0973
--- /dev/null
+++ b/src/sections/overview/overview-traffic.js
@@ -0,0 +1,143 @@
+import PropTypes from 'prop-types';
+import ComputerDesktopIcon from '@heroicons/react/24/solid/ComputerDesktopIcon';
+import DeviceTabletIcon from '@heroicons/react/24/solid/DeviceTabletIcon';
+import PhoneIcon from '@heroicons/react/24/solid/PhoneIcon';
+import {
+ Box,
+ Card,
+ CardContent,
+ CardHeader,
+ Stack,
+ SvgIcon,
+ Typography,
+ useTheme
+} from '@mui/material';
+import { Chart } from 'src/components/chart';
+
+const useChartOptions = (labels) => {
+ const theme = useTheme();
+
+ return {
+ chart: {
+ background: 'transparent'
+ },
+ colors: [
+ theme.palette.primary.main,
+ theme.palette.success.main,
+ theme.palette.warning.main
+ ],
+ dataLabels: {
+ enabled: false
+ },
+ labels,
+ legend: {
+ show: false
+ },
+ plotOptions: {
+ pie: {
+ expandOnClick: false
+ }
+ },
+ states: {
+ active: {
+ filter: {
+ type: 'none'
+ }
+ },
+ hover: {
+ filter: {
+ type: 'none'
+ }
+ }
+ },
+ stroke: {
+ width: 0
+ },
+ theme: {
+ mode: theme.palette.mode
+ },
+ tooltip: {
+ fillSeriesColor: false
+ }
+ };
+};
+
+const iconMap = {
+ Desktop: (
+
+
+
+ ),
+ Tablet: (
+
+
+
+ ),
+ Phone: (
+
+
+
+ )
+};
+
+export const OverviewTraffic = (props) => {
+ const { chartSeries, labels, sx } = props;
+ const chartOptions = useChartOptions(labels);
+
+ return (
+
+
+
+
+
+ {chartSeries.map((item, index) => {
+ const label = labels[index];
+
+ return (
+
+ {iconMap[label]}
+
+ {label}
+
+
+ {item}%
+
+
+ );
+ })}
+
+
+
+ );
+};
+
+OverviewTraffic.propTypes = {
+ chartSeries: PropTypes.array.isRequired,
+ labels: PropTypes.array.isRequired,
+ sx: PropTypes.object
+};
diff --git a/src/sections/settings/settings-notifications.js b/src/sections/settings/settings-notifications.js
new file mode 100644
index 0000000..6fbe968
--- /dev/null
+++ b/src/sections/settings/settings-notifications.js
@@ -0,0 +1,104 @@
+import { useCallback } from 'react';
+import {
+ Button,
+ Card,
+ CardActions,
+ CardContent,
+ CardHeader,
+ Checkbox,
+ Divider,
+ FormControlLabel,
+ Stack,
+ Typography,
+ Unstable_Grid2 as Grid
+} from '@mui/material';
+
+export const SettingsNotifications = () => {
+ const handleSubmit = useCallback(
+ (event) => {
+ event.preventDefault();
+ },
+ []
+ );
+
+ return (
+
+ );
+};
diff --git a/src/sections/settings/settings-password.js b/src/sections/settings/settings-password.js
new file mode 100644
index 0000000..8899d98
--- /dev/null
+++ b/src/sections/settings/settings-password.js
@@ -0,0 +1,76 @@
+import { useCallback, useState } from 'react';
+import {
+ Button,
+ Card,
+ CardActions,
+ CardContent,
+ CardHeader,
+ Divider,
+ Stack,
+ TextField
+} from '@mui/material';
+
+export const SettingsPassword = () => {
+ const [values, setValues] = useState({
+ password: '',
+ confirm: ''
+ });
+
+ const handleChange = useCallback(
+ (event) => {
+ setValues((prevState) => ({
+ ...prevState,
+ [event.target.name]: event.target.value
+ }));
+ },
+ []
+ );
+
+ const handleSubmit = useCallback(
+ (event) => {
+ event.preventDefault();
+ },
+ []
+ );
+
+ return (
+
+ );
+};
diff --git a/src/theme/colors.js b/src/theme/colors.js
new file mode 100644
index 0000000..7915b5a
--- /dev/null
+++ b/src/theme/colors.js
@@ -0,0 +1,70 @@
+import { alpha } from '@mui/material/styles';
+
+const withAlphas = (color) => {
+ return {
+ ...color,
+ alpha4: alpha(color.main, 0.04),
+ alpha8: alpha(color.main, 0.08),
+ alpha12: alpha(color.main, 0.12),
+ alpha30: alpha(color.main, 0.30),
+ alpha50: alpha(color.main, 0.50)
+ };
+};
+
+export const neutral = {
+ 50: '#F8F9FA',
+ 100: '#F3F4F6',
+ 200: '#E5E7EB',
+ 300: '#D2D6DB',
+ 400: '#9DA4AE',
+ 500: '#6C737F',
+ 600: '#4D5761',
+ 700: '#2F3746',
+ 800: '#1C2536',
+ 900: '#111927'
+};
+
+export const indigo = withAlphas({
+ lightest: '#F5F7FF',
+ light: '#EBEEFE',
+ main: '#6366F1',
+ dark: '#4338CA',
+ darkest: '#312E81',
+ contrastText: '#FFFFFF'
+});
+
+export const success = withAlphas({
+ lightest: '#F0FDF9',
+ light: '#3FC79A',
+ main: '#10B981',
+ dark: '#0B815A',
+ darkest: '#134E48',
+ contrastText: '#FFFFFF'
+});
+
+export const info = withAlphas({
+ lightest: '#ECFDFF',
+ light: '#CFF9FE',
+ main: '#06AED4',
+ dark: '#0E7090',
+ darkest: '#164C63',
+ contrastText: '#FFFFFF'
+});
+
+export const warning = withAlphas({
+ lightest: '#FFFAEB',
+ light: '#FEF0C7',
+ main: '#F79009',
+ dark: '#B54708',
+ darkest: '#7A2E0E',
+ contrastText: '#FFFFFF'
+});
+
+export const error = withAlphas({
+ lightest: '#FEF3F2',
+ light: '#FEE4E2',
+ main: '#F04438',
+ dark: '#B42318',
+ darkest: '#7A271A',
+ contrastText: '#FFFFFF'
+});
diff --git a/src/theme/create-components.js b/src/theme/create-components.js
new file mode 100644
index 0000000..5357302
--- /dev/null
+++ b/src/theme/create-components.js
@@ -0,0 +1,301 @@
+import {
+ createTheme,
+ filledInputClasses,
+ inputLabelClasses,
+ outlinedInputClasses,
+ paperClasses,
+ tableCellClasses
+} from '@mui/material';
+
+// Used only to create transitions
+const muiTheme = createTheme();
+
+export function createComponents(config) {
+ const { palette } = config;
+
+ return {
+ MuiAvatar: {
+ styleOverrides: {
+ root: {
+ fontSize: 14,
+ fontWeight: 600,
+ letterSpacing: 0
+ }
+ }
+ },
+ MuiButton: {
+ styleOverrides: {
+ root: {
+ borderRadius: '12px',
+ textTransform: 'none'
+ },
+ sizeSmall: {
+ padding: '6px 16px'
+ },
+ sizeMedium: {
+ padding: '8px 20px'
+ },
+ sizeLarge: {
+ padding: '11px 24px'
+ },
+ textSizeSmall: {
+ padding: '7px 12px'
+ },
+ textSizeMedium: {
+ padding: '9px 16px'
+ },
+ textSizeLarge: {
+ padding: '12px 16px'
+ }
+ }
+ },
+ MuiCard: {
+ styleOverrides: {
+ root: {
+ borderRadius: 20,
+ [`&.${paperClasses.elevation1}`]: {
+ boxShadow: '0px 5px 22px rgba(0, 0, 0, 0.04), 0px 0px 0px 0.5px rgba(0, 0, 0, 0.03)'
+ }
+ }
+ }
+ },
+ MuiCardContent: {
+ styleOverrides: {
+ root: {
+ padding: '32px 24px',
+ '&:last-child': {
+ paddingBottom: '32px'
+ }
+ }
+ }
+ },
+ MuiCardHeader: {
+ defaultProps: {
+ titleTypographyProps: {
+ variant: 'h6'
+ },
+ subheaderTypographyProps: {
+ variant: 'body2'
+ }
+ },
+ styleOverrides: {
+ root: {
+ padding: '32px 24px 16px'
+ }
+ }
+ },
+ MuiCssBaseline: {
+ styleOverrides: {
+ '*': {
+ boxSizing: 'border-box'
+ },
+ html: {
+ MozOsxFontSmoothing: 'grayscale',
+ WebkitFontSmoothing: 'antialiased',
+ display: 'flex',
+ flexDirection: 'column',
+ minHeight: '100%',
+ width: '100%'
+ },
+ body: {
+ display: 'flex',
+ flex: '1 1 auto',
+ flexDirection: 'column',
+ minHeight: '100%',
+ width: '100%'
+ },
+ '#__next': {
+ display: 'flex',
+ flex: '1 1 auto',
+ flexDirection: 'column',
+ height: '100%',
+ width: '100%'
+ },
+ '#nprogress': {
+ pointerEvents: 'none'
+ },
+ '#nprogress .bar': {
+ backgroundColor: palette.primary.main,
+ height: 3,
+ left: 0,
+ position: 'fixed',
+ top: 0,
+ width: '100%',
+ zIndex: 2000
+ }
+ }
+ },
+ MuiInputBase: {
+ styleOverrides: {
+ input: {
+ '&::placeholder': {
+ opacity: 1
+ }
+ }
+ }
+ },
+ MuiInput: {
+ styleOverrides: {
+ input: {
+ fontSize: 14,
+ fontWeight: 500,
+ lineHeight: '24px',
+ '&::placeholder': {
+ color: palette.text.secondary
+ }
+ }
+ }
+ },
+ MuiFilledInput: {
+ styleOverrides: {
+ root: {
+ backgroundColor: 'transparent',
+ borderRadius: 8,
+ borderStyle: 'solid',
+ borderWidth: 1,
+ overflow: 'hidden',
+ borderColor: palette.neutral[200],
+ transition: muiTheme.transitions.create([
+ 'border-color',
+ 'box-shadow'
+ ]),
+ '&:hover': {
+ backgroundColor: palette.action.hover
+ },
+ '&:before': {
+ display: 'none'
+ },
+ '&:after': {
+ display: 'none'
+ },
+ [`&.${filledInputClasses.disabled}`]: {
+ backgroundColor: 'transparent'
+ },
+ [`&.${filledInputClasses.focused}`]: {
+ backgroundColor: 'transparent',
+ borderColor: palette.primary.main,
+ boxShadow: `${palette.primary.main} 0 0 0 2px`
+ },
+ [`&.${filledInputClasses.error}`]: {
+ borderColor: palette.error.main,
+ boxShadow: `${palette.error.main} 0 0 0 2px`
+ }
+ },
+ input: {
+ fontSize: 14,
+ fontWeight: 500,
+ lineHeight: '24px'
+ }
+ }
+ },
+ MuiOutlinedInput: {
+ styleOverrides: {
+ root: {
+ '&:hover': {
+ backgroundColor: palette.action.hover,
+ [`& .${outlinedInputClasses.notchedOutline}`]: {
+ borderColor: palette.neutral[200]
+ }
+ },
+ [`&.${outlinedInputClasses.focused}`]: {
+ backgroundColor: 'transparent',
+ [`& .${outlinedInputClasses.notchedOutline}`]: {
+ borderColor: palette.primary.main,
+ boxShadow: `${palette.primary.main} 0 0 0 2px`
+ }
+ },
+ [`&.${filledInputClasses.error}`]: {
+ [`& .${outlinedInputClasses.notchedOutline}`]: {
+ borderColor: palette.error.main,
+ boxShadow: `${palette.error.main} 0 0 0 2px`
+ }
+ }
+ },
+ input: {
+ fontSize: 14,
+ fontWeight: 500,
+ lineHeight: '24px',
+ },
+ notchedOutline: {
+ borderColor: palette.neutral[200],
+ transition: muiTheme.transitions.create([
+ 'border-color',
+ 'box-shadow'
+ ])
+ }
+ }
+ },
+ MuiFormLabel: {
+ styleOverrides: {
+ root: {
+ fontSize: 14,
+ fontWeight: 500,
+ [`&.${inputLabelClasses.filled}`]: {
+ transform: 'translate(12px, 18px) scale(1)'
+ },
+ [`&.${inputLabelClasses.shrink}`]: {
+ [`&.${inputLabelClasses.standard}`]: {
+ transform: 'translate(0, -1.5px) scale(0.85)'
+ },
+ [`&.${inputLabelClasses.filled}`]: {
+ transform: 'translate(12px, 6px) scale(0.85)'
+ },
+ [`&.${inputLabelClasses.outlined}`]: {
+ transform: 'translate(14px, -9px) scale(0.85)'
+ }
+ }
+ }
+ }
+ },
+ MuiTab: {
+ styleOverrides: {
+ root: {
+ fontSize: 14,
+ fontWeight: 500,
+ lineHeight: 1.71,
+ minWidth: 'auto',
+ paddingLeft: 0,
+ paddingRight: 0,
+ textTransform: 'none',
+ '& + &': {
+ marginLeft: 24
+ }
+ }
+ }
+ },
+ MuiTableCell: {
+ styleOverrides: {
+ root: {
+ borderBottomColor: palette.divider,
+ padding: '15px 16px'
+ }
+ }
+ },
+ MuiTableHead: {
+ styleOverrides: {
+ root: {
+ borderBottom: 'none',
+ [`& .${tableCellClasses.root}`]: {
+ borderBottom: 'none',
+ backgroundColor: palette.neutral[50],
+ color: palette.neutral[700],
+ fontSize: 12,
+ fontWeight: 600,
+ lineHeight: 1,
+ letterSpacing: 0.5,
+ textTransform: 'uppercase'
+ },
+ [`& .${tableCellClasses.paddingCheckbox}`]: {
+ paddingTop: 4,
+ paddingBottom: 4
+ }
+ }
+ }
+ },
+ MuiTextField: {
+ defaultProps: {
+ variant: 'filled'
+ }
+ }
+ };
+}
diff --git a/src/theme/create-palette.js b/src/theme/create-palette.js
new file mode 100644
index 0000000..b7c74d7
--- /dev/null
+++ b/src/theme/create-palette.js
@@ -0,0 +1,33 @@
+import { common } from '@mui/material/colors';
+import { alpha } from '@mui/material/styles';
+import { error, indigo, info, neutral, success, warning } from './colors';
+
+export function createPalette() {
+ return {
+ action: {
+ active: neutral[500],
+ disabled: alpha(neutral[900], 0.38),
+ disabledBackground: alpha(neutral[900], 0.12),
+ focus: alpha(neutral[900], 0.16),
+ hover: alpha(neutral[900], 0.04),
+ selected: alpha(neutral[900], 0.12)
+ },
+ background: {
+ default: common.white,
+ paper: common.white
+ },
+ divider: '#F2F4F7',
+ error,
+ info,
+ mode: 'light',
+ neutral,
+ primary: indigo,
+ success,
+ text: {
+ primary: neutral[900],
+ secondary: neutral[500],
+ disabled: alpha(neutral[900], 0.38)
+ },
+ warning
+ };
+}
diff --git a/src/theme/create-shadows.js b/src/theme/create-shadows.js
new file mode 100644
index 0000000..22d70a5
--- /dev/null
+++ b/src/theme/create-shadows.js
@@ -0,0 +1,29 @@
+export const createShadows = () => {
+ return [
+ 'none',
+ '0px 1px 2px rgba(0, 0, 0, 0.08)',
+ '0px 1px 5px rgba(0, 0, 0, 0.08)',
+ '0px 1px 8px rgba(0, 0, 0, 0.08)',
+ '0px 1px 10px rgba(0, 0, 0, 0.08)',
+ '0px 1px 14px rgba(0, 0, 0, 0.08)',
+ '0px 1px 18px rgba(0, 0, 0, 0.08)',
+ '0px 2px 16px rgba(0, 0, 0, 0.08)',
+ '0px 3px 14px rgba(0, 0, 0, 0.08)',
+ '0px 3px 16px rgba(0, 0, 0, 0.08)',
+ '0px 4px 18px rgba(0, 0, 0, 0.08)',
+ '0px 4px 20px rgba(0, 0, 0, 0.08)',
+ '0px 5px 22px rgba(0, 0, 0, 0.08)',
+ '0px 5px 24px rgba(0, 0, 0, 0.08)',
+ '0px 5px 26px rgba(0, 0, 0, 0.08)',
+ '0px 6px 28px rgba(0, 0, 0, 0.08)',
+ '0px 6px 30px rgba(0, 0, 0, 0.08)',
+ '0px 6px 32px rgba(0, 0, 0, 0.08)',
+ '0px 7px 34px rgba(0, 0, 0, 0.08)',
+ '0px 7px 36px rgba(0, 0, 0, 0.08)',
+ '0px 8px 38px rgba(0, 0, 0, 0.08)',
+ '0px 8px 40px rgba(0, 0, 0, 0.08)',
+ '0px 8px 42px rgba(0, 0, 0, 0.08)',
+ '0px 9px 44px rgba(0, 0, 0, 0.08)',
+ '0px 9px 46px rgba(0, 0, 0, 0.08)'
+ ];
+};
diff --git a/src/theme/create-typography.js b/src/theme/create-typography.js
new file mode 100644
index 0000000..1bc601a
--- /dev/null
+++ b/src/theme/create-typography.js
@@ -0,0 +1,76 @@
+export const createTypography = () => {
+ return {
+ fontFamily: '"Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"',
+ body1: {
+ fontSize: '1rem',
+ fontWeight: 400,
+ lineHeight: 1.5
+ },
+ body2: {
+ fontSize: '0.875rem',
+ fontWeight: 400,
+ lineHeight: 1.57
+ },
+ button: {
+ fontWeight: 600
+ },
+ caption: {
+ fontSize: '0.75rem',
+ fontWeight: 500,
+ lineHeight: 1.66
+ },
+ subtitle1: {
+ fontSize: '1rem',
+ fontWeight: 500,
+ lineHeight: 1.57
+ },
+ subtitle2: {
+ fontSize: '0.875rem',
+ fontWeight: 500,
+ lineHeight: 1.57
+ },
+ overline: {
+ fontSize: '0.75rem',
+ fontWeight: 600,
+ letterSpacing: '0.5px',
+ lineHeight: 2.5,
+ textTransform: 'uppercase'
+ },
+ h1: {
+ fontFamily: '\'Plus Jakarta Sans\', sans-serif',
+ fontWeight: 700,
+ fontSize: '3.5rem',
+ lineHeight: 1.2
+ },
+ h2: {
+ fontFamily: '\'Plus Jakarta Sans\', sans-serif',
+ fontWeight: 700,
+ fontSize: '3rem',
+ lineHeight: 1.2
+ },
+ h3: {
+ fontFamily: '\'Plus Jakarta Sans\', sans-serif',
+ fontWeight: 700,
+ fontSize: '2.25rem',
+ lineHeight: 1.2
+ },
+ h4: {
+ fontFamily: '\'Plus Jakarta Sans\', sans-serif',
+ fontWeight: 700,
+ fontSize: '2rem',
+ lineHeight: 1.2
+ },
+ h5: {
+ fontFamily: '\'Plus Jakarta Sans\', sans-serif',
+ fontWeight: 700,
+ fontSize: '1.5rem',
+ lineHeight: 1.2
+ },
+ h6: {
+ fontFamily: '\'Plus Jakarta Sans\', sans-serif',
+ fontWeight: 700,
+ fontSize: '1.125rem',
+ lineHeight: 1.2
+ }
+ };
+};
diff --git a/src/theme/index.js b/src/theme/index.js
new file mode 100644
index 0000000..62a3569
--- /dev/null
+++ b/src/theme/index.js
@@ -0,0 +1,31 @@
+import { createTheme as createMuiTheme } from '@mui/material';
+import { createPalette } from './create-palette';
+import { createComponents } from './create-components';
+import { createShadows } from './create-shadows';
+import { createTypography } from './create-typography';
+
+export function createTheme() {
+ const palette = createPalette();
+ const components = createComponents({ palette });
+ const shadows = createShadows();
+ const typography = createTypography();
+
+ return createMuiTheme({
+ breakpoints: {
+ values: {
+ xs: 0,
+ sm: 600,
+ md: 900,
+ lg: 1200,
+ xl: 1440
+ }
+ },
+ components,
+ palette,
+ shadows,
+ shape: {
+ borderRadius: 8
+ },
+ typography
+ });
+}
diff --git a/src/utils/apply-pagination.js b/src/utils/apply-pagination.js
new file mode 100644
index 0000000..3b85447
--- /dev/null
+++ b/src/utils/apply-pagination.js
@@ -0,0 +1,3 @@
+export function applyPagination(documents, page, rowsPerPage) {
+ return documents.slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage);
+}
\ No newline at end of file
diff --git a/src/utils/create-emotion-cache.js b/src/utils/create-emotion-cache.js
new file mode 100644
index 0000000..72819c6
--- /dev/null
+++ b/src/utils/create-emotion-cache.js
@@ -0,0 +1,5 @@
+import createCache from '@emotion/cache';
+
+export const createEmotionCache = () => {
+ return createCache({ key: 'css' });
+};
diff --git a/src/utils/create-resource-id.js b/src/utils/create-resource-id.js
new file mode 100644
index 0000000..30065ce
--- /dev/null
+++ b/src/utils/create-resource-id.js
@@ -0,0 +1,5 @@
+export const createResourceId = () => {
+ const arr = new Uint8Array(12);
+ window.crypto.getRandomValues(arr);
+ return Array.from(arr, (v) => v.toString(16).padStart(2, '0')).join('');
+};
diff --git a/src/utils/get-initials.js b/src/utils/get-initials.js
new file mode 100644
index 0000000..84d62a7
--- /dev/null
+++ b/src/utils/get-initials.js
@@ -0,0 +1,6 @@
+export const getInitials = (name = '') => name
+ .replace(/\s+/, ' ')
+ .split(' ')
+ .slice(0, 2)
+ .map((v) => v && v[0].toUpperCase())
+ .join('');
diff --git a/tailwind.config.ts b/tailwind.config.ts
deleted file mode 100644
index 1af3b8f..0000000
--- a/tailwind.config.ts
+++ /dev/null
@@ -1,20 +0,0 @@
-import type { Config } from 'tailwindcss'
-
-const config: Config = {
- content: [
- './src/pages/**/*.{js,ts,jsx,tsx,mdx}',
- './src/components/**/*.{js,ts,jsx,tsx,mdx}',
- './src/app/**/*.{js,ts,jsx,tsx,mdx}',
- ],
- theme: {
- extend: {
- backgroundImage: {
- 'gradient-radial': 'radial-gradient(var(--tw-gradient-stops))',
- 'gradient-conic':
- 'conic-gradient(from 180deg at 50% 50%, var(--tw-gradient-stops))',
- },
- },
- },
- plugins: [],
-}
-export default config