Lab 12: CSS Architecture

Time: 30 minutes | Level: Practitioner | Docker: docker run -it --rm node:20-alpine sh

Overview

Learn scalable CSS organization with BEM naming, ITCSS layers, Tailwind utility-first concepts, CSS Modules scoping, and stylelint configuration.


Step 1: BEM — Block, Element, Modifier

BEM is a naming convention that creates self-documenting, non-conflicting CSS class names.

block           — standalone component   (.card)
block__element  — child part of block    (.card__title)
block--modifier — variant of block       (.card--featured)
block__element--modifier — variant child (.card__title--large)
<!-- BEM HTML structure -->
<article class="card card--featured">
  <div class="card__media">
    <img class="card__image" src="..." alt="...">
    <span class="card__badge">New</span>
  </div>
  <div class="card__body">
    <h2 class="card__title card__title--large">Article Title</h2>
    <p class="card__text">Description text here...</p>
    <footer class="card__footer">
      <button class="btn btn--primary">Read More</button>
      <button class="btn btn--ghost btn--sm">Save</button>
    </footer>
  </div>
</article>

Step 2: ITCSS — Inverted Triangle CSS

ITCSS organizes CSS by specificity and reach (general → specific):


Step 3: Tailwind Utility-First Concepts


Step 4: CSS Modules Scoping


Step 5: Stylelint Configuration


Step 6: Writing Maintainable CSS


Step 7: CSS Layers + Architecture Combined


Step 8: Capstone — Stylelint Validation

📸 Verified Output:


Summary

Method
Pattern
Best For

BEM

.block__el--mod

Naming convention

ITCSS

Settings→Utilities layers

File organization

@layer

@layer components {}

Cascade control

Tailwind

class="p-4 flex"

Rapid prototyping

CSS Modules

import styles from '.module.css'

Component scoping

Stylelint

.stylelintrc.json

Enforce standards

Logical props

padding-inline

i18n-ready CSS

Custom props

--space-lg: 2rem

Design tokens

Last updated