`font-palette` CSS property
Baseline Widely available
This feature is well established and works across many devices and browser versions. It's been available across browsers since November 2022.
The font-palette CSS property allows specifying one of the many palettes contained in a color font that a user agent may use for the font. Users can also override the values in a palette or create a new palette by using the @font-palette-values at-rule.
Note: A font-palette palette takes precedence when coloring a font. The color property will not override a font palette, even if specified with !important.
Syntax
/* Using a font-defined palette */ font-palette: normal; /* Using a user-defined palette */ font-palette: --one; /* Creating a new palette by blending two others */ font-palette: palette-mix(in lch, --blue, --yellow);
Values
This property is specified as a single value from the following list:
-
normal - Specifies the default color palette or the default glyph colorization (set by the font maker) to be used for the font. With this setting, the palette in the font at index 0 is rendered.
-
light - Specifies the first palette in the font that matches 'light' to be used for the font. Some fonts contain metadata that identify a palette as applicable for a light (close to white) background. If a font does not have this metadata, the
lightvalue behaves asnormal. -
dark - Specifies the first palette in the font that matches 'dark' to be used for the font. Some fonts contain metadata that identify a palette as applicable for a dark (close to black) background. If a font does not have this metadata, the value behaves as
normal. -
<dashed-ident> - Allows you to specify your own values for the font palette by using the
<palette-identifier>of a @font-palette-values at-rule. -
palette-mix() - Creates a new
font-palettevalue by blending together twofont-palettevalues by specified percentages and color interpolation methods.
Formal definition
| Initial value | normal |
|---|---|
| Applies to | all elements and text |
| Inherited | yes |
| Computed value | as specified |
| Animation type | by computed value |
Formal syntax
font-palette = normal | light | dark | <palette-identifier> | <palette-mix()> <palette-identifier> = <dashed-ident> <palette-mix()> = palette-mix(<color-interpolation-method> , [ [normal | light | dark | <palette-identifier> | <palette-mix()> ] && <percentage [0,100]>? ]#{2}) <color-interpolation-method> = in [ <rectangular-color-space> | <polar-color-space> <hue-interpolation-method>? | <custom-color-space> ] <rectangular-color-space> = srgb | srgb-linear | display-p3 | display-p3-linear | a98-rgb | prophoto-rgb | rec2020 | lab | oklab | xyz | xyz-d50 | xyz-d65 <polar-color-space> = hsl | hwb | lch | oklch <hue-interpolation-method> = [ shorter | longer | increasing | decreasing ] hue <custom-color-space> = <dashed-ident>
Examples
Specifying a dark palette
This example allows you to use the first palette marked as dark (works best on a near black background) by the font-maker.
@media (prefers-color-scheme: dark) {
.banner {
font-palette: dark;
}
}
Animating between two palettes
This example illustrates how to animate font-palette value changes to create a smooth font animation.
HTML
The HTML contains a single paragraph of text to animate:
<p>color-palette<br />animation</p>
CSS
In the CSS, we import a color font called Nabla from Google Fonts, and define two custom font-palette values using the @font-palette-values at-rule. We then create @keyframes that animate between these two palettes, and apply this animation to our paragraph.
@import "https://fonts.googleapis.com/css2?family=Nabla&display=swap";
@font-palette-values --blue-nabla {
font-family: "Nabla";
base-palette: 2; /* this is Nabla's blue palette */
}
@font-palette-values --grey-nabla {
font-family: "Nabla";
base-palette: 3; /* this is Nabla's grey palette */
}
@keyframes animate-palette {
from {
font-palette: --grey-nabla;
}
to {
font-palette: --blue-nabla;
}
}
p {
font-family: "Nabla", fantasy;
font-size: 5rem;
margin: 0;
text-align: center;
animation: animate-palette 4s infinite alternate linear;
}
Result
The output looks like this:
Note: Browsers that still implement discrete font-palette animation will flip between the two palettes rather than smoothly animating.
Specifications
| Specification |
|---|
| CSS Fonts Module Level 4 # font-palette-prop |
Browser compatibility
| Desktop | Mobile | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox for Android | Opera Android | Safari on iOS | Samsung Internet | WebView Android | WebView on iOS | |
font-palette |
101 |
101 |
107 |
87 |
15.4 |
101 |
107 |
70 |
15.4 |
19.0 |
101 |
15.4 |
animation_computed |
121 |
121 |
No |
107 |
No |
121 |
No |
81 |
No |
25.0 |
121 |
No |
dark |
101 |
101 |
107 |
87 |
15.4 |
101 |
107 |
70 |
15.4 |
19.0 |
101 |
15.4 |
light |
101 |
101 |
107 |
87 |
15.4 |
101 |
107 |
70 |
15.4 |
19.0 |
101 |
15.4 |
normal |
101 |
101 |
107 |
87 |
15.4 |
101 |
107 |
70 |
15.4 |
19.0 |
101 |
15.4 |
palette-mix_function |
121 |
121 |
No |
107 |
No |
121 |
No |
81 |
No |
25.0 |
121 |
No |
See also
palette-mix()@font-palette-values-
base-palettedescriptor -
font-familydescriptor -
override-colorsdescriptor
© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Properties/font-palette