diff --git a/2048.css b/2048.css index 8ade4f5..d425735 100644 --- a/2048.css +++ b/2048.css @@ -47,10 +47,6 @@ button:hover { font-size: 20px; } -/* ====================== - BOARD -====================== */ - /* ========================== BOARD — MIRIP BORDER LOGIN @@ -100,7 +96,6 @@ button:hover { } - /* ====================== TILE ====================== */ diff --git a/Modal_Register.js b/Modal_Register.js index 9a18417..6334895 100644 --- a/Modal_Register.js +++ b/Modal_Register.js @@ -9,10 +9,10 @@ export function showModal(type, title, message) { if (type === "success") { modalIcon.classList.add("success"); - modalTitle.textContent = title || "Register Berhasil!"; + modalTitle.textContent = title || "Register Successful!"; } else { modalIcon.classList.add("error"); - modalTitle.textContent = title || "Register Gagal!"; + modalTitle.textContent = title || "Register Failed!"; } modalMessage.textContent = message; diff --git a/Register.css b/Register.css index 7a5cb53..8c5504f 100644 --- a/Register.css +++ b/Register.css @@ -158,14 +158,18 @@ input::placeholder { text-shadow: 0 0 10px #00ddff; } -/* Modal */ +/* Modal - CENTERED VERSION */ .modal { display: none; position: fixed; - z-index: 999; - inset: 0; - background-color: rgba(0, 0, 0, 0.75); - backdrop-filter: blur(8px); + z-index: 1000; + left: 0; + top: 0; + width: 100%; + height: 100%; + background-color: rgba(0, 0, 0, 0.7); + backdrop-filter: blur(5px); + animation: fadeIn 0.3s ease; } .modal.show { @@ -175,75 +179,124 @@ input::placeholder { } .modal-content { - background: rgba(20, 0, 40, 0.95); + background: linear-gradient(135deg, rgba(30, 0, 50, 0.95) 0%, rgba(50, 0, 80, 0.95) 100%); + border: 2px solid rgba(0, 217, 255, 0.3); border-radius: 20px; - border: 2px solid rgba(0, 255, 255, 0.4); - padding: 35px 25px; - width: 90%; + padding: 40px 30px; + text-align: center; max-width: 400px; + width: 90%; + box-shadow: 0 20px 60px rgba(0, 0, 0, 0.5), + 0 0 40px rgba(0, 217, 255, 0.3), + inset 0 0 30px rgba(0, 217, 255, 0.1); + animation: slideIn 0.3s ease, glowBorder 3s ease-in-out infinite; +} - box-shadow: - 0 0 30px #00eaff, - 0 0 60px #ff00ff; +@keyframes glowBorder { + 0%, 100% { + border-color: rgba(0, 217, 255, 0.4); + box-shadow: 0 20px 60px rgba(0, 0, 0, 0.5), + 0 0 40px rgba(0, 217, 255, 0.3), + inset 0 0 30px rgba(0, 217, 255, 0.1); + } + 50% { + border-color: rgba(255, 0, 255, 0.5); + box-shadow: 0 20px 60px rgba(0, 0, 0, 0.5), + 0 0 50px rgba(255, 0, 255, 0.4), + inset 0 0 40px rgba(255, 0, 255, 0.15); + } } .modal-icon { width: 80px; height: 80px; - margin: 0 auto 15px; + margin: 0 auto 20px; border-radius: 50%; - display: flex; justify-content: center; align-items: center; - font-size: 38px; - color: white; + font-size: 40px; } .modal-icon.success { - background: linear-gradient(135deg, #00eaff, #00ff88); - box-shadow: 0 0 25px #00ffcc; + background: linear-gradient(135deg, #00d9ff 0%, #00ff88 100%); + box-shadow: 0 0 30px rgba(0, 217, 255, 0.6); +} + +.modal-icon.success::before { + content: "✓"; + color: #fff; } .modal-icon.error { - background: linear-gradient(135deg, #ff0066, #ff00ff); - box-shadow: 0 0 25px #ff00aa; + background: linear-gradient(135deg, #ff0080 0%, #ff00ff 100%); + box-shadow: 0 0 30px rgba(255, 0, 128, 0.6); +} + +.modal-icon.error::before { + content: "✕"; + color: #fff; } .modal-content h2 { - font-size: 1.7rem; - margin-bottom: 10px; - - background: linear-gradient(90deg, #00eaff, #ff00ff); + color: #fff; + font-size: 1.8rem; + margin-bottom: 15px; + background: linear-gradient(90deg, #00d9ff 0%, #ff00ff 100%); -webkit-background-clip: text; - background-clip: text; /* FIX: properti standar */ -webkit-text-fill-color: transparent; + background-clip: text; } .modal-content p { - color: rgba(240, 240, 255, 0.8); - margin-bottom: 25px; + color: rgba(255, 255, 255, 0.8); + font-size: 1rem; + margin-bottom: 30px; line-height: 1.5; } .modal-btn { - padding: 12px 55px; - background: linear-gradient(90deg, #00eaff, #ff00ff); + padding: 12px 50px; + background: linear-gradient(90deg, #00d9ff 0%, #ff00ff 100%); border: none; border-radius: 10px; - - color: white; + color: #fff; font-size: 16px; font-weight: bold; - + text-transform: uppercase; + letter-spacing: 2px; cursor: pointer; - box-shadow: 0 0 20px #00d9ff; - transition: 0.3s ease; + transition: all 0.3s ease; + box-shadow: 0 5px 25px rgba(0, 217, 255, 0.4); } .modal-btn:hover { - transform: translateY(-3px); - box-shadow: 0 0 30px #00eaff; + transform: translateY(-2px); + box-shadow: 0 8px 35px rgba(0, 217, 255, 0.6); +} + +.modal-btn:active { + transform: translateY(0); +} + +@keyframes fadeIn { + from { + opacity: 0; + } + to { + opacity: 1; + } +} + +@keyframes slideIn { + from { + transform: translateY(-50px); + opacity: 0; + } + to { + transform: translateY(0); + opacity: 1; + } } /* Autocomplete/Datalist Styling */ @@ -251,7 +304,7 @@ input::-webkit-calendar-picker-indicator { filter: invert(1); } -/* Styling untuk browser autocomplete */ +/* Browser autocomplete styling */ input:-webkit-autofill, input:-webkit-autofill:hover, input:-webkit-autofill:focus { @@ -265,7 +318,7 @@ input:-webkit-autofill:focus { border-color: #00d9ff; } -/* Styling untuk datalist dropdown - terbatas karena browser restrictions */ +/* Datalist dropdown styling - limited due to browser restrictions */ datalist { background-color: rgba(30, 0, 50, 0.95); } @@ -276,12 +329,12 @@ option { padding: 10px; } -/* Untuk Firefox */ +/* For Firefox */ input::-moz-list-thumbnail { background-color: rgba(30, 0, 50, 0.95); } -/* Custom styling untuk dropdown suggestion */ +/* Custom styling for dropdown suggestion */ input[list]::-webkit-list-button { color: #00d9ff; } @@ -305,4 +358,18 @@ input[list]::-webkit-list-button { padding: 13px; font-size: 16px; } -} + + .modal-icon { + width: 60px; + height: 60px; + font-size: 30px; + } + + .modal-content h2 { + font-size: 1.3rem; + } + + .modal-content p { + font-size: 0.9rem; + } +} \ No newline at end of file diff --git a/Register.js b/Register.js index c5c9b58..0b01421 100644 --- a/Register.js +++ b/Register.js @@ -14,13 +14,13 @@ document.getElementById("registerForm").addEventListener("submit", async functio // Validasi kosong if (!username || !password || !confirmPassword) { - showModal("error", "Register Gagal!", "Semua field wajib diisi."); + showModal("error", "Register Failed!", "All fields are required."); return; } // Validasi password tidak sama if (password !== confirmPassword) { - showModal("error", "Password Tidak Cocok!", "Password dan Confirm Password harus sama."); + showModal("error", "Password Mismatch!", "Password and Confirm Password must match."); setInputError("password"); setInputError("confirmPassword"); return; @@ -29,7 +29,7 @@ document.getElementById("registerForm").addEventListener("submit", async functio // Button loading state const submitBtn = this.querySelector("button[type='submit']"); const originalText = submitBtn.textContent; - submitBtn.innerHTML = "Memproses..."; + submitBtn.innerHTML = "Loading..."; submitBtn.disabled = true; try { @@ -37,20 +37,20 @@ document.getElementById("registerForm").addEventListener("submit", async functio // API temenmu return: { status: "success", message: "..." } if (data.status === "success") { - showModal("success", "Register Berhasil!", data.message); + showModal("success", "Register Successful!", data.message); } else { - showModal("error", "Register Gagal!", data.message || "Terjadi kesalahan."); + showModal("error", "Register Failed!", data.message || "An error occurred."); setInputError("username"); } } catch (error) { console.error("Register Error:", error); - let msg = "Terjadi kesalahan koneksi."; + let msg = "A connection error occurred."; if (error.message === "Failed to fetch") { - msg = "Tidak dapat terhubung ke server."; + msg = "Unable to connect to server."; } showModal("error", "Error!", msg);