X/Twitter Clean-up & Wide Layout Display

Hide unnecessary X menu items on the left (Bookmarks, Jobs, Communities, Premium, Verified Organizations, Monetization, Ads) and right (Subscribe to Premium, Footer), Enlarge and customize the width of the tweet timeline, Custom Script Loading Speed (supports Traditional Chinese, Simplified Chinese, English, Japanese).

Version au 03/05/2025. Voir la dernière version.

// ==UserScript==
// @name         X/Twitter Clean-up & Wide Layout Display
// @name:zh-TW   X/Twitter 乾淨化 & 加寬版面顯示
// @name:zh-CN   X/Twitter 干净化 & 加宽版面显示
// @name:JA      X/Twitter クリーンアップ & ワイドレイアウト表示
// @namespace    https://www.tampermonkey.net/
// @version      3.1
// @description  Hide unnecessary X menu items on the left (Bookmarks, Jobs, Communities, Premium, Verified Organizations, Monetization, Ads) and right (Subscribe to Premium, Footer), Enlarge and customize the width of the tweet timeline, Custom Script Loading Speed (supports Traditional Chinese, Simplified Chinese, English, Japanese).
// @description:zh-TW  隱藏 X 多餘選單項目,左側(書籤、工作機會、社群、Premium、已認證組織、營利、廣告)、右側(訂閱 Premium、頁尾欄目),加大、自定義推文時間軸的寬度,自定義腳本加載速度 (支援繁中、簡中、英文、日文)
// @description:zh-CN  隐藏 X 多余选单项目,左侧(书签、工作机会、社群、Premium、已认证组织、营利、广告)、右侧(订阅 Premium、页尾栏目),加大、自定义推文时间轴的宽度,自定义脚本加载速度 (支援繁中、简中、英文、日文)
// @description:JA  Xの不要なメニュー項目を左側(ブックマーク、求人、コミュニティ、Premium、認証済み組織、収益化、広告)および右側(Premiumの購読、フッター)で非表示にし、 ツイートのタイムラインの幅を拡大し、カスタマイズする、カスタムスクリプトの読み込み速度(繁体字中国語、簡体字中国語、英語、日本語に対応)。
// @author       ChatGPT
// @match        https://x.com/*
// @match        https://twitter.com/*
// @grant        GM_getValue
// @grant        GM_setValue
// @grant        GM_registerMenuCommand
// @license MIT
// ==/UserScript==

(function () {
  'use strict';

  // 🔧 使用者設定值
  const timelineWidth = GM_getValue('timelineWidth', 1200);
  const debounceDelay = GM_getValue('debounceDelay', 300); // 0 表示不啟用防抖

  // 📋 設定選單:時間軸寬度
  GM_registerMenuCommand(`設定:時間軸推文寬度,目前為:${timelineWidth}px`, () => {
    const input = prompt('請輸入時間軸推文寬度(單位 px,建議 600~3000):', timelineWidth);
    const val = parseInt(input);
    if (!isNaN(val) && val >= 600 && val <= 3000) {
      GM_setValue('timelineWidth', val);
      location.reload();
    } else {
      alert('請輸入合理的數值(600~3000)');
    }
  });

  // 📋 設定選單:防抖延遲時間
  GM_registerMenuCommand(`設定:防抖延遲時間(毫秒),目前為:${debounceDelay === 0 ? '關閉' : debounceDelay + 'ms'}`, () => {
    const input = prompt('請輸入防抖延遲(單位 ms,0 表示關閉,建議 1~300):', debounceDelay);
    const val = parseInt(input);
    if (!isNaN(val) && val >= 0 && val <= 300) {
      GM_setValue('debounceDelay', val);
      location.reload();
    } else {
      alert('請輸入合理的數值(0~300)');
    }
  });

  const targetLabels = [
    '書籤', 'Bookmarks', 'ブックマーク', '书签',
    '工作機會', 'Careers', '求人', '工作机会',
    '社群', 'Communities', 'コミュニティ', '社区',
    'Premium', 'プレミアム',
    '已認證組織', 'Verified Orgs', '認証済み組織', '认证组织',
    '營利', 'Monetization', '収益化', '营利',
    '廣告', 'Ads', '広告', '广告',
  ];

  const applyCleanup = () => {
    try {
      // 左側選單
      document.querySelectorAll('nav[role="navigation"] div[dir="ltr"]').forEach(item => {
        const label = item.innerText?.trim();
        if (targetLabels.includes(label)) {
          const topLevel = item.closest('a, div[role="link"]');
          if (topLevel) topLevel.style.display = 'none';
        }
      });

      // 右側 Premium 卡片
      const premiumCard = document.querySelector('.css-175oi2r[data-testid="super-upsell-UpsellCardRenderProperties"]');
      if (premiumCard) premiumCard.style.display = 'none';

      // 頁尾欄位
      const footerLabels = ['頁尾', 'Footer', '页脚', 'フッター'];
      document.querySelectorAll('nav[role="navigation"]').forEach(nav => {
        const label = nav.getAttribute('aria-label')?.trim();
        if (label && footerLabels.includes(label)) {
          nav.style.display = 'none';
        }
      });

      // 主內容加寬
      const mainContent = document.querySelector('main.css-175oi2r.r-16y2uox.r-1wbh5a2.r-1habvwh');
      if (mainContent) {
        Object.assign(mainContent.style, {
          width: '100%',
          maxWidth: 'none',
          marginLeft: 'auto',
          marginRight: 'auto',
        });
      }

      // 推文容器加寬
      const containers = document.querySelectorAll([
        'div.r-1oszu61.r-1niwhzg.r-18u37iz.r-16y2uox.r-2llsf.r-13qz1uu.r-1wtj0ep',
        'div.r-kemksi.r-1kqtdi0.r-1ua6aaf.r-th6na.r-1phboty.r-16y2uox.r-184en5c.r-1abdc3e.r-1lg4w6u.r-f8sm7e.r-13qz1uu.r-1ye8kvj',
        'div.r-f8sm7e.r-13qz1uu.r-1ye8kvj'
      ].join(', '));

      containers.forEach(el => {
        Object.assign(el.style, {
          width: `${timelineWidth}px`,
          maxWidth: 'none',
          marginLeft: 'auto',
          marginRight: 'auto',
        });
      });

    } catch (e) {
      console.error('腳本錯誤:', e);
    }
  };

  let debounceTimer = null;

  const observer = new MutationObserver(() => {
    if (debounceDelay === 0) {
      applyCleanup();
    } else {
      clearTimeout(debounceTimer);
      debounceTimer = setTimeout(applyCleanup, debounceDelay);
    }
  });

  observer.observe(document.body, { childList: true, subtree: true });
})();