This commit is contained in:
Evelyn Sucitro 2025-12-06 19:04:00 +07:00
commit 232b756ef1
6 changed files with 179 additions and 87 deletions

View File

@ -361,25 +361,6 @@ header {
box-shadow: 0 12px 50px rgba(255, 215, 0, 0.9), 0 0 40px rgba(255, 170, 0, 0.7);
}
/* Footer */
footer {
position: relative;
z-index: 10;
text-align: center;
padding: 50px 20px;
margin-top: 150px;
background: rgba(20, 0, 40, 0.7);
backdrop-filter: blur(15px);
border-top: 3px solid rgba(0, 234, 255, 0.4);
box-shadow: 0 -4px 30px rgba(0, 234, 255, 0.2);
}
footer p {
color: rgba(255, 255, 255, 0.65);
font-size: 15px;
font-family: 'Exo 2', sans-serif;
letter-spacing: 1.5px;
}
/* Floating Decoration Elements */
.hero::before {

View File

@ -5,6 +5,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Homepage</title>
<link rel="stylesheet" href="Homepage.css">
<link rel="stylesheet" href="Homepage_Credit.css">
</head>
<body>
<!-- Neon Particles Background -->
@ -28,11 +29,21 @@
</div>
</section>
<!-- Footer -->
<!-- Spacer -->
<br><br><br>
<!-- Footer with Credits -->
<footer>
<hr class="footer-hr">
<div class="credits">
<p class="credits-text">
<strong>2048</strong> - Created by Evelyn Sucitro, Jevinca Marvella Widjaya, and Michelle Aquilera
</p>
</div>
</footer>
<!-- Logout Confirmation Modal -->
<div class="logout-overlay" id="logout-overlay" style="display: none">
<div class="logout-overlay" id="logout-overlay" style="display: none">
<div class="logout-modal">
<div class="logout-icon">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5">
@ -49,10 +60,10 @@
<button class="btn-logout-confirm" id="btn-logout-confirm">Logout</button>
</div>
</div>
</div>
</div>
<!-- Logout Success Modal -->
<div class="logout-success-overlay" id="logout-success-overlay" style="display: none">
<!-- Logout Success Modal -->
<div class="logout-success-overlay" id="logout-success-overlay" style="display: none">
<div class="logout-success-modal">
<div class="success-icon">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3">
@ -62,10 +73,14 @@
<h2 class="success-title">Logout Successful!</h2>
<p class="success-message">You have been logged out successfully</p>
</div>
</div>
</div>
<script src="Animation_Homepage.js"></script>
<script src="logout.js"></script>
<script src="Homepage.js"></script>
<script>
// Auto-update copyright year
document.getElementById('currentYear').textContent = new Date().getFullYear();
</script>
<script src="Animation_Homepage.js"></script>
<script src="Homepage.js"></script>
<script src="logout.js"></script>
</body>
</html>

View File

@ -4,7 +4,7 @@
// ==================== DOM ELEMENTS ====================
const elements = {
logo: null,
loginBtn: null,
loginBtn: null, // Ini akan di-update oleh logout.js
playBtn: null,
leaderboardBtn: null,
heroTitle: null,
@ -46,7 +46,9 @@
// ==================== CACHE ELEMENTS ====================
function cacheElements() {
elements.logo = document.querySelector('.logo');
elements.loginBtn = document.querySelector('a[href="Login.html"]');
// ✅ PERBAIKAN: Jangan cache loginBtn, biar logout.js yang handle
// Cek apakah button Login atau Logout
elements.loginBtn = document.querySelector('.btn-login') || document.querySelector('.btn-logout');
elements.playBtn = document.querySelector('a[href="2048.html"]');
elements.leaderboardBtn = document.querySelector('a[href="leaderboard.html"]');
elements.heroTitle = document.querySelector('.hero-title');
@ -73,10 +75,8 @@
elements.logo.addEventListener('click', handleLogoClick);
}
// Login button
if (elements.loginBtn) {
elements.loginBtn.addEventListener('click', handleLoginClick);
}
// ✅ PERBAIKAN: JANGAN tambah event listener ke loginBtn
// Biar logout.js yang handle login/logout button
// Play button
if (elements.playBtn) {
@ -99,12 +99,7 @@
// ==================== EVENT HANDLERS ====================
function handleLogoClick(e) {
e.preventDefault();
window.location.href = 'index.html';
}
function handleLoginClick(e) {
// Allow default behavior (navigate to Login.html)
console.log('Navigating to Login page...');
window.location.href = 'Homepage.html';
}
function handlePlayClick(e) {
@ -125,10 +120,11 @@
}
}
// Press 'L' to login
// Press 'L' to login (hanya jika belum login)
if (e.key === 'l' || e.key === 'L') {
if (elements.loginBtn) {
elements.loginBtn.click();
const loginBtn = document.querySelector('.btn-login');
if (loginBtn) {
loginBtn.click();
}
}
@ -208,10 +204,6 @@
elements.logo.removeEventListener('click', handleLogoClick);
}
if (elements.loginBtn) {
elements.loginBtn.removeEventListener('click', handleLoginClick);
}
if (elements.playBtn) {
elements.playBtn.removeEventListener('click', handlePlayClick);
}

78
Homepage_Credit.css Normal file
View File

@ -0,0 +1,78 @@
/* Footer Section - Simple & Fixed at Bottom */
footer {
position: fixed;
bottom: 0;
left: 0;
right: 0;
z-index: 10;
text-align: center;
padding: 15px 20px;
background: transparent;
}
/* HR Line Above Credits - Simple Single Line */
.footer-hr {
width: 50%;
max-width: 500px;
height: 1px;
margin: 0 auto 12px;
background: rgba(0, 234, 255, 0.3);
border: none;
}
/* Credits Container - No Box, Just Text */
.credits {
max-width: 100%;
margin: 0 auto;
padding: 0;
background: none;
border: none;
}
/* Simple Credit Text - Small & Clean */
.credits-text {
color: rgba(255, 255, 255, 0.5);
font-size: 12px;
font-family: 'Exo 2', sans-serif;
line-height: 1.5;
letter-spacing: 0.5px;
font-weight: 300;
}
.credits-text strong {
color: rgba(0, 234, 255, 0.7);
font-weight: 500;
}
/* Responsive */
@media (max-width: 768px) {
footer {
padding: 12px 15px;
}
.footer-hr {
width: 60%;
margin-bottom: 10px;
}
.credits-text {
font-size: 11px;
}
}
@media (max-width: 480px) {
footer {
padding: 10px 10px;
}
.footer-hr {
width: 70%;
margin-bottom: 8px;
}
.credits-text {
font-size: 10px;
line-height: 1.4;
}
}

View File

@ -1,7 +1,7 @@
import { showModal, setupModalOk, setupOutsideClose } from "./Modal_Login.js";
import { loginRequest } from "./Login_Request.js";
// ✅ PENTING: Setup modal saat halaman load
// ✅ Setup modal saat halaman load
document.addEventListener('DOMContentLoaded', function() {
setupModalOk();
setupOutsideClose();
@ -24,13 +24,20 @@ document.getElementById('loginForm').addEventListener('submit', async function(e
try {
const data = await loginRequest(username, password);
console.log('Response dari server:', data); // Debug
console.log('Response dari server:', data);
if (data.success) {
localStorage.setItem('authToken', data.token);
localStorage.setItem('username', data.username);
// ✅ PERBAIKAN: Gunakan sessionStorage (sama dengan logout.js)
sessionStorage.setItem('authToken', data.token);
sessionStorage.setItem('loggedInUser', data.username);
showModal('success', 'Login Successful', `Welcome, ${data.username}!`);
// ✅ PERBAIKAN: Redirect ke Homepage setelah 1.5 detik
setTimeout(() => {
window.location.href = 'Homepage.html';
}, 1500);
} else {
showModal('error', 'Login Failed', data.message || 'Incorrect username or password');
}

View File

@ -13,8 +13,14 @@
loginBtn.classList.add('btn-logout');
loginBtn.href = '#'; // Prevent navigation
// Add logout click handler
loginBtn.addEventListener('click', handleLogoutClick);
// Remove existing click listeners (untuk menghindari duplikat)
loginBtn.replaceWith(loginBtn.cloneNode(true));
// Get new reference dan add logout handler
const newLogoutBtn = document.querySelector('.btn-logout');
if (newLogoutBtn) {
newLogoutBtn.addEventListener('click', handleLogoutClick);
}
console.log('✅ User logged in:', loggedInUser);
} else {
@ -44,33 +50,42 @@
function setupModalButtons() {
const cancelBtn = document.getElementById('btn-logout-cancel');
const confirmBtn = document.getElementById('btn-logout-confirm');
const overlay = document.getElementById('logout-overlay');
// Cancel button
// Remove previous listeners
if (cancelBtn) {
cancelBtn.onclick = closeLogoutModal;
const newCancelBtn = cancelBtn.cloneNode(true);
cancelBtn.replaceWith(newCancelBtn);
newCancelBtn.onclick = closeLogoutModal;
}
// Confirm button
if (confirmBtn) {
confirmBtn.onclick = confirmLogout;
const newConfirmBtn = confirmBtn.cloneNode(true);
confirmBtn.replaceWith(newConfirmBtn);
newConfirmBtn.onclick = confirmLogout;
}
// Close on overlay click
const overlay = document.getElementById('logout-overlay');
if (overlay) {
overlay.addEventListener('click', function(e) {
overlay.onclick = function(e) {
if (e.target === overlay) {
closeLogoutModal();
}
});
};
}
// ESC key to close
document.addEventListener('keydown', function(e) {
// ESC key to close (gunakan named function agar bisa di-remove)
document.addEventListener('keydown', handleEscapeKey);
}
// ==================== HANDLE ESCAPE KEY ====================
function handleEscapeKey(e) {
if (e.key === 'Escape') {
const overlay = document.getElementById('logout-overlay');
if (overlay && overlay.classList.contains('active')) {
closeLogoutModal();
}
});
}
}
// ==================== CLOSE LOGOUT MODAL ====================
@ -82,12 +97,16 @@
overlay.style.display = 'none';
}, 300);
}
// Remove escape key listener
document.removeEventListener('keydown', handleEscapeKey);
}
// ==================== CONFIRM LOGOUT ====================
function confirmLogout() {
// Clear session
// Clear semua session data
sessionStorage.removeItem("loggedInUser");
sessionStorage.removeItem("authToken");
// Close logout modal
closeLogoutModal();
@ -98,7 +117,7 @@
// Redirect after 1.5 seconds
setTimeout(() => {
window.location.href = 'Homepage.html';
}, 2000);
}, 1500);
}
// ==================== SHOW SUCCESS MODAL ====================