<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Hasan Foto - Abadikan Momen Terbaik Anda</title>
<!-- Tailwind CSS CDN untuk styling modern dan responsif -->
<script src="https://cdn.tailwindcss.com"></script>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap" rel="stylesheet">
<style>
/* Hilangkan scrollbar di seluruh aplikasi */
html,
body {
scrollbar-width: none;
/* Firefox */
-ms-overflow-style: none;
/* IE and Edge */
}
html::-webkit-scrollbar,
body::-webkit-scrollbar {
display: none;
/* Chrome, Safari, Opera */
}
body {
font-family: 'Inter', sans-serif;
background-color: #f8fafc;
}
/* Gaya untuk tab aktif */
.tab.active {
background-color: #3b82f6;
color: #fff;
}
/* Gaya untuk konten tab aktif */
.tab-content {
display: none;
}
.tab-content.active {
display: block;
}
/* Styling for the hero section with a gradient overlay */
.hero-section {
background-color: rgb(59, 130, 246);
background-image: url('https://placehold.co/1920x1080/64748b');
background-size: cover;
background-position: center;
}
/* Gaya untuk modal pop-up */
.modal {
position: fixed;
z-index: 50;
left: 0;
top: 0;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, 0.8);
display: none;
justify-content: center;
align-items: center;
}
.modal-content {
max-width: 90%;
max-height: 90%;
background-color: #fff;
border-radius: 1rem;
box-shadow: 0 10px 25px rgba(0, 0, 0, 0.5);
position: relative;
display: flex;
flex-direction: column;
overflow: hidden;
}
.close-button {
position: absolute;
top: 1rem;
right: 1rem;
color: #fff;
font-size: 2rem;
font-weight: bold;
cursor: pointer;
z-index: 60;
background-color: rgba(0, 0, 0, 0.5);
border-radius: 50%;
width: 2.5rem;
height: 2.5rem;
display: flex;
justify-content: center;
align-items: center;
transition: background-color 0.3s;
}
.close-button:hover {
background-color: rgba(0, 0, 0, 0.7);
}
.carousel-container {
position: relative;
width: 100%;
height: auto;
}
.carousel-image {
display: none;
width: 100%;
height: auto;
object-fit: cover;
}
.carousel-image.active {
display: block;
}
.carousel-nav {
position: absolute;
top: 50%;
width: 100%;
display: flex;
justify-content: space-between;
transform: translateY(-50%);
}
.carousel-nav-btn {
background-color: rgba(0, 0, 0, 0.5);
color: #fff;
border: none;
padding: 0.5rem 1rem;
cursor: pointer;
font-size: 1.5rem;
transition: background-color 0.3s;
}
.carousel-nav-btn:hover {
background-color: rgba(0, 0, 0, 0.7);
}
.carousel-nav-btn.left {
border-top-right-radius: 9999px;
border-bottom-right-radius: 9999px;
}
.carousel-nav-btn.right {
border-top-left-radius: 9999px;
border-bottom-left-radius: 9999px;
}
/* Fade-in animation for gallery modal */
@keyframes fade-in {
from {
opacity: 0;
transform: scale(0.97);
}
to {
opacity: 1;
transform: scale(1);
}
}
.animate-fade-in {
animation: fade-in 0.3s cubic-bezier(.4, 0, .2, 1);
}
@media (max-width: 640px) {
#gallery-modal .rounded-2xl {
border-radius: 0.75rem !important;
}
#gallery-modal .shadow-2xl {
box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.18) !important;
}
#gallery-modal .modal-content {
width: calc(100vw - 20px) !important;
max-width: calc(100vw - 20px) !important;
min-width: 0 !important;
margin-left: 0 !important;
margin-right: 0 !important;
padding: 0.5rem 0.5rem 1.5rem 0.5rem !important;
border-radius: 0.75rem !important;
box-sizing: border-box !important;
}
#gallery-modal .flex-1.flex.items-center.justify-center.w-full {
padding-left: 0.5rem !important;
padding-right: 0.5rem !important;
}
#gallery-modal #gallery-image {
padding: 0.5rem;
background: #f3f4f6;
border-radius: 0.5rem;
width: 100% !important;
max-width: 100% !important;
height: auto !important;
object-fit: contain !important;
box-sizing: border-box !important;
}
}
</style>
</head>
<body class="text-slate-700">
<!-- ========== Navbar Responsif ========== -->
<nav class="bg-white shadow-lg fixed w-full z-20 top-0">
<div class="container mx-auto px-4 py-3 flex justify-between items-center">
<!-- Logo/Nama Brand -->
<a href="#beranda" class="text-2xl font-bold text-blue-600">Hasan Foto</a>
<!-- Tautan Navigasi (Desktop) -->
<div class="hidden md:flex space-x-6 items-center">
<a href="#beranda"
class="text-slate-700 hover:text-blue-600 font-semibold transition-colors duration-300">Beranda</a>
<a href="#services"
class="text-slate-700 hover:text-blue-600 font-semibold transition-colors duration-300">Layanan</a>
<a href="#portfolio-gallery"
class="text-slate-700 hover:text-blue-600 font-semibold transition-colors duration-300">Galeri</a>
</div>
<!-- Tombol Hamburger (Mobile) -->
<button id="menu-button" class="md:hidden text-slate-700 hover:text-blue-600 focus:outline-none">
<svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24"
xmlns="http://www.w3.org/2000/svg">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
d="M4 6h16M4 12h16m-7 6h7">
</path>
</svg>
</button>
</div>
<!-- Menu Mobile yang bisa ditutup/dibuka -->
<div id="mobile-menu" class="hidden md:hidden bg-white shadow-inner pb-4">
<a href="#beranda"
class="block py-2 px-4 text-slate-700 hover:bg-slate-100 transition-colors duration-300 font-semibold">Beranda</a>
<a href="#services"
class="block py-2 px-4 text-slate-700 hover:bg-slate-100 transition-colors duration-300 font-semibold">Layanan</a>
<a href="#portfolio-gallery"
class="block py-2 px-4 text-slate-700 hover:bg-slate-100 transition-colors duration-300 font-semibold">Galeri</a>
</div>
</nav>
<!-- ========== Akhir Navbar ========== -->
<!-- Bagian Header/Hero -->
<header id="beranda" class="hero-section text-white py-24 md:py-32 overflow-hidden ">
<div class="relative container mx-auto px-4 text-center z-10">
<h1 class="text-4xl sm:text-5xl md:text-6xl font-bold mb-4">Hasan Foto</h1>
<p class="text-lg sm:text-xl md:text-2xl font-light mb-8">Abadikan setiap momen berharga dan ciptakan
kenangan tak terlupakan bersama kami.</p>
<a href="#services"
class="bg-white text-blue-600 font-bold py-3 px-8 rounded-full shadow-lg hover:bg-blue-100 transition-all duration-300">Lihat
Layanan Kami</a>
</div>
</header>
<!-- Konten utama halaman -->
<main class="flex-grow container mx-auto px-4 py-8">
<!-- Bagian Layanan Utama (Foto & Undangan) -->
<section id="services" class="py-16 md:py-24 bg-white">
<div class="container mx-auto px-4">
<h2 class="text-3xl md:text-4xl font-bold text-center mb-12">Layanan Kami</h2>
<div class="grid grid-cols-1 md:grid-cols-2 gap-8 lg:gap-12">
<!-- Layanan Jasa Foto -->
<div
class="bg-slate-50 p-6 md:p-8 rounded-xl shadow-lg hover:shadow-2xl transition-all duration-300 transform hover:-translate-y-2">
<h3 class="text-2xl font-bold text-blue-600 mb-4">Jasa Fotografi Sekolah</h3>
<p class="mb-4 text-slate-600">Spesialisasi kami dalam mengabadikan momen-momen istimewa di
sekolah:</p>
<ul class="list-disc list-inside space-y-2 text-slate-600 pl-4">
<li>Foto Wisuda TK & PAUD</li>
<li>Dokumentasi Manasik Haji TK & PAUD</li>
<li>Foto Raport / Ijazah SD,SMP,SMA/SMK</li>
<li>Liputan Kegiatan Sekolah (Pentas Seni, Perpisahan, dll)</li>
</ul>
</div>
<!-- Layanan Jual Undangan -->
<div
class="bg-slate-50 p-6 md:p-8 rounded-xl shadow-lg hover:shadow-2xl transition-all duration-300 transform hover:-translate-y-2">
<h3 class="text-2xl font-bold text-blue-600 mb-4">Penjualan Undangan</h3>
<p class="mb-4 text-slate-600"> Abadikan momen bahagia Anda dengan undangan pernikahan yang
indah, baik
dalam bentuk blangko cetak maupun versi digital.
</p>
<ul class="list-disc list-inside space-y-2 text-slate-600 pl-4">
<li>Undangan Blangko Pernikahan</li>
<li>Undangan Pernikahan Website / Digital</li>
</ul>
<a href="#portfolio-gallery" class="mt-6 inline-block text-blue-600 font-semibold hover:underline">Lihat
Galeri Kami
→</a>
</div>
</div>
</div>
</section>
<!-- Bagian Galeri dengan Tabs -->
<section id="portfolio-gallery" class="py-16 md:py-24 bg-slate-100">
<div class="container mx-auto px-4">
<h2 class="text-3xl md:text-4xl font-bold text-center mb-12">Galeri Kami</h2>
<!-- Tabs -->
<div class="flex flex-wrap justify-center gap-x-2 gap-y-3 md:gap-x-4 mb-8">
<button id="photo-tab"
class="tab active px-4 md:px-6 py-2 rounded-full font-semibold text-sm md:text-base transition-colors duration-300 whitespace-nowrap">
Galeri Foto
</button>
<button id="invitation-tab"
class="tab px-4 md:px-6 py-2 rounded-full font-semibold text-sm md:text-base transition-colors duration-300 bg-slate-200 hover:bg-slate-300 text-slate-700 whitespace-nowrap">
Blanko Undangan
</button>
<button id="digital-tab"
class="tab px-4 md:px-6 py-2 rounded-full font-semibold text-sm md:text-base transition-colors duration-300 bg-slate-200 hover:bg-slate-300 text-slate-700 whitespace-nowrap">
Undangan Digital
</button>
</div>
<!-- Konten Tab 1: Galeri Foto -->
<div id="photo-content" class="tab-content active">
<div id="photo-grid" class="grid grid-cols-1 sm:grid-cols-3 lg:grid-cols-4 gap-6">
<div class="bg-white rounded-lg shadow-md overflow-hidden transform hover:scale-105 transition-transform duration-300 cursor-pointer"
onclick="openModal('Wisuda Paud As-Salam', ["https:\/\/placehold.co\/3000x2398\/fcd34d\/ffffff?text=Pentas+Seni+1","https:\/\/placehold.co\/3000x2398\/fcd34d\/ffffff?text=Pentas+Seni+2","https:\/\/placehold.co\/3000x2398\/fcd34d\/ffffff?text=Pentas+Seni+3"], '2023-10-20 10:00:00', 'As-Salam, Cibarusah', '50 anak')">
<img src="https://placehold.co/800x1000/fcd34d/ffffff?text=Wisuda Paud As-Salam" alt="Foto Wisuda Paud As-Salam"
class="w-full h-48 object-cover ">
<div class="p-4 text-center">
<p class="text-lg font-semibold">Wisuda Paud As-Salam</p>
</div>
</div>
<div class="bg-white rounded-lg shadow-md overflow-hidden transform hover:scale-105 transition-transform duration-300 cursor-pointer"
onclick="openModal('Manasik Haji Nurul Huda', ["https:\/\/placehold.co\/3000x2398\/fcd34d\/ffffff?text=Pentas+Seni+1","https:\/\/placehold.co\/3000x2398\/fcd34d\/ffffff?text=Pentas+Seni+2","https:\/\/placehold.co\/3000x2398\/fcd34d\/ffffff?text=Pentas+Seni+3"], '', 'Masjid Agung Al-Falah, Bandung', '75 anak')">
<img src="https://placehold.co/800x1000/fcd34d/ffffff?text=Manasik Haji Paud Nurul Huda" alt="Foto Manasik Haji Nurul Huda"
class="w-full h-48 object-cover ">
<div class="p-4 text-center">
<p class="text-lg font-semibold">Manasik Haji Nurul Huda</p>
</div>
</div>
<div class="bg-white rounded-lg shadow-md overflow-hidden transform hover:scale-105 transition-transform duration-300 cursor-pointer"
onclick="openModal('Pentas Seni Sd Kota 02', ["https:\/\/placehold.co\/3000x2398\/fcd34d\/ffffff?text=Pentas+Seni+1","https:\/\/placehold.co\/3000x2398\/fcd34d\/ffffff?text=Pentas+Seni+2","https:\/\/placehold.co\/3000x2398\/fcd34d\/ffffff?text=Pentas+Seni+3"], '', 'Gedung Kesenian, Surabaya', '120 anak')">
<img src="https://placehold.co/800x1000/fcd34d/ffffff?text=Pentas+Seni Sd Kota 02" alt="Foto Pentas Seni Sd Kota 02"
class="w-full h-48 object-cover ">
<div class="p-4 text-center">
<p class="text-lg font-semibold">Pentas Seni Sd Kota 02</p>
</div>
</div>
<div class="bg-white rounded-lg shadow-md overflow-hidden transform hover:scale-105 transition-transform duration-300 cursor-pointer"
onclick="openModal('Pentas Seni Sd Kota 03', ["https:\/\/placehold.co\/3000x2398\/fcd34d\/ffffff?text=Pentas+Seni+1","https:\/\/placehold.co\/3000x2398\/fcd34d\/ffffff?text=Pentas+Seni+2","https:\/\/placehold.co\/3000x2398\/fcd34d\/ffffff?text=Pentas+Seni+3"], '', 'Gedung Kesenian, Surabaya', '120 anak')">
<img src="https://placehold.co/800x1000/fcd34d/ffffff?text=Pentas+Seni Sd Kota 03" alt="Foto Pentas Seni Sd Kota 03"
class="w-full h-48 object-cover ">
<div class="p-4 text-center">
<p class="text-lg font-semibold">Pentas Seni Sd Kota 03</p>
</div>
</div>
</div>
</div>
<!-- Konten Tab 2: Blanko Undangan -->
<div id="invitation-content" class="tab-content">
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-6">
<div class="bg-white rounded-lg shadow-md overflow-hidden transform hover:scale-105 transition-transform duration-300 cursor-pointer"
onclick="openInvitationModal(["https:\/\/placehold.co\/400x500\/87CEEB\/ffffff?text=BLK-1800-01","https:\/\/placehold.co\/400x500\/87CEEB\/ffffff?text=BLK-1800-02"])">
<img src="https://placehold.co/400x500/87CEEB/ffffff?text=Harga+1800" alt="Harga 1800"
class="w-full h-48 object-cover ">
<div class="p-4 text-center">
<p class="text-lg font-semibold">Harga 1800</p>
</div>
</div>
<div class="bg-white rounded-lg shadow-md overflow-hidden transform hover:scale-105 transition-transform duration-300 cursor-pointer"
onclick="openInvitationModal(["https:\/\/placehold.co\/400x500\/A0A0A0\/ffffff?text=BLK-1500-01","https:\/\/placehold.co\/400x500\/A0A0A0\/ffffff?text=BLK-1500-02"])">
<img src="https://placehold.co/400x500/A0A0A0/ffffff?text=Harga+1500" alt="Harga 1500"
class="w-full h-48 object-cover ">
<div class="p-4 text-center">
<p class="text-lg font-semibold">Harga 1500</p>
</div>
</div>
</div>
</div>
<!-- Konten Tab 3: Undangan Digital -->
<div id="digital-content" class="tab-content">
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-6">
<!-- Item Undangan Digital 1: Tema Bunga -->
<div class="bg-white rounded-lg shadow-md overflow-hidden transform hover:scale-105 transition-transform duration-300 cursor-pointer"
onclick="openModal('Undangan Digital Tema Bunga', 'Undangan digital dengan sentuhan floral yang indah. Desain ini memberikan kesan romantis dan alami.', ['https://placehold.co/400x500/f87171/ffffff?text=Web+Undangan+1A', 'https://placehold.co/400x500/f87171/ffffff?text=Web+Undangan+1B'])">
<img src="https://placehold.co/400x500/f87171/ffffff?text=Web+Undangan+1"
alt="Undangan Digital Tema Bunga" class="w-full h-auto object-cover">
<div class="p-4 text-center">
<p class="text-lg font-semibold">Tema Bunga Klasik</p>
<p class="text-sm text-slate-500 mt-1">Undangan digital dengan sentuhan floral yang
indah.</p>
</div>
</div>
<!-- Item Undangan Digital 2: Minimalis Modern -->
<div class="bg-white rounded-lg shadow-md overflow-hidden transform hover:scale-105 transition-transform duration-300 cursor-pointer"
onclick="openModal('Undangan Digital Tema Minimalis', 'Desain bersih dan modern untuk Anda yang stylish. Tampilan yang elegan dan mudah diakses.', ['https://placehold.co/400x500/fbbf24/ffffff?text=Web+Undangan+2A', 'https://placehold.co/400x500/fbbf24/ffffff?text=Web+Undangan+2B'])">
<img src="https://placehold.co/400x500/fbbf24/ffffff?text=Web+Undangan+2"
alt="Undangan Digital Tema Minimalis" class="w-full h-auto object-cover">
<div class="p-4 text-center">
<p class="text-lg font-semibold">Tema Minimalis Modern</p>
<p class="text-sm text-slate-500 mt-1">Desain bersih dan modern untuk Anda yang
stylish.</p>
</div>
</div>
<!-- Item Undangan Digital 3: Rustic Elegan -->
<div class="bg-white rounded-lg shadow-md overflow-hidden transform hover:scale-105 transition-transform duration-300 cursor-pointer"
onclick="openModal('Undangan Digital Tema Rustic', 'Gabungan nuansa alam dan elegansi dalam satu undangan. Desain unik dengan elemen kayu dan bunga kering.', ['https://placehold.co/400x500/a78bfa/ffffff?text=Web+Undangan+3A', 'https://placehold.co/400x500/a78bfa/ffffff?text=Web+Undangan+3B'])">
<img src="https://placehold.co/400x500/a78bfa/ffffff?text=Web+Undangan+3"
alt="Undangan Digital Tema Rustic" class="w-full h-auto object-cover">
<div class="p-4 text-center">
<p class="text-lg font-semibold">Tema Rustic Elegan</p>
<p class="text-sm text-slate-500 mt-1">Gabungan nuansa alam dan elegansi dalam satu
undangan.</p>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- Bagian Mengapa Memilih Kami -->
<section id="why-us" class="py-16 md:py-24 bg-white">
<div class="container mx-auto px-4">
<h2 class="text-3xl md:text-4xl font-bold text-center mb-12">Mengapa Memilih Kami?</h2>
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-8">
<!-- Keunggulan 1 -->
<div class="bg-slate-100 p-6 rounded-lg shadow-md text-center">
<div class="text-3xl text-blue-600 mb-4">📸</div>
<h4 class="font-semibold text-lg mb-2">Fotografer Profesional</h4>
<p class="text-sm text-slate-600">Tim berpengalaman yang ramah dan sabar, terutama dengan
anak-anak.</p>
</div>
<!-- Keunggulan 2 -->
<div class="bg-slate-100 p-6 rounded-lg shadow-md text-center">
<div class="text-3xl text-blue-600 mb-4">💎</div>
<h4 class="font-semibold text-lg mb-2">Kualitas Terbaik</h4>
<p class="text-sm text-slate-600">Kami menggunakan peralatan terbaik untuk hasil foto yang
tajam dan cetakan yang berkualitas.</p>
</div>
<!-- Keunggulan 3 -->
<div class="bg-slate-100 p-6 rounded-lg shadow-md text-center">
<div class="text-3xl text-blue-600 mb-4">📦</div>
<h4 class="font-semibold text-lg mb-2">Paket Fleksibel</h4>
<p class="text-sm text-slate-600">Berbagai pilihan paket yang dapat disesuaikan dengan
kebutuhan dan anggaran Anda.</p>
</div>
<!-- Keunggulan 4 -->
<div class="bg-slate-100 p-6 rounded-lg shadow-md text-center">
<div class="text-3xl text-blue-600 mb-4">⏱️</div>
<h4 class="font-semibold text-lg mb-2">Proses Cepat</h4>
<p class="text-sm text-slate-600">Kami memastikan hasil cetak foto dan undangan Anda selesai
tepat waktu.</p>
</div>
</div>
</div>
</section>
</main>
<footer class="bg-gray-800 text-white py-8">
<div class="container mx-auto px-4">
<div class="grid grid-cols-1 md:grid-cols-3 gap-8">
<div>
<h4 class="text-xl font-bold mb-4">Hasan Foto</h4>
<p class="text-sm text-slate-300">Mengabadikan momen spesial anak-anak dengan sentuhan
profesional
dan penuh kasih sayang.
</p>
</div>
<div>
<h4 class="text-xl font-bold mb-4">Layanan</h4>
<ul class="text-sm space-y-2">
<li><a href="#services" class="hover:underline text-slate-300">Jasa Fotografi</a></li>
<li><a href="#portfolio-gallery" class="hover:underline text-slate-300">Galeri Kami</a></li>
</ul>
</div>
<div>
<h4 class="text-xl font-bold mb-4">Hubungi Kami</h4>
<ul class="text-sm space-y-2 text-slate-300">
<li>Telepon: 0812-3456-7890</li>
<li>Email: info@.com</li>
<li>Alamat: Jl. Contoh No. 123, Kota Anda</li>
</ul>
</div>
</div>
<div class="border-t border-gray-700 mt-8 pt-6 text-center text-gray-400">
<p>© 2025 Hasan Foto. Semua hak cipta dilindungi.</p>
</div>
</div>
</footer>
<!-- Modal Pop-up Galeri Foto -->
<div id="gallery-modal"
class="fixed inset-0 z-50 flex items-center justify-center bg-black bg-opacity-70 hidden transition-opacity duration-300">
<div class="relative w-full max-w-lg sm:max-w-2xl md:max-w-3xl mx-2 sm:mx-8 rounded-2xl shadow-2xl bg-white flex flex-col items-center p-0 sm:p-6 animate-fade-in"
style="min-height:200px; max-height:95vh;">
<!-- Tombol Close -->
<button id="gallery-close"
class="absolute top-2 right-2 sm:top-3 sm:right-3 text-gray-500 hover:text-red-500 text-2xl font-bold focus:outline-none transition-colors duration-200 bg-white bg-opacity-80 rounded-full w-9 h-9 flex items-center justify-center"
aria-label="Tutup">×</button>
<!-- Navigasi Kiri -->
<button id="gallery-prev"
class="absolute left-1 sm:left-2 top-1/2 -translate-y-1/2 bg-white bg-opacity-80 hover:bg-opacity-100 rounded-full shadow p-2 text-2xl text-gray-700 hover:text-blue-600 focus:outline-none transition-all duration-200 z-10 block sm:block"
aria-label="Sebelumnya">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor"
class="w-7 h-7">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 19l-7-7 7-7" />
</svg>
</button>
<!-- Navigasi Kanan -->
<button id="gallery-next"
class="absolute right-1 sm:right-2 top-1/2 -translate-y-1/2 bg-white bg-opacity-80 hover:bg-opacity-100 rounded-full shadow p-2 text-2xl text-gray-700 hover:text-blue-600 focus:outline-none transition-all duration-200 z-10 block sm:block"
aria-label="Berikutnya">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor"
class="w-7 h-7">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7" />
</svg>
</button>
<!-- Gambar -->
<div
class="flex-1 flex items-center justify-center w-full min-h-[180px] sm:min-h-[250px] max-h-[60vh] sm:max-h-[70vh]">
<img id="gallery-image" src="" alt="Galeri"
class="max-h-[60vh] sm:max-h-[70vh] w-auto max-w-full object-contain rounded-xl shadow-lg transition-opacity duration-500 opacity-0 bg-gray-100"
style="background: #f3f4f6; max-width:98vw;" />
</div>
<!-- Indikator & Caption -->
<div class="w-full flex flex-col items-center mt-2 mb-2 px-2">
<span id="gallery-indicator"
class="text-xs sm:text-sm text-gray-600 bg-white bg-opacity-80 rounded-full px-2 sm:px-3 py-1 shadow font-semibold"></span>
<span id="gallery-caption"
class="text-xs sm:text-base text-gray-700 mt-1 text-center break-words"></span>
</div>
</div>
</div>
<!-- Modal Pop-up Blanko Undangan -->
<div id="invitation-modal"
class="fixed inset-0 z-50 flex items-center justify-center bg-black bg-opacity-70 hidden transition-opacity duration-300">
<div class="relative w-full max-w-lg sm:max-w-2xl md:max-w-3xl mx-2 sm:mx-8 rounded-2xl shadow-2xl bg-white flex flex-col items-center p-0 sm:p-6 animate-fade-in"
style="min-height:200px; max-height:95vh;">
<!-- Tombol Close -->
<button id="invitation-close"
class="absolute top-2 right-2 sm:top-3 sm:right-3 text-gray-500 hover:text-red-500 text-2xl font-bold focus:outline-none transition-colors duration-200 bg-white bg-opacity-80 rounded-full w-9 h-9 flex items-center justify-center"
aria-label="Tutup">×</button>
<!-- Navigasi Kiri -->
<button id="invitation-prev"
class="absolute left-1 sm:left-2 top-1/2 -translate-y-1/2 bg-white bg-opacity-80 hover:bg-opacity-100 rounded-full shadow p-2 text-2xl text-gray-700 hover:text-blue-600 focus:outline-none transition-all duration-200 z-10 block sm:block"
aria-label="Sebelumnya">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor"
class="w-7 h-7">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 19l-7-7 7-7" />
</svg>
</button>
<!-- Navigasi Kanan -->
<button id="invitation-next"
class="absolute right-1 sm:right-2 top-1/2 -translate-y-1/2 bg-white bg-opacity-80 hover:bg-opacity-100 rounded-full shadow p-2 text-2xl text-gray-700 hover:text-blue-600 focus:outline-none transition-all duration-200 z-10 block sm:block"
aria-label="Berikutnya">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor"
class="w-7 h-7">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7" />
</svg>
</button>
<!-- Gambar -->
<div
class="flex-1 flex items-center justify-center w-full min-h-[180px] sm:min-h-[250px] max-h-[60vh] sm:max-h-[70vh]">
<img id="invitation-image" src="" alt="Undangan"
class="max-h-[60vh] sm:max-h-[70vh] w-auto max-w-full object-contain rounded-xl shadow-lg transition-opacity duration-500 opacity-0 bg-gray-100"
style="background: #f3f4f6; max-width:98vw;" />
</div>
<!-- Indikator -->
<div class="w-full flex flex-col items-center mt-2 mb-2 px-2">
<span id="invitation-indicator"
class="text-xs sm:text-sm text-gray-600 bg-white bg-opacity-80 rounded-full px-2 sm:px-3 py-1 shadow font-semibold"></span>
</div>
</div>
</div>
<script>
// ========== Modal Pop-up Blanko Undangan ==========
document.addEventListener('DOMContentLoaded', function() {
let invitationImages = [];
let invitationCurrent = 0;
const modal = document.getElementById('invitation-modal');
const img = document.getElementById('invitation-image');
const indicator = document.getElementById('invitation-indicator');
const closeBtn = document.getElementById('invitation-close');
const prevBtn = document.getElementById('invitation-prev');
const nextBtn = document.getElementById('invitation-next');
window.openInvitationModal = function(images) {
invitationImages = images;
invitationCurrent = 0;
showInvitationImage(0);
modal.classList.remove('hidden');
setTimeout(() => {
modal.classList.add('opacity-100');
}, 10);
document.body.classList.add('overflow-hidden');
}
function closeModal() {
modal.classList.remove('opacity-100');
setTimeout(() => {
modal.classList.add('hidden');
}, 250);
document.body.classList.remove('overflow-hidden');
}
function showInvitationImage(idx) {
if (!invitationImages.length) return;
invitationCurrent = idx;
img.classList.remove('opacity-100');
img.classList.add('opacity-0');
setTimeout(() => {
img.src = invitationImages[invitationCurrent];
img.onload = () => {
img.classList.remove('opacity-0');
img.classList.add('opacity-100');
};
}, 200);
indicator.textContent = (invitationCurrent + 1) + ' / ' + invitationImages.length;
prevBtn.style.display = invitationImages.length > 1 ? '' : 'none';
nextBtn.style.display = invitationImages.length > 1 ? '' : 'none';
}
function nextImage() {
if (invitationImages.length < 2) return;
showInvitationImage((invitationCurrent + 1) % invitationImages.length);
}
function prevImage() {
if (invitationImages.length < 2) return;
showInvitationImage((invitationCurrent - 1 + invitationImages.length) % invitationImages.length);
}
if (closeBtn) closeBtn.addEventListener('click', closeModal);
if (nextBtn) nextBtn.addEventListener('click', nextImage);
if (prevBtn) prevBtn.addEventListener('click', prevImage);
if (modal) {
modal.addEventListener('mousedown', function(e) {
if (e.target === modal) closeModal();
});
}
document.addEventListener('keydown', function(e) {
if (!modal.classList.contains('hidden')) {
if (e.key === 'Escape') closeModal();
if (e.key === 'ArrowRight') nextImage();
if (e.key === 'ArrowLeft') prevImage();
}
});
});
// ========== Modal Pop-up Galeri Foto Modern ==========
document.addEventListener('DOMContentLoaded', function() {
let galleryImages = [];
let galleryTitle = '';
let galleryCurrent = 0;
let galleryLocation = '';
let galleryNumberOfChildren = '';
const modal = document.getElementById('gallery-modal');
const img = document.getElementById('gallery-image');
const indicator = document.getElementById('gallery-indicator');
const caption = document.getElementById('gallery-caption');
const closeBtn = document.getElementById('gallery-close');
const prevBtn = document.getElementById('gallery-prev');
const nextBtn = document.getElementById('gallery-next');
let galleryTanggal = '';
window.openModal = function(title, images, time, location, numberOfChildren) {
galleryImages = images;
galleryTitle = title;
galleryLocation = location;
galleryNumberOfChildren = numberOfChildren;
galleryCurrent = 0;
// Format tanggal (dari string time, misal '2025-08-25 14:32:10')
galleryTanggal = '';
if (time) {
let tgl = time.split(' ')[0];
let [year, month, day] = tgl.split('-');
const bulan = ['Januari', 'Februari', 'Maret', 'April', 'Mei', 'Juni', 'Juli', 'Agustus',
'September', 'Oktober', 'November', 'Desember'
];
galleryTanggal = day + ' ' + bulan[parseInt(month, 10) - 1] + ' ' + year;
}
showImage(0);
// Set time if element exists (opsional, jika ingin tetap tampilkan di bawah)
const timeEl = document.getElementById('gallery-time');
if (timeEl) timeEl.textContent = galleryTanggal;
modal.classList.remove('hidden');
setTimeout(() => {
modal.classList.add('opacity-100');
}, 10);
document.body.classList.add('overflow-hidden');
}
function closeModal() {
modal.classList.remove('opacity-100');
setTimeout(() => {
modal.classList.add('hidden');
}, 250);
document.body.classList.remove('overflow-hidden');
}
function showImage(idx) {
if (!galleryImages.length) return;
galleryCurrent = idx;
img.classList.remove('opacity-100');
img.classList.add('opacity-0');
setTimeout(() => {
img.src = galleryImages[galleryCurrent];
img.onload = () => {
img.classList.remove('opacity-0');
img.classList.add('opacity-100');
};
}, 200);
indicator.textContent = (galleryCurrent + 1) + ' / ' + galleryImages.length;
// Format caption: Judul - Tanggal - Lokasi (Jumlah Anak)
let cap = galleryTitle;
if (galleryTanggal) cap += ' - ' + galleryTanggal;
if (galleryLocation) cap += ' - ' + galleryLocation;
if (galleryNumberOfChildren) cap += ' (' + galleryNumberOfChildren + ')';
caption.textContent = cap;
// Show/hide nav
prevBtn.style.display = galleryImages.length > 1 ? '' : 'none';
nextBtn.style.display = galleryImages.length > 1 ? '' : 'none';
}
function nextImage() {
if (galleryImages.length < 2) return;
showImage((galleryCurrent + 1) % galleryImages.length);
}
function prevImage() {
if (galleryImages.length < 2) return;
showImage((galleryCurrent - 1 + galleryImages.length) % galleryImages.length);
}
if (closeBtn) closeBtn.addEventListener('click', closeModal);
if (nextBtn) nextBtn.addEventListener('click', nextImage);
if (prevBtn) prevBtn.addEventListener('click', prevImage);
// Close modal on click outside image
if (modal) {
modal.addEventListener('mousedown', function(e) {
if (e.target === modal) closeModal();
});
}
// ESC key
document.addEventListener('keydown', function(e) {
if (!modal.classList.contains('hidden')) {
if (e.key === 'Escape') closeModal();
if (e.key === 'ArrowRight') nextImage();
if (e.key === 'ArrowLeft') prevImage();
}
});
});
// Data untuk setiap item galeri
// Saya menambahkan data 'location' dan 'numberOfChildren' di sini.
document.addEventListener('DOMContentLoaded', function() {
const photoTab = document.getElementById('photo-tab');
const invitationTab = document.getElementById('invitation-tab');
const digitalTab = document.getElementById('digital-tab');
const photoContent = document.getElementById('photo-content');
const invitationContent = document.getElementById('invitation-content');
const digitalContent = document.getElementById('digital-content');
const tabs = [photoTab, invitationTab, digitalTab];
const contents = [photoContent, invitationContent, digitalContent];
// Fungsi untuk menampilkan tab yang dipilih
function showTab(tabToShow, contentToShow) {
tabs.forEach(tab => {
tab.classList.remove('active', 'bg-blue-600', 'text-white');
tab.classList.add('bg-slate-200', 'hover:bg-slate-300', 'text-slate-700');
});
contents.forEach(content => content.classList.remove('active'));
tabToShow.classList.add('active', 'bg-blue-600', 'text-white');
tabToShow.classList.remove('bg-slate-200', 'hover:bg-slate-300', 'text-slate-700');
contentToShow.classList.add('active');
}
// Tambahkan event listener untuk klik tab
photoTab.addEventListener('click', function() {
showTab(photoTab, photoContent);
});
invitationTab.addEventListener('click', function() {
showTab(invitationTab, invitationContent);
});
digitalTab.addEventListener('click', function() {
showTab(digitalTab, digitalContent);
});
// Tampilkan tab foto secara default saat halaman dimuat
showTab(photoTab, photoContent);
});
// ========== JavaScript untuk Navbar ==========
document.addEventListener('DOMContentLoaded', function() {
const menuButton = document.getElementById('menu-button');
const mobileMenu = document.getElementById('mobile-menu');
// Fungsi untuk menampilkan atau menyembunyikan menu mobile
menuButton.addEventListener('click', function() {
mobileMenu.classList.toggle('hidden');
});
// Tutup menu mobile ketika salah satu tautan diklik
const mobileLinks = mobileMenu.querySelectorAll('a');
mobileLinks.forEach(link => {
link.addEventListener('click', function() {
mobileMenu.classList.add('hidden');
});
});
});
// ========== Akhir JavaScript Navbar ==========
// ========== JavaScript Smooth Scrolling ==========
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
anchor.addEventListener('click', function(e) {
e.preventDefault();
document.querySelector(this.getAttribute('href')).scrollIntoView({
behavior: 'smooth'
});
});
});
// ========== Akhir JavaScript Smooth Scrolling ==========
</script>
</body>
</html>