From 7352aa8677e29a81a9201504099b0455b6f915ec Mon Sep 17 00:00:00 2001 From: Vendicated Date: Tue, 29 Sep 2026 19:33:39 +0200 Subject: [PATCH] fix severe lag caused by bad Discord css --- src/plugins/_core/fixDiscordCss.ts | 59 ++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 src/plugins/_core/fixDiscordCss.ts diff --git a/src/plugins/_core/fixDiscordCss.ts b/src/plugins/_core/fixDiscordCss.ts new file mode 100644 index 000000000..0f9c8471c --- /dev/null +++ b/src/plugins/_core/fixDiscordCss.ts @@ -0,0 +1,59 @@ +/* + * Vencord, a Discord client mod + * Copyright (c) 2026 Vendicated and contributors + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +import { Devs } from "@utils/constants"; +import { Logger } from "@utils/Logger"; +import definePlugin, { StartAt } from "@utils/types"; + +let observer: MutationObserver; + +function cleanSheet(sheet: CSSStyleSheet) { + try { + const rules = sheet.cssRules; + if (!rules) return; + + for (let i = 0; i < rules.length; i++) { + const rule = rules[i]; + + if ((rule as CSSStyleRule).selectorText?.includes(":has(.gameOption_")) { + new Logger("FixDiscordCss").info("Removed problematic CSS rule", rule.cssText); + sheet.deleteRule(i); + observer.disconnect(); + break; + } + } + } catch (e) { } +} + +function handleNode(node: Node) { + if (node.nodeType !== Node.ELEMENT_NODE || !(node as HTMLElement).matches('link[rel="stylesheet"]')) return; + + const linkNode = node as HTMLLinkElement; + + if (linkNode.sheet) { + cleanSheet(linkNode.sheet); + } else { + node.addEventListener("load", () => cleanSheet(linkNode.sheet!), { once: true }); + } +} + +export default definePlugin({ + name: "FixDiscordCss", + description: "Fixes Discord's css lag", + authors: [Devs.Ven], + required: true, + + startAt: StartAt.DOMContentLoaded, + + start() { + observer = new MutationObserver(mutations => { + for (const m of mutations) { + m.addedNodes.forEach(handleNode); + } + }); + observer.observe(document.head, { childList: true }); + } +});