Custom Arka Plan Yöneticisi

Web siteleri için arka plan değiştirme [öncelikli manga-manhwa siteleri]

目前為 2025-01-28 提交的版本,檢視 最新版本

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==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