selector.replace($selector, $original, $replacement) returns a copy of $selector with all instances of $original swapped for $replacement, using the @extend rule’s intelligent unification. Load with @use "sass:selector".
Official sample idea.
replace("a.disabled", "a", ".link") → .disabled.link (the original a match is dropped).
Miss = unchanged.
If $selector does not contain $original, the function returns $selector as-is.
No parent selectors.
Placeholders are allowed; & is not. Need keep-and-add instead of a swap? Use selector.extend().
Syntax
Syntax
SCSS
@use "sass:selector";
selector.replace($selector, $original, $replacement) //=> selector
selector.replace("a.disabled", "a", ".link");
// .disabled.link
selector.replace("a.disabled", "h1", "h2");
// a.disabled (unchanged — no match)
selector.replace(".guide .info", ".info", ".content nav.sidebar");
// .guide .content nav.sidebar, .content .guide nav.sidebar
// Use as a rule selector:
#{selector.replace(".btn.primary", ".btn", ".cta")} { ... }
// Global alias (legacy): selector-replace($selector, $original, $replacement)
// Prefer selector.replace after @use "sass:selector"
Pattern: pick what to swap → Sass unifies the replacement → interpolate with #{…} for CSS rules.
Reference
Replace vs Extend
Same arguments, different intent:
Helper
Typical result
Use when
selector.replace
.disabled.link
Swap $original for $replacement
selector.extend
a.disabled, .disabled.link
Keep original and share styles with extender
Official contrast.
Docs point to selector.extend() when you want keep-and-add instead of substitution.
Swaps $original for $replacement with @extend-style unification.
Miss stays unchanged when $original is absent.
vs extend — extend keeps the original match.
Prefer @use "sass:selector" (Dart Sass 1.23+).
One line: to swap a selector piece, use selector.replace($selector, $original, $replacement).
Practice
Compile Notes
Practical checklist:
checklist.txt
1. @use "sass:selector"
2. Pass $selector, $original, $replacement
3. Expect a swap (original is dropped)
4. Interpolate with #{} for CSS rules
5. Use extend when you want keep-and-add
Frequently Asked Questions
selector.replace($selector, $original, $replacement) returns a copy of $selector with all instances of $original replaced by $replacement, using @extend-style intelligent unification. Example: replace("a.disabled", "a", ".link") becomes .disabled.link.
replace swaps the original out. extend keeps the original and adds the extender form. Same args: replace → .disabled.link; extend → a.disabled, .disabled.link.
If $selector does not contain $original, the function returns $selector unchanged.
No. Arguments may contain placeholder selectors, but not parent selectors.
Yes. selector-replace($selector, $original, $replacement) is the legacy global name. Prefer selector.replace after @use "sass:selector".
Dart Sass 1.23+. LibSass and Ruby Sass do not load sass:selector with @use; they may still offer the legacy global name.