MediaWiki:Common.js: mudanças entre as edições

De Farmland
Ir para navegação Ir para pesquisar
Sem resumo de edição
Sem resumo de edição
 
(61 revisões intermediárias pelo mesmo usuário não estão sendo mostradas)
Linha 1: Linha 1:
document.addEventListener("DOMContentLoaded", function () {
/* =======================================================
     const slider = document.getElementById("exclusiveSlider");
  ARVORE DE HABILIDADE
     const left = document.querySelector(".exclusive-arrow.left");
  ======================================================= */
     const right = document.querySelector(".exclusive-arrow.right");
document.addEventListener('DOMContentLoaded', function () {
     var cards = document.querySelectorAll('.skill-card');
     cards.forEach(function (card) {
        card.addEventListener('click', function () {
            card.style.filter = 'brightness(1.2)';
            setTimeout(function () { card.style.filter = 'brightness(1)'; }, 150);
        });
    });
});
 
 
/* =======================================================
  BOTAO VOLTAR AO TOPO
  ======================================================= */
$(function () {
    var $button = $('<button id="back-to-top" title="Voltar ao Topo">↑ Topo</button>');
    $('body').append($button);
 
     $(window).scroll(function () {
        if ($(window).scrollTop() + $(window).height() > $(document).height() - 100) {
            $button.fadeIn();
        } else {
            $button.fadeOut();
        }
    });


     let autoScroll;
     $button.click(function () {
        $('html, body').animate({ scrollTop: 0 }, 'slow');
        return false;
    });
});


    function startAutoScroll() {
        autoScroll = setInterval(() => {
            slider.scrollLeft += 1;
            if (slider.scrollLeft + slider.clientWidth >= slider.scrollWidth) {
                slider.scrollLeft = 0;
            }
        }, 25);
    }


     function stopAutoScroll() {
/* =======================================================
         clearInterval(autoScroll);
  ARVORE DE CLASSES
    }
  ======================================================= */
document.addEventListener('DOMContentLoaded', function () {
     var cells = document.querySelectorAll('.ragnarok-tree td[class^="evo-"]');
 
    cells.forEach(function (cell) {
         var link = cell.querySelector('a');
        if (link) {
            cell.style.cursor = 'pointer';
            cell.addEventListener('click', function () { window.location.href = link.href; });
        }


    startAutoScroll();
        cell.addEventListener('mouseenter', function () {
            var familyClass = Array.from(this.classList).find(function (c) { return c.startsWith('evo-'); });
            if (!familyClass || familyClass === 'evo-all') return;


    slider.addEventListener("mouseenter", stopAutoScroll);
            var myPos    = this.getAttribute('data-pos');
    slider.addEventListener("mouseleave", startAutoScroll);
            var prevEl  = this.closest('table').previousElementSibling;
            var isClass1 = prevEl && prevEl.innerText.includes('Classe 1');
            var isClass2 = prevEl && prevEl.innerText.includes('Classe 2');


    left.addEventListener("click", () => {
            if (isClass1) {
        slider.scrollLeft -= 220;
                document.querySelectorAll('.' + familyClass).forEach(function (el) {
    });
                    el.classList.add('highlight-active');
                });
            } else if (isClass2) {
                this.classList.add('highlight-active');
                var table3 = document.querySelector('table:nth-of-type(3)');
                if (table3) {
                    table3.querySelectorAll('.' + familyClass).forEach(function (el) {
                        if (el.getAttribute('data-pos') === myPos) el.classList.add('highlight-active');
                    });
                }
            } else {
                this.classList.add('highlight-active');
            }
        });


    right.addEventListener("click", () => {
        cell.addEventListener('mouseleave', function () {
         slider.scrollLeft += 220;
            document.querySelectorAll('.highlight-active').forEach(function (el) {
                el.classList.remove('highlight-active');
            });
         });
     });
     });
});
});


function scrollEverlight(direction) {
    const track = document.getElementById("everlightTrack");
    const scrollAmount = 260;
    track.scrollLeft += scrollAmount * direction;
}


/* auto scroll lento */
setInterval(() => {
    const track = document.getElementById("everlightTrack");
    if (!track) return;


    if (track.scrollLeft + track.clientWidth >= track.scrollWidth) {
        track.scrollLeft = 0;
    } else {
        track.scrollLeft += 1;
    }
}, 40);


<script>
/* =======================================================
document.addEventListener("DOMContentLoaded", function () {
  CARROSSEL FARMLAND
     const track = document.querySelector(".carousel-track");
  ======================================================= */
     const items = document.querySelectorAll(".carousel-item");
mw.hook('wikipage.content').add(function () {
     const btnLeft = document.querySelector(".carousel-btn.left");
 
     const btnRight = document.querySelector(".carousel-btn.right");
     var carousel = document.getElementById('farmlandCarousel');
    if (!carousel) return;
 
    var wrapper  = carousel.querySelector('.carousel-wrapper');
    var container = carousel.querySelector('.carousel-container');
     var slides  = carousel.querySelectorAll('.carousel-slide');
     var dotsWrap = carousel.querySelector('.carousel-dots');
    var progBar  = carousel.querySelector('.carousel-progress');
     var nextBtn  = carousel.querySelector('.carousel-arrow.right');
    var prevBtn  = carousel.querySelector('.carousel-arrow.left');
 
    if (!container || slides.length === 0) return;
 
    var DELAY = 3500;
    var total = slides.length;
    var idx  = 1;
    var timer, busy = false;
 
    /* Clones para loop infinito sem flash */
    var firstClone = slides[0].cloneNode(true);
    var lastClone  = slides[total - 1].cloneNode(true);
    firstClone.classList.add('clone');
    lastClone.classList.add('clone');
    container.appendChild(firstClone);
    container.insertBefore(lastClone, slides[0]);


     let index = 0;
     var allSlides = container.querySelectorAll('.carousel-slide');
    const itemWidth = items[0].offsetWidth + 20; // largura + gap
    let autoScroll;


     function updateCarousel() {
     /* Força layout correto (crítico no MediaWiki) */
         track.style.transform = `translateX(${-index * itemWidth}px)`;
    container.style.display    = 'flex';
    container.style.transition = 'none';
    allSlides.forEach(function (s) {
         s.style.minWidth  = '100%';
        s.style.flexShrink = '0';
    });
    container.style.transform = 'translateX(-' + (idx * 100) + '%)';
 
    /* Dots */
    dotsWrap.innerHTML = '';
    var dots = [];
    for (var i = 0; i < total; i++) {
        var dot = document.createElement('span');
        dot.className = 'dot';
        dotsWrap.appendChild(dot);
        dots.push(dot);
        (function (n) {
            dot.onclick = function () { goTo(n + 1); resetAuto(); };
        })(i);
     }
     }


     function next() {
     function updateDots() {
         index++;
         var ai = idx - 1;
         if (index >= items.length) index = 0;
         if (ai < 0) ai = total - 1;
         updateCarousel();
        if (ai >= total) ai = 0;
         dots.forEach(function (d, i) {
            d.classList.toggle('active', i === ai);
        });
     }
     }


     function prev() {
     function goTo(i, animate) {
         index--;
         if (busy) return;
         if (index < 0) index = items.length - 1;
        busy = true;
         updateCarousel();
        idx  = i;
         container.style.transition = (animate === false)
            ? 'none'
            : 'transform 0.5s cubic-bezier(.4,0,.2,1)';
        container.style.transform = 'translateX(-' + (idx * 100) + '%)';
         updateDots();
     }
     }


     btnRight.addEventListener("click", () => {
     container.addEventListener('transitionend', function () {
         stopAuto();
         if (allSlides[idx] && allSlides[idx].classList.contains('clone')) {
        next();
            container.style.transition = 'none';
        startAuto();
            idx = (idx === 0) ? total : 1;
            container.style.transform = 'translateX(-' + (idx * 100) + '%)';
            updateDots();
        }
        busy = false;
     });
     });


     btnLeft.addEventListener("click", () => {
     function next() { goTo(idx + 1); resetAuto(); }
         stopAuto();
    function prev() { goTo(idx - 1); resetAuto(); }
         prev();
 
         startAuto();
    if (nextBtn) nextBtn.onclick = next;
     });
    if (prevBtn) prevBtn.onclick = prev;
 
    /* Barra de progresso */
    function startProg() {
         if (!progBar) return;
        progBar.style.transition = 'none';
        progBar.style.width = '0%';
         setTimeout(function () {
            progBar.style.transition = 'width ' + DELAY + 'ms linear';
            progBar.style.width = '100%';
         }, 30);
     }


     function startAuto() {
     function startAuto() {
         autoScroll = setInterval(() => {
         timer = setInterval(function () { goTo(idx + 1); startProg(); }, DELAY);
            next();
         startProg();
         }, 4000); // 4 segundos parado em cada imagem
     }
     }


     function stopAuto() {
     function stopAuto() {
         clearInterval(autoScroll);
         clearInterval(timer);
        if (progBar) { progBar.style.transition = 'none'; progBar.style.width = '0%'; }
     }
     }


     startAuto();
     function resetAuto() { clearInterval(timer); startAuto(); }
});
</script>
/* ===== CARROSSEL EVERLIGHT ===== */
.everlight-carousel {
    position: relative;
    display: flex;
    align-items: center;
    justify-content: center;
    margin: 25px 0;
}
 
/* Área rolável */
.everlight-carousel-track {
    display: flex;
    gap: 18px;
    overflow: hidden;
    scroll-behavior: smooth;
    width: 100%;
    max-width: 1000px;
}


/* Cada imagem */
    /* Pausa no hover */
.everlight-carousel-track .img-hover {
    if (wrapper) {
     flex: 0 0 auto;
        wrapper.addEventListener('mouseenter', stopAuto);
}
        wrapper.addEventListener('mouseleave', startAuto);
     }


/* Botões */
    /* Swipe mobile */
.carousel-btn {
    var startX = 0;
    background: rgba(0,0,0,0.6);
    if (wrapper) {
    color: #fff;
        wrapper.addEventListener('touchstart', function (e) { startX = e.touches[0].clientX; });
    border: none;
        wrapper.addEventListener('touchend', function (e) {
    width: 42px;
            var diff = startX - e.changedTouches[0].clientX;
    height: 42px;
            if (Math.abs(diff) > 40) { diff > 0 ? next() : prev(); }
    font-size: 22px;
        });
    cursor: pointer;
     }
    border-radius: 50%;
    transition: background 0.2s ease;
     z-index: 10;
}


.carousel-btn:hover {
     updateDots();
     background: rgba(0,0,0,0.85);
     startAuto();
}
});
 
.carousel-btn.left {
    margin-right: 10px;
}
 
.carousel-btn.right {
    margin-left: 10px;
}
 
/* Mantém seu hover */
.img-hover img {
    transition: transform 0.3s ease, box-shadow 0.3s ease;
}
 
.img-hover img:hover {
     transform: translateY(-6px) scale(1.03);
    box-shadow: 0 10px 20px rgba(0,0,0,0.25);
}

Edição atual tal como às 21h15min de 16 de maio de 2026

/* =======================================================
   ARVORE DE HABILIDADE
   ======================================================= */
document.addEventListener('DOMContentLoaded', function () {
    var cards = document.querySelectorAll('.skill-card');
    cards.forEach(function (card) {
        card.addEventListener('click', function () {
            card.style.filter = 'brightness(1.2)';
            setTimeout(function () { card.style.filter = 'brightness(1)'; }, 150);
        });
    });
});


/* =======================================================
   BOTAO VOLTAR AO TOPO
   ======================================================= */
$(function () {
    var $button = $('<button id="back-to-top" title="Voltar ao Topo">↑ Topo</button>');
    $('body').append($button);

    $(window).scroll(function () {
        if ($(window).scrollTop() + $(window).height() > $(document).height() - 100) {
            $button.fadeIn();
        } else {
            $button.fadeOut();
        }
    });

    $button.click(function () {
        $('html, body').animate({ scrollTop: 0 }, 'slow');
        return false;
    });
});


/* =======================================================
   ARVORE DE CLASSES
   ======================================================= */
document.addEventListener('DOMContentLoaded', function () {
    var cells = document.querySelectorAll('.ragnarok-tree td[class^="evo-"]');

    cells.forEach(function (cell) {
        var link = cell.querySelector('a');
        if (link) {
            cell.style.cursor = 'pointer';
            cell.addEventListener('click', function () { window.location.href = link.href; });
        }

        cell.addEventListener('mouseenter', function () {
            var familyClass = Array.from(this.classList).find(function (c) { return c.startsWith('evo-'); });
            if (!familyClass || familyClass === 'evo-all') return;

            var myPos    = this.getAttribute('data-pos');
            var prevEl   = this.closest('table').previousElementSibling;
            var isClass1 = prevEl && prevEl.innerText.includes('Classe 1');
            var isClass2 = prevEl && prevEl.innerText.includes('Classe 2');

            if (isClass1) {
                document.querySelectorAll('.' + familyClass).forEach(function (el) {
                    el.classList.add('highlight-active');
                });
            } else if (isClass2) {
                this.classList.add('highlight-active');
                var table3 = document.querySelector('table:nth-of-type(3)');
                if (table3) {
                    table3.querySelectorAll('.' + familyClass).forEach(function (el) {
                        if (el.getAttribute('data-pos') === myPos) el.classList.add('highlight-active');
                    });
                }
            } else {
                this.classList.add('highlight-active');
            }
        });

        cell.addEventListener('mouseleave', function () {
            document.querySelectorAll('.highlight-active').forEach(function (el) {
                el.classList.remove('highlight-active');
            });
        });
    });
});




/* =======================================================
   CARROSSEL FARMLAND
   ======================================================= */
mw.hook('wikipage.content').add(function () {

    var carousel = document.getElementById('farmlandCarousel');
    if (!carousel) return;

    var wrapper  = carousel.querySelector('.carousel-wrapper');
    var container = carousel.querySelector('.carousel-container');
    var slides   = carousel.querySelectorAll('.carousel-slide');
    var dotsWrap = carousel.querySelector('.carousel-dots');
    var progBar  = carousel.querySelector('.carousel-progress');
    var nextBtn  = carousel.querySelector('.carousel-arrow.right');
    var prevBtn  = carousel.querySelector('.carousel-arrow.left');

    if (!container || slides.length === 0) return;

    var DELAY = 3500;
    var total = slides.length;
    var idx   = 1;
    var timer, busy = false;

    /* Clones para loop infinito sem flash */
    var firstClone = slides[0].cloneNode(true);
    var lastClone  = slides[total - 1].cloneNode(true);
    firstClone.classList.add('clone');
    lastClone.classList.add('clone');
    container.appendChild(firstClone);
    container.insertBefore(lastClone, slides[0]);

    var allSlides = container.querySelectorAll('.carousel-slide');

    /* Força layout correto (crítico no MediaWiki) */
    container.style.display    = 'flex';
    container.style.transition = 'none';
    allSlides.forEach(function (s) {
        s.style.minWidth   = '100%';
        s.style.flexShrink = '0';
    });
    container.style.transform = 'translateX(-' + (idx * 100) + '%)';

    /* Dots */
    dotsWrap.innerHTML = '';
    var dots = [];
    for (var i = 0; i < total; i++) {
        var dot = document.createElement('span');
        dot.className = 'dot';
        dotsWrap.appendChild(dot);
        dots.push(dot);
        (function (n) {
            dot.onclick = function () { goTo(n + 1); resetAuto(); };
        })(i);
    }

    function updateDots() {
        var ai = idx - 1;
        if (ai < 0) ai = total - 1;
        if (ai >= total) ai = 0;
        dots.forEach(function (d, i) {
            d.classList.toggle('active', i === ai);
        });
    }

    function goTo(i, animate) {
        if (busy) return;
        busy = true;
        idx  = i;
        container.style.transition = (animate === false)
            ? 'none'
            : 'transform 0.5s cubic-bezier(.4,0,.2,1)';
        container.style.transform = 'translateX(-' + (idx * 100) + '%)';
        updateDots();
    }

    container.addEventListener('transitionend', function () {
        if (allSlides[idx] && allSlides[idx].classList.contains('clone')) {
            container.style.transition = 'none';
            idx = (idx === 0) ? total : 1;
            container.style.transform = 'translateX(-' + (idx * 100) + '%)';
            updateDots();
        }
        busy = false;
    });

    function next() { goTo(idx + 1); resetAuto(); }
    function prev() { goTo(idx - 1); resetAuto(); }

    if (nextBtn) nextBtn.onclick = next;
    if (prevBtn) prevBtn.onclick = prev;

    /* Barra de progresso */
    function startProg() {
        if (!progBar) return;
        progBar.style.transition = 'none';
        progBar.style.width = '0%';
        setTimeout(function () {
            progBar.style.transition = 'width ' + DELAY + 'ms linear';
            progBar.style.width = '100%';
        }, 30);
    }

    function startAuto() {
        timer = setInterval(function () { goTo(idx + 1); startProg(); }, DELAY);
        startProg();
    }

    function stopAuto() {
        clearInterval(timer);
        if (progBar) { progBar.style.transition = 'none'; progBar.style.width = '0%'; }
    }

    function resetAuto() { clearInterval(timer); startAuto(); }

    /* Pausa no hover */
    if (wrapper) {
        wrapper.addEventListener('mouseenter', stopAuto);
        wrapper.addEventListener('mouseleave', startAuto);
    }

    /* Swipe mobile */
    var startX = 0;
    if (wrapper) {
        wrapper.addEventListener('touchstart', function (e) { startX = e.touches[0].clientX; });
        wrapper.addEventListener('touchend', function (e) {
            var diff = startX - e.changedTouches[0].clientX;
            if (Math.abs(diff) > 40) { diff > 0 ? next() : prev(); }
        });
    }

    updateDots();
    startAuto();
});