MediaWiki:Common.js: Difference between revisions
Appearance
No edit summary |
No edit summary |
||
| (6 intermediate revisions by the same user not shown) | |||
| Line 1: | Line 1: | ||
/* Any JavaScript here will be loaded for all users on every page load. */ | /* Any JavaScript here will be loaded for all users on every page load. */ | ||
(function() { | (function() { | ||
function applyEffects(el) { | function applyEffects(el) { | ||
const hasEffect = ['wavy', 'rainbow', 'jolt', 'pulse', 'force-glow', 'force-shadow'].some(cls => el.classList.contains(cls)); | |||
const hasEffect = ['wavy', 'rainbow', 'jolt', 'force-glow', 'force-shadow'].some(cls => el.classList.contains(cls)); | |||
if (!hasEffect || el.getAttribute('data-animated') === 'true') return; | if (!hasEffect || el.getAttribute('data-animated') === 'true') return; | ||
const | const text = el.textContent; | ||
const isJolt = el.classList.contains('jolt'); | |||
const isWavy = el.classList.contains('wavy'); | |||
const isRainbow = el.classList.contains('rainbow'); | const isRainbow = el.classList.contains('rainbow'); | ||
// | // Note: Pulse is handled by the container CSS now | ||
el.style.setProperty('animation', ' | el.style.setProperty('animation-delay', '0s', 'important'); | ||
let lastVariant = -1; | |||
const newHTML = | const newHTML = text.split('').map((c, i) => { | ||
let delays = []; | let delays = []; | ||
let classes = []; | |||
if (isWavy) delays.push((i * -0.15).toFixed(2) + 's'); | |||
if (isRainbow) delays.push((i * -0.15).toFixed(2) + 's'); | |||
if (isJolt) { | if (isJolt) { | ||
let variant; | |||
delays.push((Math.random() * -0. | do { variant = Math.floor(Math.random() * 3) + 1; } while (variant === lastVariant); | ||
lastVariant = variant; | |||
classes.push(`jolt-v${variant}`); | |||
delays.push((Math.random() * -0.35).toFixed(2) + 's'); | |||
} | } | ||
const content = (c === ' ') ? ' ' : c; | const content = (c === ' ') ? ' ' : c; | ||
const delayStyle = delays.length > 0 ? `animation-delay: ${delays.join(', ')} !important;` : ''; | const delayStyle = delays.length > 0 ? `style="animation-delay: ${delays.join(', ')} !important;"` : ''; | ||
const classAttr = classes.length > 0 ? `class="${classes.join(' ')}"` : ''; | |||
return `<span ${classAttr} ${delayStyle}>${content}</span>`; | |||
return `<span | |||
}).join(''); | }).join(''); | ||
el.innerHTML = newHTML; | el.innerHTML = newHTML; | ||
el.setAttribute('data-animated', 'true'); | el.setAttribute('data-animated', 'true'); | ||
} | } | ||
mw.hook('wikipage.content').add(function($content) { | mw.hook('wikipage.content').add(function($content) { | ||
$content.find('.text-animation-container').each(function() { | $content.find('.text-animation-container').each(function() { | ||
Latest revision as of 22:29, 17 March 2026
/* Any JavaScript here will be loaded for all users on every page load. */
(function() {
function applyEffects(el) {
const hasEffect = ['wavy', 'rainbow', 'jolt', 'pulse', 'force-glow', 'force-shadow'].some(cls => el.classList.contains(cls));
if (!hasEffect || el.getAttribute('data-animated') === 'true') return;
const text = el.textContent;
const isJolt = el.classList.contains('jolt');
const isWavy = el.classList.contains('wavy');
const isRainbow = el.classList.contains('rainbow');
// Note: Pulse is handled by the container CSS now
el.style.setProperty('animation-delay', '0s', 'important');
let lastVariant = -1;
const newHTML = text.split('').map((c, i) => {
let delays = [];
let classes = [];
if (isWavy) delays.push((i * -0.15).toFixed(2) + 's');
if (isRainbow) delays.push((i * -0.15).toFixed(2) + 's');
if (isJolt) {
let variant;
do { variant = Math.floor(Math.random() * 3) + 1; } while (variant === lastVariant);
lastVariant = variant;
classes.push(`jolt-v${variant}`);
delays.push((Math.random() * -0.35).toFixed(2) + 's');
}
const content = (c === ' ') ? ' ' : c;
const delayStyle = delays.length > 0 ? `style="animation-delay: ${delays.join(', ')} !important;"` : '';
const classAttr = classes.length > 0 ? `class="${classes.join(' ')}"` : '';
return `<span ${classAttr} ${delayStyle}>${content}</span>`;
}).join('');
el.innerHTML = newHTML;
el.setAttribute('data-animated', 'true');
}
mw.hook('wikipage.content').add(function($content) {
$content.find('.text-animation-container').each(function() {
applyEffects(this);
});
});
})();