- // ==UserScript==
- // @name Custom Arka Plan Yöneticisi
- // @namespace http://Vebascans.net/
- // @version 2.1.1
- // @description Web siteleri için arka plan değiştirme [öncelikli manga-manhwa siteleri]
- // @author www.vebascans.net
- // @match https://*/*
- // @grant none
- // @icon https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhi0QDJZNeXWcaD9lXWMN2yenYt5XGrqfPavkCFpWLe01CpSEsMn7IGpbOLqxEfjx4QUUi4wgTw0Kc7vP7FrKjPKpcaaCu1N6QRJzlZvS_Wwr2r3kA4l0-E5wl7xObsZchd8YNSxySFZATPAr2bnrkANBUrmy8Rpdexe-mxG8N6QDojEj0onaNNXF_6g-s/w800/logo.png
- // ==/UserScript==
-
- (function() {
- 'use strict';
-
- // 1) SweetAlert2 kütüphanesini otomatik yükle:
- const script = document.createElement('script');
- script.src = 'https://cdn.jsdelivr.net/npm/sweetalert2@11';
- script.onload = main; // Kütüphane yüklendikten sonra main() fonksiyonunu çalıştır
- document.head.appendChild(script);
-
- // 2) Tüm kodu main() içine alıyoruz:
- function main() {
-
- /**************************************************************************
- * SweetAlert Tanımlaması
- **************************************************************************/
- const Toast = Swal.mixin({
- toast: true,
- position: "top",
- showConfirmButton: false,
- timer: 3000,
- timerProgressBar: true,
- didOpen: (toast) => {
- toast.onmouseenter = Swal.stopTimer;
- toast.onmouseleave = Swal.resumeTimer;
- }
- });
-
- /**************************************************************************
- * 0) Sabitler
- **************************************************************************/
- const ACTIVE_KEY = 'VebaScans.net_custom_wp_active'; // Son seçilen veri (URL/Color)
- const HISTORY_KEY = 'VebaScans.net_custom_wp_history'; // Tüm geçmiş
- const SETTINGS_KEY = 'vebascans.net_custom_wp_settings'; // Arka plan ayarları (repeat/cover vs.)
-
- /**************************************************************************
- * 1) Local Storage Yardımcı Fonksiyonları
- **************************************************************************/
- function getActiveData() {
- try {
- const str = localStorage.getItem(ACTIVE_KEY);
- return str ? JSON.parse(str) : null;
- } catch (e) {
- return null;
- }
- }
-
- function setActiveData(obj) {
- localStorage.setItem(ACTIVE_KEY, JSON.stringify(obj));
- applyActiveDataToBody(); // Aktif veri her değiştiğinde body'yi güncelle
- }
-
- function removeActiveData() {
- localStorage.removeItem(ACTIVE_KEY);
- applyActiveDataToBody();
- }
-
- function getHistoryData() {
- try {
- const str = localStorage.getItem(HISTORY_KEY);
- return str ? JSON.parse(str) : [];
- } catch (e) {
- return [];
- }
- }
-
- function addToHistory(obj) {
- const history = getHistoryData();
- history.push(obj);
- localStorage.setItem(HISTORY_KEY, JSON.stringify(history));
- }
-
- // -- Ayarlar (Tekrarlı / Tek sefer)
- function getSettings() {
- try {
- const str = localStorage.getItem(SETTINGS_KEY);
- return str ? JSON.parse(str) : {};
- } catch (e) {
- return {};
- }
- }
-
- function setSettings(newSettings) {
- localStorage.setItem(SETTINGS_KEY, JSON.stringify(newSettings));
- }
-
- /**************************************************************************
- * 2) BODY Arkaplanını Aktif Veriye (URL/Color) ve Ayarlara Göre Uygulama
- **************************************************************************/
- function applyActiveDataToBody() {
- const activeData = getActiveData();
- if (!activeData) {
- // Aktif bir şey yoksa istersen varsayılan temize çek
- document.body.style.backgroundImage = '';
- document.body.style.backgroundColor = '';
- return;
- }
-
- if (activeData.type === 'url') {
- // Body için arkaplan resmi
- document.body.style.backgroundImage = `url(${activeData.value})`;
- document.body.style.backgroundRepeat = 'no-repeat';
- document.body.style.backgroundSize = 'cover';
- document.body.style.backgroundColor = '';
-
- // .body-wrap için deneme
-
- try {
-
- const bodyWrap = document.querySelector('body.text-ui-light .body-wrap');
- bodyWrap.style.backgroundImage = `url(${activeData.value})`;
- bodyWrap.style.backgroundRepeat = 'no-repeat';
- bodyWrap.style.backgroundSize = 'cover';
- bodyWrap.style.backgroundColor = '';
- } catch (error) {
- // .body-wrap yoksa hata görmezden gel
- }
- try {
- const sitecontent = document.querySelector('.site-content');
- sitecontent.style.backgroundImage = `url(${activeData.value})`;
- sitecontent.style.backgroundRepeat = 'no-repeat';
- sitecontent.style.backgroundSize = 'cover';
- sitecontent.style.backgroundColor = '';
- } catch (error) {
- // .site-content yoksa hata görmezden gel
- }
- } else if (activeData.type === 'color') {
- // Body için arkaplan rengi
- document.body.style.backgroundImage = 'none';
- document.body.style.backgroundColor = activeData.value;
-
- // .body-wrap için deneme
- try {
- const bodyWrap = document.querySelector('body.text-ui-light .body-wrap');
- bodyWrap.style.backgroundImage = 'none';
- bodyWrap.style.backgroundColor = activeData.value;
- } catch (error) {
- // .body-wrap yoksa hata görmezden gel
- }
-
- // .site-content için deneme
- try {
- const sitecontent = document.querySelector('.site-content');
- sitecontent.style.backgroundImage = 'none';
- sitecontent.style.backgroundColor = activeData.value;
- } catch (error) {
- // .site-content yoksa hata görmezden gel
- }
- }
- }
-
- /**************************************************************************
- * 3) MODAL Arayüzü Oluşturma
- **************************************************************************/
- let modalOverlay, modalContent;
-
- window.addEventListener('load', () => {
- createModal();
- createToggleShortcut(); // F7 ile aç/kapa
- applyActiveDataToBody(); // Sayfa açıldığında kaydedilmiş aktif veriyi uygula
- });
-
- // F7 ile modal aç/kapa
- function createToggleShortcut() {
- window.addEventListener('keydown', (e) => {
- if (e.key === 'F7') {
- toggleModal();
- }
- });
- }
-
- function toggleModal(forceOpen) {
- const isHidden = (modalOverlay.style.display === 'none');
- if (forceOpen === true) {
- showModal();
- } else if (forceOpen === false) {
- hideModal();
- } else {
- if (isHidden) showModal(); else hideModal();
- }
- }
-
- function showModal() {
- modalOverlay.style.display = 'block';
- refreshHistoryList();
- refreshActiveLabel();
- refreshSettingsUI();
- }
-
- function hideModal() {
- modalOverlay.style.display = 'none';
- }
-
- function createModal() {
- // (1) Overlay
- modalOverlay = document.createElement('div');
- Object.assign(modalOverlay.style, {
- display: 'none',
- position: 'fixed',
- top: '0',
- left: '0',
- width: '100%',
- height: '100%',
- backgroundColor: 'rgba(0,0,0,0.5)',
- zIndex: '99999',
- color: '#000'
- });
- document.body.appendChild(modalOverlay);
-
- // (2) İçerik
- modalContent = document.createElement('div');
- Object.assign(modalContent.style, {
- position: 'absolute',
- top: '50%',
- left: '50%',
- transform: 'translate(-50%, -50%)',
- width: '400px',
- backgroundColor: '#fff',
- padding: '20px',
- borderTopLeftRadius: '15px',
- borderBottomRightRadius: '15px',
- border: '3px solid black',
- minHeight: '400px',
- fontFamily: 'Arial, sans-serif',
- fontSize: '14px',
- fontWeight: 'normal',
- color: '#000',
- });
- modalOverlay.appendChild(modalContent);
-
- // (3) Logo
- const img = document.createElement('img');
- img.src = 'https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhi0QDJZNeXWcaD9lXWMN2yenYt5XGrqfPavkCFpWLe01CpSEsMn7IGpbOLqxEfjx4QUUi4wgTw0Kc7vP7FrKjPKpcaaCu1N6QRJzlZvS_Wwr2r3kA4l0-E5wl7xObsZchd8YNSxySFZATPAr2bnrkANBUrmy8Rpdexe-mxG8N6QDojEj0onaNNXF_6g-s/w800/logo.png';
- img.alt = 'Logo';
- Object.assign(img.style, {
- width: '130px',
- position: 'absolute',
- top: '0',
- right: '50%',
- transform: 'translate(50%, -50%)'
- });
- modalContent.appendChild(img);
-
- // (4) Başlık
- const header = document.createElement('h3');
- header.innerHTML = '<a href=\"https://www.vebascans.net/\" style=\"color: #402870; font-weight: 500; text-decoration: none; font-family: fantasy;\">Vebascans</a> - Custom Background';
- header.style.margin = '0 0 10px 0';
- header.style.color = 'black';
- header.style.marginTop = '45px';
- modalContent.appendChild(header);
-
- // (5) Kapat butonu
- const closeBtn = document.createElement('button');
- closeBtn.innerHTML = `
- <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">
- <g fill=\"none\" fill-rule=\"evenodd\">
- <path d=\"m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z\"/>
- <path fill=\"currentColor\" d=\"m12 14.122l5.303 5.303a1.5 1.5 0 0 0 2.122-2.122L14.12 12l5.304-5.303a1.5 1.5 0 1 0-2.122-2.121L12 9.879L6.697 4.576a1.5 1.5 0 1 0-2.122 2.12L9.88 12l-5.304 5.304a1.5 1.5 0 1 0 2.122 2.12z\"/>
- </g>
- </svg>`;
- Object.assign(closeBtn.style, {
- position: 'absolute',
- top: '10px',
- right: '10px',
- border: 'none',
- background: 'transparent',
- cursor: 'pointer',
- color: 'black'
- });
- closeBtn.onclick = () => hideModal();
- modalContent.appendChild(closeBtn);
-
- // (6) Seçim Menüsü (URL mi Renk mi)
- const selectDiv = document.createElement('div');
- Object.assign(selectDiv.style, {
- display: 'flex',
- flexDirection: 'row',
- gap: '5px',
- marginBottom: '10px'
- });
- modalContent.appendChild(selectDiv);
-
- const selectLabel = document.createElement('label');
- selectLabel.textContent = 'Seçim: ';
- selectLabel.style.display = 'flex';
- selectLabel.style.alignItems = 'center';
- selectDiv.appendChild(selectLabel);
-
- const selectInput = document.createElement('select');
- selectInput.id = 'typeSelect';
- selectInput.style.background ='white';
- selectInput.style.border ='2px solid black';
- selectInput.style.borderRadius ='3px';
- selectInput.style.color = 'black';
- const optUrl = new Option('URL', 'url');
- const optColor = new Option('Renk', 'color');
- selectInput.add(optUrl);
- selectInput.add(optColor);
- selectDiv.appendChild(selectInput);
-
- // (7) URL input
- const urlInput = document.createElement('input');
- urlInput.type = 'text';
- urlInput.id = 'urlInput';
- urlInput.placeholder = 'Görsel URL giriniz...';
- urlInput.style.background ='transparent';
- urlInput.style.border ='2px solid black';
- urlInput.style.borderRadius ='3px';
- selectDiv.appendChild(urlInput);
-
- // (8) Color input
- const colorInput = document.createElement('input');
- colorInput.type = 'color';
- colorInput.id = 'colorInput';
- colorInput.value = '#000000';
- colorInput.style.width = '50px';
- colorInput.style.height = '30px';
- colorInput.style.display = 'none';
- selectDiv.appendChild(colorInput);
-
- // Seçim değişince hangi input görünsün?
- selectInput.addEventListener('change', () => {
- if (selectInput.value === 'url') {
- urlInput.style.display = 'inline-block';
- colorInput.style.display = 'none';
- } else {
- urlInput.style.display = 'none';
- colorInput.style.display = 'inline-block';
- }
- });
-
- // (9) Aktar butonu
- const aktarBtn = document.createElement('button');
- aktarBtn.textContent = 'Aktar';
- aktarBtn.style.marginLeft = '5px';
- aktarBtn.style.padding = '5px 10px';
- aktarBtn.style.cursor = 'pointer';
- aktarBtn.style.color = 'black';
- aktarBtn.style.border ='2px solid black';
- aktarBtn.style.borderRadius ='3px';
- aktarBtn.style.background = 'transparent';
- selectDiv.appendChild(aktarBtn);
-
- aktarBtn.onclick = () => {
- const currentType = selectInput.value; // 'url' | 'color'
- let currentValue = '';
- if (currentType === 'url') {
- currentValue = urlInput.value.trim();
- if (!currentValue) {
- Toast.fire({ icon: 'error', title: 'Lütfen bir URL girin.' });
- return;
- }
- } else {
- currentValue = colorInput.value; // #rrggbb
- if (!currentValue) {
- Toast.fire({ icon: 'error', title: 'Lütfen bir renk seçin.' });
- return;
- }
- }
-
- // Yeni aktif obje
- const newActiveObj = { type: currentType, value: currentValue };
- setActiveData(newActiveObj);
- addToHistory(newActiveObj);
-
- refreshHistoryList();
- refreshActiveLabel();
-
- // URL tipini kullandıysa inputu temizleyelim
- if (currentType === 'url') {
- urlInput.value = '';
- }
- Toast.fire({ icon: 'success', title: 'Yeni aktif değer atandı ve body arkaplanı güncellendi!' });
- };
-
- // (10) Tekrar / Tek Sefer AYARI
- const repeatDiv = document.createElement('div');
- repeatDiv.style.margin = '10px 0';
- repeatDiv.style.display = 'flex';
- repeatDiv.style.flexDirection = 'row';
- repeatDiv.style.gap = '10px';
- modalContent.appendChild(repeatDiv);
-
- const repeatLabel = document.createElement('span');
- repeatLabel.textContent = 'Arkaplan Tekrarı:';
- repeatLabel.style.alignSelf = 'center';
- repeatDiv.appendChild(repeatLabel);
-
- const labelRepeat = document.createElement('label');
- const radioRepeat = document.createElement('input');
- radioRepeat.type = 'radio';
- radioRepeat.name = 'bgRepeat';
- radioRepeat.value = 'repeat';
- radioRepeat.style.marginRight = '5px';
- labelRepeat.appendChild(radioRepeat);
- labelRepeat.appendChild(document.createTextNode('Tekrarlı'));
- repeatDiv.appendChild(labelRepeat);
-
- const labelNoRepeat = document.createElement('label');
- const radioNoRepeat = document.createElement('input');
- radioNoRepeat.type = 'radio';
- radioNoRepeat.name = 'bgRepeat';
- radioNoRepeat.value = 'no-repeat';
- radioNoRepeat.style.marginRight = '5px';
- labelNoRepeat.appendChild(radioNoRepeat);
- labelNoRepeat.appendChild(document.createTextNode('Tek Sefer'));
- repeatDiv.appendChild(labelNoRepeat);
-
- [radioRepeat, radioNoRepeat].forEach(radio => {
- radio.addEventListener('change', () => {
- const newVal = radio.value; // 'repeat' | 'no-repeat'
- const s = getSettings();
- s.bgRepeat = newVal;
- setSettings(s);
- applyActiveDataToBody();
- });
- });
-
- // (11) Aktif Veriyi Sil
- const removeActiveBtn = document.createElement('button');
- removeActiveBtn.textContent = 'Aktif Veriyi Sil';
- removeActiveBtn.style.marginBottom = '10px';
- removeActiveBtn.style.padding = '5px 10px';
- removeActiveBtn.style.cursor = 'pointer';
- removeActiveBtn.style.color = 'black';
- removeActiveBtn.style.background = 'transparent';
- removeActiveBtn.style.border ='2px solid black';
- removeActiveBtn.style.borderRadius ='3px';
- modalContent.appendChild(removeActiveBtn);
-
- removeActiveBtn.onclick = () => {
- removeActiveData();
- refreshHistoryList();
- refreshActiveLabel();
- Toast.fire({ icon: 'info', title: 'Aktif veri silindi. Arkaplan temizlendi.' });
- };
-
- // (12) Şu anda aktif veriyi gösteren label
- const activeDiv = document.createElement('div');
- activeDiv.id = 'activeDiv';
- activeDiv.style.marginTop = '10px';
- modalContent.appendChild(activeDiv);
-
- // (13) Geçmiş Başlık
- const historyTitle = document.createElement('h4');
- historyTitle.textContent = 'Geçmiş';
- historyTitle.style.margin = '10px 0 5px 0';
- modalContent.appendChild(historyTitle);
-
- // (14) Geçmiş Container
- const historyContainer = document.createElement('div');
- historyContainer.id = 'historyContainer';
- historyContainer.style.maxHeight = '200px';
- historyContainer.style.overflowY = 'auto';
- historyContainer.style.border = '1px solid #ccc';
- historyContainer.style.padding = '5px';
- modalContent.appendChild(historyContainer);
- }
-
- /**************************************************************************
- * 4) Geçmiş & Aktif Listeyi Güncelleme
- **************************************************************************/
- function refreshHistoryList() {
- const historyContainer = document.getElementById('historyContainer');
- if (!historyContainer) return;
-
- historyContainer.innerHTML = '';
-
- const historyData = getHistoryData();
- const activeData = getActiveData(); // {type:'...', value:'...'}
-
- historyData.forEach((item) => {
- const row = document.createElement('div');
- row.style.display = 'flex';
- row.style.alignItems = 'center';
- row.style.marginBottom = '8px';
- row.style.cursor = 'pointer';
-
- // URL ise küçük görsel
- if (item.type === 'url') {
- const imgThumb = document.createElement('img');
- imgThumb.src = item.value;
- imgThumb.alt = 'Görsel';
- imgThumb.style.width = '30px';
- imgThumb.style.height = '30px';
- imgThumb.style.objectFit = 'cover';
- imgThumb.style.marginRight = '8px';
- row.appendChild(imgThumb);
-
- const label = document.createElement('span');
- label.textContent = 'URL';
- row.appendChild(label);
- }
- // Renk ise kutu
- else if (item.type === 'color') {
- const colorBox = document.createElement('span');
- colorBox.style.display = 'inline-block';
- colorBox.style.width = '30px';
- colorBox.style.height = '30px';
- colorBox.style.backgroundColor = item.value;
- colorBox.style.marginRight = '8px';
- colorBox.style.border = '1px solid #000';
- row.appendChild(colorBox);
-
- const label = document.createElement('span');
- label.textContent = 'Renk';
- row.appendChild(label);
- }
-
- // Aktif mi?
- if (activeData && activeData.type === item.type && activeData.value === item.value) {
- const activeSpan = document.createElement('span');
- activeSpan.textContent = ' (Şu anda aktif)';
- activeSpan.style.color = 'green';
- activeSpan.style.marginLeft = '5px';
- row.appendChild(activeSpan);
- }
-
- // Tıklayınca bu itemi aktif yap
- row.addEventListener('click', () => {
- setActiveData(item);
- refreshHistoryList();
- refreshActiveLabel();
- Toast.fire({ icon: 'success', title: 'Aktif değer güncellendi!' });
- });
-
- historyContainer.appendChild(row);
- });
- }
-
- function refreshActiveLabel() {
- const activeDiv = document.getElementById('activeDiv');
- if (!activeDiv) return;
-
- const activeData = getActiveData();
- if (!activeData) {
- activeDiv.textContent = 'Şu anda aktif bir değer yok.';
- } else {
- if (activeData.type === 'url') {
- activeDiv.innerHTML = `
- Aktif: URL →
- <img src=\"${activeData.value}\"
- alt=\"Aktif Görsel\"
- style=\"width: 100px; height: auto; object-fit: cover; margin-left:5px;\"/>
- `;
- } else {
- activeDiv.innerHTML = `
- Aktif: Renk →
- <span style=\"display:inline-block; width:20px; height:20px;
- background-color:${activeData.value};
- border:1px solid #000; vertical-align:middle;\">
- </span>
- ${activeData.value}
- `;
- }
- }
- }
-
- /**************************************************************************
- * 5) Arkaplan Ayarı (Tekrar / Tek Sefer) Radyo Butonlarını Güncelleme
- **************************************************************************/
- function refreshSettingsUI() {
- const settings = getSettings();
- const bgRepeat = settings.bgRepeat || 'no-repeat'; // Varsayılan no-repeat
- const radios = document.getElementsByName('bgRepeat');
- radios.forEach(radio => {
- radio.checked = (radio.value === bgRepeat);
- });
- }
-
- } // main() sonu
-
- })(); // IIFE sonu