MediaWiki:Common.js: различия между версиями
Внешний вид
Glamyr (обсуждение | вклад) Отмена версии 8859, сделанной Glamyr (обсуждение) |
Glamyr (обсуждение | вклад) Отмена версии 8858, сделанной Glamyr (обсуждение) Метка: отмена |
||
| Строка 12: | Строка 12: | ||
function applyTheme(themeId) { | function applyTheme(themeId) { | ||
Object.keys(themes).forEach(id => document.body.classList.remove(id)); | |||
if ( | document.body.classList.remove('theme-active-dark'); | ||
if (themeId && themes[themeId]) { | |||
document.body.classList.add(themeId); | |||
if (themeId !== 'theme-default') { | |||
document.body.classList.add('theme-active-dark'); | |||
} | |||
localStorage.setItem('mw-tg-theme', themeId); | localStorage.setItem('mw-tg-theme', themeId); | ||
const logoImg = document.querySelector('.mw-wiki-logo, .vector-header-container .mw-logo-img, .vector-logo-img'); | |||
if (logoImg) { | |||
if (logoImg.tagName === 'IMG') { | |||
logoImg.src = themes[themeId].logo; | |||
} else { | |||
logoImg.style.backgroundImage = `url(${themes[themeId].logo})`; | |||
} | |||
} | } | ||
} | } | ||
} | } | ||
| Строка 83: | Строка 35: | ||
function injectSelector() { | function injectSelector() { | ||
if (document.getElementById('p-tg-theme')) return; | if (document.getElementById('p-tg-theme')) return; | ||
const activeTheme = localStorage.getItem('mw-tg-theme') || 'theme-stddark'; | const activeTheme = localStorage.getItem('mw-tg-theme') || 'theme-stddark'; | ||
applyTheme(activeTheme); | applyTheme(activeTheme); | ||
let selectHtml = '<div id="p-tg-theme" style="margin:0 10px; display:inline-block; vertical-align:middle; position:relative; width:36px; height:36px | let selectHtml = '<div id="p-tg-theme" style="margin: 0 10px; display: inline-block !important; vertical-align: middle !important; position: relative; width: 36px !important; height: 36px !important;">'; | ||
selectHtml += '<input type="checkbox" id="p-tg-theme-dropdown-checkbox" role="button" aria-haspopup="true" class="vector-dropdown-checkbox" style="display:none !important;">'; | selectHtml += '<input type="checkbox" id="p-tg-theme-dropdown-checkbox" role="button" aria-haspopup="true" class="vector-dropdown-checkbox" style="display: none !important;">'; | ||
selectHtml += '<label id="p-tg-theme-dropdown-label" for="p-tg-theme-dropdown-checkbox" aria-label="Смена темы" title="Выбрать тему фракции" style="display:flex; width:36px; height:36px; align-items:center; justify-content:center; cursor:pointer; padding:0; margin:0; border:none; background:transparent | selectHtml += '<label id="p-tg-theme-dropdown-label" for="p-tg-theme-dropdown-checkbox" aria-label="Смена темы" title="Выбрать тему фракции" style="display: flex !important; width: 36px !important; height: 36px !important; align-items: center; justify-content: center; cursor: pointer; padding: 0 !important; margin: 0 !important; border: none !important; background: transparent !important;">'; | ||
selectHtml += '<span class="tg-custom-palette-icon"></span>'; | selectHtml += '<span class="tg-custom-palette-icon" style="display: block !important; width: 32px !important; height: 32px !important;"></span>'; | ||
selectHtml += '</label>'; | selectHtml += '</label>'; | ||
selectHtml += '<div class="vector-dropdown-content" style="padding:8px; min-width:180px; display:none; position:absolute; top:110%; right:0; z-index:1000;">'; | selectHtml += '<div class="vector-dropdown-content" style="padding: 8px; min-width: 180px; display: none; position: absolute; top: 110%; right: 0; z-index: 1000;">'; | ||
selectHtml += '<ul class="vector-menu-content-list" style="margin:0; padding:0; list-style:none;">'; | selectHtml += '<ul class="vector-menu-content-list" style="margin: 0; padding: 0; list-style: none;">'; | ||
Object.keys(themes).forEach(id => { | Object.keys(themes).forEach(id => { | ||
selectHtml += `<li style="margin:4px 0;"><a href="#" class="tg-theme-item" data-theme="${id}" style="display:block; padding:6px 8px; border-radius:4px; text-decoration:none;">${themes[id].name}</a></li>`; | const isSelected = id === activeTheme ? 'font-weight: bold; color: var(--accent) !important;' : ''; | ||
selectHtml += `<li style="margin: 4px 0;"><a href="#" class="tg-theme-item" data-theme="${id}" style="display: block; padding: 6px 8px; border-radius: 4px; text-decoration: none; ${isSelected}">${themes[id].name}</a></li>`; | |||
}); | }); | ||
selectHtml += '</ul></div></div>'; | selectHtml += '</ul></div></div>'; | ||
const targets = [document.querySelector('.vector-user-links-main'), document.getElementById('p-personal-more'), document.getElementById('p-userlinks'), document.querySelector('.vector-user-links'), document.querySelector('.vector-header-end')]; | const targets = [ | ||
for (let target of targets) { if (target) { $(target).before(selectHtml); break; } } | document.querySelector('.vector-user-links-main'), | ||
document.getElementById('p-personal-more'), | |||
document.getElementById('p-userlinks'), | |||
document.querySelector('.vector-user-links'), | |||
document.querySelector('.vector-header-end') | |||
]; | |||
for (let target of targets) { | |||
if (target) { | |||
$(target).before(selectHtml); | |||
break; | |||
} | |||
} | |||
} | } | ||
const checkExist = setInterval(function() { | const checkExist = setInterval(function() { | ||
const userLinks = document.querySelector('.vector-user-links, .vector-header-end'); | |||
if (userLinks) { | |||
injectSelector(); | |||
clearInterval(checkExist); | |||
} | |||
}, 100); | }, 100); | ||
}); | |||
$(document).on('change', '#p-tg-theme-dropdown-checkbox', function() { | |||
const content = $(this).siblings('.vector-dropdown-content'); | |||
if (this.checked) { | |||
content.css('display', 'block'); | |||
} else { | |||
content.css('display', 'none'); | |||
} | |||
}); | |||
$(document).on('click', '.tg-theme-item', function (e) { | |||
e.preventDefault(); | |||
}); | const chosenTheme = $(this).data('theme'); | ||
const classes = ['theme-stddark', 'theme-nanotrasen', 'theme-syndicate', 'theme-plasmafire', 'theme-clockcult', 'theme-bloodcult', 'theme-heretic', 'theme-default']; | |||
classes.forEach(id => document.body.classList.remove(id)); | |||
document.body.classList.remove('theme-active-dark'); | |||
document.body.classList.add(chosenTheme); | |||
if (chosenTheme !== 'theme-default') { | |||
document.body.classList.add('theme-active-dark'); | |||
} | |||
localStorage.setItem('mw-tg-theme', chosenTheme); | |||
const logos = { | |||
'theme-nanotrasen': '/images/5/58/Nanotrasen-logo.png', | |||
'theme-syndicate': '/images/c/ce/Syndicate-logo.png', | |||
}; | |||
const logoImg = document.querySelector('.mw-wiki-logo, .vector-header-container .mw-logo-img, .vector-logo-img'); | |||
if (logoImg) { | |||
if (logoImg.tagName === 'IMG') { logoImg.src = logos[chosenTheme]; } | |||
else { logoImg.style.backgroundImage = `url(${logos[chosenTheme]})`; } | |||
} | |||
$( | $('.tg-theme-item').css({'font-weight': 'normal', 'color': ''}); | ||
$(this).css({'font-weight': 'bold', 'color': 'var(--accent)'}); | |||
$('#p-tg-theme-dropdown-checkbox').prop('checked', false).trigger('change'); | |||
}); | |||
Версия от 15:47, 13 июня 2026
mw.hook('wikipage.content').add(function () {
const themes = {
'theme-nanotrasen': { name: 'Nanotrasen TGUI', logo: '/images/5/58/Nanotrasen-logo.png' },
'theme-syndicate': { name: 'Syndicate TGUI', logo: mw.util.getUrl('Special:Redirect/file/Syndicate-logo.png') },
'theme-plasmafire': { name: 'Plasmafire' },
'theme-clockcult': { name: 'Clock Cult' },
'theme-bloodcult': { name: 'Blood Cult' },
'theme-heretic': { name: 'Heretic' },
'theme-stddark': { name: 'Standard Dark' },
'theme-default': { name: 'Standard Light' }
};
function applyTheme(themeId) {
Object.keys(themes).forEach(id => document.body.classList.remove(id));
document.body.classList.remove('theme-active-dark');
if (themeId && themes[themeId]) {
document.body.classList.add(themeId);
if (themeId !== 'theme-default') {
document.body.classList.add('theme-active-dark');
}
localStorage.setItem('mw-tg-theme', themeId);
const logoImg = document.querySelector('.mw-wiki-logo, .vector-header-container .mw-logo-img, .vector-logo-img');
if (logoImg) {
if (logoImg.tagName === 'IMG') {
logoImg.src = themes[themeId].logo;
} else {
logoImg.style.backgroundImage = `url(${themes[themeId].logo})`;
}
}
}
}
function injectSelector() {
if (document.getElementById('p-tg-theme')) return;
const activeTheme = localStorage.getItem('mw-tg-theme') || 'theme-stddark';
applyTheme(activeTheme);
let selectHtml = '<div id="p-tg-theme" style="margin: 0 10px; display: inline-block !important; vertical-align: middle !important; position: relative; width: 36px !important; height: 36px !important;">';
selectHtml += '<input type="checkbox" id="p-tg-theme-dropdown-checkbox" role="button" aria-haspopup="true" class="vector-dropdown-checkbox" style="display: none !important;">';
selectHtml += '<label id="p-tg-theme-dropdown-label" for="p-tg-theme-dropdown-checkbox" aria-label="Смена темы" title="Выбрать тему фракции" style="display: flex !important; width: 36px !important; height: 36px !important; align-items: center; justify-content: center; cursor: pointer; padding: 0 !important; margin: 0 !important; border: none !important; background: transparent !important;">';
selectHtml += '<span class="tg-custom-palette-icon" style="display: block !important; width: 32px !important; height: 32px !important;"></span>';
selectHtml += '</label>';
selectHtml += '<div class="vector-dropdown-content" style="padding: 8px; min-width: 180px; display: none; position: absolute; top: 110%; right: 0; z-index: 1000;">';
selectHtml += '<ul class="vector-menu-content-list" style="margin: 0; padding: 0; list-style: none;">';
Object.keys(themes).forEach(id => {
const isSelected = id === activeTheme ? 'font-weight: bold; color: var(--accent) !important;' : '';
selectHtml += `<li style="margin: 4px 0;"><a href="#" class="tg-theme-item" data-theme="${id}" style="display: block; padding: 6px 8px; border-radius: 4px; text-decoration: none; ${isSelected}">${themes[id].name}</a></li>`;
});
selectHtml += '</ul></div></div>';
const targets = [
document.querySelector('.vector-user-links-main'),
document.getElementById('p-personal-more'),
document.getElementById('p-userlinks'),
document.querySelector('.vector-user-links'),
document.querySelector('.vector-header-end')
];
for (let target of targets) {
if (target) {
$(target).before(selectHtml);
break;
}
}
}
const checkExist = setInterval(function() {
const userLinks = document.querySelector('.vector-user-links, .vector-header-end');
if (userLinks) {
injectSelector();
clearInterval(checkExist);
}
}, 100);
});
$(document).on('change', '#p-tg-theme-dropdown-checkbox', function() {
const content = $(this).siblings('.vector-dropdown-content');
if (this.checked) {
content.css('display', 'block');
} else {
content.css('display', 'none');
}
});
$(document).on('click', '.tg-theme-item', function (e) {
e.preventDefault();
const chosenTheme = $(this).data('theme');
const classes = ['theme-stddark', 'theme-nanotrasen', 'theme-syndicate', 'theme-plasmafire', 'theme-clockcult', 'theme-bloodcult', 'theme-heretic', 'theme-default'];
classes.forEach(id => document.body.classList.remove(id));
document.body.classList.remove('theme-active-dark');
document.body.classList.add(chosenTheme);
if (chosenTheme !== 'theme-default') {
document.body.classList.add('theme-active-dark');
}
localStorage.setItem('mw-tg-theme', chosenTheme);
const logos = {
'theme-nanotrasen': '/images/5/58/Nanotrasen-logo.png',
'theme-syndicate': '/images/c/ce/Syndicate-logo.png',
};
const logoImg = document.querySelector('.mw-wiki-logo, .vector-header-container .mw-logo-img, .vector-logo-img');
if (logoImg) {
if (logoImg.tagName === 'IMG') { logoImg.src = logos[chosenTheme]; }
else { logoImg.style.backgroundImage = `url(${logos[chosenTheme]})`; }
}
$('.tg-theme-item').css({'font-weight': 'normal', 'color': ''});
$(this).css({'font-weight': 'bold', 'color': 'var(--accent)'});
$('#p-tg-theme-dropdown-checkbox').prop('checked', false).trigger('change');
});