feat: initial Jimi Gallery prototype

- 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
This commit is contained in:
2026-04-25 12:47:36 +09:00
commit 098b55e3b0
32 changed files with 5334 additions and 0 deletions

59
contact.html Normal file
View File

@ -0,0 +1,59 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Contact — Jimi Gallery</title>
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<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="assets/styles.css" />
</head>
<body>
<div id="nav-slot"></div>
<main>
<section class="page-title">
<div class="eyebrow" id="eyebrow"></div>
<h1 id="title"></h1>
</section>
<section class="section-tight">
<div id="contact" class="contact-grid"></div>
</section>
</main>
<div id="footer-slot"></div>
<script src="assets/i18n.js"></script>
<script src="assets/data.js"></script>
<script src="assets/app.js"></script>
<script>
(async () => {
try { await Store.load(); } catch (e) { return showBootError(e); }
renderChrome("contact");
document.getElementById("eyebrow").textContent = t("eyebrow.visit");
document.getElementById("title").textContent = t("title.contact");
const s = Store.settings();
mount(
"contact",
`
<div>
<strong>${t("contact.gallery")}</strong>
${s.address}<br>
${L(s.hours)}<br><br>
<a href="tel:${s.phone}">${s.phone}</a><br>
<a href="mailto:${s.email}">${s.email}</a>
</div>
<div>
<strong>${t("contact.press_sales")}</strong>
<a href="mailto:press@jimigallery.com">press@jimigallery.com</a><br>
<a href="mailto:sales@jimigallery.com">sales@jimigallery.com</a><br><br>
<strong>${t("footer.follow")}</strong>
<a href="#">${t("footer.instagram")} ${s.instagram}</a>
</div>
`
);
})();
</script>
</body>
</html>