diff --git a/index.html b/index.html
index 7f2abc5..955206c 100644
--- a/index.html
+++ b/index.html
@@ -2,9 +2,9 @@
-
+
- Vite + React
+ Skillov.ai
diff --git a/package-lock.json b/package-lock.json
index 3384e4f..cfc4841 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -10,13 +10,16 @@
"dependencies": {
"@emotion/react": "^11.14.0",
"@emotion/styled": "^11.14.0",
+ "@mui/icons-material": "^6.4.1",
"@mui/material": "^6.4.1",
"@reduxjs/toolkit": "^2.5.1",
"axios": "^1.7.9",
+ "formik": "^2.4.6",
"react": "^18.3.1",
"react-dom": "^18.3.1",
"react-redux": "^9.2.0",
- "react-router-dom": "^7.1.3"
+ "react-router-dom": "^7.1.3",
+ "yup": "^1.6.1"
},
"devDependencies": {
"@eslint/js": "^9.17.0",
@@ -1171,6 +1174,32 @@
"url": "https://opencollective.com/mui-org"
}
},
+ "node_modules/@mui/icons-material": {
+ "version": "6.4.1",
+ "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-6.4.1.tgz",
+ "integrity": "sha512-wsxFcUTQxt4s+7Bg4GgobqRjyaHLmZGNOs+HJpbwrwmLbT6mhIJxhpqsKzzWq9aDY8xIe7HCjhpH7XI5UD6teA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.26.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mui-org"
+ },
+ "peerDependencies": {
+ "@mui/material": "^6.4.1",
+ "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0",
+ "react": "^17.0.0 || ^18.0.0 || ^19.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
"node_modules/@mui/material": {
"version": "6.4.1",
"resolved": "https://registry.npmjs.org/@mui/material/-/material-6.4.1.tgz",
@@ -1735,6 +1764,16 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/@types/hoist-non-react-statics": {
+ "version": "3.3.6",
+ "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.6.tgz",
+ "integrity": "sha512-lPByRJUer/iN/xa4qpyL0qmL11DqNW81iU/IG1S3uvRUq4oKagz8VCxZjiWkumgt66YT3vOdDgZ0o32sGKtCEw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/react": "*",
+ "hoist-non-react-statics": "^3.3.0"
+ }
+ },
"node_modules/@types/json-schema": {
"version": "7.0.15",
"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
@@ -2422,6 +2461,15 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/deepmerge": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.2.1.tgz",
+ "integrity": "sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/define-data-property": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
@@ -3093,6 +3141,31 @@
"node": ">= 6"
}
},
+ "node_modules/formik": {
+ "version": "2.4.6",
+ "resolved": "https://registry.npmjs.org/formik/-/formik-2.4.6.tgz",
+ "integrity": "sha512-A+2EI7U7aG296q2TLGvNapDNTZp1khVt5Vk0Q/fyfSROss0V/V6+txt2aJnwEos44IxTCW/LYAi/zgWzlevj+g==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://opencollective.com/formik"
+ }
+ ],
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@types/hoist-non-react-statics": "^3.3.1",
+ "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": "^2.0.0"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0"
+ }
+ },
"node_modules/fsevents": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
@@ -3972,6 +4045,18 @@
"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==",
+ "license": "MIT"
+ },
+ "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==",
+ "license": "MIT"
+ },
"node_modules/lodash.merge": {
"version": "4.6.2",
"resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
@@ -4389,6 +4474,12 @@
"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==",
+ "license": "MIT"
+ },
"node_modules/proxy-from-env": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
@@ -4430,6 +4521,12 @@
"react": "^18.3.1"
}
},
+ "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==",
+ "license": "MIT"
+ },
"node_modules/react-is": {
"version": "16.13.1",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
@@ -5051,6 +5148,30 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "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==",
+ "license": "MIT"
+ },
+ "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==",
+ "license": "MIT"
+ },
+ "node_modules/toposort": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz",
+ "integrity": "sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==",
+ "license": "MIT"
+ },
+ "node_modules/tslib": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "license": "0BSD"
+ },
"node_modules/turbo-stream": {
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/turbo-stream/-/turbo-stream-2.4.0.tgz",
@@ -5070,6 +5191,18 @@
"node": ">= 0.8.0"
}
},
+ "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==",
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=12.20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/typed-array-buffer": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz",
@@ -5437,6 +5570,18 @@
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
+ },
+ "node_modules/yup": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/yup/-/yup-1.6.1.tgz",
+ "integrity": "sha512-JED8pB50qbA4FOkDol0bYF/p60qSEDQqBD0/qeIrUCG1KbPBIQ776fCUNb9ldbPcSTxA69g/47XTo4TqWiuXOA==",
+ "license": "MIT",
+ "dependencies": {
+ "property-expr": "^2.0.5",
+ "tiny-case": "^1.0.3",
+ "toposort": "^2.0.2",
+ "type-fest": "^2.19.0"
+ }
}
}
}
diff --git a/package.json b/package.json
index e8c9537..47afaef 100644
--- a/package.json
+++ b/package.json
@@ -12,13 +12,16 @@
"dependencies": {
"@emotion/react": "^11.14.0",
"@emotion/styled": "^11.14.0",
+ "@mui/icons-material": "^6.4.1",
"@mui/material": "^6.4.1",
"@reduxjs/toolkit": "^2.5.1",
"axios": "^1.7.9",
+ "formik": "^2.4.6",
"react": "^18.3.1",
"react-dom": "^18.3.1",
"react-redux": "^9.2.0",
- "react-router-dom": "^7.1.3"
+ "react-router-dom": "^7.1.3",
+ "yup": "^1.6.1"
},
"devDependencies": {
"@eslint/js": "^9.17.0",
diff --git a/src/App.jsx b/src/App.jsx
index 2a7ff79..a280b4c 100644
--- a/src/App.jsx
+++ b/src/App.jsx
@@ -11,20 +11,20 @@ import { darkTheme, lightTheme } from './theme';
const App = () => {
const [darkMode, setDarkMode] = useState(false);
- const toggleDarkMode = () => setDarkMode(!darkMode);
+ // const toggleDarkMode = () => setDarkMode(!darkMode);
return (
-
+ */}
} />
} />
diff --git a/src/assets/fav1.png b/src/assets/fav1.png
new file mode 100644
index 0000000..14fdf19
Binary files /dev/null and b/src/assets/fav1.png differ
diff --git a/src/assets/favicon.jpg b/src/assets/favicon.jpg
deleted file mode 100644
index 6056ca3..0000000
Binary files a/src/assets/favicon.jpg and /dev/null differ
diff --git a/src/assets/index.js b/src/assets/index.js
new file mode 100644
index 0000000..5a62e86
--- /dev/null
+++ b/src/assets/index.js
@@ -0,0 +1,3 @@
+import interviewImg from './interviewImg.jpeg';
+import skillovLogo from './fav1.png'
+export { interviewImg, skillovLogo };
\ No newline at end of file
diff --git a/src/assets/interviewImg.jpeg b/src/assets/interviewImg.jpeg
new file mode 100644
index 0000000..2144366
Binary files /dev/null and b/src/assets/interviewImg.jpeg differ
diff --git a/src/assets/react.svg b/src/assets/react.svg
deleted file mode 100644
index 6c87de9..0000000
--- a/src/assets/react.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src/pages/LoginPage.jsx b/src/pages/LoginPage.jsx
index e565ac8..2190c80 100644
--- a/src/pages/LoginPage.jsx
+++ b/src/pages/LoginPage.jsx
@@ -1,52 +1,168 @@
-import React, { useState } from 'react';
-import { useDispatch } from 'react-redux';
-import { loginSuccess, setError } from '../features/auth/authSlice';
-import { Box, Button, TextField, Typography, Alert } from '@mui/material';
+import React, { useState } from "react";
+import { Box, Button, Typography, Stack, InputLabel, OutlinedInput, InputAdornment, IconButton, FormControlLabel, Checkbox } from "@mui/material";
+import Grid from "@mui/material/Grid2";
+import { interviewImg } from "../assets/index";
+import RemoveRedEyeOutlinedIcon from '@mui/icons-material/RemoveRedEyeOutlined';
+import VisibilityOffOutlinedIcon from '@mui/icons-material/VisibilityOffOutlined';
+import { Formik } from "formik";
+import { Link } from "react-router-dom";
const LoginPage = () => {
- const [email, setEmail] = useState('');
- const [password, setPassword] = useState('');
- const [error, setErrorState] = useState(null);
- const dispatch = useDispatch();
+ // States
+ const [showPassword, setShowPassword] = useState(false);
+ const [checked, setChecked] = useState(false);
- const handleLogin = () => {
- if (!email || !password) {
- setErrorState('Email and Password are required.');
- return;
- }
- // Simulate login API call
- try {
- dispatch(loginSuccess({ email })); // Replace with actual API response
- } catch (err) {
- dispatch(setError(err.message));
- setErrorState('Invalid credentials.');
- }
+ // Functions
+ const handleClickShowPassword = () => {
+ const input = document.getElementById('password-login');
+ const cursorPosition = input.selectionStart;
+ setShowPassword((prev) => !prev);
+ setTimeout(() => {
+ input.focus();
+ input.setSelectionRange(cursorPosition, cursorPosition);
+ }, 0);
};
return (
-
- Login
- {error && {error}}
- setEmail(e.target.value)}
- />
- setPassword(e.target.value)}
- />
-
-
+
+ {/* Left Side (Image Section) */}
+
+
+ {/* Right Side (Login Form Section) */}
+
+
+
+ Welcome to Skillov.ai
+
+
+ {
+ ({ values, errors, touched, handleChange, handleBlur, handleSubmit, isSubmitting }) => (
+
+ )
+ }
+
+
+
+ Don't have an account? Create an account
+
+
+
+
+
);
};
diff --git a/src/theme.js b/src/theme.js
index 6219be2..2c0e64f 100644
--- a/src/theme.js
+++ b/src/theme.js
@@ -4,10 +4,10 @@ const lightTheme = createTheme({
palette: {
mode: 'light',
primary: {
- main: '#2196f3', // Light Blue
+ main: '#B2A5FF', // Light purple
},
secondary: {
- main: '#90caf9', // Lighter Blue
+ main: '#DAD2FF', // Lighter purple
},
background: {
default: '#f5f5f5', // Light Gray
@@ -27,10 +27,10 @@ const darkTheme = createTheme({
palette: {
mode: 'dark',
primary: {
- main: '#2196f3', // Light Blue
+ main: '#B2A5FF', // Light purple
},
secondary: {
- main: '#64b5f6', // Slightly Lighter Blue
+ main: '#DAD2FF', // Slightly Lighter purple
},
background: {
default: '#121212', // Black