| Server IP : 172.67.191.97 / Your IP : 104.23.197.208 Web Server : Apache/2.4.63 (Ubuntu) System : Linux adminpruebas-Virtual-Machine 6.14.0-37-generic #37-Ubuntu SMP PREEMPT_DYNAMIC Fri Nov 14 22:10:32 UTC 2025 x86_64 User : www-data ( 33) PHP Version : 8.4.5 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : ON Directory : /var/www/idiomas/media/idiomas/ |
Upload File : |
(function () {
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', init, { once: true });
} else {
init();
}
function init() {
const root = document.querySelector('[data-sitemap-root]');
if (!root) return;
const search = root.querySelector('[data-sitemap-search]');
const status = root.querySelector('[data-sitemap-status]');
const cards = Array.from(root.querySelectorAll('[data-sitemap-card]'));
const links = Array.from(root.querySelectorAll('[data-sitemap-link]'));
const revealItems = Array.from(root.querySelectorAll('[data-sitemap-reveal]'));
revealItems.forEach((item, index) => {
item.style.setProperty('--sitemap-delay', `${Math.min(index, 12) * 45}ms`);
});
if ('IntersectionObserver' in window) {
const observer = new IntersectionObserver((entries) => {
entries.forEach((entry) => {
if (!entry.isIntersecting) return;
entry.target.classList.add('is-visible');
observer.unobserve(entry.target);
});
}, { rootMargin: '0px 0px -8% 0px', threshold: 0.14 });
revealItems.forEach((item) => observer.observe(item));
} else {
revealItems.forEach((item) => item.classList.add('is-visible'));
}
cards.forEach((card) => {
card.addEventListener('pointermove', (event) => {
const rect = card.getBoundingClientRect();
const x = ((event.clientX - rect.left) / rect.width) * 100;
const y = ((event.clientY - rect.top) / rect.height) * 100;
card.style.setProperty('--spot-x', `${x}%`);
card.style.setProperty('--spot-y', `${y}%`);
});
card.addEventListener('pointerleave', () => {
card.style.removeProperty('--spot-x');
card.style.removeProperty('--spot-y');
});
});
if (!search) return;
const normalize = (value) => value
.toLowerCase()
.normalize('NFD')
.replace(/[\u0300-\u036f]/g, '')
.trim();
const update = () => {
const query = normalize(search.value);
let visibleLinks = 0;
links.forEach((link) => {
const match = !query || normalize(link.textContent).includes(query);
link.closest('li').hidden = !match;
if (match) visibleLinks += 1;
});
cards.forEach((card) => {
const hasVisibleLinks = Array.from(card.querySelectorAll('[data-sitemap-link]'))
.some((link) => !link.closest('li').hidden);
card.hidden = !hasVisibleLinks;
});
if (status) {
status.textContent = query
? `${visibleLinks} enlace${visibleLinks === 1 ? '' : 's'} encontrado${visibleLinks === 1 ? '' : 's'}`
: `${links.length} enlaces organizados`;
}
};
search.addEventListener('input', update);
update();
}
}());