Skip to main content
felt-css, spelled in stitched felt letters

Bootstrap, but made of wool felt

A small, dependency-free CSS toolkit with Bootstrap 5 class names and two looks: a clean one for everyday work, and a cosy one where every card is cut from felt and every button is sewn on by hand.

Public domain · CSS only · about 33 KB gzipped plus 42 KB of felt photos

Get started in a minute#

No build step and no package to install. Copy felt.css and the img/ folder next to it, link the stylesheet and switch on the felt look with one attribute. Bring Bootstrap's own JavaScript for dropdowns, modals and friends.

Read the quick start →
<html data-look="felt">   <!-- leave it out for the clean look -->
<head>
  <link rel="stylesheet" href="felt.css">
</head>
<body>
  <div class="card">
    <div class="card-header">New expense</div>
    <div class="card-body">…</div>
    <div class="card-footer">
      <button class="btn">Cancel</button>
      <button class="btn btn-primary">Save</button>
    </div>
  </div>
</body>

Bootstrap names#

Same classes, same markup, same JavaScript. If you know Bootstrap 5.3 you already know felt-css; most pages of these docs are Bootstrap's own, trimmed to what is here.

Two looks, one layout#

The felt layer only swaps colours, textures, shadows and seams — never padding, borders or fonts. Toggle the look and not a single pixel moves. How the felt works

Light and dark#

Dark mode works like Bootstrap's: data-bs-theme on any element, or the system setting. Dark felt is charcoal. Color modes

Grid and utilities#

Bootstrap's flex grid and all of its 5.3 utilities, responsive at sm, md and lg. Grid · Utilities

Re-dye it#

Every colour is a custom property written as light-dark(). Override --primary and friends and the whole sheet takes the new dye. Color

Your CSS wins#

All felt rules live in @layer felt behind :where(), with zero specificity. Whatever you write on top simply applies.

See it sewn together#

Three small apps built from nothing but felt-css: a smart-home dashboard, a shared-expenses app and a blog.

Browse examples