# nopierdasturesidencia.es ## Pages - [Política de privacidad](https://nopierdasturesidencia.es/politica-de-privacidad/): Conoce qué datos personales utilizamos en No Pierdas Tu Residencia, para qué los necesitamos y cómo puedes ejercer tus derechos. - [Mi residencia | No Pierdas Tu Residencia](https://nopierdasturesidencia.es/mi-residencia/) - [registro](https://nopierdasturesidencia.es/registro/): Responde unas preguntas sencillas y organizaremos los próximos pasos de tu proceso para que puedas controlar fechas, documentos y acciones importantes. - [Planes](https://nopierdasturesidencia.es/planes/): Puedes utilizar nuestras herramientas por tu cuenta o solicitar un nivel mayor de acompañamiento cuando necesites revisar tu situación, documentación o próximos pasos. - [Servicios](https://nopierdasturesidencia.es/servicios/) - [Regularización](https://nopierdasturesidencia.es/regularizacion/) - [Inicio](https://nopierdasturesidencia.es/): document.addEventListener("DOMContentLoaded", function () { "use strict"; const landing = document.querySelector("#nptr-landing"); if (!landing || landing.dataset.nptrInitialized === "true") { return; } landing.dataset.nptrInitialized = "true"; const timers = []; function registerTimer(timerId) { timers.push(timerId); return timerId; } function clearRegisteredTimers() { while (timers.length) { window.clearInterval(timers.pop()); } } function animatePercentage(element, from, to, duration) { if (!element) { return; } const start = performance.now(); function update(currentTime) { const progress = Math.min( (currentTime - start) / duration, 1 ); const eased = 1 - Math.pow(1 - progress, 3); const value = Math.round(from + (to - from) * eased); element.textContent = value + " %"; if (progress < 1) { window.requestAnimationFrame(update); } } window.requestAnimationFrame(update); } /* ===================================================== DESPLAZAMIENTO SUAVE ===================================================== */ landing .querySelectorAll('a[href^="#"]:not([href="#"])') .forEach(function (link) { link.addEventListener("click", function (event) { const selector = link.getAttribute("href"); const target = document.querySelector(selector); if (!target) { return; } event.preventDefault(); const position = target.getBoundingClientRect().top + window.pageYOffset - 80; window.scrollTo({ top: position, behavior: "smooth" }); }); }); /* ===================================================== FAQ ===================================================== */ const faqItems = landing.querySelectorAll(".nptr-faq details"); faqItems.forEach(function (item) { item.addEventListener("toggle", function () { if (!item.open) { return; } faqItems.forEach(function (otherItem) { if (otherItem !== item) { otherItem.removeAttribute("open"); } }); }); }); /* ===================================================== ANIMACIONES AL HACER SCROLL ===================================================== */ const revealElements = landing.querySelectorAll( [ ".nptr-dato", ".nptr-tarjeta", ".nptr-plan", ".nptr-servicio", ".nptr-credencial", ".nptr-faq details" ].join(",") ); revealElements.forEach(function (element, index) { element.classList.add("nptr-reveal"); element.style.setProperty( "--nptr-delay", Math.min(index % 4, 3) * 90 + "ms" ); }); if ("IntersectionObserver" in window) { const revealObserver = new IntersectionObserver( function (entries, observer) { entries.forEach(function (entry) { if (!entry.isIntersecting) { return; } entry.target.classList.add("nptr-visible"); observer.unobserve(entry.target); }); }, { threshold: 0.12 } ); revealElements.forEach(function (element) { revealObserver.observe(element); }); } else { revealElements.forEach(function (element) { element.classList.add("nptr-visible"); }); } /* ===================================================== PANEL DINÁMICO DEL HERO ===================================================== */ const heroPanel = landing.querySelector("#nptr-panel-dinamico"); if (heroPanel) { const heroElements = { estado: landing.querySelector("#nptr-demo-estado"), etapa: landing.querySelector("#nptr-demo-etapa"), titulo: landing.querySelector("#nptr-demo-titulo"), subtitulo: landing.querySelector("#nptr-demo-subtitulo"), porcentaje: landing.querySelector("#nptr-demo-porcentaje"), barra: landing.querySelector("#nptr-demo-barra"), barraContenedor: landing.querySelector( "#nptr-demo-barra-contenedor" ), proximoPaso: landing.querySelector( "#nptr-demo-proximo-paso" ), proximoTexto: landing.querySelector( "#nptr-demo-proximo-texto" ), dias: landing.querySelector("#nptr-demo-dias"), fechaTexto: landing.querySelector( "#nptr-demo-fecha-texto" ), documentos: landing.querySelector( "#nptr-demo-documentos" ), documentosTexto: landing.querySelector( "#nptr-demo-documentos-texto" ), alerta: landing.querySelector("#nptr-demo-alerta"), alertaTitulo: landing.querySelector( "#nptr-demo-alerta-titulo" ), alertaTexto: landing.querySelector( "#nptr-demo-alerta-texto" ), etapas: landing.querySelectorAll(".nptr-etapa-mini") }; const heroData = [ { porcentaje: 18, estado: "Solicitud registrada", etapa: "Etapa 1 de 5", titulo: "Tu solicitud ha sido registrada", subtitulo: "Guarda el justificante y revisa periódicamente tus notificaciones.", proximoPaso: "Revisar tus notificaciones", proximoTexto: "Comprueba si Extranjería solicita documentación adicional.", dias: "Seguimiento activo", fechaTexto: "Te avisaremos cuando debas realizar una acción.", documentos: "2 de 6 documentos", documentosTexto: "Añade los documentos disponibles.", alertaTipo: "informativa", alertaIcono: "i", alertaTitulo: "Información", alertaTexto: "Guarda una copia del justificante de presentación." [comment]: # (Generated by Hostinger Tools Plugin)