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

De Farmland
Ir para navegação Ir para pesquisar
Sem resumo de edição
Etiqueta: Reversão manual
Sem resumo de edição
Etiqueta: Revertido
Linha 103: Linha 103:
     });
     });
   });
   });
});
// =========================
// FUNCIONALIDADE DOS BOTÕES
// =========================
document.addEventListener('DOMContentLoaded', function() {
  const guideItems = document.querySelectorAll('.hr-guide-item');
  const filterButtons = document.querySelectorAll('.filter-btn');
  const searchInput = document.querySelector('.search-input');
  const searchClear = document.querySelector('.search-clear');
  const controlButtons = {
    shuffle: document.getElementById('shuffleGuides'),
    expand: document.getElementById('expandAll'),
    collapse: document.getElementById('collapseAll'),
    popular: document.getElementById('showPopular'),
    icons: document.getElementById('toggleIcons')
  };
  const pageButtons = document.querySelectorAll('.page-btn, .page-number');
  // 1. FILTRAGEM
  filterButtons.forEach(button => {
    button.addEventListener('click', function() {
      // Remove active de todos
      filterButtons.forEach(btn => btn.classList.remove('active'));
      // Adiciona active no clicado
      this.classList.add('active');
     
      const filter = this.dataset.filter;
      filterGuides(filter);
    });
  });
  function filterGuides(filter) {
    guideItems.forEach(item => {
      const category = item.dataset.category;
      const isPopular = item.dataset.popular === 'true';
      const isUpdated = item.dataset.updated === 'true';
     
      let shouldShow = true;
     
      switch(filter) {
        case 'all':
          shouldShow = true;
          break;
        case 'progression':
          shouldShow = category === 'progression';
          break;
        case 'systems':
          shouldShow = category === 'systems';
          break;
        case 'economy':
          shouldShow = category === 'economy';
          break;
        case 'content':
          shouldShow = category === 'content';
          break;
        case 'popular':
          shouldShow = isPopular;
          break;
        case 'updated':
          shouldShow = isUpdated;
          break;
      }
     
      if (shouldShow) {
        item.classList.remove('hidden');
        setTimeout(() => {
          item.classList.add('highlighted');
          setTimeout(() => item.classList.remove('highlighted'), 300);
        }, 100);
      } else {
        item.classList.add('hidden');
      }
    });
  }
  // 2. BUSCA EM TEMPO REAL
  searchInput.addEventListener('input', function() {
    const term = this.value.toLowerCase().trim();
   
    guideItems.forEach(item => {
      const link = item.querySelector('.guide-link');
      const text = link.textContent.toLowerCase();
     
      if (term === '' || text.includes(term)) {
        item.classList.remove('hidden');
        if (term !== '') {
          item.classList.add('highlighted');
        } else {
          item.classList.remove('highlighted');
        }
      } else {
        item.classList.add('hidden');
        item.classList.remove('highlighted');
      }
    });
  });
  searchClear.addEventListener('click', function() {
    searchInput.value = '';
    searchInput.dispatchEvent(new Event('input'));
  });
  // 3. EMBARALHAR GUIAS
  controlButtons.shuffle.addEventListener('click', function() {
    const grid = document.querySelector('.hr-guides-grid');
    const items = Array.from(guideItems);
   
    // Embaralha array
    for (let i = items.length - 1; i > 0; i--) {
      const j = Math.floor(Math.random() * (i + 1));
      [items[i], items[j]] = [items[j], items[i]];
    }
   
    // Remove e readiciona em ordem embaralhada
    items.forEach(item => {
      grid.appendChild(item);
      item.classList.add('highlighted');
      setTimeout(() => item.classList.remove('highlighted'), 500);
    });
   
    // Efeito visual
    this.classList.add('shuffling');
    setTimeout(() => this.classList.remove('shuffling'), 1000);
  });
  // 4. MOSTRAR POPULARES
  controlButtons.popular.addEventListener('click', function() {
    filterButtons.forEach(btn => btn.classList.remove('active'));
    document.querySelector('[data-filter="popular"]').classList.add('active');
    filterGuides('popular');
  });
  // 5. TOGGLE ÍCONES
  controlButtons.icons.addEventListener('click', function() {
    const icons = document.querySelectorAll('.hr-icon');
    const areHidden = icons[0].style.opacity === '0';
   
    icons.forEach(icon => {
      icon.style.opacity = areHidden ? '1' : '0';
      icon.style.transform = areHidden ? 'scale(1)' : 'scale(0)';
    });
   
    this.querySelector('.control-icon').textContent = areHidden ? '👁️' : '👁️‍🗨️';
  });
  // 6. PAGINAÇÃO (exemplo básico)
  pageButtons.forEach(button => {
    button.addEventListener('click', function() {
      if (this.classList.contains('active') || this.disabled) return;
     
      // Atualiza página ativa
      document.querySelectorAll('.page-number.active').forEach(el => {
        el.classList.remove('active');
      });
     
      if (this.classList.contains('page-number')) {
        this.classList.add('active');
      }
     
      // Aqui você implementaria a lógica de paginação real
      // Por enquanto apenas efeito visual
      guideItems.forEach(item => {
        item.classList.add('hidden');
        setTimeout(() => item.classList.remove('hidden'), 300);
      });
    });
  });
  // 7. CONTADOR DINÂMICO
  function updateGuideCount() {
    const visibleGuides = Array.from(guideItems).filter(item =>
      !item.classList.contains('hidden')
    ).length;
   
    document.querySelector('.stat-count').textContent = visibleGuides;
  }
  // Atualiza contador em todas as interações
  const observer = new MutationObserver(updateGuideCount);
  guideItems.forEach(item => {
    observer.observe(item, {
      attributes: true,
      attributeFilter: ['class']
    });
  });
  // Inicialização
  updateGuideCount();
});
});

Edição das 06h58min de 30 de janeiro de 2026

/* =======================================================
   CARROSSEL UNIFICADO - WIKI EVERLIGHT
   ======================================================= */
mw.loader.using(['jquery', 'mediawiki.util'], function () {
    $(function() {
        const $wrapper = $('.carousel-wrapper');
        const $items = $('.carousel-item');
        const $next = $('.right-btn');
        const $prev = $('.left-btn');
        
        if (!$wrapper.length) return; // Só executa se o carrossel existir na página

        let current = 0;
        let autoPlayTimer;

        function updateCarousel() {
            // Atualiza a classe ativa para o efeito visual de destaque
            $items.removeClass('active').eq(current).addClass('active');

            const activeItem = $items.get(current);
            const scrollPosition = 
                activeItem.offsetLeft - 
                ($wrapper.width() / 2) + 
                ($(activeItem).outerWidth() / 2);

            $wrapper.stop().animate({
                scrollLeft: scrollPosition
            }, 500);
        }

        // Funções de Navegação
        function moveNext() {
            current = (current + 1) % $items.length;
            updateCarousel();
        }

        function movePrev() {
            current = (current - 1 + $items.length) % $items.length;
            updateCarousel();
        }

        // Eventos de Clique
        $next.on('click', function() {
            stopAutoPlay();
            moveNext();
        });

        $prev.on('click', function() {
            stopAutoPlay();
            movePrev();
        });

        // Auto-Play (4 segundos)
        function startAutoPlay() {
            autoPlayTimer = setInterval(moveNext, 4000);
        }

        function stopAutoPlay() {
            clearInterval(autoPlayTimer);
        }

        // Inicialização
        updateCarousel();
        startAutoPlay();

        // Pausa o carrossel se o mouse estiver em cima
        $wrapper.hover(stopAutoPlay, startAutoPlay);
    });
});


/* =======================================================
   ARVORE HABILIDADE - WIKI EVERLIGHT
   ======================================================= */


document.addEventListener('DOMContentLoaded', () => {
    const cards = document.querySelectorAll('.skill-card');

    cards.forEach(card => {
        card.addEventListener('click', () => {
            const skillName = card.querySelector('.skill-name').innerText;
            console.log(`Habilidade clicada: ${skillName}`);
            
            // Exemplo de efeito visual simples
            card.style.filter = "brightness(1.2)";
            setTimeout(() => {
                card.style.filter = "brightness(1)";
            }, 150);
        });
    });
});

document.querySelectorAll('.carousel-track').forEach(track => {
  track.addEventListener('mouseenter', () => {
    track.querySelectorAll('.carousel-item').forEach(item => {
      item.style.animationPlayState = 'paused';
    });
  });
  track.addEventListener('mouseleave', () => {
    track.querySelectorAll('.carousel-item').forEach(item => {
      item.style.animationPlayState = 'running';
    });
  });
});








// =========================
// FUNCIONALIDADE DOS BOTÕES
// =========================

document.addEventListener('DOMContentLoaded', function() {
  const guideItems = document.querySelectorAll('.hr-guide-item');
  const filterButtons = document.querySelectorAll('.filter-btn');
  const searchInput = document.querySelector('.search-input');
  const searchClear = document.querySelector('.search-clear');
  const controlButtons = {
    shuffle: document.getElementById('shuffleGuides'),
    expand: document.getElementById('expandAll'),
    collapse: document.getElementById('collapseAll'),
    popular: document.getElementById('showPopular'),
    icons: document.getElementById('toggleIcons')
  };
  const pageButtons = document.querySelectorAll('.page-btn, .page-number');

  // 1. FILTRAGEM
  filterButtons.forEach(button => {
    button.addEventListener('click', function() {
      // Remove active de todos
      filterButtons.forEach(btn => btn.classList.remove('active'));
      // Adiciona active no clicado
      this.classList.add('active');
      
      const filter = this.dataset.filter;
      filterGuides(filter);
    });
  });

  function filterGuides(filter) {
    guideItems.forEach(item => {
      const category = item.dataset.category;
      const isPopular = item.dataset.popular === 'true';
      const isUpdated = item.dataset.updated === 'true';
      
      let shouldShow = true;
      
      switch(filter) {
        case 'all':
          shouldShow = true;
          break;
        case 'progression':
          shouldShow = category === 'progression';
          break;
        case 'systems':
          shouldShow = category === 'systems';
          break;
        case 'economy':
          shouldShow = category === 'economy';
          break;
        case 'content':
          shouldShow = category === 'content';
          break;
        case 'popular':
          shouldShow = isPopular;
          break;
        case 'updated':
          shouldShow = isUpdated;
          break;
      }
      
      if (shouldShow) {
        item.classList.remove('hidden');
        setTimeout(() => {
          item.classList.add('highlighted');
          setTimeout(() => item.classList.remove('highlighted'), 300);
        }, 100);
      } else {
        item.classList.add('hidden');
      }
    });
  }

  // 2. BUSCA EM TEMPO REAL
  searchInput.addEventListener('input', function() {
    const term = this.value.toLowerCase().trim();
    
    guideItems.forEach(item => {
      const link = item.querySelector('.guide-link');
      const text = link.textContent.toLowerCase();
      
      if (term === '' || text.includes(term)) {
        item.classList.remove('hidden');
        if (term !== '') {
          item.classList.add('highlighted');
        } else {
          item.classList.remove('highlighted');
        }
      } else {
        item.classList.add('hidden');
        item.classList.remove('highlighted');
      }
    });
  });

  searchClear.addEventListener('click', function() {
    searchInput.value = '';
    searchInput.dispatchEvent(new Event('input'));
  });

  // 3. EMBARALHAR GUIAS
  controlButtons.shuffle.addEventListener('click', function() {
    const grid = document.querySelector('.hr-guides-grid');
    const items = Array.from(guideItems);
    
    // Embaralha array
    for (let i = items.length - 1; i > 0; i--) {
      const j = Math.floor(Math.random() * (i + 1));
      [items[i], items[j]] = [items[j], items[i]];
    }
    
    // Remove e readiciona em ordem embaralhada
    items.forEach(item => {
      grid.appendChild(item);
      item.classList.add('highlighted');
      setTimeout(() => item.classList.remove('highlighted'), 500);
    });
    
    // Efeito visual
    this.classList.add('shuffling');
    setTimeout(() => this.classList.remove('shuffling'), 1000);
  });

  // 4. MOSTRAR POPULARES
  controlButtons.popular.addEventListener('click', function() {
    filterButtons.forEach(btn => btn.classList.remove('active'));
    document.querySelector('[data-filter="popular"]').classList.add('active');
    filterGuides('popular');
  });

  // 5. TOGGLE ÍCONES
  controlButtons.icons.addEventListener('click', function() {
    const icons = document.querySelectorAll('.hr-icon');
    const areHidden = icons[0].style.opacity === '0';
    
    icons.forEach(icon => {
      icon.style.opacity = areHidden ? '1' : '0';
      icon.style.transform = areHidden ? 'scale(1)' : 'scale(0)';
    });
    
    this.querySelector('.control-icon').textContent = areHidden ? '👁️' : '👁️‍🗨️';
  });

  // 6. PAGINAÇÃO (exemplo básico)
  pageButtons.forEach(button => {
    button.addEventListener('click', function() {
      if (this.classList.contains('active') || this.disabled) return;
      
      // Atualiza página ativa
      document.querySelectorAll('.page-number.active').forEach(el => {
        el.classList.remove('active');
      });
      
      if (this.classList.contains('page-number')) {
        this.classList.add('active');
      }
      
      // Aqui você implementaria a lógica de paginação real
      // Por enquanto apenas efeito visual
      guideItems.forEach(item => {
        item.classList.add('hidden');
        setTimeout(() => item.classList.remove('hidden'), 300);
      });
    });
  });

  // 7. CONTADOR DINÂMICO
  function updateGuideCount() {
    const visibleGuides = Array.from(guideItems).filter(item => 
      !item.classList.contains('hidden')
    ).length;
    
    document.querySelector('.stat-count').textContent = visibleGuides;
  }

  // Atualiza contador em todas as interações
  const observer = new MutationObserver(updateGuideCount);
  guideItems.forEach(item => {
    observer.observe(item, { 
      attributes: true, 
      attributeFilter: ['class'] 
    });
  });

  // Inicialização
  updateGuideCount();
});