Bird
Raised Fist0
SASSmarkup~10 mins

Component variant generation in SASS - Browser Rendering Trace

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Render Flow - Component variant generation
Write base component styles
Define variant mixins or placeholders
Generate variant classes using @each loop
Compile CSS with base + variants
Browser applies styles to elements with variant classes
Sass processes base styles first, then loops through variant definitions to create multiple CSS classes. The browser then applies these styles to elements with matching classes, showing different visual variants.
Render Steps - 3 Steps
Code Added:.btn { padding: 0.5rem 1rem; border: none; color: white; font-weight: bold; border-radius: 0.25rem; cursor: pointer; }
Before
[ ]

[ ]

[ ]
After
[ btn ]

[ btn ]

[ btn ]
Added base button styles giving all buttons padding, white text, rounded corners, and pointer cursor.
🔧 Browser Action:Creates base CSS rules and applies to all elements with class .btn
Code Sample
Three buttons styled with a base .btn class and color variants generated by Sass for primary, secondary, and danger states.
SASS
<button class="btn btn-primary">Primary</button>
<button class="btn btn-secondary">Secondary</button>
<button class="btn btn-danger">Danger</button>
SASS
$variants: (primary: #007bff, secondary: #6c757d, danger: #dc3545);

.btn {
  padding: 0.5rem 1rem;
  border: none;
  color: white;
  font-weight: bold;
  border-radius: 0.25rem;
  cursor: pointer;
}

@each $name, $color in $variants {
  .btn-#{$name} {
    background-color: $color;
  }
}
Render Quiz - 3 Questions
Test your understanding
After applying step 3, what visual difference do the buttons show compared to step 1?
AAll buttons remain the same color with no background
BEach button has a different background color matching its variant
CButtons lose padding and become smaller
DText color changes to black
Common Confusions - 3 Topics
Why do all buttons share the same padding and font styles even though they have different colors?
Because the base .btn class sets common styles like padding and font. The color variants only change background color, so the buttons keep consistent size and shape.
💡 Base styles apply to all variants; variant classes add only what changes visually.
Why doesn't the button change color if I forget to add the variant class like btn-primary?
The background color is set only in the variant classes (e.g., .btn-primary). Without that class, the button uses base styles which have no background color.
💡 Always add the variant class to see the color change.
Why can't I see the variant colors if I write the Sass variable but don't use @each to generate classes?
Sass variables store values but don't create CSS by themselves. You must use loops or mixins to generate actual CSS rules for the variants.
💡 Variables hold data; loops create CSS from that data.
Property Reference
PropertyValue AppliedVisual EffectCommon Use
padding0.5rem 1remAdds space inside button around textMakes button larger and easier to click
background-color#007bff, #6c757d, #dc3545Changes button background color per variantIndicates different button purposes
colorwhiteText color is white for contrastEnsures readability on colored backgrounds
border-radius0.25remRounds button corners slightlyGives modern, friendly look
cursorpointerChanges cursor on hoverShows button is clickable
Concept Snapshot
Component variant generation uses Sass variables and loops to create multiple CSS classes from one base style. Base styles define common look and feel. Variants add specific differences like colors. Use @each to loop through variants and generate CSS. Buttons with variant classes show different backgrounds but share padding and font. This keeps code DRY and consistent visually.

Practice

(1/5)
1. What is the main purpose of component variant generation in Sass?
easy
A. To create multiple style versions of the same component easily
B. To write JavaScript inside Sass files
C. To compile Sass into JavaScript
D. To remove unused CSS automatically

Solution

  1. Step 1: Understand component variants

    Component variants allow creating different styles for the same element, like buttons with different colors.
  2. Step 2: Identify the main purpose

    The main goal is to generate these style versions easily and keep code organized.
  3. Final Answer:

    To create multiple style versions of the same component easily -> Option A
  4. Quick Check:

    Component variant generation = multiple style versions [OK]
Hint: Variants mean different styles for one component [OK]
Common Mistakes:
  • Confusing Sass with JavaScript
  • Thinking Sass compiles to JS
  • Believing variants remove unused CSS
2. Which Sass syntax correctly defines a mixin for generating button variants with a dynamic color?
easy
A. @include button-variant($color) { background-color: $color; }
B. @function button-variant($color) { background-color: $color; }
C. @extend button-variant($color) { background-color: $color; }
D. @mixin button-variant($color) { background-color: $color; }

Solution

  1. Step 1: Identify mixin syntax

    Mixins use '@mixin' to define reusable style blocks with parameters.
  2. Step 2: Check options

    @mixin button-variant($color) { background-color: $color; } uses '@mixin' correctly; others misuse '@function', '@include', or '@extend'.
  3. Final Answer:

    @mixin button-variant($color) { background-color: $color; } -> Option D
  4. Quick Check:

    Mixin definition starts with '@mixin' [OK]
Hint: Define mixins with '@mixin', not '@function' or '@include' [OK]
Common Mistakes:
  • Using '@function' instead of '@mixin'
  • Trying to define styles inside '@include'
  • Confusing '@extend' with mixin definition
3. Given the Sass code:
@mixin variant($name, $color) {
  .btn-#{$name} {
    background-color: $color;
  }
}

@include variant('primary', blue);
@include variant('danger', red);

What CSS will this generate?
medium
A. .btn-primary { background-color: blue; } .btn-danger { background-color: red; }
B. .btn-#primary { background-color: blue; } .btn-#danger { background-color: red; }
C. .btn-primary { color: blue; } .btn-danger { color: red; }
D. .btn-primary { background-color: $color; } .btn-danger { background-color: $color; }

Solution

  1. Step 1: Understand interpolation in class names

    The '#{$name}' inside '.btn-#{$name}' inserts the string value of $name, creating '.btn-primary' and '.btn-danger'.
  2. Step 2: Check property values

    The background-color uses the passed $color values 'blue' and 'red' correctly.
  3. Final Answer:

    .btn-primary { background-color: blue; } .btn-danger { background-color: red; } -> Option A
  4. Quick Check:

    Interpolation creates correct class names [OK]
Hint: Use #{} to insert variables in selectors [OK]
Common Mistakes:
  • Leaving interpolation as literal text
  • Confusing background-color with color property
  • Not passing parameters correctly
4. What is wrong with this Sass code for generating variants?
@mixin variant($name, $color) {
  .btn-$name {
    background-color: $color;
  }
}

@include variant('success', green);
medium
A. Cannot use variables in mixin parameters
B. Incorrect property name 'background-color'
C. Missing interpolation for $name in the selector
D. Mixin cannot be included with parameters

Solution

  1. Step 1: Check selector syntax

    Variables inside selectors need interpolation with '#{}'. Here '.btn-$name' misses '#{}'.
  2. Step 2: Understand interpolation usage

    Correct syntax is '.btn-#{$name}' to insert the variable value.
  3. Final Answer:

    Missing interpolation for $name in the selector -> Option C
  4. Quick Check:

    Use '#{}' to insert variables in selectors [OK]
Hint: Use #{} around variables in selectors [OK]
Common Mistakes:
  • Forgetting interpolation syntax
  • Thinking variables can't be in selectors
  • Misusing mixin parameters
5. You want to generate button variants for 'primary', 'secondary', and 'danger' with colors blue, gray, and red using a Sass map and a mixin. Which code correctly creates all variants with minimal repetition?
hard
A. @mixin variants($map) { .btn { background-color: map-get($map, primary); } } $btn-colors: (primary: blue, secondary: gray, danger: red); @include variants($btn-colors);
B. @mixin variants($map) { @each $name, $color in $map { .btn-#{$name} { background-color: $color; } } } $btn-colors: (primary: blue, secondary: gray, danger: red); @include variants($btn-colors);
C. @mixin variants($map) { @for $i from 1 through length($map) { .btn-#{$i} { background-color: nth($map, $i); } } } $btn-colors: (blue, gray, red); @include variants($btn-colors);
D. @mixin variants($map) { @each $color in $map { .btn-#{$color} { background-color: $color; } } } $btn-colors: (blue, gray, red); @include variants($btn-colors);

Solution

  1. Step 1: Understand map usage with @each

    Using '@each $name, $color in $map' loops over keys and values, perfect for named variants.
  2. Step 2: Check each option's approach

    @mixin variants($map) { @each $name, $color in $map { .btn-#{$name} { background-color: $color; } } } $btn-colors: (primary: blue, secondary: gray, danger: red); @include variants($btn-colors); correctly loops over a map with names and colors, generating '.btn-primary', '.btn-secondary', '.btn-danger' with correct colors.
  3. Step 3: Identify issues in other options

    @mixin variants($map) { .btn { background-color: map-get($map, primary); } } $btn-colors: (primary: blue, secondary: gray, danger: red); @include variants($btn-colors); only styles '.btn' once, ignoring variants. @mixin variants($map) { @for $i from 1 through length($map) { .btn-#{$i} { background-color: nth($map, $i); } } } $btn-colors: (blue, gray, red); @include variants($btn-colors); uses numeric indexes without names. @mixin variants($map) { @each $color in $map { .btn-#{$color} { background-color: $color; } } } $btn-colors: (blue, gray, red); @include variants($btn-colors); loops colors but uses color names as class names incorrectly.
  4. Final Answer:

    @mixin variants($map) { @each $name, $color in $map { .btn-#{$name} { background-color: $color; } } } $btn-colors: (primary: blue, secondary: gray, danger: red); @include variants($btn-colors); -> Option B
  5. Quick Check:

    Use @each with map keys and values for variants [OK]
Hint: Use @each with map keys and values for variant generation [OK]
Common Mistakes:
  • Looping only colors without names
  • Using numeric loops without keys
  • Not generating separate classes per variant