Disable ChatGPT Login Popup

Menghilangkan popup login & "Sign up" di chatgpt.com dengan lebih agresif menggunakan CSS injection dan MutationObserver.

// ==UserScript==
// @name         Disable ChatGPT Login Popup
// @name:en      Disable ChatGPT Login Popup
// @namespace    Violentmonkey Scripts
// @version      1.0
// @description  Menghilangkan popup login & "Sign up" di chatgpt.com dengan lebih agresif menggunakan CSS injection dan MutationObserver.
// @description:en Aggressively removes the login & "Sign up" popup on chatgpt.com using CSS injection and MutationObserver.
// @author       3xploiton3
// @match        https://chatgpt.com/*
// @grant        GM_addStyle
// @run-at       document-start
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';

    // Selektor untuk popup dan elemen pengganggu lainnya.
    // Ini mungkin perlu disesuaikan jika OpenAI mengubah desain situsnya.
    // ---
    // Selectors for the popup and other intrusive elements.
    // These may need to be adjusted if OpenAI changes the site design.
    const SELECTORS_TO_REMOVE = [
        '[data-testid="modal-no-auth-welcome-back"]', // Popup utama "Welcome back" // Main "Welcome back" popup
        '.group.fixed.bottom-3.right-3', // Tombol "Get help" yang mengambang // Floating "Get help" button
        'div.w-full.text-center.text-xs' // Banner "Sign up to chat" di bawah // "Sign up to chat" banner at the bottom
    ];

    // Selektor untuk backdrop/overlay yang menggelapkan dan mengunci halaman.
    // ---
    // Selector for the backdrop/overlay that darkens and locks the page.
    const BACKDROP_SELECTOR = 'div[data-radix-portal] + div';

    // --- Langkah 1: Sembunyikan Elemen Secara Instan dengan CSS ---
    // @run-at document-start memastikan CSS ini diterapkan sebelum halaman dirender.
    // Ini adalah cara paling efektif untuk mencegah "flash" atau kemunculan singkat popup.
    // ---
    // --- Step 1: Instantly Hide Elements with CSS ---
    // @run-at document-start ensures this CSS is applied before the page is rendered.
    // This is the most effective way to prevent a "flash" or brief appearance of the popup.
    GM_addStyle(`
        ${SELECTORS_TO_REMOVE.join(',\n')} {
            display: none !important;
            opacity: 0 !important;
            pointer-events: none !important;
        }
        ${BACKDROP_SELECTOR} {
            display: none !important;
        }
    `);

    // --- Langkah 2: Hapus Elemen dari DOM & Perbaiki Scroll ---
    // MutationObserver akan memantau setiap perubahan pada halaman.
    // ---
    // --- Step 2: Remove Elements from the DOM & Fix Scrolling ---
    // The MutationObserver will monitor any changes on the page.
    const observer = new MutationObserver((mutations) => {
        let popupFound = false;

        // Loop untuk mencari dan menghapus semua elemen yang tidak diinginkan.
        // ---
        // Loop to find and remove all unwanted elements.
        for (const selector of SELECTORS_TO_REMOVE) {
            const element = document.querySelector(selector);
            if (element) {
                element.remove();
                popupFound = true; // Tandai jika salah satu elemen ditemukan & dihapus // Mark if an element was found & removed
            }
        }

        // Cari dan hapus backdrop secara terpisah.
        // ---
        // Find and remove the backdrop separately.
        const backdrop = document.querySelector(BACKDROP_SELECTOR);
        if (backdrop) {
            backdrop.remove();
            popupFound = true;
        }

        // Jika popup atau backdrop ditemukan dan dihapus,
        // pastikan scroll halaman diaktifkan kembali.
        // ---
        // If a popup or backdrop was found and removed,
        // ensure page scrolling is re-enabled.
        if (popupFound) {
            document.documentElement.style.overflow = '';
            document.body.style.overflow = '';
        }
    });

    // Mulai amati perubahan dari root elemen (<html>) sesegera mungkin.
    // ---
    // Start observing changes from the root element (<html>) as soon as possible.
    observer.observe(document.documentElement, {
        childList: true, // Amati penambahan/penghapusan elemen anak // Observe addition/removal of child elements
        subtree: true    // Amati seluruh sub-pohon (semua elemen di dalam <html>) // Observe the entire subtree (all elements within <html>)
    });

})();