Improve automatic var injection (#12236)

* prevent automatic var injection for properties that accept `<dashed-ident>` for the value

* add test

* add `font-palette`

* improve readability
This commit is contained in:
Robin Malfait 2023-10-24 14:08:46 +02:00 • committed by Jordan Pittman
parent c15b187ae0
commit 2514820dd4
4 changed files with 58 additions and 4 deletions

View file

@ -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

View file

@ -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})`
}
@ -27,7 +51,7 @@ export function normalize(value, isRoot = true) {
return part
}
return normalize(part, false)
return normalize(part, context, false)
})
.join('')
}