- Public site (Home/Artists/Exhibitions/News/About/Contact) with EN/KO/JA i18n - Admin panel with login, CRUD, image upload, multilingual editing - Exhibition slider/lightbox view - FastAPI + MongoDB backend, JWT auth - Docker Compose deployment, behind nginx at jimi.yakenator.io
66 lines
2.8 KiB
HTML
66 lines
2.8 KiB
HTML
<!doctype html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="utf-8" />
|
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
<title>Jimi Gallery Admin — Sign in</title>
|
|
<link
|
|
href="https://fonts.googleapis.com/css2?family=Cinzel:wght@500;600&family=Cormorant+Garamond:wght@400;500;600&family=Inter:wght@300;400;500&display=swap"
|
|
rel="stylesheet"
|
|
/>
|
|
<link rel="stylesheet" href="admin.css" />
|
|
</head>
|
|
<body>
|
|
<div class="login-lang-wrap"></div>
|
|
<div class="login-wrap">
|
|
<form class="login-card" id="f">
|
|
<h1>
|
|
<svg class="brand-mark" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
|
|
<circle cx="50" cy="50" r="50" fill="#6b3d8f"/>
|
|
<g fill="#ffffff" font-family="'Cormorant Garamond','Playfair Display','Times New Roman',serif" font-weight="500" font-style="italic">
|
|
<text x="37" y="70" text-anchor="middle" font-size="60">J</text>
|
|
<text x="63" y="70" text-anchor="middle" font-size="60">M</text>
|
|
</g>
|
|
</svg>
|
|
<span>
|
|
<span class="brand-word">Jimi Gallery</span>
|
|
<span class="brand-sub" id="login-role"></span>
|
|
</span>
|
|
</h1>
|
|
<label for="pw" id="pw-label"></label>
|
|
<input type="password" id="pw" autofocus autocomplete="current-password" />
|
|
<div class="error" id="err"></div>
|
|
<button class="btn" style="width:100%;margin-top:12px" type="submit" id="submit-btn"></button>
|
|
<div class="hint"><span id="hint-text"></span> <code>admin</code></div>
|
|
</form>
|
|
</div>
|
|
<script src="../assets/i18n.js"></script>
|
|
<script src="../assets/data.js"></script>
|
|
<script src="admin.js"></script>
|
|
<script>
|
|
if (Auth.isAuthed()) location.href = "dashboard.html";
|
|
|
|
document.getElementById("login-role").textContent = t("admin.login.title");
|
|
document.getElementById("pw-label").textContent = t("admin.login.password");
|
|
document.getElementById("submit-btn").textContent = t("admin.login.submit");
|
|
document.getElementById("hint-text").textContent = t("admin.login.hint");
|
|
document.title = "Jimi Gallery · " + t("admin.login.title") + " — " + t("admin.login.submit");
|
|
|
|
// language switcher in corner
|
|
document.querySelector(".login-lang-wrap").innerHTML = langSwitcherHtml();
|
|
wireLangSwitcher();
|
|
|
|
document.getElementById("f").addEventListener("submit", async (e) => {
|
|
e.preventDefault();
|
|
const pw = document.getElementById("pw").value;
|
|
const ok = await Auth.login(pw);
|
|
if (ok) {
|
|
location.href = "dashboard.html";
|
|
} else {
|
|
document.getElementById("err").textContent = t("admin.login.incorrect");
|
|
}
|
|
});
|
|
</script>
|
|
</body>
|
|
</html>
|