Skip to main content

no-unwrapped-global-theme-selectors-in-css-modules

Disallow unwrapped Docusaurus and Infima runtime theme selectors inside CSS Modules.

Targeted pattern scopeโ€‹

This rule runs on CSS Modules files such as *.module.css, *.module.scss, and *.module.sass.

It reports global Docusaurus or Infima class selectors like .navbar, .theme-doc-sidebar-menu, .menu__link, and .DocSearch when they appear directly in a CSS Module selector instead of being wrapped with :global(...).

What this rule reportsโ€‹

This rule reports CSS Module selectors that rely on runtime theme classes without marking them global.

CSS Modules localize class selectors by default, so a selector like .navbar inside Component.module.css does not target the real Docusaurus navbar unless you explicitly opt out of localization.

Why this rule existsโ€‹

This is one of the most common Docusaurus + CSS Modules mistakes.

Authors often move a working selector from src/css/custom.css into a CSS Module and assume it still targets the same markup. It does not. The selector silently becomes local, the runtime class stops matching, and the override appears to "randomly" stop working.

โŒ Incorrectโ€‹

.theme-doc-sidebar-menu .menu__link {
font-weight: 700;
}

โœ… Correctโ€‹

:global(.theme-doc-sidebar-menu) :global(.menu__link) {
font-weight: 700;
}

Behavior and migration notesโ€‹

  • This rule only runs for CSS Modules file names.
  • It is report-only because automatically inserting :global(...) can change selector meaning in nested selectors and CSS Modules syntax.
  • It intentionally focuses on Docusaurus and Infima runtime classes rather than trying to lint every possible global class name.

Additional examplesโ€‹

โŒ Incorrect โ€” unwrapped DocSearch selector in a moduleโ€‹

.DocSearch {
--docsearch-primary-color: #818cf8;
}

โœ… Correct โ€” local component class plus explicit global runtime selectorโ€‹

.card :global(.navbar__link) {
text-decoration: underline;
}

Stylelint config exampleโ€‹

import { docusaurusPluginConfigs } from "stylelint-plugin-docusaurus";

export default {
...docusaurusPluginConfigs["docusaurus-recommended"],
rules: {
...docusaurusPluginConfigs["docusaurus-recommended"].rules,
"docusaurus/no-unwrapped-global-theme-selectors-in-css-modules": true,
},
};

When not to use itโ€‹

Disable this rule if your CSS Modules setup intentionally avoids :global(...) syntax or if your build chain rewrites theme selectors in a non-standard way.

Package documentationโ€‹

Docusaurus package documentation:

Rule catalog ID: R009

Further readingโ€‹