No description
Find a file
Philipp Spiess db405304f4
Don't swallow @utility declarations when @apply is used in nested rules (#16940)
Fixes #16935

This PR fixes an issue where the order of how `@apply` was resolved was
incorrect for nested rules. Consider this example:

```css
.rule {
  @apply underline;
  .nested-rule {
    @apply custom-utility;
  }
}

@utility custom-utility {
  @apply flex;
}
```

The way we topologically sort these, we end up with a list that looks
roughly like this:

```css
.rule {
  @apply underline;
  .nested-rule {
    @apply custom-utility;
  }
}

@utility custom-utility {
  @apply flex;
}

.nested-rule {
  @apply custom-utility;
}
```

As you can see here the nested rule is now part of the top-level list.
This is correct because we first have to substitute the `@apply` inside
the `@utility custom-utility` before we can apply the `custom-utility`
inside `.nested-rule`. However, because we were using a regular AST walk
and because the initial `.rule` also contains the `.nested-rule` as
child, we would first substitute the `@apply` inside the `.nested-rule`,
causing the design-system to force resolve (and cache) the wrong value
for `custom-utility`.

Because the list is already flattened, we do not need to recursively
look into child declarations when we traverse the sorted list. This PR
changes it to use a regular `for` loop instead of the `walk`.

## Test plan

- Added a regression test
- Rest of tests still green
2025-03-04 16:54:05 +01:00
.github Pin pnpm version in freebsd build 2025-02-25 18:20:14 +01:00
crates Prepare v4.0.9 release (#16804) 2025-02-25 17:33:28 +01:00
integrations Handle BOM (#16800) 2025-02-25 16:07:16 +01:00
packages Don't swallow @utility declarations when @apply is used in nested rules (#16940) 2025-03-04 16:54:05 +01:00
patches Upgrade @parcel/watcher to 2.5.1 (#16248) 2025-02-04 15:14:52 +01:00
playgrounds Make JS APIs available to plugins and configs in the Standalone CLI (#15934) 2025-02-25 13:21:46 +01:00
scripts Prepare v4.0.1 release (#16018) 2025-01-29 14:14:35 -05:00
.gitignore Add test.debug to integration tests (#14133) 2024-08-08 12:02:19 +02:00
.npmrc introduce v4 codebase 2024-03-05 14:29:15 +01:00
.prettierignore Hoist oxide/crates to just crates (#13333) 2024-03-23 09:00:48 -04:00
Cargo.lock Scan Next.js dynamic route segments with manual @source rules (#16457) 2025-02-18 11:51:58 +01:00
Cargo.toml Hoist oxide/crates to just crates (#13333) 2024-03-23 09:00:48 -04:00
CHANGELOG.md Don't swallow @utility declarations when @apply is used in nested rules (#16940) 2025-03-04 16:54:05 +01:00
LICENSE Add README, LICENSE, and CONTRIBUTING (#13088) 2024-03-05 14:45:39 -05:00
mise.toml Pin pnpm version in freebsd build 2025-02-25 18:20:14 +01:00
package.json Update prettier-plugin-embed 0.4.15 → 0.5.0 (major) (#16906) 2025-03-03 13:22:51 +01:00
pnpm-lock.yaml Update prettier-plugin-embed 0.4.15 → 0.5.0 (major) (#16906) 2025-03-03 13:22:51 +01:00
pnpm-workspace.yaml Bump and pin prettier (#16382) 2025-02-10 10:54:45 +01:00
README.md Copy README file to every package (#13096) 2024-03-06 08:49:31 -05:00
rust-toolchain.toml Bring back rust-toolchain.toml (#14585) 2024-10-03 14:37:24 +00:00
turbo.json Revert: Only expose used CSS variables (#16403) 2025-02-10 13:26:13 +01:00
vitest.workspace.ts introduce v4 codebase 2024-03-05 14:29:15 +01:00

Tailwind CSS

A utility-first CSS framework for rapidly building custom user interfaces.

Build Status Total Downloads Latest Release License


Documentation

For full documentation, visit tailwindcss.com.

Community

For help, discussion about best practices, or any other conversation that would benefit from being searchable:

Discuss Tailwind CSS on GitHub

For chatting with others using the framework:

Join the Tailwind CSS Discord Server

Contributing

If you're interested in contributing to Tailwind CSS, please read our contributing docs before submitting a pull request.