Skip to content

Commit

Permalink
Improve automatic var injection (#12236)
Browse files Browse the repository at this point in the history
* prevent automatic var injection for properties that accept `<dashed-ident>` for the value

* add test

* add `font-palette`

* improve readability
  • Loading branch information
RobinMalfait committed Oct 24, 2023
1 parent 549d50d commit 6a59f51
Show file tree
Hide file tree
Showing 4 changed files with 58 additions and 4 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Allow plugins from a parent document to be used in an iframe ([#12208](https://github.com/tailwindlabs/tailwindcss/pull/12208))
- Add types for `tailwindcss/nesting` ([#12269](https://github.com/tailwindlabs/tailwindcss/pull/12269))
- Bump `jiti`, `fast-glob`, and `browserlist` dependencies ([#11550](https://github.com/tailwindlabs/tailwindcss/pull/11550))
- Improve automatic `var` injection for properties that accept a `<dashed-ident>` ([#12236](https://github.com/tailwindlabs/tailwindcss/pull/12236))

## [3.3.3] - 2023-07-13

Expand Down
2 changes: 1 addition & 1 deletion src/lib/generateRules.js
Original file line number Diff line number Diff line change
Expand Up @@ -496,7 +496,7 @@ function extractArbitraryProperty(classCandidate, context) {
return null
}

let normalized = normalize(value)
let normalized = normalize(value, { property })

if (!isParsableCssValue(property, normalized)) {
return null
Expand Down
30 changes: 27 additions & 3 deletions src/util/dataTypes.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,34 @@ function isCSSFunction(value) {
return cssFunctions.some((fn) => new RegExp(`^${fn}\\(.*\\)`).test(value))
}

// These properties accept a `<dashed-ident>` as one of the values. This means that you can use them
// as: `timeline-scope: --tl;`
//
// Without the `var(--tl)`, in these cases we don't want to normalize the value, and you should add
// the `var()` yourself.
//
// More info:
// - https://drafts.csswg.org/scroll-animations/#propdef-timeline-scope
// - https://developer.mozilla.org/en-US/docs/Web/CSS/timeline-scope#dashed-ident
//
const AUTO_VAR_INJECTION_EXCEPTIONS = new Set([
// Concrete properties
'scroll-timeline-name',
'timeline-scope',
'view-timeline-name',
'font-palette',

// Shorthand properties
'scroll-timeline',
'animation-timeline',
'view-timeline',
])

// This is not a data type, but rather a function that can normalize the
// correct values.
export function normalize(value, isRoot = true) {
if (value.startsWith('--')) {
export function normalize(value, context = null, isRoot = true) {
let isVarException = context && AUTO_VAR_INJECTION_EXCEPTIONS.has(context.property)
if (value.startsWith('--') && !isVarException) {
return `var(${value})`
}

Expand All @@ -27,7 +51,7 @@ export function normalize(value, isRoot = true) {
return part
}

return normalize(part, false)
return normalize(part, context, false)
})
.join('')
}
Expand Down
29 changes: 29 additions & 0 deletions tests/normalize-data-types.test.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { css, run } from './util/run'
import { normalize } from '../src/util/dataTypes'
import { crosscheck } from './util/run'

Expand Down Expand Up @@ -78,3 +79,31 @@ crosscheck(() => {
expect(normalize(input)).toBe(output)
})
})

it('should not automatically inject the `var()` for properties that accept `<dashed-ident>` as the value', () => {
let config = {
content: [
// Automatic var injection
{ raw: '[color:--foo]' },

// Automatic var injection is skipped
{ raw: '[timeline-scope:--foo]' },
],
}

let input = css`
@tailwind utilities;
`

return run(input, config).then((result) => {
expect(result.css).toMatchFormattedCss(css`
.\[color\:--foo\] {
color: var(--foo);
}
.\[timeline-scope\:--foo\] {
timeline-scope: --foo;
}
`)
})
})

0 comments on commit 6a59f51

Please sign in to comment.