$(function () { // Navbar scroll $(window).on("scroll", function () { if ($(this).scrollTop() > 60) $("#navbar").addClass("scrolled"); else $("#navbar").removeClass("scrolled"); }); // Hero animation on load setTimeout(function () { $("#heroContent").addClass("visible"); $("#heroBg").addClass("loaded"); }, 200); // Scroll animations function checkVisible() { $(".fact, [data-animate]").each(function () { var el = $(this); var top = el.offset().top; var windowBottom = $(window).scrollTop() + $(window).height(); if (windowBottom > top + 60) { el.addClass("visible"); el.css({ opacity: 1, transform: "translateY(0)" }); } }); } $("[data-animate]").css({ opacity: 0, transform: "translateY(30px)", transition: "opacity 0.8s ease, transform 0.8s ease", }); $(window).on("scroll", checkVisible); checkVisible(); // Floor accordion $(".floor-header").on("click", function () { var item = $(this).closest(".floor-item"); var isOpen = item.hasClass("open"); $(".floor-item").removeClass("open"); $(".floor-header").attr("aria-expanded", "false"); $(".floor-body").slideUp(300); if (!isOpen) { item.addClass("open"); $(this).attr("aria-expanded", "true"); item.find(".floor-body").slideDown(300); } }); // Accordion keyboard handler (Enter/Space) $(".floor-header").on("keydown", function (e) { if (e.key === "Enter" || e.key === " ") { e.preventDefault(); $(this).trigger("click"); } }); // Lightbox – track last focused element for focus return var lightboxTrigger = null; function openLightbox(src) { lightboxTrigger = document.activeElement; $("#lightboxImg").attr("src", src).attr("alt", ""); $("#lightbox").addClass("open"); $("body").css("overflow", "hidden"); // Set focus to close button setTimeout(function () { $("#lightboxClose").focus(); }, 50); } function closeLightbox() { $("#lightbox").removeClass("open"); $("body").css("overflow", ""); // Return focus to trigger if (lightboxTrigger) { $(lightboxTrigger).focus(); lightboxTrigger = null; } } // Lightbox – gallery grid items $(document).on("click", ".grid-item", function () { var src = $(this).data("img") || $(this).find("img").attr("src"); openLightbox(src); }); // Lightbox – floor plan images in Raumaufteilung $(document).on("click", ".floor-plan img[data-img]", function () { var src = $(this).data("img"); openLightbox(src); }); // Lightbox close handlers $("#lightboxClose").on("click", function () { closeLightbox(); }); $("#lightbox").on("click", function (e) { if (e.target === this) { closeLightbox(); } }); // Escape key to close lightbox $(document).on("keydown", function (e) { if (e.key === "Escape" && $("#lightbox").hasClass("open")) { closeLightbox(); } }); // Focus trap for lightbox $("#lightbox").on("keydown", function (e) { if (e.key !== "Tab") return; var focusable = $(this).find("button, [href], input, select, textarea, [tabindex]:not([tabindex='-1'])").filter(":visible"); if (focusable.length === 0) return; var first = focusable[0]; var last = focusable[focusable.length - 1]; if (e.shiftKey) { if (document.activeElement === first) { e.preventDefault(); last.focus(); } } else { if (document.activeElement === last) { e.preventDefault(); first.focus(); } } }); // Gallery keyboard handler (Enter/Space) $(document).on("keydown", ".grid-item", function (e) { if (e.key === "Enter" || e.key === " ") { e.preventDefault(); $(this).trigger("click"); } }); // Form submit is handled server-side by PHP – no JS intervention needed. }); // Mobile hamburger menu (vanilla JS) (function () { var hamburger = document.querySelector(".nav-hamburger"); var nav = document.getElementById("navbar"); var overlay = document.querySelector(".nav-mobile-overlay"); var links = nav ? nav.querySelectorAll(".nav-links a") : []; function toggleMenu() { var isOpen = hamburger.classList.toggle("active"); nav.classList.toggle("mobile-open", isOpen); if (overlay) overlay.classList.toggle("active", isOpen); hamburger.setAttribute("aria-expanded", isOpen); document.body.style.overflow = isOpen ? "hidden" : ""; } function closeMenu() { hamburger.classList.remove("active"); nav.classList.remove("mobile-open"); if (overlay) overlay.classList.remove("active"); hamburger.setAttribute("aria-expanded", "false"); document.body.style.overflow = ""; } if (hamburger) { hamburger.addEventListener("click", toggleMenu); } if (overlay) { overlay.addEventListener("click", closeMenu); } links.forEach(function (link) { link.addEventListener("click", closeMenu); }); document.addEventListener("keydown", function (e) { if (e.key === "Escape") closeMenu(); }); // Close on resize to desktop window.addEventListener("resize", function () { if (window.innerWidth > 900) closeMenu(); }); })();