[#83] About https://project.mdnd-it.cc/work_packages/83 #18
@@ -9,6 +9,8 @@ import ResetPassword from "./pages/Auth/ResetPassword"
|
|||||||
import Landingpage from "./pages/Landing/Landingpage"
|
import Landingpage from "./pages/Landing/Landingpage"
|
||||||
import Home from "./pages/Landing/Home"
|
import Home from "./pages/Landing/Home"
|
||||||
import DeckManagerPage from "./pages/Decks/DeckManagerPage"
|
import DeckManagerPage from "./pages/Decks/DeckManagerPage"
|
||||||
|
import About from "./pages/About/About"
|
||||||
|
import ScrollToTop from "./components/ScrollToTop";
|
||||||
|
|
||||||
function App() {
|
function App() {
|
||||||
const [isMobile, setIsMobile] = useState(false)
|
const [isMobile, setIsMobile] = useState(false)
|
||||||
@@ -39,6 +41,7 @@ function App() {
|
|||||||
return (
|
return (
|
||||||
<Router>
|
<Router>
|
||||||
<Routes>
|
<Routes>
|
||||||
|
<Route path="/about" element={<About />} />
|
||||||
<Route path="/register" element={<AuthRegister />} />
|
<Route path="/register" element={<AuthRegister />} />
|
||||||
<Route path="/login" element={<AuthLogin />} />
|
<Route path="/login" element={<AuthLogin />} />
|
||||||
<Route path="/verify-email" element={<EmailVerification />} />
|
<Route path="/verify-email" element={<EmailVerification />} />
|
||||||
@@ -50,6 +53,9 @@ function App() {
|
|||||||
<Route path="/decks" element={<DeckManagerPage />} />
|
<Route path="/decks" element={<DeckManagerPage />} />
|
||||||
{/* Add more routes as needed */}
|
{/* Add more routes as needed */}
|
||||||
</Routes>
|
</Routes>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</Router>
|
</Router>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -93,3 +93,4 @@
|
|||||||
fill: #ffffff;
|
fill: #ffffff;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
|
After Width: | Height: | Size: 173 KiB |
|
After Width: | Height: | Size: 203 KiB |
|
After Width: | Height: | Size: 186 KiB |
|
After Width: | Height: | Size: 172 KiB |
|
After Width: | Height: | Size: 177 KiB |
|
After Width: | Height: | Size: 174 KiB |
|
After Width: | Height: | Size: 189 KiB |
@@ -1,54 +1,112 @@
|
|||||||
import React from "react"
|
import React, { useEffect, useRef, useState } from "react"
|
||||||
|
import { Link } from "react-router-dom"
|
||||||
import Logo from "../../assets/pictures/Logo"
|
import Logo from "../../assets/pictures/Logo"
|
||||||
|
|
||||||
const Footer = () => (
|
|
||||||
<footer className="bg-zinc-900 text-white border-t-2 border-zinc-800 mt-auto py-8">
|
const ArrowUpIcon = () => <span style={{ fontSize: "1.25rem" }}>↑</span>
|
||||||
|
|
||||||
|
const Footer = () => {
|
||||||
|
const [isVisible, setIsVisible] = useState(false)
|
||||||
|
const footerRef = useRef(null)
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const observer = new IntersectionObserver(
|
||||||
|
([entry]) => {
|
||||||
|
setIsVisible(entry.isIntersecting)
|
||||||
|
},
|
||||||
|
{ threshold: 0.3 }
|
||||||
|
)
|
||||||
|
|
||||||
|
if (footerRef.current) {
|
||||||
|
observer.observe(footerRef.current)
|
||||||
|
}
|
||||||
|
|
||||||
|
return () => {
|
||||||
|
if (footerRef.current) {
|
||||||
|
observer.unobserve(footerRef.current)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, [])
|
||||||
|
|
||||||
|
const scrollToTop = () => {
|
||||||
|
window.scrollTo({ top: 0, behavior: "smooth" })
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<footer
|
||||||
|
ref={footerRef}
|
||||||
|
className={`relative bg-zinc-900 text-white border-t-2 border-zinc-800 mt-auto py-8 transition-all duration-700 ease-out ${
|
||||||
|
isVisible ? "opacity-100 scale-100 translate-y-0" : "opacity-0 scale-95 translate-y-10"
|
||||||
|
}`}
|
||||||
|
style={{ transformOrigin: "bottom center" }}
|
||||||
|
>
|
||||||
|
<style>
|
||||||
|
{`
|
||||||
|
.footer-animate {
|
||||||
|
transition: opacity 0.8s ease, transform 0.8s ease;
|
||||||
|
}
|
||||||
|
`}
|
||||||
|
</style>
|
||||||
|
|
||||||
<div className="max-w-6xl mx-auto flex flex-wrap justify-between items-start gap-8 px-4">
|
<div className="max-w-6xl mx-auto flex flex-wrap justify-between items-start gap-8 px-4">
|
||||||
<div className="flex flex-col items-center">
|
{/* Logó */}
|
||||||
|
<div className="flex flex-col items-center footer-animate">
|
||||||
|
<a
|
||||||
|
href="/"
|
||||||
|
className="transition-transform duration-500 hover:scale-105 hover:brightness-125"
|
||||||
|
>
|
||||||
<Logo size={100} />
|
<Logo size={100} />
|
||||||
<span className="font-bold text-lg mt-2">SerpentRace</span>
|
|
||||||
</div>
|
|
||||||
<div className="flex flex-col gap-1">
|
|
||||||
<span className="font-bold mb-2">Oldalak</span>
|
|
||||||
<a href="/" className="hover:underline hover:text-green-400 transition">
|
|
||||||
Főoldal
|
|
||||||
</a>
|
</a>
|
||||||
|
<span className="font-extrabold text-xl mt-2 tracking-wide">SerpentRace</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Oldalak */}
|
||||||
|
<div className="flex flex-col gap-1 footer-animate">
|
||||||
|
<span className="text-lg font-semibold text-green-400 underline underline-offset-4 mb-2 drop-shadow-sm">
|
||||||
|
Oldalak
|
||||||
|
</span>
|
||||||
|
<a href="/" className="hover:underline hover:text-green-400 transition">Főoldal</a>
|
||||||
<a href="/about" className="hover:underline hover:text-green-400 transition">
|
<a href="/about" className="hover:underline hover:text-green-400 transition">
|
||||||
Rólunk
|
Rólunk
|
||||||
</a>
|
</a>
|
||||||
<a href="/contact" className="hover:underline hover:text-green-400 transition">
|
<a href="/contact" className="hover:underline hover:text-green-400 transition">Kapcsolat</a>
|
||||||
Kapcsolat
|
|
||||||
</a>
|
|
||||||
</div>
|
</div>
|
||||||
<div className="flex flex-col gap-1">
|
|
||||||
<span className="font-bold mb-2">Közösség</span>
|
{/* Közösség */}
|
||||||
<a
|
<div className="flex flex-col gap-1 footer-animate">
|
||||||
href="https://discord.gg/"
|
<span className="text-lg font-semibold text-green-400 underline underline-offset-4 mb-2 drop-shadow-sm">
|
||||||
target="_blank"
|
Közösség
|
||||||
rel="noopener noreferrer"
|
</span>
|
||||||
className="hover:underline hover:text-green-400 transition"
|
<a href="https://discord.gg/" target="_blank" rel="noopener noreferrer" className="hover:underline hover:text-green-400 transition">Discord</a>
|
||||||
>
|
<a href="https://github.com/" target="_blank" rel="noopener noreferrer" className="hover:underline hover:text-green-400 transition">GitHub</a>
|
||||||
Discord
|
|
||||||
</a>
|
|
||||||
<a
|
|
||||||
href="https://github.com/"
|
|
||||||
target="_blank"
|
|
||||||
rel="noopener noreferrer"
|
|
||||||
className="hover:underline hover:text-green-400 transition"
|
|
||||||
>
|
|
||||||
GitHub
|
|
||||||
</a>
|
|
||||||
</div>
|
</div>
|
||||||
<div className="flex flex-col gap-1">
|
|
||||||
<span className="font-bold mb-2">Elérhetőség</span>
|
{/* Elérhetőség */}
|
||||||
|
<div className="flex flex-col gap-1 footer-animate">
|
||||||
|
<span className="text-lg font-semibold text-green-400 underline underline-offset-4 mb-2 drop-shadow-sm">
|
||||||
|
Elérhetőség
|
||||||
|
</span>
|
||||||
<span className="opacity-80">Email: info@serpentrace.hu</span>
|
<span className="opacity-80">Email: info@serpentrace.hu</span>
|
||||||
<span className="opacity-80">Telefon: +36 30 123 4567</span>
|
<span className="opacity-80">Telefon: +36 30 123 4567</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="text-center mt-8 text-sm opacity-70">
|
|
||||||
|
<div className="text-center mt-8 text-sm opacity-70 footer-animate">
|
||||||
© {new Date().getFullYear()} SerpentRace. Minden jog fenntartva.
|
© {new Date().getFullYear()} SerpentRace. Minden jog fenntartva.
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
{/* Scroll to top */}
|
||||||
|
{isVisible && (
|
||||||
|
<button
|
||||||
|
onClick={scrollToTop}
|
||||||
|
className="fixed bottom-6 right-6 bg-green-500 hover:bg-green-600 text-white p-3 rounded-full shadow-lg transition transform hover:scale-110"
|
||||||
|
aria-label="Ugrás az oldal tetejére"
|
||||||
|
>
|
||||||
|
<ArrowUpIcon />
|
||||||
|
</button>
|
||||||
|
)}
|
||||||
</footer>
|
</footer>
|
||||||
)
|
)
|
||||||
|
}
|
||||||
|
|
||||||
export default Footer
|
export default Footer
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import React, { useState } from "react"
|
import React, { useState } from "react"
|
||||||
import Logo from "../../assets/pictures/Logo"
|
import Logo from "../../assets/pictures/Logo"
|
||||||
|
import About from "../../pages/About/About"
|
||||||
|
|
||||||
const navLinkClass = "px-3 py-2 rounded-lg text-white transition-all duration-200 hover:bg-white/10"
|
const navLinkClass = "px-3 py-2 rounded-lg text-white transition-all duration-200 hover:bg-white/10"
|
||||||
|
|
||||||
@@ -7,6 +8,7 @@ const Navbar = () => {
|
|||||||
const [menuOpen, setMenuOpen] = useState(false)
|
const [menuOpen, setMenuOpen] = useState(false)
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|
||||||
<nav className="bg-gradient-to-r from-green-700 to-emerald-500 shadow-lg">
|
<nav className="bg-gradient-to-r from-green-700 to-emerald-500 shadow-lg">
|
||||||
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||||
<div className="flex justify-between h-16 items-center">
|
<div className="flex justify-between h-16 items-center">
|
||||||
@@ -27,7 +29,7 @@ const Navbar = () => {
|
|||||||
<a href="#" className={navLinkClass}>
|
<a href="#" className={navLinkClass}>
|
||||||
Leaderboard
|
Leaderboard
|
||||||
</a>
|
</a>
|
||||||
<a href="#" className={navLinkClass}>
|
<a href="/about" className={navLinkClass}>
|
||||||
About
|
About
|
||||||
</a>
|
</a>
|
||||||
<a href="#" className={navLinkClass}>
|
<a href="#" className={navLinkClass}>
|
||||||
|
|||||||
@@ -0,0 +1,14 @@
|
|||||||
|
import { useEffect } from "react";
|
||||||
|
import { useLocation } from "react-router-dom";
|
||||||
|
|
||||||
|
const ScrollToTop = () => {
|
||||||
|
const { pathname } = useLocation();
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
window.scrollTo({ top: 0, behavior: "smooth" });
|
||||||
|
}, [pathname]);
|
||||||
|
|
||||||
|
return null;
|
||||||
|
};
|
||||||
|
|
||||||
|
export default ScrollToTop;
|
||||||
@@ -0,0 +1,163 @@
|
|||||||
|
import React, { useEffect, useRef, useState } from "react"
|
||||||
|
import Navbar from "../../components/Navbar/Navbar"
|
||||||
|
import Footer from "../../components/Footer/Footer"
|
||||||
|
import Background from "../../assets/backgrounds/Background.jsx"
|
||||||
|
import Walke from "../../assets/pictures/walke.jpg"
|
||||||
|
import Busi from "../../assets/pictures/busi.jpg"
|
||||||
|
import Gege from "../../assets/pictures/gege.jpg"
|
||||||
|
import Zsola from "../../assets/pictures/zsola.jpg"
|
||||||
|
import Donat from "../../assets/pictures/donat.jpg"
|
||||||
|
import Turo from "../../assets/pictures/turo.jpg"
|
||||||
|
import Piskor from "../../assets/pictures/piskor.jpg"
|
||||||
|
|
||||||
|
const About = () => {
|
||||||
|
const [visible, setVisible] = useState(false)
|
||||||
|
const sectionRef = useRef(null)
|
||||||
|
|
||||||
|
const teamMembers = [
|
||||||
|
{
|
||||||
|
name: "Magda Donát",
|
||||||
|
role: "Backend fejlesztő",
|
||||||
|
photo: Donat,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Máté Gergely",
|
||||||
|
role: "UI/UX designer",
|
||||||
|
photo: Gege,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Walke Gábor",
|
||||||
|
role: "UI/UX designer, Frontend fejlesztő",
|
||||||
|
photo: Walke,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Piskor Barnabás",
|
||||||
|
role: "Frontend fejlesztő",
|
||||||
|
photo: Piskor,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Buús Levente",
|
||||||
|
role: "UI/UX designer",
|
||||||
|
photo: Busi,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Pintér Zsolt",
|
||||||
|
role: "UI/UX designer",
|
||||||
|
photo: Zsola,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Thuróczy Attila",
|
||||||
|
role: "UI/UX designer",
|
||||||
|
photo: Turo,
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const observer = new IntersectionObserver(
|
||||||
|
([entry]) => {
|
||||||
|
if (entry.isIntersecting) setVisible(true)
|
||||||
|
},
|
||||||
|
{ threshold: 0.3 }
|
||||||
|
)
|
||||||
|
if (sectionRef.current) observer.observe(sectionRef.current)
|
||||||
|
return () => observer.disconnect()
|
||||||
|
}, [])
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="flex flex-col min-h-screen overflow-y-auto relative">
|
||||||
|
|
||||||
|
{/* Háttér – fix pozíció, a teljes képernyőre */}
|
||||||
|
<div className="fixed top-0 left-0 w-full h-full z-[-10]">
|
||||||
|
<Background />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Navbar fix */}
|
||||||
|
<div className="fixed top-0 left-0 right-0 z-30">
|
||||||
|
<Navbar />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Tartalom */}
|
||||||
|
<main className="flex-grow text-white px-6 pt-16 mt-0 mb-20">
|
||||||
|
|
||||||
|
{/* Vissza gomb */}
|
||||||
|
<div className="fixed top-4 left-4 z-50 group">
|
||||||
|
<div className="absolute top-full mt-1 left-1/2 -translate-x-1/2 scale-0 group-hover:scale-100 transition transform bg-zinc-800 text-sm text-white px-3 py-1 rounded shadow-lg">
|
||||||
|
Főoldalra
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<section
|
||||||
|
ref={sectionRef}
|
||||||
|
className={`max-w-5xl mx-auto transition-all duration-1000 ease-out ${
|
||||||
|
visible ? "opacity-100 translate-y-0" : "opacity-0 translate-y-10"
|
||||||
|
}`}
|
||||||
|
>
|
||||||
|
{/* Rólunk cím */}
|
||||||
|
<h1 className="mt-24 text-5xl font-extrabold text-green-300 mb-10 text-center tracking-wide drop-shadow-lg">
|
||||||
|
<span className="inline-block animate-pulse mr-2"></span> Rólunk
|
||||||
|
</h1>
|
||||||
|
|
||||||
|
{/* Leírás */}
|
||||||
|
<p className="text-lg leading-relaxed text-zinc-200 mb-10 text-center max-w-3xl mx-auto">
|
||||||
|
Célunk, hogy egy innovatív, közösségorientált platformot építsünk, ahol a versenyzés, játék és technológia találkozik. Elhivatott csapatunk minden nap azon dolgozik, hogy élményt és értéket nyújtson a felhasználóinknak.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
{/* Küldetésünk */}
|
||||||
|
<div className="mt-12">
|
||||||
|
<h2 className="text-2xl font-bold text-green-300 mb-4">Küldetésünk</h2>
|
||||||
|
<div className="grid md:grid-cols-3 gap-6">
|
||||||
|
<div className="bg-zinc-800 rounded-xl p-6 shadow-lg hover:scale-105 transition">
|
||||||
|
<h3 className="text-xl font-semibold mb-2">Innováció</h3>
|
||||||
|
<p className="text-zinc-300">Folyamatosan fejlesztjük rendszereinket a legmodernebb technológiákkal.</p>
|
||||||
|
</div>
|
||||||
|
<div className="bg-zinc-800 rounded-xl p-6 shadow-lg hover:scale-105 transition">
|
||||||
|
<h3 className="text-xl font-semibold mb-2">Közösség</h3>
|
||||||
|
<p className="text-zinc-300">Fontos számunkra, hogy egy összetartó, aktív közösséget építsünk ki.</p>
|
||||||
|
</div>
|
||||||
|
<div className="bg-zinc-800 rounded-xl p-6 shadow-lg hover:scale-105 transition">
|
||||||
|
<h3 className="text-xl font-semibold mb-2">Minőség</h3>
|
||||||
|
<p className="text-zinc-300">Minden részletre figyelünk a felhasználói élmény és biztonság érdekében.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Csapat */}
|
||||||
|
<div className="mt-16">
|
||||||
|
<h2 className="text-2xl font-bold text-green-300 mb-6">Csapatunk</h2>
|
||||||
|
<div className="grid md:grid-cols-3 gap-8">
|
||||||
|
{teamMembers.map((member, i) => {
|
||||||
|
const isLast = i === teamMembers.length - 1
|
||||||
|
const itemsInLastRow = teamMembers.length % 3
|
||||||
|
const shouldCenter = itemsInLastRow === 1 && isLast
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div
|
||||||
|
key={i}
|
||||||
|
className={`flex flex-col items-center text-center bg-zinc-800 p-6 rounded-xl shadow-lg hover:shadow-green-400/20 hover:scale-105 transition ${
|
||||||
|
shouldCenter ? "md:col-start-2" : ""
|
||||||
|
}`}
|
||||||
|
>
|
||||||
|
<img
|
||||||
|
src={member.photo}
|
||||||
|
alt={member.name}
|
||||||
|
className="w-24 h-24 rounded-full object-cover mb-4 border-4 border-green-400"
|
||||||
|
/>
|
||||||
|
<h4 className="text-lg font-bold">{member.name}</h4>
|
||||||
|
<p className="text-zinc-400">{member.role}</p>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
})}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</main>
|
||||||
|
|
||||||
|
{/* Footer (nem scrollozható alá) */}
|
||||||
|
<footer className="mt-auto">
|
||||||
|
<Footer />
|
||||||
|
</footer>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default About
|
||||||