Space Exploration Mode - Galaxy Theme

It transforms every site into outer space - stars, planets, nebulae, shooting meteors.

K instalaci tototo skriptu si budete muset nainstalovat rozšíření jako Tampermonkey, Greasemonkey nebo Violentmonkey.

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

K instalaci tohoto skriptu si budete muset nainstalovat rozšíření jako Tampermonkey nebo Violentmonkey.

K instalaci tohoto skriptu si budete muset nainstalovat rozšíření jako Tampermonkey nebo Userscripts.

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

K instalaci tohoto skriptu si budete muset nainstalovat manažer uživatelských skriptů.

(Už mám manažer uživatelských skriptů, nechte mě ho nainstalovat!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(Už mám manažer uživatelských stylů, nechte mě ho nainstalovat!)

// ==UserScript==
// @name         Space Exploration Mode - Galaxy Theme
// @namespace    http://tampermonkey.net/
// @version      1.1
// @description  It transforms every site into outer space - stars, planets, nebulae, shooting meteors.
// @author       Mustafa Hakan
// @match        *://*/*
// @grant        none
// @run-at       document-end
// ==/UserScript==

(function() {
    'use strict';

    let stars = [], meteors = [], planets = [], nebulaParticles = [];
    let canvas, ctx, W, H, mouseX = 0, mouseY = 0, animId;
    let speed = 0, lastScroll = 0, scrollDirection = 0;

    const PLANET_TYPES = [
        { name: 'Dünya', emoji: '🌍', size: 60, glow: '#4a90d9', orbit: true },
        { name: 'Satürn', emoji: '🪐', size: 70, glow: '#d9a64a', orbit: true },
        { name: 'Jüpiter', emoji: '🪐', size: 80, glow: '#d9b87a', orbit: true },
        { name: 'Mars', emoji: '🔴', size: 40, glow: '#d94a4a', orbit: false },
        { name: 'Ay', emoji: '🌙', size: 35, glow: '#e8e8e8', orbit: false },
        { name: 'Güneş', emoji: '☀️', size: 90, glow: '#ffd700', orbit: false, bright: true },
        { name: 'Neptün', emoji: '🔵', size: 50, glow: '#4a6ad9', orbit: true },
        { name: 'Ateş Gezegeni', emoji: '🟠', size: 45, glow: '#ff6b35', orbit: true }
    ];

    function rand(a, b) { return Math.random() * (b - a) + a; }

    class Star {
        constructor() {
            this.reset(true);
        }
        reset(init) {
            this.x = rand(0, W);
            this.y = init ? rand(0, H) : -5;
            this.size = rand(0.5, 3);
            this.brightness = rand(0.3, 1);
            this.twinkleSpeed = rand(0.005, 0.03);
            this.twinkleOffset = rand(0, Math.PI * 2);
            this.color = ['#fff', '#ffd', '#ddf', '#fdf', '#dff'][Math.floor(rand(0, 5))];
            this.driftX = rand(-0.02, 0.02);
            this.driftY = rand(0.1, 0.5);
        }
        update() {
            this.y += this.driftY + scrollDirection * 0.5;
            this.x += this.driftX;
            if (this.y > H + 5) this.reset(false);
            if (this.x < 0) this.x = W;
            if (this.x > W) this.x = 0;
        }
        draw() {
            const twinkle = Math.sin(Date.now() * this.twinkleSpeed + this.twinkleOffset) * 0.3 + 0.7;
            const alpha = this.brightness * twinkle;
            ctx.fillStyle = this.color;
            ctx.globalAlpha = alpha;
            ctx.beginPath();
            ctx.arc(this.x, this.y, this.size, 0, Math.PI * 2);
            ctx.fill();
            if (this.size > 1.5) {
                ctx.shadowColor = this.color;
                ctx.shadowBlur = this.size * 3;
                ctx.fill();
                ctx.shadowBlur = 0;
            }
            ctx.globalAlpha = 1;
        }
    }

    class Meteor {
        constructor() {
            this.reset();
        }
        reset() {
            this.x = rand(0, W);
            this.y = rand(-100, -10);
            this.length = rand(40, 120);
            this.speed = rand(3, 8);
            this.angle = rand(-0.3, -0.1);
            this.opacity = rand(0.6, 1);
            this.trail = [];
        }
        update() {
            this.trail.push({ x: this.x, y: this.y, alpha: 1 });
            if (this.trail.length > 15) this.trail.shift();
            this.trail.forEach(t => t.alpha -= 0.06);

            this.x += Math.cos(this.angle) * this.speed;
            this.y += Math.sin(this.angle) * this.speed + this.speed * 0.7;

            if (this.y > H + 50 || this.x < -50 || this.x > W + 50) {
                this.reset();
                this.y = rand(-200, -20);
            }
        }
        draw() {
            if (this.trail.length < 2) return;
            ctx.strokeStyle = '#fff';
            ctx.lineWidth = 1.5;
            ctx.lineCap = 'round';
            ctx.beginPath();
            ctx.moveTo(this.trail[0].x, this.trail[0].y);
            for (let i = 1; i < this.trail.length; i++) {
                ctx.lineTo(this.trail[i].x, this.trail[i].y);
            }
            ctx.stroke();

            ctx.fillStyle = '#fff';
            ctx.shadowColor = '#fff';
            ctx.shadowBlur = 8;
            ctx.beginPath();
            ctx.arc(this.x, this.y, 1.5, 0, Math.PI * 2);
            ctx.fill();
            ctx.shadowBlur = 0;
        }
    }

    class Planet {
        constructor() {
            const type = PLANET_TYPES[Math.floor(rand(0, PLANET_TYPES.length))];
            Object.assign(this, type);
            this.x = rand(100, W - 100);
            this.y = rand(80, H - 200);
            this.baseX = this.x;
            this.baseY = this.y;
            this.orbitRadius = rand(30, 80);
            this.orbitSpeed = rand(0.0002, 0.001);
            this.orbitAngle = rand(0, Math.PI * 2);
            this.floatOffset = rand(0, Math.PI * 2);
        }
        update() {
            this.floatOffset += 0.003;
            const floatY = Math.sin(this.floatOffset) * 8;

            if (this.orbit) {
                this.orbitAngle += this.orbitSpeed;
                this.x = this.baseX + Math.cos(this.orbitAngle) * this.orbitRadius;
                this.y = this.baseY + Math.sin(this.orbitAngle) * this.orbitRadius * 0.4 + floatY;
            } else {
                this.y = this.baseY + floatY;
                this.x += (mouseX - W / 2) * 0.0001;
            }

            this.x += scrollDirection * 0.1;

            if (this.x < -50) this.x = W + 50;
            if (this.x > W + 50) this.x = -50;
        }
        draw() {
            ctx.save();
            ctx.translate(this.x, this.y);

            if (this.bright) {
                const gradient = ctx.createRadialGradient(0, 0, this.size * 0.5, 0, 0, this.size * 2);
                gradient.addColorStop(0, 'rgba(255,255,200,0.3)');
                gradient.addColorStop(0.5, 'rgba(255,200,100,0.1)');
                gradient.addColorStop(1, 'rgba(255,150,0,0)');
                ctx.fillStyle = gradient;
                ctx.beginPath();
                ctx.arc(0, 0, this.size * 2, 0, Math.PI * 2);
                ctx.fill();
            }

            ctx.shadowColor = this.glow;
            ctx.shadowBlur = this.bright ? 40 : 20;
            ctx.font = this.size + 'px serif';
            ctx.textAlign = 'center';
            ctx.textBaseline = 'middle';
            ctx.fillText(this.emoji, 0, 0);
            ctx.shadowBlur = 0;

            if (this.orbit) {
                ctx.strokeStyle = 'rgba(255,255,255,0.05)';
                ctx.lineWidth = 1;
                ctx.setLineDash([3, 8]);
                ctx.beginPath();
                ctx.ellipse(0, -Math.sin(this.floatOffset) * 8, this.orbitRadius, this.orbitRadius * 0.4, 0, 0, Math.PI * 2);
                ctx.stroke();
                ctx.setLineDash([]);
            }

            ctx.restore();
        }
    }

    class Nebula {
        constructor() {
            this.reset();
        }
        reset() {
            this.x = rand(0, W);
            this.y = rand(0, H);
            this.size = rand(100, 300);
            this.color = ['rgba(100,50,200,', 'rgba(50,100,200,', 'rgba(200,50,150,', 'rgba(50,200,150,', 'rgba(200,100,50,'][Math.floor(rand(0, 5))];
            this.opacity = rand(0.015, 0.04);
            this.driftX = rand(-0.1, 0.1);
            this.driftY = rand(-0.1, 0.1);
        }
        update() {
            this.x += this.driftX;
            this.y += this.driftY + scrollDirection * 0.2;
            if (this.x < -this.size) this.x = W + this.size;
            if (this.x > W + this.size) this.x = -this.size;
            if (this.y < -this.size) this.y = H + this.size;
            if (this.y > H + this.size) this.y = -this.size;
        }
        draw() {
            const gradient = ctx.createRadialGradient(this.x, this.y, 0, this.x, this.y, this.size);
            gradient.addColorStop(0, this.color + this.opacity + ')');
            gradient.addColorStop(1, 'rgba(0,0,0,0)');
            ctx.fillStyle = gradient;
            ctx.beginPath();
            ctx.arc(this.x, this.y, this.size, 0, Math.PI * 2);
            ctx.fill();
        }
    }

    function createSky() {
        stars = [];
        for (let i = 0; i < 250; i++) stars.push(new Star());
        meteors = [];
        for (let i = 0; i < 3; i++) meteors.push(new Meteor());
        planets = [];
        for (let i = 0; i < 5; i++) planets.push(new Planet());
        nebulaParticles = [];
        for (let i = 0; i < 6; i++) nebulaParticles.push(new Nebula());
    }

    function init() {
        if (document.getElementById('space-canvas')) return;

        canvas = document.createElement('canvas');
        canvas.id = 'space-canvas';
        canvas.style.cssText = `
            position:fixed;top:0;left:0;width:100%;height:100%;
            z-index:2147483640;pointer-events:none;
            background:linear-gradient(180deg,#000011,#0a0a2e 30%,#0d0d1a 60%,#000011);
        `;
        document.body.appendChild(canvas);

        W = canvas.width = window.innerWidth;
        H = canvas.height = window.innerHeight;
        ctx = canvas.getContext('2d');

        createSky();

        window.addEventListener('resize', () => {
            W = canvas.width = window.innerWidth;
            H = canvas.height = window.innerHeight;
            createSky();
        });

        document.addEventListener('mousemove', (e) => {
            mouseX = e.clientX;
            mouseY = e.clientY;
        });

        window.addEventListener('scroll', () => {
            const currentScroll = window.scrollY;
            scrollDirection = currentScroll - lastScroll;
            lastScroll = currentScroll;
            speed = Math.abs(scrollDirection);
            if (speed > 50) speed = 50;
            setTimeout(() => { scrollDirection *= 0.5; }, 200);
        });

        loop();
    }

    function loop() {
        ctx.clearRect(0, 0, W, H);

        const bgGrad = ctx.createLinearGradient(0, 0, 0, H);
        bgGrad.addColorStop(0, '#000011');
        bgGrad.addColorStop(0.3, '#0a0a2e');
        bgGrad.addColorStop(0.6, '#0d0d1a');
        bgGrad.addColorStop(1, '#000011');
        ctx.fillStyle = bgGrad;
        ctx.fillRect(0, 0, W, H);

        nebulaParticles.forEach(n => { n.update(); n.draw(); });
        stars.forEach(s => { s.update(); s.draw(); });
        planets.forEach(p => { p.update(); p.draw(); });
        meteors.forEach(m => { m.update(); m.draw(); });

        if (speed > 5) {
            for (let i = 0; i < Math.floor(speed / 3); i++) {
                const star = new Star();
                star.y = rand(0, H);
                star.driftY = speed * 0.3;
                star.draw();
            }
        }

        ctx.fillStyle = 'rgba(255,255,255,0.02)';
        ctx.font = '12px monospace';
        ctx.fillText('✦ UZAY KEŞİF MODU ✦', 20, H - 20);
        ctx.fillText('Mustafa Hakan', W - 130, H - 20);

        animId = requestAnimationFrame(loop);
    }

    function addInfoBadge() {
        const badge = document.createElement('div');
        badge.style.cssText = `
            position:fixed;top:15px;right:15px;background:rgba(0,0,0,0.6);
            color:#fff;padding:8px 14px;border-radius:20px;font-size:11px;
            z-index:2147483645;font-family:system-ui;pointer-events:none;
            border:1px solid rgba(255,255,255,0.1);letter-spacing:0.5px;
        `;
        badge.innerHTML = '🪐 Uzay Modu Aktif • Kaydır ===>';
        document.body.appendChild(badge);
        setTimeout(() => { badge.style.opacity = '0'; badge.style.transition = 'opacity 2s'; }, 8000);
    }

    if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', () => setTimeout(init, 500));
    } else {
        setTimeout(init, 500);
    }
    setTimeout(addInfoBadge, 1000);

    console.log('🪐 Uzay Keşif Modu Aktif | Sayfayı kaydır, yıldızlara bak |');
})();