[#37] Login & Register Page UI https://project.mdnd-it.cc/work_packages/37 #3

Merged
Donat merged 2 commits from task/37-login-and-register-page-ui into main 2025-05-17 22:23:05 +02:00
7 changed files with 131 additions and 16 deletions
Showing only changes of commit 8a7500eb69 - Show all commits
@@ -1,3 +1,6 @@
// src/components/Inputs/InputBox.jsx
// Gomb komponens
import { motion } from "framer-motion"; import { motion } from "framer-motion";
export default function Button({ text, type, onClick }) { export default function Button({ text, type, onClick }) {
@@ -1,10 +1,15 @@
export default function InputBox({ type, placeholder }) { // src/components/Inputs/InputBox.jsx
// InputBox komponens
export default function InputBox({ type, placeholder, value, onChange }) {
return ( return (
<div className="mb-6 relative"> <div className="mb-6 relative">
<input <input
type={type} type={type}
className="w-full px-4 py-3 border border-gray-300 rounded-lg focus:border-background focus:outline-none text-gray-700 placeholder-gray-400 bg-gray-50" className="w-full px-4 py-3 border border-gray-300 rounded-lg focus:border-background focus:outline-none text-gray-700 placeholder-gray-400 bg-gray-50"
placeholder={placeholder} placeholder={placeholder}
value={value}
onChange={onChange}
/> />
</div> </div>
); );
@@ -1,3 +1,6 @@
// src/pages/Auth/AuthLogin.jsx
// Kártya amelyiken a bejelentkezés és regisztráció van
import { motion, AnimatePresence } from "framer-motion"; import { motion, AnimatePresence } from "framer-motion";
import Animation from "../../assets/SerpentRace_Animation/SerpentRace_Animation"; import Animation from "../../assets/SerpentRace_Animation/SerpentRace_Animation";
import LoginForm from "./LoginForm"; import LoginForm from "./LoginForm";
@@ -20,7 +23,7 @@ export default function AuthCard({ isRegistering, setIsRegistering }) {
<div className="h-6" /> <div className="h-6" />
<Animation sizePercentage={30} /> <Animation sizePercentage={30} />
<p className="text-lg mt-0 text-center font-light whitespace-nowrap overflow-hidden"> <p className="text-lg mt-0 text-center font-light whitespace-nowrap overflow-hidden">
Baszódj meg te kurva! Lépj be és légy a legjobb!
</p> </p>
</div> </div>
@@ -1,4 +1,4 @@
// pages/Auth.js // src/pages/Auth/AuthLogin.jsx
// Login url címre érkezés (registering = false) // Login url címre érkezés (registering = false)
import { useState } from "react"; import { useState } from "react";
@@ -1,4 +1,4 @@
// pages/Auth.js // src/pages/Auth/AuthRegister.jsx
// Register url címre érkezés (registering = true) // Register url címre érkezés (registering = true)
import { useState } from "react"; import { useState } from "react";
@@ -11,7 +11,6 @@ export default function AuthRegister() {
return ( return (
<div className="relative flex items-center justify-center min-h-screen bg-gray-100 p-0 font-poppins"> <div className="relative flex items-center justify-center min-h-screen bg-gray-100 p-0 font-poppins">
<Background /> <Background />
<AuthCard isRegistering={isRegistering} setIsRegistering={setIsRegistering} /> <AuthCard isRegistering={isRegistering} setIsRegistering={setIsRegistering} />
</div> </div>
); );
@@ -1,9 +1,35 @@
// components/LoginForm.js // src/pages/Auth/LoginForm.jsx
// Bejelentkezési űrlap
import InputBox from "../../components/Inputs/InputBox"; import InputBox from "../../components/Inputs/InputBox";
import Button from "../../components/Buttons/Button"; import Button from "../../components/Buttons/Button";
import { motion } from "framer-motion"; import { motion } from "framer-motion";
import { useState } from "react";
export default function LoginForm() { export default function LoginForm() {
const [email, setEmail] = useState("");
const [password, setPassword] = useState("");
const [error, setError] = useState("");
function validateEmail(email) {
return /\S+@\S+\.\S+/.test(email);
}
const handleSubmit = (e) => {
e.preventDefault();
setError("");
if (!email || !password) {
setError("Minden mező kitöltése kötelező.");
return;
}
if (!validateEmail(email)) {
setError("Hibás email formátum.");
return;
}
// Backend API
console.log("Bejelentkezés:", { email, password });
};
return ( return (
<motion.div <motion.div
key="login" key="login"
@@ -13,9 +39,22 @@ export default function LoginForm() {
transition={{ duration: 0.25 }} transition={{ duration: 0.25 }}
> >
<h2 className="text-4xl font-extrabold text-center mb-6 text-gray-800 tracking-wide">Bejelentkezés</h2> <h2 className="text-4xl font-extrabold text-center mb-6 text-gray-800 tracking-wide">Bejelentkezés</h2>
<form> {error && (
<InputBox type="email" placeholder="Email cím" /> <div className="mb-4 text-red-600 text-center font-semibold">{error}</div>
<InputBox type="password" placeholder="Jelszó" /> )}
<form onSubmit={handleSubmit}>
<InputBox
type="email"
placeholder="Email cím"
value={email}
onChange={e => setEmail(e.target.value)}
/>
<InputBox
type="password"
placeholder="Jelszó"
value={password}
onChange={e => setPassword(e.target.value)}
/>
<Button text="Bejelentkezés" type="submit" /> <Button text="Bejelentkezés" type="submit" />
</form> </form>
</motion.div> </motion.div>
@@ -1,9 +1,47 @@
// components/RegisterForm.js // src/pages/Auth/RegisterForm.jsx
// Regisztrációs űrlap
import InputBox from "../../components/Inputs/InputBox"; import InputBox from "../../components/Inputs/InputBox";
import Button from "../../components/Buttons/Button"; import Button from "../../components/Buttons/Button";
import { motion } from "framer-motion"; import { motion } from "framer-motion";
import { useState } from "react";
export default function RegisterForm() { export default function RegisterForm() {
const [fullName, setFullName] = useState("");
const [username, setUsername] = useState("");
const [email, setEmail] = useState("");
const [password, setPassword] = useState("");
const [confirmPassword, setConfirmPassword] = useState("");
const [error, setError] = useState("");
function validateEmail(email) {
return /\S+@\S+\.\S+/.test(email);
}
const handleSubmit = (e) => {
e.preventDefault();
setError("");
if (!fullName || !username || !email || !password || !confirmPassword) {
setError("Minden mező kitöltése kötelező.");
return;
}
if (!validateEmail(email)) {
setError("Hibás email formátum.");
return;
}
if (password.length < 6) {
setError("A jelszónak legalább 6 karakter hosszúnak kell lennie.");
return;
}
if (password !== confirmPassword) {
setError("A jelszavak nem egyeznek.");
return;
}
// Backend API
console.log("Regisztráció:", { fullName, username, email, password });
};
return ( return (
<motion.div <motion.div
key="register" key="register"
@@ -13,12 +51,40 @@ export default function RegisterForm() {
transition={{ duration: 0.25 }} transition={{ duration: 0.25 }}
> >
<h2 className="text-4xl font-extrabold text-center mb-6 text-gray-800 tracking-wide">Regisztráció</h2> <h2 className="text-4xl font-extrabold text-center mb-6 text-gray-800 tracking-wide">Regisztráció</h2>
<form> {error && (
<InputBox type="text" placeholder="Teljes név" /> <div className="mb-4 text-red-600 text-center font-semibold">{error}</div>
<InputBox type="text" placeholder="Felhasználónév" /> )}
<InputBox type="email" placeholder="Email cím" /> <form onSubmit={handleSubmit}>
<InputBox type="password" placeholder="Jelszó" /> <InputBox
<InputBox type="password" placeholder="Jelszó megerősítése" /> type="text"
placeholder="Teljes név"
value={fullName}
onChange={e => setFullName(e.target.value)}
/>
<InputBox
type="text"
placeholder="Felhasználónév"
value={username}
onChange={e => setUsername(e.target.value)}
/>
<InputBox
type="email"
placeholder="Email cím"
value={email}
onChange={e => setEmail(e.target.value)}
/>
<InputBox
type="password"
placeholder="Jelszó"
value={password}
onChange={e => setPassword(e.target.value)}
/>
<InputBox
type="password"
placeholder="Jelszó megerősítése"
value={confirmPassword}
onChange={e => setConfirmPassword(e.target.value)}
/>
<Button text="Regisztráció" type="submit" /> <Button text="Regisztráció" type="submit" />
</form> </form>
</motion.div> </motion.div>