From 7352aa8677e29a81a9201504099b0455b6f915ec Mon Sep 17 00:00:00 2001 From: Vendicated Date: Tue, 29 Sep 2026 19:33:39 +0200 Subject: [PATCH 1/2] 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 }); + } +}); From 7f0c10cc29fd789f2f4828ae3dc947623e837920 Mon Sep 17 00:00:00 2001 From: Vendicated Date: Tue, 29 Sep 2026 19:41:03 +0200 Subject: [PATCH 2/2] v1.15.9 --- package.json | 2 +- src/plugins/_core/fixDiscordCss.ts | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 126c86a79..0f3a7dc5f 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "vencord", "private": "true", - "version": "1.15.8", + "version": "1.15.9", "description": "The cutest Discord client mod", "homepage": "https://github.com/Vendicated/Vencord#readme", "bugs": { diff --git a/src/plugins/_core/fixDiscordCss.ts b/src/plugins/_core/fixDiscordCss.ts index 0f9c8471c..22dd4562c 100644 --- a/src/plugins/_core/fixDiscordCss.ts +++ b/src/plugins/_core/fixDiscordCss.ts @@ -8,7 +8,7 @@ import { Devs } from "@utils/constants"; import { Logger } from "@utils/Logger"; import definePlugin, { StartAt } from "@utils/types"; -let observer: MutationObserver; +let observer: MutationObserver | null; function cleanSheet(sheet: CSSStyleSheet) { try { @@ -21,7 +21,8 @@ function cleanSheet(sheet: CSSStyleSheet) { if ((rule as CSSStyleRule).selectorText?.includes(":has(.gameOption_")) { new Logger("FixDiscordCss").info("Removed problematic CSS rule", rule.cssText); sheet.deleteRule(i); - observer.disconnect(); + observer!.disconnect(); + observer = null; break; } }