MediaWiki:Common.js

From determinar.ia.br - Determine suas informações
Revision as of 15:34, 6 August 2026 by Determinaradmin (talk | contribs)

Note: After publishing, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5.
$( function () {
	document.querySelectorAll( '.medico-desamb-titulo, .medico-faq-q' ).forEach( function ( el ) {
		el.addEventListener( 'click', function () {
			var bloco = el.closest( '.medico-desamb, .medico-faq' );
			if ( bloco ) bloco.classList.toggle( 'fechado' );
		} );
	} );
} );
/* ===== Banner Hero Interativo (Canvas Partículas) ===== */

// Espera a página carregar completamente
$(document).ready(function() {
    // Tenta encontrar o elemento onde o canvas será inserido
    var heroContainer = $('.wiki-hero-canvas-wrapper');
    
    // Se o elemento não existir nesta página, não faz nada
    if (!heroContainer.length) return;

    // Cria o elemento Canvas e adiciona ao container
    var canvas = document.createElement('canvas');
    canvas.id = 'hero-particle-canvas';
    heroContainer.append(canvas);
    var ctx = canvas.getContext('2d');

    // Configurações e Variáveis
    var particles = [];
    var particleCount = 100; // Quantidade de luzinhas (partículas)
    var maxDistance = 100; // Distância máxima para conectar as linhas
    var mouse = { x: null, y: null, radius: 150 }; // Propriedades do mouse

    // Redimensiona o canvas para preencher o container
    function setCanvasSize() {
        canvas.width = heroContainer.width();
        canvas.height = heroContainer.height();
    }

    setCanvasSize();
    $(window).on('resize', setCanvasSize);

    // Rastreia o movimento do mouse dentro do banner
    heroContainer.on('mousemove', function(e) {
        var rect = canvas.getBoundingClientRect();
        mouse.x = e.clientX - rect.left;
        mouse.y = e.clientY - rect.top;
    });

    // Zera o mouse quando ele sai do banner
    heroContainer.on('mouseout', function() {
        mouse.x = null;
        mouse.y = null;
    });

    // Classe para criar cada Partícula/Luzinha
    class Particle {
        constructor(x, y, dx, dy, size, color) {
            this.x = x || Math.random() * canvas.width;
            this.y = y || Math.random() * canvas.height;
            this.dx = dx || (Math.random() - 0.5) * 1.5; // Velocidade X
            this.dy = dy || (Math.random() - 0.5) * 1.5; // Velocidade Y
            this.size = size || Math.random() * 2 + 1; // Tamanho
            this.color = color || 'rgba(16, 185, 129, 0.75)'; // Cor verde translúcida (logo)
        }

        // Desenha a partícula
        draw() {
            ctx.beginPath();
            ctx.arc(this.x, this.y, this.size, 0, Math.random() * Math.PI * 2);
            ctx.fillStyle = this.color;
            ctx.fill();
        }

        // Atualiza a posição e reage ao mouse
        update() {
            // Verifica limites do canvas e rebate
            if (this.x > canvas.width || this.x < 0) this.dx = -this.dx;
            if (this.y > canvas.height || this.y < 0) this.dy = -this.dy;

            // Move a partícula
            this.x += this.dx;
            this.y += this.dy;

            // Interação com o Mouse (faz as partículas fugirem)
            if (mouse.x != null && mouse.y != null) {
                let dxM = this.x - mouse.x;
                let dyM = this.y - mouse.y;
                let distanceMouse = Math.sqrt(dxM * dxM + dyM * dyM);
                
                if (distanceMouse < mouse.radius + this.size) {
                    if (mouse.x < this.x && this.x < canvas.width - this.size * 10) this.x += 2;
                    if (mouse.x > this.x && this.x > this.size * 10) this.x -= 2;
                    if (mouse.y < this.y && this.y < canvas.height - this.size * 10) this.y += 2;
                    if (mouse.y > this.y && this.y < canvas.height - this.size * 10) this.y -= 2;
                }
            }

            this.draw();
        }
    }

    // Inicializa o array de partículas
    function initParticles() {
        particles = [];
        for (let i = 0; i < particleCount; i++) {
            particles.push(new Particle());
        }
    }

    // Loop de animação
    function animate() {
        // Limpa o canvas para o próximo quadro
        ctx.clearRect(0, 0, canvas.width, canvas.height);

        // Atualiza e desenha cada partícula
        for (let i = 0; i < particles.length; i++) {
            particles[i].update();
            
            // Desenha linhas entre as partículas próximas
            for (let j = i; j < particles.length; j++) {
                let dxP = particles[i].x - particles[j].x;
                let dyP = particles[i].y - particles[j].y;
                let distance = Math.sqrt(dxP * dxP + dyP * dyP);

                if (distance < maxDistance) {
                    // Define a opacidade com base na distância
                    let opacity = 1 - (distance / maxDistance);
                    ctx.strokeStyle = 'rgba(16, 185, 129, ' + opacity * 0.3 + ')';
                    ctx.lineWidth = 1;
                    ctx.beginPath();
                    ctx.moveTo(particles[i].x, particles[i].y);
                    ctx.lineTo(particles[j].x, particles[j].y);
                    ctx.stroke();
                }
            }
        }
        
        // Chama recursivamente para o próximo quadro
        requestAnimationFrame(animate);
    }

    // Começa a mágica
    initParticles();
    animate();
});