> ## Documentation Index
> Fetch the complete documentation index at: https://extension.js.org/llms.txt
> Use this file to discover all available pages before exploring further.

# Sass and SCSS modules in browser extensions

> Scale browser extension styling with Sass variables, nesting, and SCSS modules. Extension.js supports .scss, .sass, and .module variants via Rspack.

Use Sass to scale browser extension styling with variables, nesting, and SCSS modules while keeping a single build workflow.

Extension.js supports `.scss` and `.sass`, plus SCSS module variants (`.module.scss`, `.module.sass`) through the Rspack-based style pipeline.

## When Sass is a good fit

* Your design system already relies on Sass variables and mixins.
* You need modular styles for component-driven extension UIs.
* You want parity with existing Sass workflows in web applications.

## Template examples

### `new-sass`

<img src="https://mintcdn.com/extensionjs/VCnDd7fX2Nza24SE/images/examples/new-sass/screenshot.png?fit=max&auto=format&n=VCnDd7fX2Nza24SE&q=85&s=fb1e21b868c5ac0998647658d0b59c76" alt="new-sass template screenshot" width="2400" height="1800" data-path="images/examples/new-sass/screenshot.png" />

Start a new-tab extension with Sass support already configured.

<CodeGroup>
  ```bash npm theme={null}
  npx extension@latest create my-extension --template=new-sass
  ```

  ```bash pnpm theme={null}
  pnpx extension@latest create my-extension --template=new-sass
  ```

  ```bash yarn theme={null}
  yarn dlx extension@latest create my-extension --template=new-sass
  ```

  ```bash bun theme={null}
  bunx extension@latest create my-extension --template=new-sass
  ```

  ```bash deno theme={null}
  deno run -A npm:extension@latest create my-extension --template=new-sass
  ```
</CodeGroup>

Repository: [extension-js/examples/new-sass](https://github.com/extension-js/examples/tree/main/examples/new-sass)

## Usage with an existing extension

Add Sass to an existing extension with the steps below.

### Installation

Install the required dependencies:

<PackageManagerTabs command="install -D sass sass-loader" />

### Example usage in an HTML file

In extension pages (popup/options/new tab), import Sass from your entry script:

```html theme={null}
<!doctype html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>New Extension</title>
    <script src="./main.ts"></script>
  </head>
  <body>
    <h1 class="title">Hello, Extension.</h1>
  </body>
</html>
```

```ts theme={null}
import "./styles/globals.scss";

console.log("Sass loaded");
```

## Sass modules

Scope styles locally with Sass modules, just like CSS modules. Use `.module.scss` or `.module.sass` to activate scoping and prevent naming conflicts in your stylesheets.

### `content-sass-modules`

<img src="https://mintcdn.com/extensionjs/VCnDd7fX2Nza24SE/images/examples/content-sass-modules/screenshot.png?fit=max&auto=format&n=VCnDd7fX2Nza24SE&q=85&s=db5f350d56fd869acc019bda11ffb989" alt="content-sass-modules template screenshot" width="2400" height="1800" data-path="images/examples/content-sass-modules/screenshot.png" />

Use Sass modules in content scripts when you need scoped styling for injected UI.

<CodeGroup>
  ```bash npm theme={null}
  npx extension@latest create my-extension --template=content-sass-modules
  ```

  ```bash pnpm theme={null}
  pnpx extension@latest create my-extension --template=content-sass-modules
  ```

  ```bash yarn theme={null}
  yarn dlx extension@latest create my-extension --template=content-sass-modules
  ```

  ```bash bun theme={null}
  bunx extension@latest create my-extension --template=content-sass-modules
  ```

  ```bash deno theme={null}
  deno run -A npm:extension@latest create my-extension --template=content-sass-modules
  ```
</CodeGroup>

Repository: [extension-js/examples/content-sass-modules](https://github.com/extension-js/examples/tree/main/examples/content-sass-modules)

## Using Sass modules in an existing extension

To enable Sass modules, rename your Sass file to include `.module.scss` or `.module.sass`. This automatically scopes the styles to your component.

```diff theme={null}
- button.scss
+ button.module.scss
```

### Example usage

After renaming your Sass file, import it into your script:

```ts theme={null}
import styles from "./styles/button.module.scss";

const element = document.createElement("h1");
element.className = styles.primaryColor;
element.innerText = "Hello, Extension!";
document.body.appendChild(element);
```

In the Sass file:

```scss theme={null}
/* styles/button.module.scss */

$primary-color: #64ff00;

:export {
  primaryColor: $primary-color;
}
```

## React/Preact example usage

Import the Sass module into your React or Preact component, and use the scoped class names:

```jsx theme={null}
import styles from "./styles/button.module.scss";

export default function MyComponent() {
  return <h1 className={styles.primaryColor}>Hello, Extension!</h1>;
}
```

## Vue example usage

In Vue SFCs, prefer module styles with `lang="scss"`:

```vue theme={null}
<template>
  <h1 :class="$style.primaryColor">Hello, Extension!</h1>
</template>

<style lang="scss" module>
@import "./styles/button.module.scss";
</style>
```

## Svelte example usage

In Svelte, import Sass module mappings and apply classes:

```svelte theme={null}
<script>
  import styles from "./styles/button.module.scss";
</script>

<h1 class={styles.primaryColor}>Hello, Extension!</h1>
```

## Behavior notes

* In extension pages, `.module.scss` and `.module.sass` export class maps for JS/TS imports.
* In content scripts, Extension.js emits Sass as CSS assets without JavaScript class-name mappings.
* If your project lacks Sass tooling, Extension.js installs the optional dependencies and asks for a restart.

## Next steps

* Learn more about [CSS modules](/docs/languages-and-frameworks/css-modules).
* Ensure stylesheet quality with [Stylelint](/docs/integrations/stylelint).

## Video walkthrough
