// ==UserScript== // @name Get Twitter Icons Back // @namespace Pionxzh // @version 1.1.1 // @author Pionxzh // @description Brings back the blue bird icon on Twitter. No more 𝕏. // @license MIT // @icon https://abs.twimg.com/favicons/twitter.2.ico // @match https://twitter.com/* // @match https://x.com/* // @downloadURL none // ==/UserScript== (function () { 'use strict'; var commonjsGlobal = typeof globalThis !== "undefined" ? globalThis : typeof window !== "undefined" ? window : typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : {}; function getDefaultExportFromCjs(x) { return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, "default") ? x["default"] : x; } var sentinel_umd = { exports: {} }; (function(module, exports) { (function(root, factory) { { module.exports = factory(); } })(commonjsGlobal, function() { var isArray = Array.isArray, selectorToAnimationMap = {}, animationCallbacks = {}, styleEl, styleSheet, cssRules; return { /** * Add watcher. * @param {array} cssSelectors - List of CSS selector strings * @param {Function} callback - The callback function */ on: function(cssSelectors, callback) { if (!callback) return; if (!styleEl) { var doc = document, head = doc.head; doc.addEventListener("animationstart", function(ev, callbacks, l, i) { callbacks = animationCallbacks[ev.animationName]; if (!callbacks) return; ev.stopImmediatePropagation(); l = callbacks.length; for (i = 0; i < l; i++) callbacks[i](ev.target); }, true); styleEl = doc.createElement("style"); head.append(styleEl); styleSheet = styleEl.sheet; cssRules = styleSheet.cssRules; } (isArray(cssSelectors) ? cssSelectors : [cssSelectors]).map(function(selector, animId, isCustomName) { animId = selectorToAnimationMap[selector]; if (!animId) { isCustomName = selector[0] == "!"; selectorToAnimationMap[selector] = animId = isCustomName ? selector.slice(1) : "sentinel-" + Math.random().toString(16).slice(2); cssRules[styleSheet.insertRule( "@keyframes " + animId + "{from{transform:none;}to{transform:none;}}", cssRules.length )]._id = selector; if (!isCustomName) { cssRules[styleSheet.insertRule( selector + "{animation-duration:0.0001s;animation-name:" + animId + ";}", cssRules.length )]._id = selector; } selectorToAnimationMap[selector] = animId; } (animationCallbacks[animId] = animationCallbacks[animId] || []).push(callback); }); }, /** * Remove watcher. * @param {array} cssSelectors - List of CSS selector strings * @param {Function} callback - The callback function (optional) */ off: function(cssSelectors, callback) { (isArray(cssSelectors) ? cssSelectors : [cssSelectors]).map(function(selector, animId, callbackList, i) { if (!(animId = selectorToAnimationMap[selector])) return; callbackList = animationCallbacks[animId]; if (callback) { i = callbackList.length; while (i--) { if (callbackList[i] === callback) callbackList.splice(i, 1); } } else { callbackList = []; } if (callbackList.length) return; i = cssRules.length; while (i--) { if (cssRules[i]._id == selector) styleSheet.deleteRule(i); } delete selectorToAnimationMap[selector]; delete animationCallbacks[animId]; }); }, /** * Reset watchers and cache */ reset: function() { selectorToAnimationMap = {}; animationCallbacks = {}; if (styleEl) styleEl.parentNode.removeChild(styleEl); styleEl = 0; } }; }); })(sentinel_umd); var sentinel_umdExports = sentinel_umd.exports; const sentinel = /* @__PURE__ */ getDefaultExportFromCjs(sentinel_umdExports); function onloadSafe(fn) { if (document.readyState === "complete") { fn(); } else { window.addEventListener("load", fn); } } main(); const twitterIconSvg = ''; const linkMap = { "mask-icon": "https://abs.twimg.com/responsive-web/client-web/icon-svg.168b89da.svg", "shortcut icon": "//abs.twimg.com/favicons/twitter.2.ico", "apple-touch-icon": "https://abs.twimg.com/responsive-web/client-web/icon-ios.b1fc727a.png" }; const metaMap = { "apple-mobile-web-app-title": "Twitter" }; function main() { onloadSafe(() => { injectStyle(); const placeHolderIconSelector = "#placeholder > svg"; replaceIcon(placeHolderIconSelector); const headerIconSelector = "h1 a[href='/home'] svg"; replaceIcon(headerIconSelector); replaceLinkRel(); replaceMetaName(); }); } function injectStyle() { const sheet = new CSSStyleSheet(); sheet.replaceSync(` .old-twitter-icon { height: 1.75rem; width: 20px; max-width: 100%; fill: currentcolor; color: rgba(29,155,240,1.00); vertical-align: text-bottom; position: relative; -ms-flex-positive: 1; -webkit-box-flex: 1; -webkit-flex-grow: 1; flex-grow: 1; -moz-user-select: none; -ms-user-select: none; -webkit-user-select: none; user-select: none; display: inline-block; } @media (prefers-color-scheme: dark) { .old-twitter-icon { color: rgba(231,233,234,1.00); } }`); document.adoptedStyleSheets = [...document.adoptedStyleSheets, sheet]; } function replaceIcon(selector) { sentinel.on(selector, (svg) => { svg.innerHTML = twitterIconSvg; sentinel.off(selector); }); } function replaceLinkRel() { const links = document.querySelectorAll("link[rel]"); links.forEach((link) => { const rel = link.getAttribute("rel"); if (rel && linkMap[rel] && link.getAttribute("href") !== linkMap[rel]) { link.setAttribute("href", linkMap[rel]); } }); } function replaceMetaName() { const metaList = document.querySelectorAll("meta[name]"); metaList.forEach((meta) => { const name = meta.getAttribute("name"); if (name && metaMap[name] && meta.getAttribute("content") !== metaMap[name]) { meta.setAttribute("content", metaMap[name]); } }); } })();