Jump to content

MediaWiki:Common.js: Difference between revisions

From FC1
No edit summary
No edit summary
Line 3: Line 3:


function applyEffects(el) {
function applyEffects(el) {
  // Check for any of our active classes
    const hasEffect = ['wavy', 'rainbow', 'force-glow', 'force-shadow'].some(cls => el.classList.contains(cls));
  const hasEffect = ['wavy', 'rainbow', 'force-glow', 'force-shadow'].some(cls => el.classList.contains(cls));
    if (!hasEffect) return;
 
  if (!hasEffect) return;


  const chars = el.textContent.split('');
    const chars = el.textContent.split('');
  const total = chars.length;
    const total = chars.length;
  const isRainbow = el.classList.contains('rainbow');
    const isRainbow = el.classList.contains('rainbow');
  const isWavy = el.classList.contains('wavy');
    const isWavy = el.classList.contains('wavy');


  // Kill animation on the parent so it doesn't move as a block
    el.style.setProperty('animation', 'none', 'important');
  el.style.setProperty('animation', 'none', 'important');


el.innerHTML = chars.map((c, i) => {
    el.innerHTML = chars.map((c, i) => {
    let styles = [
        let styles = [
      `display: inline-block`,  
            `display: inline-block`,  
      `position: relative`,
            `position: relative`,
      `color: inherit` // Keeps the Color and Glow working
            `color: inherit`
    ];
        ];
let delays = [];
        let delays = [];
   
       
    if (isWavy) {
        if (isWavy) {
      const waveDelay = -((i / total) * 1).toFixed(2);
            // FIXED: Using -0.15 creates a broad wave that flows through phrases
      delays.push(`${waveDelay}s`);
            // instead of stretching one wave over the whole length.
    }
            const waveDelay = (i * -0.15).toFixed(2);
   
            delays.push(`${waveDelay}s`);
    if (isRainbow) {
        }
      const hue = Math.round((i / total) * 360);
       
      const rainbowDelay = -((i / total) * 3).toFixed(2);
        if (isRainbow) {
      styles.push(`color: hsl(${hue}, 100%, 60%)`);
            const hue = Math.round((i / total) * 360);
      delays.push(`${rainbowDelay}s`);
            const rainbowDelay = -((i / total) * 3).toFixed(2);
    }
            styles.push(`color: hsl(${hue}, 100%, 60%)`);
            delays.push(`${rainbowDelay}s`);
        }


    const content = (c === ' ') ? ' ' : c;
        const content = (c === ' ') ? ' ' : c;
    const span = document.createElement('span');
        const span = document.createElement('span');
    span.innerHTML = content;
        span.innerHTML = content;
   
       
    // Apply display and position
        styles.forEach(s => {
    styles.forEach(s => {
            const [prop, val] = s.split(': ');
      const [prop, val] = s.split(': ');
            span.style.setProperty(prop, val, 'important');
      span.style.setProperty(prop, val, 'important');
        });
    });


    // Apply the crucial animation-delay with !important
        if (delays.length > 0) {
    if (delays.length > 0) {
            span.style.setProperty('animation-delay', delays.join(', '), 'important');
      span.style.setProperty('animation-delay', delays.join(', '), 'important');
        }
    }


    return span.outerHTML;
        return span.outerHTML;
  }).join('');
    }).join('');
}
}


$(document).ready(function() {
$(document).ready(function() {
     // 200ms gives the wiki a bit more breathing room to load CSS
     // UPDATED: Added glow and shadow to the trigger list
     setTimeout(function() {
     setTimeout(function() {
         $('.rainbow, .wavy').each(function() {  
         $('.rainbow, .wavy, .force-glow, .force-shadow').each(function() {  
             applyEffects(this);  
             applyEffects(this);  
         });
         });
     }, 200);  
     }, 200);  
});
});

Revision as of 18:55, 16 March 2026

/* Any JavaScript here will be loaded for all users on every page load. */
document.querySelectorAll('.text-animation-container').forEach(applyEffects);

function applyEffects(el) {
    const hasEffect = ['wavy', 'rainbow', 'force-glow', 'force-shadow'].some(cls => el.classList.contains(cls));
    if (!hasEffect) return;

    const chars = el.textContent.split('');
    const total = chars.length;
    const isRainbow = el.classList.contains('rainbow');
    const isWavy = el.classList.contains('wavy');

    el.style.setProperty('animation', 'none', 'important');

    el.innerHTML = chars.map((c, i) => {
        let styles = [
            `display: inline-block`, 
            `position: relative`,
            `color: inherit`
        ];
        let delays = [];
        
        if (isWavy) {
            // FIXED: Using -0.15 creates a broad wave that flows through phrases 
            // instead of stretching one wave over the whole length.
            const waveDelay = (i * -0.15).toFixed(2);
            delays.push(`${waveDelay}s`);
        }
        
        if (isRainbow) {
            const hue = Math.round((i / total) * 360);
            const rainbowDelay = -((i / total) * 3).toFixed(2);
            styles.push(`color: hsl(${hue}, 100%, 60%)`);
            delays.push(`${rainbowDelay}s`);
        }

        const content = (c === ' ') ? ' ' : c;
        const span = document.createElement('span');
        span.innerHTML = content;
        
        styles.forEach(s => {
            const [prop, val] = s.split(': ');
            span.style.setProperty(prop, val, 'important');
        });

        if (delays.length > 0) {
            span.style.setProperty('animation-delay', delays.join(', '), 'important');
        }

        return span.outerHTML;
    }).join('');
}

$(document).ready(function() {
    // UPDATED: Added glow and shadow to the trigger list
    setTimeout(function() {
        $('.rainbow, .wavy, .force-glow, .force-shadow').each(function() { 
            applyEffects(this); 
        });
    }, 200); 
});