diff --git a/.env b/.env
new file mode 100644
index 00000000..49d2ddb9
--- /dev/null
+++ b/.env
@@ -0,0 +1,3 @@
+NODE_ENV=development
+PORT=5000
+MONGO_URI=mongodb://localhost:27017/
\ No newline at end of file
diff --git a/client/public/bg.png b/client/public/bg.png
new file mode 100644
index 00000000..4ad073d8
Binary files /dev/null and b/client/public/bg.png differ
diff --git a/client/src/asset/brand/logo.png b/client/public/logo.png
similarity index 100%
rename from client/src/asset/brand/logo.png
rename to client/public/logo.png
diff --git a/client/src/app/App.js b/client/src/app/App.js
index de73873c..a69bee9c 100644
--- a/client/src/app/App.js
+++ b/client/src/app/App.js
@@ -1,6 +1,5 @@
-import { BrowserRouter as Router, Route, Routes } from 'react-router-dom';
+import { BrowserRouter as Router, Route, Routes, useLocation } from 'react-router-dom';
import { useState, useEffect } from "react";
-
import Loader from "../components/Loader/loader.js";
import './App.css';
import 'bootstrap/dist/css/bootstrap.min.css';
@@ -19,7 +18,10 @@ import Login from '../components/Authentication/Login/Login';
import Register from '../components/Authentication/Register/Register';
import Wishlist from '../components/Wishlist';
import WishItemsProvider from '../Context/WishItemsProvider';
+<<<<<<< HEAD
+=======
// import Checkout from '../components/Checkout/Checkout';
+>>>>>>> upstream/main
import SearchProvider from '../Context/SearchProvider';
import Toaster from '../components/Toaster/toaster';
import { ThemeProvider } from '../Context/ThemeContext';
@@ -31,8 +33,77 @@ import ShippingPage from '../Pages/Footer/Shipping/Shipping.js';
import TermsConditions from '../components/Legal/TermsConditions/TermsConditions';
import PrivacyPolicy from '../components/Legal/PrivacyPolicy/PrivacyPolicy';
+<<<<<<< HEAD
+// Minimal Header for login/register (logo left aligned)
+const MinimalHeader = () => (
+
+ {/* Make sure logo.png is in public folder */}
+

+
+);
+
+function AppContent() {
+ const location = useLocation();
+
+ // Detect if we are on login or register page
+ const isAuthPage =
+ location.pathname.startsWith("/account/login") ||
+ location.pathname.startsWith("/account/register");
+
+ return (
+
+ {/* Show minimal header on auth pages, full header elsewhere */}
+ {isAuthPage ? : }
+
+
+
+ } />
+
+ } />
+ } />
+ } />
+ } />
+ } />
+
+ } />
+
+ } />
+
+
+
+ } />
+
+
+ } />
+
+
+ } />
+
+
+ } />
+
+
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+
+
+
+ {/* Footer visible on all pages */}
+
+
+ );
+}
+=======
// ✅ Import RecentlyViewedSection
import RecentlyViewedSection from '../components/RecentlyViewedSection';
+>>>>>>> upstream/main
function App() {
const [loading, setLoading] = useState(true);
@@ -70,6 +141,9 @@ function App() {
+<<<<<<< HEAD
+
+=======
} />
@@ -105,6 +179,7 @@ function App() {
+>>>>>>> upstream/main
diff --git a/client/src/components/Authentication/Login/Login.css b/client/src/components/Authentication/Login/Login.css
index 5a7a0c2f..d04ba905 100644
--- a/client/src/components/Authentication/Login/Login.css
+++ b/client/src/components/Authentication/Login/Login.css
@@ -1,11 +1,11 @@
/* ==== Container for the entire login page ==== */
.login__auth__container {
- min-height: calc(120vh - 20px); /* subtract header height */
+ min-height: calc(100vh - 80px); /* Subtract header height */
display: flex;
justify-content: center;
- align-items: center;
+ align-items: center; /* Vertically center */
padding: 2rem;
- background-color: var(--bg-primary);
+background: url('c:\Users\nandh\AppData\Local\Packages\5319275A.WhatsAppDesktop_cv1g1gvanyjgm\TempState\95D40515D78B92D75F485224D51A7EA6\WhatsApp Image 2025-08-08 at 14.02.31_1a0af9da.jpg') no-repeat center center/cover;
box-sizing: border-box;
}
@@ -19,9 +19,11 @@
width: 100%;
max-width: 400px;
padding: 2.5rem;
- background-color: var(--bg-secondary);
+ background: rgba(255, 255, 255, 0.15); /* Transparent background */
+ backdrop-filter: blur(10px); /* Glass effect */
border-radius: 10px;
box-shadow: var(--shadow);
+ border: 1px solid rgba(255, 255, 255, 0.2);
transition: transform 0.3s ease;
}
@@ -74,6 +76,23 @@
border-color: var(--accent-color);
}
+/* ==== Password field with eye icon ==== */
+.password__container {
+ position: relative;
+}
+
+.toggle-password {
+ position: absolute;
+ top: 35px;
+ right: 12px;
+ cursor: pointer;
+ color: var(--text-muted);
+}
+
+.toggle-password:hover {
+ color: var(--accent-color);
+}
+
/* ==== Login Button Container ==== */
.login__button__container {
margin-top: 1.5rem;
@@ -151,4 +170,3 @@
color: inherit;
text-decoration: none;
}
-
diff --git a/client/src/components/Authentication/Login/Login.js b/client/src/components/Authentication/Login/Login.js
index e80b850b..148e9e21 100644
--- a/client/src/components/Authentication/Login/Login.js
+++ b/client/src/components/Authentication/Login/Login.js
@@ -3,30 +3,29 @@ import LoginCard from '../../Card/LoginCard/LoginCard';
import './Login.css';
import { FcGoogle } from 'react-icons/fc';
import { FaGithub } from 'react-icons/fa';
+import { FaEye, FaEyeSlash } from 'react-icons/fa';
import { supabase } from '../../../lib/supabase';
import { useNavigate } from 'react-router-dom';
import axios from 'axios';
const Login = () => {
-
const [email, setEmail] = useState('');
const [password, setPassword] = useState('');
+ const [showPassword, setShowPassword] = useState(false);
const navigate = useNavigate();
const handleLogin = async (e) => {
- e.preventDefault();
- try {
- const response = await axios.post(`${process.env.REACT_APP_BACKEND_URL}/api/auth/login`, { email, password });
- localStorage.setItem('token', response.data.token); // Store JWT token
- alert('Login successful!');
- navigate('/account/me'); // Navigate to account page after login
- } catch (error) {
- const errorMessage = error.response ? error.response.data.message : error.message;
- alert(`Login failed: ${errorMessage}`);
- }
- };
-
-
+ e.preventDefault();
+ try {
+ const response = await axios.post(`${process.env.REACT_APP_BACKEND_URL}/api/auth/login`, { email, password });
+ localStorage.setItem('token', response.data.token); // Store JWT token
+ alert('Login successful!');
+ navigate('/account/me'); // Navigate to account page after login
+ } catch (error) {
+ const errorMessage = error.response ? error.response.data.message : error.message;
+ alert(`Login failed: ${errorMessage}`);
+ }
+ };
const handleOAuthLogin = async (provider) => {
const { error } = await supabase.auth.signInWithOAuth({
@@ -47,6 +46,11 @@ const Login = () => {
{/* OAuth icons row */}
+ {/*

*/}
@@ -63,12 +66,39 @@ const Login = () => {
{/* Email/password form */}
@@ -76,5 +106,3 @@ const Login = () => {
};
export default Login;
-
-
diff --git a/client/src/components/Nav/Container/Container.css b/client/src/components/Nav/Container/Container.css
index 12974a4e..e3707ecf 100644
--- a/client/src/components/Nav/Container/Container.css
+++ b/client/src/components/Nav/Container/Container.css
@@ -4,15 +4,15 @@
align-items: center;
justify-content: space-between;
padding: 0 20px;
- flex-wrap: wrap; /* allow wrapping instead of pushing off-screen */
+ height: auto !important; /* allow logo to grow */
}
-.mbox{
+.nav__container {
display: flex;
- margin-right: 0.8rem;
- padding-top: 6px;
- padding-bottom: 8px;
+ align-items: center;
+ justify-content: space-between;
+ width: 100%;
}
-/* Search form container adjustments */
+
.form__container {
flex: 1;
min-width: 150px; /* prevent search bar from shrinking too far */
@@ -25,15 +25,19 @@
flex-shrink: 0; /* prevent it from being squeezed out */
}
-/* Mobile-specific tweaks */
+/* Mobile adjustments */
@media (max-width: 768px) {
.top__container {
padding: 6px;
flex-wrap: nowrap; /* keep them in one line */
}
.form__container {
- flex: 1;
- padding: 2px;
- margin: 0 10px;
+ padding: 10px 0;
+ }
+ .drawer {
+ margin-left: auto;
+ }
+ .top__container {
+ padding: 8px;
}
}
diff --git a/client/src/components/Nav/Container/Container.js b/client/src/components/Nav/Container/Container.js
index d5bab42e..2683d6ee 100644
--- a/client/src/components/Nav/Container/Container.js
+++ b/client/src/components/Nav/Container/Container.js
@@ -3,7 +3,6 @@ import DrawerNav from '../DrawerNav/DrawerNav';
import NavBrand from '../Nav-Brand/Navbrand';
import Form from '../Search-Bar/Form';
import './Container.css';
-import Box from '@mui/material/Box';
import useMediaQuery from '@mui/material/useMediaQuery';
const Navtop = () => {
@@ -28,6 +27,16 @@ const Navtop = () => {
)}
+<<<<<<< HEAD
+
+ {/* Mobile Search */}
+ {isSmallScreen && (
+
+
+
+ )}
+=======
+>>>>>>> upstream/main
{/* Mobile Hamburger */}
{isSmallScreen && (
@@ -36,6 +45,8 @@ const Navtop = () => {
)}
+<<<<<<< HEAD
+=======
{isSmallScreen && (
@@ -48,6 +59,7 @@ const Navtop = () => {
)}
+>>>>>>> upstream/main
);
};
diff --git a/client/src/components/Nav/Nav-Brand/NavBrand.css b/client/src/components/Nav/Nav-Brand/NavBrand.css
index 3e42be30..f430a9bf 100644
--- a/client/src/components/Nav/Nav-Brand/NavBrand.css
+++ b/client/src/components/Nav/Nav-Brand/NavBrand.css
@@ -1,38 +1,29 @@
-.navbrand {
- height: 8rem; /* default desktop size */
+.navbrand__container {
+ display: flex;
+ align-items: center;
+ justify-content: flex-start; /* left align */
+ cursor: pointer;
+ height: auto !important; /* override parent restrictions */
}
-.navbrand img {
- height: 8rem;
- cursor: pointer;
+.navbrand__logo {
+ height: 120px !important; /* force bigger size */
+ width: auto !important;
+ max-height: none !important;
transition: transform 0.3s ease;
}
-/* Hover effect */
-.navbrand img:hover {
+.navbrand__logo:hover {
transform: scale(1.05);
}
-/* Dark mode compatibility */
-.dark-mode .navbrand img {
+/* Dark mode support */
+.dark-mode .navbrand__logo {
filter: brightness(0) invert(1) contrast(1.5) saturate(1.1);
}
-/* Mobile adjustments */
@media (max-width: 768px) {
- .navbrand__container {
- height: 60px;
- display: flex;
- align-items: flex-start; /* push logo toward top */
- padding-bottom: 8px; /* small upward nudge */
- margin-top: -44px; /* slight upward shift */
- }
-
- .navbrand {
- height: 5.5rem;
- }
-
- .navbrand img {
- height: 7rem;
+ .navbrand__logo {
+ height: 80px !important; /* mobile size */
}
}
diff --git a/client/src/components/Nav/Nav-Brand/Navbrand.js b/client/src/components/Nav/Nav-Brand/Navbrand.js
index df35e3dc..34449689 100644
--- a/client/src/components/Nav/Nav-Brand/Navbrand.js
+++ b/client/src/components/Nav/Nav-Brand/Navbrand.js
@@ -1,13 +1,16 @@
+import { useNavigate } from 'react-router-dom';
import './NavBrand.css';
-import { Link } from 'react-router-dom';
-import logo from '../../../asset/brand/logo.png';
const NavBrand = () => {
+ const navigate = useNavigate();
+
return (
-
-
-

-
+
navigate('/')}>
+
);
};
diff --git a/client/src/components/Nav/Nav-Links/NavLinks.js b/client/src/components/Nav/Nav-Links/NavLinks.js
index c895fe5c..1ad3353b 100644
--- a/client/src/components/Nav/Nav-Links/NavLinks.js
+++ b/client/src/components/Nav/Nav-Links/NavLinks.js
@@ -1,15 +1,16 @@
-import { Link } from 'react-router-dom';
-import { useLocation } from 'react-router-dom';
+import { Link, useLocation } from 'react-router-dom';
import './NavLinks.css';
import useMediaQuery from '@mui/material/useMediaQuery';
const NavLinks = () => {
- const path=useLocation().pathname;
+ const path = useLocation().pathname;
const isSmallScreen = useMediaQuery('(max-width:768px)');
+ // Conditions for hiding
if (isSmallScreen) return null;
- if(path.includes("/item")) return null;
-
+ if (path.includes("/item")) return null;
+ if (path.startsWith("/account/login") || path.startsWith("/account/register")) return null;
+
return (