213 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			JavaScript
		
	
	
			
		
		
	
	
			213 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			JavaScript
		
	
	
| document.addEventListener("DOMContentLoaded", function () {
 | |
|     const loadMoreBtn = document.getElementById("load-more-btn");
 | |
|     const newsContainer = document.getElementById("news-container");
 | |
|     const videoContainer = document.getElementById("video-container");
 | |
|     const newsContent = document.getElementById("news-content");
 | |
|     const videoContent = document.getElementById("videos-content");
 | |
|     const tabs = document.querySelectorAll(".tab-btn");
 | |
|     const tabIndicator = document.getElementById("tab-indicator");
 | |
| 
 | |
|     let newsOffset = 0;
 | |
|     let videoOffset = 0;
 | |
|     const itemsPerLoad = 3;
 | |
| 
 | |
|     setTabIndicatorPosition(tabs[0]);
 | |
|     tabs[0].classList.add("text-white", "font-medium");
 | |
| 
 | |
|     tabs.forEach((tab) => {
 | |
|         tab.addEventListener("click", () => {
 | |
|             setTabIndicatorPosition(tab);
 | |
| 
 | |
|             tabs.forEach((t) => {
 | |
|                 t.classList.remove("text-white", "font-medium");
 | |
|                 t.classList.add("text-gray-600");
 | |
|             });
 | |
|             tab.classList.add("text-white", "font-medium");
 | |
|             tab.classList.remove("text-gray-600");
 | |
| 
 | |
|             const targetTab = tab.getAttribute("data-tab");
 | |
|             document.querySelectorAll(".tab-content").forEach((content) => {
 | |
|                 content.classList.add("hidden");
 | |
|             });
 | |
|             document
 | |
|                 .getElementById(`${targetTab}-content`)
 | |
|                 .classList.remove("hidden");
 | |
| 
 | |
|             // Update button visibility when switching tabs
 | |
|             updateLoadMoreButtonVisibility();
 | |
|         });
 | |
|     });
 | |
| 
 | |
|     function setTabIndicatorPosition(activeTab) {
 | |
|         tabIndicator.style.width = `${activeTab.offsetWidth}px`;
 | |
|         tabIndicator.style.left = `${activeTab.offsetLeft}px`;
 | |
|     }
 | |
| 
 | |
|     function updateLoadMoreButtonVisibility() {
 | |
|         if (newsContent.classList.contains("hidden") === false) {
 | |
|             if (newsOffset >= moreArticles.length) {
 | |
|                 loadMoreBtn.classList.add("hidden");
 | |
|             } else {
 | |
|                 loadMoreBtn.classList.remove("hidden");
 | |
|             }
 | |
|         } else {
 | |
|             if (videoOffset >= moreVideos.length) {
 | |
|                 loadMoreBtn.classList.add("hidden");
 | |
|             } else {
 | |
|                 loadMoreBtn.classList.remove("hidden");
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     const moreArticles = [
 | |
|         {
 | |
|             image: "https://developers.elementor.com/docs/assets/img/elementor-placeholder-image.png",
 | |
|             title: "Panduan Lengkap Perizinan AMDAL Terbaru",
 | |
|             description:
 | |
|                 "Prosedur dan persyaratan terbaru untuk mendapatkan persetujuan AMDAL dalam proyek pembangunan skala besar di Indonesia...",
 | |
|             published_date: "10 April 2025",
 | |
|             slug: "panduan-perizinan-amdal-terbaru",
 | |
|         },
 | |
|         {
 | |
|             image: "https://developers.elementor.com/docs/assets/img/elementor-placeholder-image.png",
 | |
|             title: "Regulasi UKL-UPL: Apa yang Perlu Diketahui",
 | |
|             description:
 | |
|                 "Panduan praktis tentang dokumen Upaya Pengelolaan Lingkungan dan Upaya Pemantauan Lingkungan untuk usaha skala menengah...",
 | |
|             published_date: "12 April 2025",
 | |
|             slug: "regulasi-ukl-upl-terbaru",
 | |
|         },
 | |
|         {
 | |
|             image: "https://developers.elementor.com/docs/assets/img/elementor-placeholder-image.png",
 | |
|             title: "Perubahan Kebijakan Perizinan Lingkungan 2025",
 | |
|             description:
 | |
|                 "Analisis mendalam tentang perubahan kebijakan perizinan lingkungan dan dampaknya terhadap sektor industri di Indonesia...",
 | |
|             published_date: "15 April 2025",
 | |
|             slug: "perubahan-kebijakan-perizinan-lingkungan-2025",
 | |
|         },
 | |
|     ];
 | |
|     const moreVideos = [
 | |
|         {
 | |
|             src: "https://www.w3schools.com/html/movie.mp4",
 | |
|             title: "Tutorial Pengisian Formulir Izin Lingkungan",
 | |
|             description:
 | |
|                 "Panduan langkah demi langkah cara mengisi formulir perizinan lingkungan dengan benar dan efisien...",
 | |
|             date: "8 April 2025",
 | |
|         },
 | |
|         {
 | |
|             src: "https://www.w3schools.com/html/movie.mp4",
 | |
|             title: "Proses Sidang Perizinan Lingkungan: Apa yang Harus Dipersiapkan",
 | |
|             description:
 | |
|                 "Penjelasan detail tentang tahapan sidang perizinan lingkungan dan tips sukses menghadapinya...",
 | |
|             date: "11 April 2025",
 | |
|         },
 | |
|         {
 | |
|             src: "https://www.w3schools.com/html/movie.mp4",
 | |
|             title: "Studi Kasus: Penolakan Izin Lingkungan dan Solusinya",
 | |
|             description:
 | |
|                 "Analisis kasus penolakan izin lingkungan dan strategi untuk mengatasi masalah perizinan yang umum terjadi...",
 | |
|             date: "14 April 2025",
 | |
|         },
 | |
|     ];
 | |
| 
 | |
|     loadMoreBtn.addEventListener("click", function () {
 | |
|         const loadingText = loadMoreBtn.innerHTML;
 | |
|         loadMoreBtn.innerHTML = `
 | |
|             <svg class="animate-spin -ml-1 mr-3 h-5 w-5 text-white" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24">
 | |
|                 <circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle>
 | |
|                 <path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path>
 | |
|             </svg>
 | |
|             Loading...
 | |
|         `;
 | |
| 
 | |
|         setTimeout(() => {
 | |
|             if (newsContent.classList.contains("hidden") === false) {
 | |
|                 const remainingArticles = moreArticles.slice(
 | |
|                     newsOffset,
 | |
|                     newsOffset + itemsPerLoad
 | |
|                 );
 | |
|                 remainingArticles.forEach((article) => {
 | |
|                     const articleElement = createArticleElement(article);
 | |
|                     newsContainer.appendChild(articleElement);
 | |
|                 });
 | |
|                 newsOffset += remainingArticles.length;
 | |
|             } else {
 | |
|                 const remainingVideos = moreVideos.slice(
 | |
|                     videoOffset,
 | |
|                     videoOffset + itemsPerLoad
 | |
|                 );
 | |
|                 remainingVideos.forEach((video) => {
 | |
|                     const videoElement = createVideoElement(video);
 | |
|                     videoContainer.appendChild(videoElement);
 | |
|                 });
 | |
|                 videoOffset += remainingVideos.length;
 | |
|             }
 | |
| 
 | |
|             loadMoreBtn.innerHTML = loadingText;
 | |
| 
 | |
|             updateLoadMoreButtonVisibility();
 | |
|         }, 1000);
 | |
|     });
 | |
| 
 | |
|     updateLoadMoreButtonVisibility();
 | |
| 
 | |
|     function createArticleElement(article) {
 | |
|         const div = document.createElement("div");
 | |
|         div.className =
 | |
|             "bg-white rounded-xl overflow-hidden shadow-lg transition-all duration-300 hover:shadow-2xl hover:-translate-y-2 group";
 | |
|         div.innerHTML = `
 | |
|                 <div class="relative overflow-hidden">
 | |
|                     <img src="${article.image}" alt="${article.title}" class="w-full h-56 object-cover transition-transform duration-500 group-hover:scale-110">
 | |
|                     <div class="absolute top-4 left-4">
 | |
|                         <span class="bg-blue-600 text-white text-xs font-semibold px-3 py-1.5 rounded-full shadow-md">${article.published_date}</span>
 | |
|                     </div>
 | |
|                 </div>
 | |
|                 <div class="p-6">
 | |
|                     <h3 class="text-xl font-bold mb-3 text-gray-800 group-hover:text-blue-600 transition-colors">${article.title}</h3>
 | |
|                     <p class="text-gray-600 mb-5 line-clamp-3">${article.description}</p>
 | |
|                     <a href="/news/${article.slug}" class="inline-flex items-center text-blue-600 font-medium group-hover:text-blue-800 transition-colors">
 | |
|                         <span>Baca Selengkapnya</span>
 | |
|                         <svg class="w-4 h-4 ml-2 transition-transform group-hover:translate-x-1" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 14 10">
 | |
|                             <path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M1 5h12m0 0L9 1m4 4L9 9"/>
 | |
|                         </svg>
 | |
|                     </a>
 | |
|                 </div>
 | |
|             `;
 | |
|         return div;
 | |
|     }
 | |
| 
 | |
|     function createVideoElement(video) {
 | |
|         const div = document.createElement("div");
 | |
|         div.className =
 | |
|             "bg-white rounded-xl overflow-hidden shadow-lg transition-all duration-300 hover:shadow-2xl hover:-translate-y-2 group";
 | |
|         div.innerHTML = `
 | |
|                 <div class="relative overflow-hidden">
 | |
|                     <video class="w-full h-56 object-cover" poster="https://developers.elementor.com/docs/assets/img/elementor-placeholder-image.png" controls>
 | |
|                         <source src="${video.src}" type="video/mp4">
 | |
|                         Your browser does not support the video tag.
 | |
|                     </video>
 | |
|                     <div class="absolute inset-0 bg-gradient-to-t from-black/60 to-transparent opacity-0 group-hover:opacity-100 transition-opacity flex items-center justify-center">
 | |
|                         <div class="bg-white/20 backdrop-blur-sm p-3 rounded-full">
 | |
|                             <svg class="w-12 h-12 text-white" fill="currentColor" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">
 | |
|                                 <path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zM9.555 7.168A1 1 0 008 8v4a1 1 0 001.555.832l3-2a1 1 0 000-1.664l-3-2z" clip-rule="evenodd"></path>
 | |
|                             </svg>
 | |
|                         </div>
 | |
|                     </div>
 | |
|                 </div>
 | |
|                 <div class="p-6">
 | |
|                     <div class="flex items-center mb-3">
 | |
|                         <span class="bg-indigo-100 text-indigo-800 text-xs font-semibold px-3 py-1 rounded-full">${video.date}</span>
 | |
|                     </div>
 | |
|                     <h3 class="text-xl font-bold mb-2 text-gray-800 group-hover:text-indigo-600 transition-colors">${video.title}</h3>
 | |
|                     <p class="text-gray-600 mb-5 line-clamp-3">${video.description}</p>
 | |
|                     <a href="#" class="inline-flex items-center text-indigo-600 font-medium group-hover:text-indigo-800 transition-colors">
 | |
|                         <span>Tonton Video</span>
 | |
|                         <svg class="w-4 h-4 ml-2 transition-transform group-hover:translate-x-1" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 14 10">
 | |
|                             <path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M1 5h12m0 0L9 1m4 4L9 9"/>
 | |
|                         </svg>
 | |
|                     </a>
 | |
|                 </div>
 | |
|             `;
 | |
|         return div;
 | |
|     }
 | |
| });
 |