diff --git a/public/assets/css/frontend/home/faq.css b/public/assets/css/frontend/home/faq.css
new file mode 100644
index 0000000..11ab724
--- /dev/null
+++ b/public/assets/css/frontend/home/faq.css
@@ -0,0 +1,30 @@
+.custom-blue {
+ color: #003296;
+}
+.custom-blue-bg,
+.bg-custom-blue {
+ background-color: #003296;
+}
+.border-custom-blue {
+ border-color: #003296;
+}
+.faq-item {
+ border-left: 4px solid transparent;
+ transition: all 0.3s ease;
+}
+.faq-item:hover,
+.faq-item.active {
+ border-left: 4px solid #003296;
+}
+.faq-item.active {
+ box-shadow: 0 10px 15px -3px rgba(0, 50, 150, 0.1);
+}
+@media (min-width: 768px) {
+ .faq-icon {
+ transform: scale(0.9);
+ transition: transform 0.3s ease;
+ }
+ .faq-item:hover .faq-icon {
+ transform: scale(1.1);
+ }
+}
diff --git a/public/assets/css/frontend/home/hero.css b/public/assets/css/frontend/home/hero.css
new file mode 100644
index 0000000..4c8ef68
--- /dev/null
+++ b/public/assets/css/frontend/home/hero.css
@@ -0,0 +1,13 @@
+@keyframes fadeInUp {
+ from {
+ opacity: 0;
+ transform: translateY(20px);
+ }
+ to {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
+.animate-fade-in-up {
+ animation: fadeInUp 0.8s ease-out forwards;
+}
diff --git a/public/assets/css/frontend/home/news.css b/public/assets/css/frontend/home/news.css
new file mode 100644
index 0000000..45c1afa
--- /dev/null
+++ b/public/assets/css/frontend/home/news.css
@@ -0,0 +1,169 @@
+@keyframes gradient-x {
+ 0%,
+ 100% {
+ background-position: 0% 50%;
+ }
+ 50% {
+ background-position: 100% 50%;
+ }
+}
+.animate-gradient-x {
+ background-size: 200% 200%;
+ animation: gradient-x 3s ease infinite;
+}
+
+@keyframes pulse-slow {
+ 0%,
+ 100% {
+ opacity: 0.3;
+ }
+ 50% {
+ opacity: 0.7;
+ }
+}
+.animate-pulse-slow {
+ animation: pulse-slow 6s cubic-bezier(0.4, 0, 0.6, 1) infinite;
+}
+
+@keyframes float {
+ 0%,
+ 100% {
+ transform: translateY(0);
+ }
+ 50% {
+ transform: translateY(-15px);
+ }
+}
+.animate-float {
+ animation: float 8s ease-in-out infinite;
+}
+.animate-float-slow {
+ animation: float 12s ease-in-out infinite;
+}
+.animate-float-slow-reverse {
+ animation: float 12s ease-in-out infinite reverse;
+}
+
+@keyframes float-text {
+ 0%,
+ 100% {
+ transform: translateY(0);
+ }
+ 50% {
+ transform: translateY(-5px) rotate(2deg);
+ }
+}
+.animate-float-text {
+ animation: float-text 2s ease-in-out infinite;
+ display: inline-block;
+}
+
+@keyframes subtle-rotate {
+ 0%,
+ 100% {
+ transform: rotate(-1deg);
+ }
+ 50% {
+ transform: rotate(1deg);
+ }
+}
+.animate-subtle-rotate {
+ animation: subtle-rotate 12s ease-in-out infinite;
+}
+
+/* efek 3d */
+.perspective {
+ perspective: 1000px;
+}
+.perspective-hero {
+ perspective: 2000px;
+}
+.perspective-card {
+ perspective: 1000px;
+ transform-style: preserve-3d;
+}
+.transform-3d {
+ transform-style: preserve-3d;
+ transition: transform 0.6s cubic-bezier(0.2, 0.85, 0.4, 1);
+}
+
+.glow-line {
+ box-shadow: 0 0 15px 2px rgba(124, 207, 0, 0.6);
+ animation: glow-pulse 3s ease-in-out infinite alternate;
+}
+@keyframes glow-pulse {
+ 0% {
+ box-shadow: 0 0 10px 1px rgba(124, 207, 0, 0.5);
+ }
+ 100% {
+ box-shadow: 0 0 25px 5px rgba(124, 207, 0, 0.8);
+ }
+}
+
+.ripple-effect {
+ position: absolute;
+ width: 70px;
+ height: 70px;
+ border-radius: 50%;
+ background: rgba(72, 127, 255, 0.4);
+ top: 50%;
+ left: 50%;
+ transform: translate(-50%, -50%);
+ opacity: 0;
+ animation: ripple 2s linear infinite;
+}
+@keyframes ripple {
+ 0% {
+ transform: translate(-50%, -50%) scale(1);
+ opacity: 0;
+ }
+ 20% {
+ transform: translate(-50%, -50%) scale(1.2);
+ opacity: 0.6;
+ }
+ 100% {
+ transform: translate(-50%, -50%) scale(2);
+ opacity: 0;
+ }
+}
+
+.masonry-card-wide {
+ grid-row: span 1;
+}
+@media (min-width: 1024px) {
+ .masonry-card:nth-child(4n + 1) {
+ grid-row: span 2;
+ }
+}
+
+#beritaContent,
+#videoContent {
+ transition: all 0.5s cubic-bezier(0.2, 0.85, 0.4, 1);
+}
+
+.line-clamp-2 {
+ display: -webkit-box;
+ -webkit-line-clamp: 2;
+ -webkit-box-orient: vertical;
+ overflow: hidden;
+}
+.line-clamp-3 {
+ display: -webkit-box;
+ -webkit-line-clamp: 3;
+ -webkit-box-orient: vertical;
+ overflow: hidden;
+}
+
+.tab-glass-container {
+ position: relative;
+ z-index: 1;
+}
+.tab-glass-container::after {
+ content: "";
+ position: absolute;
+ inset: 0;
+ z-index: -1;
+ background: rgba(255, 255, 255, 0.03);
+ backdrop-filter: blur(10px);
+ border-radius: inherit;
+}
diff --git a/public/assets/css/frontend/home/popup.css b/public/assets/css/frontend/home/popup.css
new file mode 100644
index 0000000..e92050c
--- /dev/null
+++ b/public/assets/css/frontend/home/popup.css
@@ -0,0 +1,6 @@
+.banner-slide {
+ transition: opacity 0.5s ease;
+}
+.dot-indicator.active {
+ background-color: #3182ce;
+}
diff --git a/public/assets/js/frontend/footer.js b/public/assets/js/frontend/footer.js
new file mode 100644
index 0000000..4377826
--- /dev/null
+++ b/public/assets/js/frontend/footer.js
@@ -0,0 +1,42 @@
+document.addEventListener("DOMContentLoaded", function () {
+ const container = document.getElementById("marquee-container");
+ const content = document.getElementById("marquee-content");
+
+ // Calculate the total width needed for animation
+ let contentWidth = content.offsetWidth;
+
+ // Clone the content multiple times to ensure smooth looping
+ for (let i = 0; i < 3; i++) {
+ const clone = content.cloneNode(true);
+ container.appendChild(clone);
+ }
+
+ // Start animation
+ let scrollPosition = 0;
+ const speed = 0.5; // slower speed (was 1)
+ let isAnimating = true;
+
+ // Pause on hover
+ container.addEventListener("mouseenter", function () {
+ isAnimating = false;
+ });
+
+ container.addEventListener("mouseleave", function () {
+ isAnimating = true;
+ });
+
+ function scroll() {
+ if (isAnimating) {
+ scrollPosition -= speed;
+ // Reset when first element is completely scrolled out
+ if (scrollPosition <= -contentWidth) {
+ scrollPosition += contentWidth;
+ }
+ container.style.transform = `translateX(${scrollPosition}px)`;
+ }
+ requestAnimationFrame(scroll);
+ }
+
+ // Start the animation
+ scroll();
+});
diff --git a/public/assets/js/frontend/home/faq.js b/public/assets/js/frontend/home/faq.js
new file mode 100644
index 0000000..4380046
--- /dev/null
+++ b/public/assets/js/frontend/home/faq.js
@@ -0,0 +1,27 @@
+document.querySelectorAll(".faq-header").forEach((header) => {
+ header.addEventListener("click", () => {
+ const parent = header.parentElement;
+ const content = parent.querySelector(".faq-content");
+ const toggle = parent.querySelector(".faq-toggle svg");
+
+ document.querySelectorAll(".faq-item").forEach((item) => {
+ if (item !== parent && item.classList.contains("active")) {
+ item.classList.remove("active");
+ item.querySelector(".faq-content").style.maxHeight = "0";
+ item.querySelector(".faq-toggle svg").classList.remove(
+ "rotate-45"
+ );
+ }
+ });
+
+ parent.classList.toggle("active");
+
+ if (parent.classList.contains("active")) {
+ content.style.maxHeight = content.scrollHeight + "px";
+ toggle.classList.add("rotate-45");
+ } else {
+ content.style.maxHeight = "0";
+ toggle.classList.remove("rotate-45");
+ }
+ });
+});
diff --git a/public/assets/js/frontend/home/layanan.js b/public/assets/js/frontend/home/layanan.js
new file mode 100644
index 0000000..62ecdd1
--- /dev/null
+++ b/public/assets/js/frontend/home/layanan.js
@@ -0,0 +1,39 @@
+document.getElementById("filter-button").addEventListener("click", function () {
+ const filterSection = document.getElementById("filter-section");
+ filterSection.classList.toggle("hidden");
+});
+
+document.getElementById("clear-filter").addEventListener("click", function () {
+ // Reset province and city dropdowns
+ document.getElementById("kabkota").value = "";
+ document.getElementById("kecamatan").value = "";
+ document.getElementById("kelurahan").value = "";
+
+ // Reset search input
+ const searchInput = document.querySelector('input[placeholder="Search"]');
+ if (searchInput) searchInput.value = "";
+});
+
+function changeTab(tabName) {
+ const contentSections = document.querySelectorAll(".tab-content");
+ contentSections.forEach((section) => {
+ section.classList.add("hidden");
+ });
+
+ const tabButtons = document.querySelectorAll(".tab-btn");
+ tabButtons.forEach((button) => {
+ button.classList.remove("bg-blue-900", "text-white");
+ button.classList.add("bg-white", "border", "border-gray-300");
+ });
+
+ const selectedTab = document.getElementById("tab-" + tabName);
+ selectedTab.classList.remove("bg-white", "border", "border-gray-300");
+ selectedTab.classList.add("bg-blue-900", "text-white");
+
+ const selectedContent = document.getElementById("content-" + tabName);
+ selectedContent.classList.remove("hidden");
+}
+
+document.addEventListener("DOMContentLoaded", function () {
+ changeTab("pertek");
+});
diff --git a/public/assets/js/frontend/home/news.js b/public/assets/js/frontend/home/news.js
new file mode 100644
index 0000000..128f3b1
--- /dev/null
+++ b/public/assets/js/frontend/home/news.js
@@ -0,0 +1,177 @@
+document.addEventListener("DOMContentLoaded", function () {
+ if (typeof particlesJS !== "undefined") {
+ particlesJS("particles-js", {
+ particles: {
+ number: {
+ value: 80,
+ density: { enable: true, value_area: 1000 },
+ },
+ color: { value: "#ffffff" },
+ shape: { type: "circle" },
+ opacity: { value: 0.1, random: true },
+ size: { value: 3, random: true },
+ line_linked: {
+ enable: true,
+ distance: 150,
+ color: "#ffffff",
+ opacity: 0.05,
+ width: 1,
+ },
+ move: {
+ enable: true,
+ speed: 0.5,
+ direction: "none",
+ random: true,
+ out_mode: "out",
+ bounce: false,
+ },
+ },
+ interactivity: {
+ detect_on: "canvas",
+ events: {
+ onhover: { enable: true, mode: "bubble" },
+ resize: true,
+ },
+ modes: {
+ bubble: {
+ distance: 200,
+ size: 4,
+ duration: 2,
+ opacity: 0.2,
+ },
+ },
+ },
+ retina_detect: true,
+ });
+ }
+
+ // Parallax effect image utama
+ initParallaxEffect();
+
+ initHoverEffects();
+});
+
+function initParallaxEffect() {
+ const parallaxContainers = document.querySelectorAll(".parallax-container");
+
+ parallaxContainers.forEach((container) => {
+ const img = container.querySelector(".parallax-img");
+
+ if (img) {
+ container.addEventListener("mousemove", (e) => {
+ const rect = container.getBoundingClientRect();
+ const x = e.clientX - rect.left;
+ const y = e.clientY - rect.top;
+
+ const xPercent = (x / rect.width - 0.5) * 2; // -1 to 1
+ const yPercent = (y / rect.height - 0.5) * 2; // -1 to 1
+
+ img.style.transform = `translate(${xPercent * -10}px, ${
+ yPercent * -10
+ }px) scale(1.1)`;
+ });
+
+ container.addEventListener("mouseleave", () => {
+ img.style.transform = "translate(0, 0) scale(1.05)";
+ });
+ }
+ });
+}
+
+function initHoverEffects() {
+ const perspectiveCards = document.querySelectorAll(".perspective-card");
+
+ perspectiveCards.forEach((card) => {
+ card.addEventListener("mousemove", (e) => {
+ const rect = card.getBoundingClientRect();
+ const x = e.clientX - rect.left;
+ const y = e.clientY - rect.top;
+
+ const xPercent = (x / rect.width - 0.5) * 2; // -1 to 1
+ const yPercent = (y / rect.height - 0.5) * -2; // -1 to 1
+
+ const inner = card.querySelector(".transform-3d");
+ if (inner) {
+ inner.style.transform = `rotateY(${xPercent * 5}deg) rotateX(${
+ yPercent * 5
+ }deg)`;
+ }
+ });
+
+ card.addEventListener("mouseleave", () => {
+ const inner = card.querySelector(".transform-3d");
+ if (inner) {
+ inner.style.transform = "rotateY(0) rotateX(0)";
+ }
+ });
+ });
+}
+
+function switchTab(tabName) {
+ const beritaContent = document.getElementById("beritaContent");
+ const videoContent = document.getElementById("videoContent");
+ const beritaTab = document.getElementById("beritaTab");
+ const videoTab = document.getElementById("videoTab");
+
+ if (tabName === "berita") {
+ // Update tab styles
+ beritaTab.classList.add(
+ "bg-gradient-to-r",
+ "from-[#00c950]/80",
+ "to-[#00c950]/80",
+ "text-white"
+ );
+ beritaTab.classList.remove("bg-white/5", "text-white/80");
+ videoTab.classList.remove(
+ "bg-gradient-to-r",
+ "from-[#487fff]/80",
+ "to-[#487fff]/80",
+ "text-white"
+ );
+ videoTab.classList.add("bg-white/5", "text-white/80");
+
+ // Enhanced transition effects
+ beritaContent.style.transform = "translateX(20px)";
+ beritaContent.style.opacity = "0";
+
+ setTimeout(() => {
+ videoContent.classList.add("hidden");
+ beritaContent.classList.remove("hidden");
+
+ requestAnimationFrame(() => {
+ beritaContent.style.transform = "translateX(0)";
+ beritaContent.style.opacity = "1";
+ });
+ }, 300);
+ } else {
+ videoTab.classList.add(
+ "bg-gradient-to-r",
+ "from-[#487fff]/80",
+ "to-[#487fff]/80",
+ "text-white"
+ );
+ videoTab.classList.remove("bg-white/5", "text-white/80");
+ beritaTab.classList.remove(
+ "bg-gradient-to-r",
+ "from-[#00c950]/80",
+ "to-[#00c950]/80",
+ "text-white"
+ );
+ beritaTab.classList.add("bg-white/5", "text-white/80");
+
+ videoContent.style.transform = "translateX(20px)";
+ videoContent.style.opacity = "0";
+ beritaContent.style.opacity = "0";
+ beritaContent.style.transform = "translateX(-20px)";
+
+ setTimeout(() => {
+ beritaContent.classList.add("hidden");
+ videoContent.classList.remove("hidden");
+
+ requestAnimationFrame(() => {
+ videoContent.style.transform = "translateX(0)";
+ videoContent.style.opacity = "1";
+ });
+ }, 300);
+ }
+}
diff --git a/public/assets/js/frontend/home/popup.js b/public/assets/js/frontend/home/popup.js
new file mode 100644
index 0000000..d288fbf
--- /dev/null
+++ b/public/assets/js/frontend/home/popup.js
@@ -0,0 +1,75 @@
+document.addEventListener("DOMContentLoaded", function () {
+ // Show popup with slight delay after page load
+ setTimeout(function () {
+ document.getElementById("popupBanner").classList.remove("hidden");
+ }, 800);
+
+ // Close popup when clicking the close button
+ document
+ .getElementById("closePopup")
+ .addEventListener("click", function () {
+ document.getElementById("popupBanner").classList.add("hidden");
+ });
+
+ // Close popup when clicking outside the banner
+ document
+ .getElementById("popupBanner")
+ .addEventListener("click", function (e) {
+ if (e.target === this) {
+ this.classList.add("hidden");
+ }
+ });
+
+ // Slider functionality
+ const slides = document.querySelectorAll(".banner-slide");
+ const dots = document.querySelectorAll(".dot-indicator");
+ let currentSlide = 0;
+
+ function showSlide(index) {
+ slides.forEach((slide) => slide.classList.add("hidden"));
+ dots.forEach((dot) => dot.classList.remove("active"));
+
+ slides[index].classList.remove("hidden");
+ dots[index].classList.add("active");
+ currentSlide = index;
+ }
+
+ // Auto slide every 5 seconds
+ let slideInterval = setInterval(() => {
+ let nextSlide = (currentSlide + 1) % slides.length;
+ showSlide(nextSlide);
+ }, 5000);
+
+ // Navigation buttons
+ document.getElementById("nextSlide").addEventListener("click", function () {
+ clearInterval(slideInterval);
+ let nextSlide = (currentSlide + 1) % slides.length;
+ showSlide(nextSlide);
+ slideInterval = setInterval(() => {
+ nextSlide = (currentSlide + 1) % slides.length;
+ showSlide(nextSlide);
+ }, 5000);
+ });
+
+ document.getElementById("prevSlide").addEventListener("click", function () {
+ clearInterval(slideInterval);
+ let prevSlide = (currentSlide - 1 + slides.length) % slides.length;
+ showSlide(prevSlide);
+ slideInterval = setInterval(() => {
+ let nextSlide = (currentSlide + 1) % slides.length;
+ showSlide(nextSlide);
+ }, 5000);
+ });
+
+ // Dot indicators
+ dots.forEach((dot, index) => {
+ dot.addEventListener("click", function () {
+ clearInterval(slideInterval);
+ showSlide(index);
+ slideInterval = setInterval(() => {
+ let nextSlide = (currentSlide + 1) % slides.length;
+ showSlide(nextSlide);
+ }, 5000);
+ });
+ });
+});
diff --git a/public/assets/js/frontend/navbar.js b/public/assets/js/frontend/navbar.js
new file mode 100644
index 0000000..9a504d0
--- /dev/null
+++ b/public/assets/js/frontend/navbar.js
@@ -0,0 +1,26 @@
+// Mobile Menu Toggle
+const mobileMenuToggle = document.getElementById("mobile-menu-toggle");
+const mobileMenuClose = document.getElementById("mobile-menu-close");
+const mobileMenu = document.getElementById("mobile-menu");
+
+mobileMenuToggle.addEventListener("click", () => {
+ mobileMenu.classList.remove("-translate-x-full");
+});
+
+mobileMenuClose.addEventListener("click", () => {
+ mobileMenu.classList.add("-translate-x-full");
+});
+
+// Mobile Submenu Toggle
+const mobileSubmenuToggles = document.querySelectorAll(
+ ".mobile-submenu-toggle"
+);
+mobileSubmenuToggles.forEach((toggle) => {
+ toggle.addEventListener("click", (e) => {
+ const submenu = e.currentTarget.nextElementSibling;
+ const svg = e.currentTarget.querySelector("svg");
+
+ submenu.classList.toggle("hidden");
+ svg.classList.toggle("rotate-180");
+ });
+});
diff --git a/resources/views/auth/signin.blade.php b/resources/views/auth/signin.blade.php
index 1732ac8..504b74d 100644
--- a/resources/views/auth/signin.blade.php
+++ b/resources/views/auth/signin.blade.php
@@ -4,6 +4,8 @@
+
+
@@ -53,24 +55,21 @@
-
-