saturate() is a global Sass helper documented in the sass:color module page (Deprecated Functions). It makes a legacy color more vivid by increasing HSL saturation by $amount at compile time. This page covers the fixed-amount trap, why the module system skipped it, how it differs from color.scale(), migration to color.adjust(), and five compiled examples.
01
Concept
Add HSL saturation
02
Status
Deprecated global
03
$amount
0% … 100%
04
Prefer
color.scale()
05
Same math
color.adjust()
06
Practice
5 examples
Concept
What Is saturate()?
Saturate means “push this color toward a richer, more vivid look.” Official docs: it increases the HSL saturation of $color by $amount (0%–100%). Hue and lightness stay related; only saturation moves up by a fixed chunk.
Fixed addition is like pouring the same cup of pigment into every glass. A glass that is already almost full (high saturation) overflows to full chroma. Relative scaling is like “fill 30% of the remaining empty space”—that is color.scale.
Foundation
📝 Syntax
Call the global function with a legacy color and a percentage:
styles.scss
// Deprecated global (legacy colors only)
saturate($color, $amount)
// Preferred — relative saturation
@use "sass:color";
color.scale($color, $saturation: $amount)
// Same fixed math as saturate (Dart Sass 1.79+ with $space)
color.adjust($color, $saturation: $amount, $space: hsl)
Parameters
Parameter
Type
Description
$color
Color
Must be in a legacy color space (rgb, hsl, or hwb).
$amount
Number %
How much to add to HSL saturation, between 0% and 100% (inclusive).
Return value
Type
Meaning
Color
A more saturated color (may clamp to full saturation at 100%).
Modules
📦 Why There Is No color.saturate()
Official docs: because saturate() is usually not the best way to make a color more saturated, it is not included in the new module system. You will not find color.saturate after @use "sass:color".
styles.scss
// Old (deprecated global)
$vivid: saturate(#c69, 20%);
@use "sass:color";
// Same fixed addition as saturate
$vivid: color.adjust(#c69, $saturation: 20%); // works on older Dart Sass too
// Official form (Dart Sass 1.79+):
// color.adjust(#c69, $saturation: 20%, $space: hsl)
// Usually better — 20% more saturated relative to the original
$vivid: color.scale(#c69, $saturation: 20%);
⚠️
Version note for $space
Official migration uses $space: hsl, which needs Dart Sass 1.79+. On older compilers, color.adjust($c, $saturation: $amount) still matches saturate for typical hex/RGB colors.
Compare
📋 saturate vs color.scale vs color.adjust
Official docs call out this trap with #0e4982 (already 80% saturation):
Call
Result
Why
saturate(#0e4982, 30%)
#004990
Adds 30% saturation to 80% → clamps to 100%
color.scale(#0e4982, $saturation: 30%)
#0a4986
Moves 30% of the way toward maximum saturation
color.adjust(..., $saturation: 30%)
Same fixed math as saturate
Use only when you need identical legacy behavior
Support
🛠 Compatibility
This is about Sass compilers, not browsers. Compiled CSS receives a finished color—no saturate() call remains at runtime.
Feature
Dart Sass
Notes
Global saturate()
Yes (deprecated)
Legacy colors only; omitted from sass:color
color.scale($saturation: …)
Yes (module)
Preferred relative saturation
color.adjust(..., $space: hsl)
1.79+
Official same-math migration form
LibSass / Ruby Sass
Global likely
Lack modern module / $space APIs
Cheat Sheet
⚡ Quick Reference
Goal
Code
Saturate 20% (legacy)
saturate(#c69, 20%) → #e05299
Slate punch
saturate(#6b717f, 30%) → #4863a2
Overshoot trap
saturate(#0e4982, 30%) → #004990
Relative saturate
color.scale(#0e4982, $saturation: 30%) → #0a4986
Same math as saturate
color.adjust($c, $saturation: 20%, $space: hsl)
Desaturate twin
desaturate($c, $amount) (also deprecated)
Hands-On
Examples Gallery
Examples use deprecated global saturate() plus modern scale / adjust migrations. Open View Compiled CSS for verified output (matches official Sass docs samples).
📚 Getting Started
Official docs samples for everyday saturate amounts.
Example 1 — Saturation 50% → 70% (Official Docs)
A soft magenta punch gets richer by a fixed 20% saturation.
Low-saturation neutrals have lots of room. In new code, try color.scale(#6b717f, $saturation: 30%) and compare the look.
📈 Practical Patterns
The full-chroma trap, preferred scale, and adjust migration.
Example 3 — High Saturation + Amount → Full Chroma (Official Docs)
Saturation 80% plus 30% clamps to fully saturated.
styles.scss
// #0e4982 has saturation 80%, so when saturate() adds 30% it just becomes
// fully saturated.
@debug saturate(#0e4982, 30%); // #004990
.deep {
color: saturate(#0e4982, 30%);
}
📤 Compiled CSS:
.deep {
color: #004990;
}
How It Works
This is the classic reason official docs discourage saturate. You asked for “a bit more vivid,” but fixed math snapped to maximum chroma.
Example 4 — Prefer color.scale() (Official Docs)
Same seed color, relative 30% saturation keeps a softer navy.
styles.scss
@use "sass:color";
// scale() instead makes it 30% more saturated than it was originally.
@debug color.scale(#0e4982, $saturation: 30%); // #0a4986
.deep {
--saturate: #{saturate(#0e4982, 30%)};
--scale: #{color.scale(#0e4982, $saturation: 30%)};
}
📤 Compiled CSS:
.deep {
--saturate: #004990;
--scale: #0a4986;
}
How It Works
Side-by-side: saturate hits full chroma; scale keeps a usable mid step. Prefer scale in new SCSS.
--legacy and --adjust match, so you can swap calls without visual diffs. Still consider scale when you redesign accent states.
Applications
🚀 Real-World Use Cases
Reading legacy SCSS — recognize saturate() in older accent/hover themes.
Safe migrations — swap to color.adjust for identical output, or scale for better UX.
Teaching HSL — show fixed saturation steps vs relative scaling.
Audit traps — find saturate on already-vivid brands that snap to full chroma.
Pairing with desaturate — both globals are deprecated twins; migrate together.
🧠 How Compilation Works
1
Write SCSS
Call saturate($c, 20%) or migrate to scale / adjust.
Source
2
Read HSL saturation
Sass works in HSL for this legacy helper on rgb/hsl/hwb colors.
HSL
3
Add $amount
Saturation rises by a fixed percent; may clamp at 100%.
Saturate
4
✓
Finished CSS color
Browsers see hex—not a Sass function call.
Watch Out
⚠️ Common Pitfalls
Using it in new code — prefer color.scale (or adjust for same math).
Expecting color.saturate() — that name does not exist in sass:color.
Already-vivid colors + large amounts — easy to clamp to full saturation unexpectedly.
Modern color spaces — $color must be legacy for global saturate.
Assuming “30% more saturated” means scale — saturate is fixed addition, not relative.
Pro Tips
💡 Best Practices
✅ Do
Use color.scale($c, $saturation: $n) for relative saturation
Use color.adjust(..., $saturation: $n, $space: hsl) when matching old saturate
Audit already-vivid brands before applying large amounts
Migrate desaturate siblings in the same pass
Document accent/token recipes with the modern API
❌ Don’t
Add new saturate() calls in greenfield projects
Look for color.saturate in the module
Pass modern oklch colors into global saturate
Expect the browser to re-run Sass at runtime
Assume fixed saturation steps feel “30% more vivid”
Summary
Key Takeaways
Knowledge Unlocked
Five things to remember about saturate()
Deprecated fixed saturation adder—prefer scale.
5
Core concepts
📝01
Call
saturate($c, $%)
API
⚠️02
Status
Deprecated
Docs
🎨03
Does
Adds fixed saturation
HSL
🔄04
Prefer
color.scale()
Modern
✓05
Same math
color.adjust(…)
Migrate
❓ Frequently Asked Questions
saturate($color, $amount) increases a legacy color’s HSL saturation by $amount (0%–100%). Example: saturate(#c69, 20%) is #e05299; saturate(#0e4982, 30%) is fully saturated #004990.
Yes. Official Sass docs list it under Deprecated Functions and omit it from the sass:color module. Prefer color.scale() for relative saturation, or color.adjust($color, $saturation: $amount, $space: hsl) to keep the old math.
Because saturate() is usually not the best way to raise saturation, it is not included in the new module system. Use color.scale or color.adjust instead.
saturate adds a fixed saturation amount (80% + 30% becomes fully saturated). color.scale($c, $saturation: 30%) makes the color 30% more saturated than it was, which is usually what designers want.
No for modern spaces. Official docs require a legacy color space (rgb, hsl, or hwb). Convert first, or use color.scale / color.adjust with an explicit $space.
For the same fixed addition: color.adjust($color, $saturation: $amount, $space: hsl) on Dart Sass 1.79+. For better relative saturation: color.scale($color, $saturation: $amount).
Did you know?
Official Sass docs keep saturate() and desaturate() for compatibility, but neither lives in sass:color. The modern story is color.scale for relative steps and color.adjust when you must match the old fixed math exactly.
saturate() is the classic global way to add HSL saturation on legacy colors. Treat it as deprecated documentation: prefer color.scale($color, $saturation: $amount) for relative saturation, or color.adjust when you need identical old math.