Great things are coming soon

Stay tuned

Powered by

GoDaddy
/* =================================================== SERVICES SLIDER =================================================== */ (function () { var track = document.getElementById('roofSvcTrack'); var viewport = document.getElementById('roofSvcViewport'); if (!track || !viewport) return; var cards = Array.prototype.slice.call(track.querySelectorAll('.work-card')); var prev = document.getElementById('roofSvcPrev'); var next = document.getElementById('roofSvcNext'); var dotsWrap = document.getElementById('roofSvcDots'); var total = cards.length; var page = 0; function perView() { var w = window.innerWidth; if (w >= 1024) return 3; if (w >= 640) return 2; return 1; } function pages() { return Math.ceil(total / perView()); } function render() { var p = pages(); if (page > p - 1) page = p - 1; if (page < 0) page = 0; track.style.transform = 'translateX(' + (-page * 100) + '%)'; if (prev) prev.disabled = (page === 0); if (next) next.disabled = (page === p - 1); if (dotsWrap) { dotsWrap.innerHTML = ''; for (var i = 0; i < p; i++) { var b = document.createElement('button'); b.type = 'button'; b.className = 'roof-services__dot' + (i === page ? ' is-active' : ''); b.setAttribute('aria-label', 'Go to slide ' + (i + 1)); (function (idx) { b.addEventListener('click', function () { page = idx; render(); }); })(i); dotsWrap.appendChild(b); } } } if (next) next.addEventListener('click', function () { page++; render(); }); if (prev) prev.addEventListener('click', function () { page--; render(); }); var rt; window.addEventListener('resize', function () { clearTimeout(rt); rt = setTimeout(render, 150); }); /* tap en pantallas tactiles: revela la card */ cards.forEach(function (card) { card.addEventListener('click', function () { if (window.matchMedia('(hover: none)').matches) { cards.forEach(function (c) { if (c !== card) c.classList.remove('is-active'); }); card.classList.toggle('is-active'); } }); }); render(); })(); /* =================================================== WHY CHOOSE US (carrusel giratorio) =================================================== */ (function () { var stage = document.getElementById('whyChooseStage'); if (!stage) return; var cards = Array.prototype.slice.call(stage.querySelectorAll('.why-choose__card')); var dotsWrap = document.getElementById('whyChooseDots'); if (!cards.length || !dotsWrap) return; var i = 0; var timer; var DELAY = 3500; cards.forEach(function (_, idx) { var b = document.createElement('button'); b.className = 'why-choose__dot' + (idx === 0 ? ' is-on' : ''); b.type = 'button'; b.setAttribute('aria-label', 'Show reason ' + (idx + 1)); b.addEventListener('click', function () { go(idx); restart(); }); dotsWrap.appendChild(b); }); var dots = Array.prototype.slice.call(dotsWrap.children); function go(n) { i = (n + cards.length) % cards.length; cards.forEach(function (c, x) { var on = x === i; c.classList.toggle('is-active', on); c.setAttribute('aria-hidden', on ? 'false' : 'true'); }); dots.forEach(function (d, x) { d.classList.toggle('is-on', x === i); }); } function restart() { clearInterval(timer); timer = setInterval(function () { go(i + 1); }, DELAY); } stage.addEventListener('mouseenter', function () { clearInterval(timer); }); stage.addEventListener('mouseleave', restart); restart(); })(); /* =================================================== HOW WE WORK (tap trae cards al frente) =================================================== */ (function () { var section = document.querySelector('.process'); if (!section) return; var backs = Array.prototype.slice.call(section.querySelectorAll('.process__card--back')); if (!backs.length) return; backs.forEach(function (card) { card.addEventListener('click', function (e) { var wasFront = card.classList.contains('is-front'); backs.forEach(function (c) { c.classList.remove('is-front'); }); if (!wasFront) card.classList.add('is-front'); e.stopPropagation(); }); }); document.addEventListener('click', function () { backs.forEach(function (c) { c.classList.remove('is-front'); }); }); })(); /* =================================================== FAQ (acordeon) =================================================== */ (function () { var list = document.getElementById('roofFaqList'); if (!list) return; var items = Array.prototype.slice.call(list.querySelectorAll('.roof-faq__item')); list.querySelectorAll('.roof-faq__q').forEach(function (btn) { btn.addEventListener('click', function () { var item = btn.parentElement; var willOpen = !item.classList.contains('is-open'); items.forEach(function (it) { it.classList.remove('is-open'); var b = it.querySelector('.roof-faq__q'); if (b) b.setAttribute('aria-expanded', 'false'); }); if (willOpen) { item.classList.add('is-open'); btn.setAttribute('aria-expanded', 'true'); } }); }); })();