diff --git a/src/components/Layout/TopBar.jsx b/src/components/Layout/TopBar.jsx index 8916882..37d33f0 100644 --- a/src/components/Layout/TopBar.jsx +++ b/src/components/Layout/TopBar.jsx @@ -21,11 +21,11 @@ export default function TopBar({ theme = "dark", onChangeTheme }) { const [showAuth, setShowAuth] = useState(false); const [mode, setMode] = useState("login"); // "login" | "signup" - // login + // login form const [loginUser, setLoginUser] = useState(""); const [loginPass, setLoginPass] = useState(""); - // signup + // signup form const [firstName, setFirstName] = useState(""); const [lastName, setLastName] = useState(""); const [regUser, setRegUser] = useState(""); @@ -46,12 +46,11 @@ export default function TopBar({ theme = "dark", onChangeTheme }) { const closeModal = () => { setShowAuth(false); - // reset basique des champs setLoginPass(""); setSignupError(""); }; - // 🔒 Quand on devient authentifié → fermer automatiquement le popup + // When auth becomes true, close the popup automatically useEffect(() => { if (authenticated) { setShowAuth(false); @@ -61,7 +60,7 @@ export default function TopBar({ theme = "dark", onChangeTheme }) { const handleLoginSubmit = async (e) => { e.preventDefault(); await login(loginUser, loginPass); - // le useEffect ci-dessus va fermer le modal quand authenticated passe à true + // popup closes via useEffect when authenticated becomes true }; const handleSignupSubmit = async (e) => { @@ -74,7 +73,9 @@ export default function TopBar({ theme = "dark", onChangeTheme }) { !regEmail.trim() || !regPass ) { - setSignupError("Nom, prénom, user, email et mot de passe sont requis."); + setSignupError( + "First name, last name, username, email and password are required." + ); return; } try { @@ -86,12 +87,12 @@ export default function TopBar({ theme = "dark", onChangeTheme }) { firstName: firstName.trim(), lastName: lastName.trim(), }); - // après création, on tente le login direct + // auto-login after registration await login(regUser.trim(), regPass); - // la fermeture est gérée aussi par le useEffect(authenticated) + // popup closes via useEffect } catch (err) { console.error(err); - setSignupError(err.message || "Register error."); + setSignupError(err.message || "Registration error."); } finally { setSignupLoading(false); } @@ -198,7 +199,7 @@ export default function TopBar({ theme = "dark", onChangeTheme }) { {mode === "login" ? (
) : ( )} diff --git a/src/styles/auth-modal.css b/src/styles/auth-modal.css index 4114701..f560da2 100644 --- a/src/styles/auth-modal.css +++ b/src/styles/auth-modal.css @@ -1,144 +1,155 @@ -/* src/styles/auth-modal.css */ +/* ========================================== + SocioWire auth modal (login / signup) + Follows body[data-theme]: dark | blue | light + ========================================== */ -/* BACKDROP sombre plein écran */ .auth-modal-backdrop { position: fixed; inset: 0; - z-index: 50; - background: rgba(15, 23, 42, 0.88); + z-index: 60; display: flex; align-items: center; justify-content: center; + background: rgba(2, 6, 23, 0.65); + backdrop-filter: blur(8px); } -/* BOÎTE MODAL */ +/* Base modal box */ .auth-modal { - width: 100%; - max-width: 420px; - background: rgba(15, 23, 42, 0.98); - border-radius: 16px; - border: 1px solid rgba(148, 163, 184, 0.9); - box-shadow: - 0 18px 40px rgba(0, 0, 0, 0.9), - 0 0 24px rgba(56, 189, 248, 0.55); - padding: 0.75rem 0.9rem 0.9rem 0.9rem; - color: #e5e7eb; + width: min(640px, 95vw); + border-radius: 22px; + padding: 1.1rem 1.25rem 1.35rem; + box-shadow: 0 20px 60px rgba(0, 0, 0, 0.85); + border: 1px solid rgba(148, 163, 184, 0.7); } -/* HEADER TABS (Login / Sign up) */ +/* Theme variants */ +body[data-theme="dark"] .auth-modal { + background: radial-gradient(circle at top left, #0f172a, #020617 70%); +} + +body[data-theme="blue"] .auth-modal { + background: radial-gradient(circle at top left, #0ea5e9, #020617 65%); + border-color: rgba(96, 165, 250, 0.9); +} + +body[data-theme="light"] .auth-modal { + background: radial-gradient(circle at top left, #ffffff, #e5e7eb 70%); + color: #020617; + border-color: rgba(148, 163, 184, 0.7); +} + +/* Header: tabs + close */ .auth-modal-header { display: flex; align-items: center; - gap: 0.4rem; - margin-bottom: 0.6rem; + gap: 0.5rem; + margin-bottom: 0.9rem; } .auth-tab { - flex: 1; - border: 1px solid rgba(75, 85, 99, 0.9); - background: rgba(15, 23, 42, 0.95); - color: #e5e7eb; + padding: 0.45rem 0.95rem; border-radius: 999px; - font-size: 0.8rem; - padding: 0.35rem 0.4rem; + border: 1px solid transparent; + background: transparent; + font-size: 0.85rem; + color: #e5e7eb; cursor: pointer; } .auth-tab-active { - background: linear-gradient(135deg, #1d4ed8, #0ea5e9); - border-color: #93c5fd; + background: linear-gradient(135deg, #1d4ed8, #38bdf8); + border-color: rgba(191, 219, 254, 0.9); + color: #f9fafb; +} + +/* light theme override for tab text */ +body[data-theme="light"] .auth-tab { + color: #0f172a; +} +body[data-theme="light"] .auth-tab-active { color: #f9fafb; - box-shadow: 0 0 14px rgba(59, 130, 246, 0.7); } -/* Bouton X */ .auth-close { - border: none; - background: transparent; - color: #9ca3af; - font-size: 0.9rem; - padding: 0.1rem 0.3rem; + margin-left: auto; + width: 32px; + height: 32px; + border-radius: 999px; + border: 1px solid rgba(148, 163, 184, 0.6); + background: rgba(15, 23, 42, 0.85); + color: #e5e7eb; + font-size: 0.8rem; cursor: pointer; } -/* FORMULAIRE */ +/* Close button for light theme */ +body[data-theme="light"] .auth-close { + background: #e5e7eb; + color: #020617; +} + +/* Form layout */ .auth-form { display: flex; flex-direction: column; + gap: 0.7rem; +} + +.auth-row { + display: flex; + gap: 0.6rem; +} +.auth-row label { + flex: 1; } -/* Chaque label = colonne verticale */ .auth-form label { display: flex; flex-direction: column; - gap: 0.2rem; - font-size: 0.78rem; - margin-bottom: 0.45rem; + font-size: 0.8rem; + gap: 0.25rem; } -/* CHAMPS TEXTE */ +/* Inputs */ .auth-form input { border-radius: 999px; - border: 1px solid #4b5563; - padding: 0.38rem 0.7rem; - background: #020617; + border: 1px solid rgba(51, 65, 85, 0.9); + background: rgba(15, 23, 42, 0.96); color: #e5e7eb; - font-size: 0.8rem; - outline: none; - width: 100%; + padding: 0.55rem 0.85rem; + font-size: 0.85rem; } -.auth-form input:focus { - border-color: #60a5fa; - box-shadow: 0 0 0 1px rgba(37, 99, 235, 0.7); +/* Light theme inputs */ +body[data-theme="light"] .auth-form input { + background: #f9fafb; + color: #020617; + border-color: rgba(148, 163, 184, 0.9); } -/* LIGNE PRÉNOM / NOM */ -.auth-row { - display: flex; - gap: 0.5rem; - margin-bottom: 0.3rem; -} - -/* Les deux labels prennent chacun 50% (moins le gap) */ -.auth-row label { - flex: 1; - min-width: 0; /* évite de dépasser le modal */ -} - -/* MESSAGE D’ERREUR */ -.auth-error { - margin-top: 0.25rem; - font-size: 0.74rem; - color: #fecaca; - background: rgba(127, 29, 29, 0.35); - border-radius: 0.5rem; - padding: 0.25rem 0.5rem; -} - -/* BOUTON FULL WIDTH */ +/* Full-width primary button */ .btn-full { width: 100%; margin-top: 0.4rem; } -/* Petite variation visuelle pour Sign up si .btn-secondary non définie */ -.btn-secondary { - padding: 0.25rem 0.7rem; - font-size: 0.75rem; - border-radius: 999px; - border: 1px solid #60a5fa; - background: #0b1120; - color: #dbeafe; - cursor: pointer; +/* Error message */ +.auth-error { + margin-top: 0.25rem; + font-size: 0.8rem; + color: #fecaca; + background: rgba(127, 29, 29, 0.55); + border-radius: 0.5rem; + padding: 0.4rem 0.6rem; + border: 1px solid rgba(248, 113, 113, 0.7); } -/* Responsive: sur petits écrans, Prénom/Nom se mettent l’un sous l’autre */ +/* Small screen tweaks */ @media (max-width: 480px) { .auth-modal { - margin: 0 0.7rem; + padding: 0.95rem 0.9rem 1.1rem; } - .auth-row { flex-direction: column; }