// ==UserScript==
// @name BlackRussia редактор стиля форума
// @namespace http://tampermonkey.net/
// @version 4.3
// @description Наводит красоту на форуме
// @author Haytham_Kenway by Vladimir., Pavel_Bewerly
// @match https://forum.blackrussia.online/*
// @grant GM_addStyle
// @grant GM_getValue
// @grant GM_setValue
// @run-at document-end
// @icon https://forum.blackrussia.online/favicon.ico
// ==/UserScript==
(function() {
'use strict';
const fontOptions = [
{name: "Стандартный", value: "inherit"},
{name: "Arial", value: "Arial, sans-serif"},
{name: "Roboto", value: "'Roboto', sans-serif"},
{name: "Open Sans", value: "'Open Sans', sans-serif"},
{name: "Montserrat", value: "'Montserrat', sans-serif"},
{name: "Courier New", value: "'Courier New', monospace"}
];
const defaultSettings = {
background: '',
backgroundUrl: '',
transparency: 0.08,
blurRadius: 6,
useDarkMode: true,
selectedFont: "'Montserrat', sans-serif",
textColor: '#ffffff',
headerTransparency: 0.00,
menuTransparency: 0.28,
messageTransparency: 0.06,
messageContentTransparency: 0.03,
memberHeaderTransparency: 0.50,
placeholderTransparency: 0.50,
customTitle: '',
bgColor: '#0a0a0a'
};
const currentSettings = {
background: GM_getValue('background', defaultSettings.background),
backgroundUrl: GM_getValue('backgroundUrl', defaultSettings.backgroundUrl),
transparency: GM_getValue('transparency', defaultSettings.transparency),
blurRadius: GM_getValue('blurRadius', defaultSettings.blurRadius),
useDarkMode: GM_getValue('useDarkMode', defaultSettings.useDarkMode),
selectedFont: GM_getValue('selectedFont', defaultSettings.selectedFont),
textColor: GM_getValue('textColor', defaultSettings.textColor),
headerTransparency: GM_getValue('headerTransparency', defaultSettings.headerTransparency),
menuTransparency: GM_getValue('menuTransparency', defaultSettings.menuTransparency),
messageTransparency: GM_getValue('messageTransparency', defaultSettings.messageTransparency),
messageContentTransparency: GM_getValue('messageContentTransparency', defaultSettings.messageContentTransparency),
memberHeaderTransparency: GM_getValue('memberHeaderTransparency', defaultSettings.memberHeaderTransparency),
placeholderTransparency: GM_getValue('placeholderTransparency', defaultSettings.placeholderTransparency),
customTitle: GM_getValue('customTitle', defaultSettings.customTitle),
bgColor: GM_getValue('bgColor', defaultSettings.bgColor)
};
let currentPage = 'main';
function createToggleButton() {
const toggleBtn = document.createElement('button');
toggleBtn.id = 'br-toggle-btn';
toggleBtn.title = 'Настройки оформления BlackRussia';
toggleBtn.style.cssText = `
position: fixed;
bottom: 20px;
right: 20px;
z-index: 99999;
background: #d10000;
color: white;
border: none;
width: 50px;
height: 50px;
border-radius: 50%;
cursor: pointer;
font-size: 20px;
display: flex;
align-items: center;
justify-content: center;
box-shadow: 0 0 10px rgba(209, 0, 0, 0.7);
background-image: url('https://forum.blackrussia.online/favicon.ico');
background-size: 60%;
background-position: center;
background-repeat: no-repeat;
`;
toggleBtn.innerHTML = '';
document.body.appendChild(toggleBtn);
}
function createControlPanel() {
const panel = document.createElement('div');
panel.id = 'br-control-panel';
panel.style.cssText = `
display: none;
position: fixed;
top: 50%;
right: 20px;
transform: translateY(-50%);
background: rgba(10, 10, 10, 0.95);
padding: 20px;
border-radius: 8px;
z-index: 99998;
width: 350px;
max-height: 90vh;
overflow-y: auto;
border: 1px solid #d10000;
box-shadow: 0 0 15px rgba(209, 0, 0, 0.5);
color: #e0e0e0;
`;
// Основная страница
const mainPageHTML = `
<div style="margin-bottom: 20px; border-bottom: 1px solid #d10000; padding-bottom: 10px; display: flex; justify-content: space-between; align-items: center;">
<h3 style="margin:0; font-weight: bold; color: #d10000;">ОСНОВНЫЕ НАСТРОЙКИ</h3>
<div>
<button class="br-page-btn" data-page="fonts" style="margin-right: 10px;">Шрифты</button>
<button class="br-page-btn" data-page="transparency">Прозрачность</button>
<button class="br-page-btn" data-page="about">О скрипте</button>
</div>
</div>
<div style="margin-bottom: 20px;">
<label style="display: block; margin-bottom: 8px;">Заголовок форума:</label>
<input type="text" id="br-custom-title" value="${currentSettings.customTitle}" placeholder="Введите свой заголовок" style="width: 100%; padding: 8px; margin-bottom: 10px; background: #1a1a1a; border: 1px solid #333; color: #e0e0e0;">
</div>
<div style="margin-bottom: 20px;">
<label style="display: block; margin-bottom: 8px;">Фон:</label>
<div style="display: flex; gap: 10px; margin-bottom: 10px;">
<input type="file" id="br-bg-image" accept="image/*" style="flex-grow: 1; background: #1a1a1a; border: 1px solid #333; color: #e0e0e0;">
<button id="br-reset-bg" style="padding: 0 15px; cursor: pointer; background: #d10000; color: white; border: none; border-radius: 4px;">Сброс</button>
</div>
<div style="display: flex; gap: 10px; margin-bottom: 10px;">
<input type="text" id="br-bg-url" placeholder="Ссылка на фон" value="${currentSettings.backgroundUrl}" style="flex-grow: 1; padding: 8px; background: #1a1a1a; border: 1px solid #333; color: #e0e0e0;">
<button id="br-apply-bg-url" style="padding: 0 15px; cursor: pointer; background: #d10000; color: white; border: none; border-radius: 4px;">Применить</button>
</div>
<div style="margin-bottom: 10px;">
<label style="display: block; margin-bottom: 8px;">Цвет фона:</label>
<input type="color" id="br-bg-color" value="${currentSettings.bgColor}" style="width: 100%; height: 40px;">
</div>
<div id="br-bg-preview" style="height: 100px; border-radius: 4px; background: ${currentSettings.background || currentSettings.backgroundUrl ? `url(${currentSettings.backgroundUrl})` : currentSettings.bgColor}; background-size: cover; border: 1px solid #333;"></div>
</div>
<div style="margin-bottom: 20px;">
<label style="display: block; margin-bottom: 8px;">
Размытие: <span id="blur-value">${currentSettings.blurRadius}px</span>
</label>
<input type="range" id="br-blur" min="0" max="15" step="1" value="${currentSettings.blurRadius}" style="width: 100%; accent-color: #d10000;">
</div>
<div style="margin-bottom: 20px;">
<label style="display: flex; align-items: center; cursor: pointer;">
<input type="checkbox" id="br-dark-mode" ${currentSettings.useDarkMode ? 'checked' : ''} style="margin-right: 10px; accent-color: #d10000;">
Темная тема
</label>
</div>
`;
// Страница шрифтов
const fontOptionsHTML = fontOptions.map(font =>
`<option value="${font.value}" ${currentSettings.selectedFont === font.value ? 'selected' : ''}>${font.name}</option>`
).join('');
const fontsPageHTML = `
<div style="margin-bottom: 20px; border-bottom: 1px solid #d10000; padding-bottom: 10px; display: flex; justify-content: space-between; align-items: center;">
<h3 style="margin:0; font-weight: bold; color: #d10000;">НАСТРОЙКИ ШРИФТОВ</h3>
<div>
<button class="br-page-btn" data-page="main" style="margin-right: 10px;">Основные</button>
<button class="br-page-btn" data-page="transparency">Прозрачность</button>
<button class="br-page-btn" data-page="about">О скрипте</button>
</div>
</div>
<div style="margin-bottom: 20px;">
<label style="display: block; margin-bottom: 8px;">Выберите шрифт:</label>
<select id="br-font-select" style="width: 100%; padding: 8px; background: #1a1a1a; border: 1px solid #333; color: #e0e0e0;">
${fontOptionsHTML}
</select>
</div>
<div style="margin-bottom: 20px;">
<label style="display: block; margin-bottom: 8px;">Цвет текста:</label>
<input type="color" id="br-text-color" value="${currentSettings.textColor}" style="width: 100%; height: 40px;">
</div>
<div style="padding: 15px; background: rgba(209, 0, 0, 0.05); border-radius: 4px; border-left: 3px solid #d10000;">
<p style="margin-top: 0;">Пример текста выбранным шрифтом:</p>
<p id="font-preview" style="font-size: 16px; margin-bottom: 0;">Этот текст отображается выбранным шрифтом</p>
</div>
`;
// Страница прозрачности
const transparencyPageHTML = `
<div style="margin-bottom: 20px; border-bottom: 1px solid #d10000; padding-bottom: 10px; display: flex; justify-content: space-between; align-items: center;">
<h3 style="margin:0; font-weight: bold; color: #d10000;">НАСТРОЙКИ ПРОЗРАЧНОСТИ</h3>
<div>
<button class="br-page-btn" data-page="main" style="margin-right: 10px;">Основные</button>
<button class="br-page-btn" data-page="fonts">Шрифты</button>
<button class="br-page-btn" data-page="about">О скрипте</button>
</div>
</div>
<div style="margin-bottom: 20px;">
<label style="display: block; margin-bottom: 8px;">
Общая прозрачность: <span id="transparency-value">${Math.round(currentSettings.transparency * 100)}%</span>
</label>
<input type="range" id="br-transparency" min="0" max="100" step="1" value="${Math.round(currentSettings.transparency * 100)}" style="width: 100%; accent-color: #d10000;">
</div>
<div style="margin-bottom: 20px;">
<label style="display: block; margin-bottom: 8px;">
Прозрачность заголовков: <span id="header-transparency-value">${Math.round(currentSettings.headerTransparency * 100)}%</span>
</label>
<input type="range" id="br-header-transparency" min="0" max="100" step="1" value="${Math.round(currentSettings.headerTransparency * 100)}" style="width: 100%; accent-color: #d10000;">
</div>
<div style="margin-bottom: 20px;">
<label style="display: block; margin-bottom: 8px;">
Прозрачность меню: <span id="menu-transparency-value">${Math.round(currentSettings.menuTransparency * 100)}%</span>
</label>
<input type="range" id="br-menu-transparency" min="0" max="100" step="1" value="${Math.round(currentSettings.menuTransparency * 100)}" style="width: 100%; accent-color: #d10000;">
</div>
<div style="margin-bottom: 20px;">
<label style="display: block; margin-bottom: 8px;">
Прозрачность сообщений: <span id="message-transparency-value">${Math.round(currentSettings.messageTransparency * 100)}%</span>
</label>
<input type="range" id="br-message-transparency" min="0" max="100" step="1" value="${Math.round(currentSettings.messageTransparency * 100)}" style="width: 100%; accent-color: #d10000;">
</div>
<div style="margin-bottom: 20px;">
<label style="display: block; margin-bottom: 8px;">
Прозрачность содержимого сообщений: <span id="message-content-transparency-value">${Math.round(currentSettings.messageContentTransparency * 100)}%</span>
</label>
<input type="range" id="br-message-content-transparency" min="0" max="100" step="1" value="${Math.round(currentSettings.messageContentTransparency * 100)}" style="width: 100%; accent-color: #d10000;">
</div>
<div style="margin-bottom: 20px;">
<label style="display: block; margin-bottom: 8px;">
Прозрачность профиля пользователя: <span id="member-header-transparency-value">${Math.round(currentSettings.memberHeaderTransparency * 100)}%</span>
</label>
<input type="range" id="br-member-header-transparency" min="0" max="100" step="1" value="${Math.round(currentSettings.memberHeaderTransparency * 100)}" style="width: 100%; accent-color: #d10000;">
<div class="br-control-description" style="font-size: 11px; color: rgba(255,255,255,0.6); margin-top: 3px;">
Регулирует прозрачность профиля пользователя (memberHeader)
</div>
</div>
<div style="margin-bottom: 20px;">
<label style="display: block; margin-bottom: 8px;">
Прозрачность плейсхолдера: <span id="placeholder-transparency-value">${Math.round(currentSettings.placeholderTransparency * 100)}%</span>
</label>
<input type="range" id="br-placeholder-transparency" min="0" max="100" step="1" value="${Math.round(currentSettings.placeholderTransparency * 100)}" style="width: 100%; accent-color: #d10000;">
<div class="br-control-description" style="font-size: 11px; color: rgba(255,255,255,0.6); margin-top: 3px;">
Регулирует прозрачность плейсхолдера редактора
</div>
</div>
<div style="padding: 15px; background: rgba(209, 0, 0, 0.05); border-radius: 4px; border-left: 3px solid #d10000;">
<p style="margin: 0; font-size: 13px;">Настройте прозрачность разных элементов интерфейса отдельно для более точного контроля внешнего вида.</p>
</div>
`;
// Страница о скрипте
const aboutPageHTML = `
<div style="margin-bottom: 20px; border-bottom: 1px solid #d10000; padding-bottom: 10px; display: flex; justify-content: space-between; align-items: center;">
<h3 style="margin:0; font-weight: bold; color: #d10000;">О СКРИПТЕ</h3>
<div>
<button class="br-page-btn" data-page="main" style="margin-right: 10px;">Основные</button>
<button class="br-page-btn" data-page="fonts">Шрифты</button>
<button class="br-page-btn" data-page="transparency">Прозрачность</button>
</div>
</div>
<div id="br-author-tab" style="padding: 15px; margin-bottom: 15px; border-left: 3px solid #d10000;">
<div style="display: flex; align-items: center; gap: 10px; margin-bottom: 10px;">
<div style="width: 40px; height: 40px; background: #d10000; border-radius: 50%; display: flex; align-items: center; justify-content: center; color: white; font-weight: bold;">HK</div>
<div>
<div style="font-weight: bold;">Haytham_Kenway</div>
<div style="font-size: 12px; opacity: 0.7;">Автор скрипта</div>
</div>
</div>
<div style="font-size: 13px; line-height: 1.5;">
Связь ВК: <a href="https://vk.com/rokkf29" target="_blank" style="text-decoration: none; color: #d10000;">vk.com/rokkf29</a>
</div>
</div>
<div id="br-author-tab" style="padding: 15px; margin-bottom: 15px; border-left: 3px solid #d10000;">
<div style="display: flex; align-items: center; gap: 10px; margin-bottom: 10px;">
<div style="width: 40px; height: 40px; background: #d10000; border-radius: 50%; display: flex; align-items: center; justify-content: center; color: white; font-weight: bold;">PB</div>
<div>
<div style="font-weight: bold;">Pavel_Bewerly</div>
<div style="font-size: 12px; opacity: 0.7;">Разработчик</div>
</div>
</div>
<div style="font-size: 13px; line-height: 1.5;">
Связь ВК: <a href="https://vk.com/pavelbewerly" target="_blank" style="text-decoration: none; color: #d10000;">vk.com/pavelbewerly</a>
</div>
</div>
<div style="padding: 15px; background: rgba(209, 0, 0, 0.05); border-radius: 4px; border-left: 3px solid #d10000;">
<h4 style="margin-top: 0; color: #d10000;">Возможности скрипта:</h4>
<ul style="padding-left: 20px; margin-bottom: 0;">
<li>Настройка фона (цвет/изображение/ссылка)</li>
<li>Изменение заголовка форума</li>
<li>Регулировка прозрачности элементов</li>
<li>Индивидуальная прозрачность для разных частей</li>
<li>Настройка размытия</li>
<li>Выбор шрифта и цвета текста</li>
<li>Темная/светлая тема</li>
<li>Полная прозрачность сообщений</li>
<li>Отдельные настройки прозрачности профилей и плейсхолдеров</li>
</ul>
</div>
`;
panel.innerHTML = `
<div id="br-main-page">${mainPageHTML}</div>
<div id="br-fonts-page" style="display: none;">${fontsPageHTML}</div>
<div id="br-transparency-page" style="display: none;">${transparencyPageHTML}</div>
<div id="br-about-page" style="display: none;">${aboutPageHTML}</div>
`;
document.body.appendChild(panel);
addEventListeners();
}
function updateStyles() {
if (currentSettings.customTitle) {
const titleElement = document.querySelector('.p-title-value');
if (titleElement) {
titleElement.textContent = currentSettings.customTitle;
}
}
const bgColor = currentSettings.useDarkMode ? currentSettings.bgColor : '#f5f5f5';
const textColor = currentSettings.textColor;
const borderColor = currentSettings.useDarkMode ? 'rgba(255,255,255,0.1)' : 'rgba(0,0,0,0.1)';
const linkColor = currentSettings.useDarkMode ? '#ffffff' : '#0066cc';
const mainOpacity = currentSettings.transparency;
const menuOpacity = currentSettings.menuTransparency;
const postOpacity = currentSettings.messageTransparency;
const headerOpacity = currentSettings.headerTransparency;
const messageContentOpacity = currentSettings.messageContentTransparency;
const memberHeaderOpacity = currentSettings.memberHeaderTransparency;
const placeholderOpacity = currentSettings.placeholderTransparency;
const mainBgColor = currentSettings.useDarkMode
? `rgba(20, 20, 20, ${mainOpacity})`
: `rgba(240, 240, 240, ${mainOpacity})`;
const menuBgColor = currentSettings.useDarkMode
? `rgba(10, 10, 10, ${menuOpacity})`
: `rgba(230, 230, 230, ${menuOpacity})`;
const postBgColor = currentSettings.useDarkMode
? `rgba(30, 30, 30, ${postOpacity})`
: `rgba(250, 250, 250, ${postOpacity})`;
const headerBgColor = currentSettings.useDarkMode
? `rgba(20, 20, 20, ${headerOpacity})`
: `rgba(230, 230, 230, ${headerOpacity})`;
const messageContentBgColor = currentSettings.useDarkMode
? `rgba(40, 40, 40, ${messageContentOpacity})`
: `rgba(255, 255, 255, ${messageContentOpacity})`;
const styles = `
body {
background: ${currentSettings.background || (currentSettings.backgroundUrl ? `url(${currentSettings.backgroundUrl})` : bgColor)} !important;
background-size: cover !important;
background-attachment: fixed !important;
background-repeat: no-repeat !important;
font-family: ${currentSettings.selectedFont} !important;
color: ${textColor} !important;
}
.p-body-main, .p-body-sidebar,
.p-footer, .block, .block-container,
.structItem, .structItem-container,
.widget-definition, .fr-box,
.alert, .overlay-container, .tooltip-content,
.memberHeader, .memberCard {
background: ${mainBgColor} !important;
backdrop-filter: blur(${currentSettings.blurRadius}px) !important;
border-radius: 4px !important;
margin: 8px 0 !important;
border: 1px solid ${borderColor} !important;
}
.p-body-header, .p-nav {
background: ${headerBgColor} !important;
backdrop-filter: blur(${currentSettings.blurRadius}px) !important;
border-radius: 4px !important;
margin: 8px 0 !important;
border: 1px solid ${borderColor} !important;
}
.menu, .menu-content, .subNodeMenu,
.p-sectionLinks, .menu-outer {
background: ${menuBgColor} !important;
backdrop-filter: blur(${currentSettings.blurRadius}px) !important;
}
.message, .message-cell, .message-user,
.message-inner, .message-main {
background: ${postBgColor} !important;
backdrop-filter: blur(${currentSettings.blurRadius}px) !important;
}
.message-content, .message-body, .bbWrapper,
.bbCodeBlock, .bbCodeQuote, .fr-wrapper,
.quickReply, .formControls, .buttonGroup,
.thThreads__message-userExtras, .node-body,
.node--forum, .p-body-pageContent, .node-stats,
.node-extra, .message-avatar, .message-userDetails,
.message-signature, .message-footer {
background: ${messageContentBgColor} !important;
}
.memberHeader-content.memberHeader-content--info {
opacity: ${memberHeaderOpacity} !important;
}
.editorPlaceholder-placeholder {
opacity: ${placeholderOpacity} !important;
}
a {
color: ${linkColor} !important;
text-decoration: none !important;
}
a:hover {
text-decoration: underline !important;
}
.title, .block-title, .block-minorHeader,
.block-tabHeader, .node-title {
color: ${textColor} !important;
}
.username {
animation: none !important;
text-shadow: none !important;
}
.br-page-btn {
background: transparent;
border: none;
color: inherit;
cursor: pointer;
padding: 5px 10px;
border-radius: 4px;
font-size: 12px;
}
.br-page-btn:hover {
background: rgba(209, 0, 0, 0.2);
}
#br-control-panel {
background: rgba(10, 10, 10, 0.95) !important;
border: 1px solid #d10000 !important;
box-shadow: 0 0 15px rgba(209, 0, 0, 0.5) !important;
color: #e0e0e0 !important;
}
#br-control-panel h3 {
color: #d10000 !important;
}
#br-control-panel input[type="text"],
#br-control-panel input[type="file"],
#br-control-panel select {
background: #1a1a1a !important;
border: 1px solid #333 !important;
color: #e0e0e0 !important;
}
#br-control-panel input[type="range"] {
accent-color: #d10000 !important;
}
#br-toggle-btn {
background: #d10000 !important;
box-shadow: 0 0 10px rgba(209, 0, 0, 0.7) !important;
}
`;
GM_addStyle(styles);
const bgPreview = document.getElementById('br-bg-preview');
if (bgPreview) {
bgPreview.style.background = currentSettings.background || (currentSettings.backgroundUrl ? `url(${currentSettings.backgroundUrl})` : currentSettings.bgColor);
bgPreview.style.backgroundSize = 'cover';
}
const fontPreview = document.getElementById('font-preview');
if (fontPreview) {
fontPreview.style.fontFamily = currentSettings.selectedFont;
fontPreview.style.color = currentSettings.textColor;
}
}
function switchPage(page) {
currentPage = page;
document.getElementById('br-main-page').style.display = 'none';
document.getElementById('br-fonts-page').style.display = 'none';
document.getElementById('br-transparency-page').style.display = 'none';
document.getElementById('br-about-page').style.display = 'none';
document.getElementById(`br-${page}-page`).style.display = 'block';
}
function addEventListeners() {
document.getElementById('br-toggle-btn')?.addEventListener('click', () => {
const panel = document.getElementById('br-control-panel');
panel.style.display = panel.style.display === 'none' ? 'block' : 'none';
});
document.querySelectorAll('.br-page-btn').forEach(btn => {
btn.addEventListener('click', (e) => {
switchPage(e.target.dataset.page);
});
});
document.getElementById('br-custom-title')?.addEventListener('change', (e) => {
currentSettings.customTitle = e.target.value;
GM_setValue('customTitle', currentSettings.customTitle);
updateStyles();
});
document.getElementById('br-transparency')?.addEventListener('input', (e) => {
currentSettings.transparency = e.target.value / 100;
GM_setValue('transparency', currentSettings.transparency);
document.getElementById('transparency-value').textContent = `${e.target.value}%`;
updateStyles();
});
document.getElementById('br-header-transparency')?.addEventListener('input', (e) => {
currentSettings.headerTransparency = e.target.value / 100;
GM_setValue('headerTransparency', currentSettings.headerTransparency);
document.getElementById('header-transparency-value').textContent = `${e.target.value}%`;
updateStyles();
});
document.getElementById('br-menu-transparency')?.addEventListener('input', (e) => {
currentSettings.menuTransparency = e.target.value / 100;
GM_setValue('menuTransparency', currentSettings.menuTransparency);
document.getElementById('menu-transparency-value').textContent = `${e.target.value}%`;
updateStyles();
});
document.getElementById('br-message-transparency')?.addEventListener('input', (e) => {
currentSettings.messageTransparency = e.target.value / 100;
GM_setValue('messageTransparency', currentSettings.messageTransparency);
document.getElementById('message-transparency-value').textContent = `${e.target.value}%`;
updateStyles();
});
document.getElementById('br-message-content-transparency')?.addEventListener('input', (e) => {
currentSettings.messageContentTransparency = e.target.value / 100;
GM_setValue('messageContentTransparency', currentSettings.messageContentTransparency);
document.getElementById('message-content-transparency-value').textContent = `${e.target.value}%`;
updateStyles();
});
document.getElementById('br-member-header-transparency')?.addEventListener('input', (e) => {
currentSettings.memberHeaderTransparency = e.target.value / 100;
GM_setValue('memberHeaderTransparency', currentSettings.memberHeaderTransparency);
document.getElementById('member-header-transparency-value').textContent = `${e.target.value}%`;
updateStyles();
});
document.getElementById('br-placeholder-transparency')?.addEventListener('input', (e) => {
currentSettings.placeholderTransparency = e.target.value / 100;
GM_setValue('placeholderTransparency', currentSettings.placeholderTransparency);
document.getElementById('placeholder-transparency-value').textContent = `${e.target.value}%`;
updateStyles();
});
document.getElementById('br-text-color')?.addEventListener('input', (e) => {
currentSettings.textColor = e.target.value;
GM_setValue('textColor', currentSettings.textColor);
updateStyles();
});
document.getElementById('br-blur')?.addEventListener('input', (e) => {
currentSettings.blurRadius = e.target.value;
GM_setValue('blurRadius', currentSettings.blurRadius);
document.getElementById('blur-value').textContent = `${e.target.value}px`;
updateStyles();
});
document.getElementById('br-reset-bg')?.addEventListener('click', () => {
currentSettings.background = '';
currentSettings.backgroundUrl = '';
currentSettings.bgColor = defaultSettings.bgColor;
currentSettings.textColor = defaultSettings.textColor;
document.getElementById('br-bg-color').value = defaultSettings.bgColor;
document.getElementById('br-text-color').value = defaultSettings.textColor;
GM_setValue('background', '');
GM_setValue('backgroundUrl', '');
GM_setValue('bgColor', defaultSettings.bgColor);
GM_setValue('textColor', defaultSettings.textColor);
updateStyles();
});
document.getElementById('br-bg-image')?.addEventListener('change', (e) => {
const file = e.target.files[0];
const reader = new FileReader();
reader.onload = function(e) {
currentSettings.background = `url(${e.target.result})`;
currentSettings.backgroundUrl = '';
GM_setValue('background', currentSettings.background);
GM_setValue('backgroundUrl', '');
updateStyles();
};
file && reader.readAsDataURL(file);
});
document.getElementById('br-apply-bg-url')?.addEventListener('click', () => {
const url = document.getElementById('br-bg-url').value;
if (url) {
currentSettings.backgroundUrl = url;
currentSettings.background = '';
GM_setValue('backgroundUrl', currentSettings.backgroundUrl);
GM_setValue('background', '');
updateStyles();
}
});
document.getElementById('br-bg-color')?.addEventListener('input', (e) => {
currentSettings.bgColor = e.target.value;
GM_setValue('bgColor', currentSettings.bgColor);
updateStyles();
});
document.getElementById('br-dark-mode')?.addEventListener('change', (e) => {
currentSettings.useDarkMode = e.target.checked;
GM_setValue('useDarkMode', currentSettings.useDarkMode);
updateStyles();
});
document.getElementById('br-font-select')?.addEventListener('change', (e) => {
currentSettings.selectedFont = e.target.value;
GM_setValue('selectedFont', currentSettings.selectedFont);
updateStyles();
});
}
function loadFonts() {
const fontStyles = `
@import url('https://fonts.googleapis.com/css2?family=Roboto:wght@400;500&display=swap');
@import url('https://fonts.googleapis.com/css2?family=Open+Sans:wght@400;600&display=swap');
@import url('https://fonts.googleapis.com/css2?family=Montserrat:wght@400;500&display=swap');
`;
GM_addStyle(fontStyles);
}
window.addEventListener('load', () => {
loadFonts();
createToggleButton();
createControlPanel();
updateStyles();
new MutationObserver(updateStyles)
.observe(document.body, {subtree: true, childList: true});
});
})();