Understand Before You Build

  • HTML
    • Form
    • HTML pattern Attribute
  • CSS
    • inset
    • scroll-snap-type
    • margin-inline
    • Content-visibility
    • Scroll-Driven Animations
    • Isolation
    • @Container
    • @layer
    • :not()
    • :is()
    • :Where()
    • :has()
    • :target
    • backdrop-filter
    • :root
    • Color-scheme
    • Animations
    • Selectors
    • Object-fit
    • Logical Pseudo-Classes
    • :scope
    • Properties
    • Performance
    • Aspect-ratio
    • State Pseudo-Classes
    • Positioning
    • Resize
    • Structural Pseudo-Classes
    • Responsive Design
    • Units
    • Root & Scope Selectors
    • Scrolling
    • At-Rules
    • Target & URL Selectors
    • Spacing
    • Functions
    • Attribute Selectors
    • Layouts
    • Basic Selectors
    • Filters & Effects
    • Colors & Typography
    • Flexbox
    • Combinator Selectors
    • Grid
    • Form & UI State Selectors
    • AI CSS Generator
  • Sass
    • Variables
    • Nesting
    • Mixins
    • Reusable styles
    • Large project management
  • CSS Frameworks
    • Material UI
    • Bootstrap
    • Tailwind CSS
  • React UI
    • Performance Optimization
    • React.memo
    • useMemo
    • useCallback
    • Lazy Loading
    • Code Splitting
    • Virtual DOM Optimization
    • Preventing Re-renders
    • Props & State
    • Hooks
    • Component-based architecture
    • State-driven UI updates
  • Figma
    • Design systems
    • Tokens
    • Variables
    • Auto layout
    • Component variants
    • Design handoff
    • UI consistency

Better CSS organization

SASS stands for Syntactically Awesome Style Sheets.

It is a CSS preprocessor that adds advanced features on top of normal CSS.

Developers write code in SASS/SCSS, and it finally gets compiled into standard CSS.

Why SASS Was Created?

As projects became larger, managing normal CSS became difficult.

Common Problems in Large CSS Files

  • Repeated code
  • Large files
  • Difficult maintenance
  • Duplicate colors and spacing
  • Poor structure

SASS solves these problems using features like:

  • Variables
  • Nesting
  • Mixins
  • Functions
  • Partials
  • Reusable structure

SASS vs SCSS

Both are almost the same.

SCSS is the modern and most commonly used syntax.


SCSS Syntax

[code theme="dark"] .card{ color:red; } [/code]

Looks similar to normal CSS.


SASS Syntax

[code theme="dark"] .card color: red [/code]

No brackets and semicolons.


Why Developers Prefer SCSS?

  • Looks like normal CSS
  • Easier to learn
  • Better readability
  • Direct CSS compatibility

How SASS Works?

Developer writes:

[code theme="dark"] style.scss [/code]

Then it compiles into:

[code theme="dark"] style.css [/code]

Example

SCSS

[code theme="dark"] $primary:red; .button{ background:$primary; } [/code]

Compiled CSS

[code theme="dark"] .button{ background:red; } [/code]

1. Variables

Variables store reusable values.


SCSS Variable Example

[code theme="dark"] $primary-color:#ff6600; $text-color:#333; $radius:12px; .button{ background:$primary-color; color:$text-color; border-radius:$radius; } [/code]

Advantages of Variables

  • Reusable values
  • Easy theme updates
  • Cleaner code
  • Better consistency

2. Nesting

Nesting creates cleaner component structure.


Example

[code theme="dark"] .card{ padding:20px; h2{ font-size:24px; } p{ color:gray; } } [/code]

Compiled CSS

[code theme="dark"] .card{ padding:20px; } .card h2{ font-size:24px; } .card p{ color:gray; } [/code]

Nesting Problem

Too much nesting creates difficult CSS.

Bad Example

[code theme="dark"] .main{ .wrapper{.card{ .content{ .title{ color:red; } } }} } [/code]

Keep nesting limited.


3. Partials

Large SCSS projects are divided into smaller files.


Example Structure

[code theme="dark"] _base.scss _header.scss _footer.scss _buttons.scss [/code]

Import Files

[code theme="dark"] @import "header"; @import "buttons"; [/code]

Modern Alternative

[code theme="dark"] @use "header"; [/code]

4. Mixins

Mixins create reusable blocks of CSS.


Mixin Example

[code theme="dark"] @mixin flex-center{ display:flex; justify-content:center; align-items:center; } [/code]

Use Mixin

[code theme="dark"] .card{ @include flex-center; } [/code]

Compiled CSS

[code theme="dark"] .card{ display:flex; justify-content:center; align-items:center; } [/code]

Mixin with Parameters

[code theme="dark"] @mixin button($bg){ background:$bg; padding:12px 20px; border-radius:8px; } [/code]

Use Example

[code theme="dark"] .primary-btn{ @include button(blue); } [/code]

5. Extend

Shares styles between classes.

[code theme="dark"] .button{ padding:12px 20px; } .primary-btn{ @extend .button; background:blue; } [/code]

6. Functions

SASS supports custom functions.

[code theme="dark"] @function double($size){ @return $size * 2; } .box{ width:double(100px); } [/code]

7. Operators

SASS supports calculations.

[code theme="dark"] .container{ width:100% - 20%; } [/code]

8. Loops

Useful for repeated styles.

[code theme="dark"] @for $i from 1 through 3{ .m-#{$i}{ margin:#{$i * 10}px; } } [/code]

Generated CSS

[code theme="dark"] .m-1{ margin:10px; } .m-2{ margin:20px; } [/code]

SASS Folder Structure Example

[code theme="dark"] scss/ abstracts/ base/ components/ layout/ pages/ utilities/ [/code]

Component Based SCSS

Modern frontend projects organize styles by components.


Example

[code theme="dark"] Button.scss Card.scss Navbar.scss [/code]

SASS in React Projects

Install:

[code theme="dark"] npm install sass [/code]

Import SCSS

[code theme="dark"] import "./App.scss"; [/code]

SCSS Module Example

[code theme="dark"] import styles from "./Button.module.scss"; [/code]

In large projects, writing all SCSS inside one file becomes difficult.

So developers split styles into smaller reusable files called Partials.


What are Partials in SCSS?

Partials are small SCSS files created for reusable or modular styling.

They are usually used for:

  • Buttons
  • Variables
  • Header styles
  • Footer styles
  • Mixins
  • Layout styles

Why Underscore (_) is Used?

SCSS partial files start with an underscore (_).

Example

[code theme="dark"] _variables.scss _buttons.scss _header.scss [/code]

Purpose of Underscore

The underscore tells Sass:

"Do not compile this file separately into CSS."

These files are meant to be imported into another SCSS file.


Without Underscore

[code theme="dark"] buttons.scss [/code]

SASS may generate:

[code theme="dark"] buttons.css [/code]

With Underscore

[code theme="dark"] _buttons.scss [/code]

No separate CSS file is generated.


Common SCSS Folder Structure

[code theme="dark"] scss/ abstracts/ _variables.scss _mixins.scss base/ _reset.scss _typography.scss components/ _button.scss _card.scss layout/ _header.scss _footer.scss main.scss [/code]

Main SCSS File

main.scss usually imports all partial files.


Old Import Method

[code theme="dark"] @import "abstracts/variables"; @import "abstracts/mixins"; @import "components/button"; [/code]

You do not need to write:

  • underscore (_)
  • .scss extension

SASS automatically understands it.


Modern Method: @use

@import is now deprecated.

Modern projects use:

[code theme="dark"] @use "abstracts/variables"; @use "components/button"; [/code]

Why @use is Better?

  • Avoids global conflicts
  • Better performance
  • Cleaner architecture
  • Safer variable handling

Variables with @use

_variables.scss

[code theme="dark"] $primary-color:#ff6600; [/code]

main.scss

[code theme="dark"] @use "abstracts/variables"; .button{ background:variables.$primary-color; } [/code]

Why Prefix Needed?

With @use, variables become namespaced.

This prevents naming conflicts.


Using "as *"

If you want direct access without prefix:

[code theme="dark"] @use "abstracts/variables" as *; .button{ background:$primary-color; } [/code]

But avoid overusing this in large projects.


Mixin Import Example

_mixins.scss

[code theme="dark"] @mixin flex-center{ display:flex; justify-content:center; align-items:center; } [/code]

main.scss

[code theme="dark"] @use "abstracts/mixins"; .card{ @include mixins.flex-center; } [/code]

Component Partial Example

_button.scss

[code theme="dark"] .button{ padding:12px 20px; border-radius:8px; } [/code]

main.scss

[code theme="dark"] @use "components/button"; [/code]

What Happens After Compilation?

All imported partials combine into one CSS file.


Compiled Output

[code theme="dark"] main.css [/code]

This final CSS is loaded into the browser.


SCSS Compilation

SASS converts:

[code theme="dark"] SCSS → CSS [/code]

Install Sass

[code theme="dark"] npm install sass [/code]

Watch Mode

Automatically compiles SCSS when files change.

[code theme="dark"] sass --watch scss:css [/code]

React Example

Import SCSS File

[code theme="dark"] import "./App.scss"; [/code]

SCSS Module Example

[code theme="dark"] Button.module.scss [/code]

Import Module

[code theme="dark"] import styles from "./Button.module.scss"; [/code]

Use Class

[code theme="dark"] [/code]

Benefits of Partials

  • Cleaner project structure
  • Easy maintenance
  • Reusable code
  • Scalable architecture
  • Better teamwork

SCSS partials help organize large frontend projects in a clean and scalable way.


Common SCSS Architecture

Folder Purpose
abstracts Variables, mixins, functions
base Reset and typography
components Buttons, cards, modals
layout Header, footer, sidebar
pages Page-specific styles

Tailwind vs SCSS

Tailwind SCSS
Utility-first Traditional styling
Faster UI development Better custom styling control
Classes inside HTML Separate stylesheet structure
Smaller custom CSS needed Full custom CSS architecture

Advantages of SASS

  • Cleaner code
  • Reusable styles
  • Better project structure
  • Easy maintenance
  • Powerful features
  • Scalable CSS architecture

Common Problems in SCSS

  • Too much nesting
  • Very large files
  • Duplicate mixins
  • Poor naming conventions
  • Overcomplicated architecture

Best Practices

  • Keep nesting limited
  • Use variables properly
  • Create reusable mixins
  • Use component-based structure
  • Avoid duplicate styles
  • Keep files modular
  • Use partials for modular structure
  • Prefer @use over @import
  • Keep files small and reusable
  • Avoid deep nesting
  • Use variables and mixins properly

Quick Summary

  • Partials → Small reusable SCSS files
  • _underscore → Prevents separate CSS compilation
  • @import → Old import method
  • @use → Modern recommended method
  • main.scss → Main file importing all partials
  • SCSS compiles into CSS
  • SASS → CSS preprocessor
  • SCSS → Modern SASS syntax
  • Variables → Reusable values
  • Nesting → Cleaner structure
  • Mixins → Reusable CSS blocks
  • Partials → Modular files
  • Compilation → SCSS converts into CSS

SASS helps developers write cleaner, scalable, and maintainable CSS for modern frontend projects.