Skip to content

Commit

Permalink
Support CSS theme() functions inside @custom-media rules (#14358)
Browse files Browse the repository at this point in the history
This PR will now also scan `@custom-media` rules for invocations of the
CSS `theme()` function.
  • Loading branch information
philipp-spiess authored Sep 6, 2024
1 parent 7b59aac commit ee35a1d
Show file tree
Hide file tree
Showing 3 changed files with 85 additions and 2 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

### Added

- Support CSS `theme()` functions inside other `@custom-media`, `@container`, and `@supports` rules ([#14358])(https://github.com/tailwindlabs/tailwindcss/pull/14358)

### Fixed

- Ensure there is always CLI feedback on save even when no new classes were found ([#14351](https://github.com/tailwindlabs/tailwindcss/pull/14351))
Expand Down
76 changes: 76 additions & 0 deletions packages/tailwindcss/src/css-functions.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -619,6 +619,82 @@ describe('theme function', () => {
`)
})
})

test('@custom-media --my-media (min-width: theme(breakpoint.md))', async () => {
expect(
await compileCss(css`
@theme {
--breakpoint-md: 48rem;
}
@custom-media --my-media (min-width: theme(breakpoint.md));
@media (--my-media) {
.red {
color: red;
}
}
`),
).toMatchInlineSnapshot(`
":root {
--breakpoint-md: 48rem;
}
@media (width >= 48rem) {
.red {
color: red;
}
}"
`)
})

test('@container (width > theme(breakpoint.md))', async () => {
expect(
await compileCss(css`
@theme {
--breakpoint-md: 48rem;
}
@container (width > theme(breakpoint.md)) {
.red {
color: red;
}
}
`),
).toMatchInlineSnapshot(`
":root {
--breakpoint-md: 48rem;
}
@container (width > 48rem) {
.red {
color: red;
}
}"
`)
})

test('@supports (text-stroke: theme(--font-size-xs))', async () => {
expect(
await compileCss(css`
@theme {
--font-size-xs: 0.75rem;
}
@supports (text-stroke: theme(--font-size-xs)) {
.red {
color: red;
}
}
`),
).toMatchInlineSnapshot(`
":root {
--font-size-xs: .75rem;
}
@supports (text-stroke: 0.75rem) {
.red {
color: red;
}
}"
`)
})
})

describe('in plugins', () => {
Expand Down
7 changes: 5 additions & 2 deletions packages/tailwindcss/src/css-functions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,14 @@ export function substituteFunctions(ast: AstNode[], pluginApi: PluginAPI) {
return
}

// Find @media rules
// Find at-rules rules
if (node.kind === 'rule') {
if (
node.selector[0] === '@' &&
node.selector.startsWith('@media ') &&
(node.selector.startsWith('@media ') ||
node.selector.startsWith('@custom-media ') ||
node.selector.startsWith('@container ') ||
node.selector.startsWith('@supports ')) &&
node.selector.includes(THEME_FUNCTION_INVOCATION)
) {
node.selector = substituteFunctionsInValue(node.selector, pluginApi)
Expand Down

0 comments on commit ee35a1d

Please sign in to comment.