CSS is Awesome

Get started in 5 minutes

Paste one HTML snippet, open it in a browser, and you are looking at a themed page. No build step, no config, no framework. When you are ready to re-skin, you change exactly one line.

Minimum setup

Prerequisites: any modern browser. No Node, no bundler, no build step. The stylesheets below are served from jsDelivr, auto-mirrored from the npm package — theme first so the base can read its tokens.

<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>Hello, sketchbook</title>
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/css-is-awesome@1/public/themes/sketchbook-light/theme.css">
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/css-is-awesome@1/dist/css-is-awesome.min.css">
</head>
<body>
  <main class="cia-mx-auto cia-p-6 cia-flex-col cia-gap-4">
    <h1>Hello, sketchbook</h1>
    <p class="cia-text-text-secondary">Swap the theme file and this page re-skins.</p>
  </main>
</body>
</html>

Save that as index.html, open it — you are done. That is the entire 1-minute track.

Those classes are utilities — spacing, layout, text and animation. There are 746 of them and they are the whole of what a stylesheet drop-in gives you, alongside the tokens and resets. There are no component classes: no .cia-btn, no .cia-card. Components come from mixins, which need a Sass build — that is the next section — or from the bare-tags recipe, which styles ordinary <button> and <table> elements with no classes at all.

Your first themed element

Every element in the system reads from the active theme's tokens. Here is a button and a card rendered live on this page, followed by the SCSS that produced them — this is the real source of the two components above, not a paraphrase. The class names are ours; cia supplies only the mixin.

Get startedRead the docs

Warm paper, sumi ink

The card inherits its paper colour, border and serif title from the active theme. Swap the theme and this block re-skins without a single markup change.

// Button.module.scss
@use 'css-is-awesome/scss/components/buttons' as m;

.primary { @include m.btn(primary); }
.outline { @include m.btn(outline); }

// Card.module.scss
@use 'css-is-awesome/scss/components/data' as d;

.card {
  @include d.card-base($border: true);
  @include d.card-interactive;
}

Three bundle tiers

Pick the smallest bundle that covers your needs — they all read the same theme tokens, so you can start with core and graduate to full later without changing markup.

The /compare page shows these sizes next to Tailwind's and Bootstrap's equivalents.

Utility class, or SCSS mixin

The same button is reachable two ways. If you have no build step, drop the utility class on a tag. If you have a Sass build, call the mixin from your own selector — every variant the utility class ships rides through to the mixin and back.

<!-- Tier 3: no classes at all - the bare-tags recipe styles the element -->
<button>Get started</button>

// Tier 2: same output, via the SCSS mixin
@use 'css-is-awesome/scss/components/buttons' as b;

.hero-cta {
  @include b.btn(primary);
}

Swap the theme

Themes are single files. The base stylesheet never hard-codes a colour, a radius or a font — it reads them from CSS custom properties the theme defines. Re-skinning the entire site is one <link> change:

/* before — sketchbook */
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/css-is-awesome@1/public/themes/sketchbook-light/theme.css">

/* after — press */
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/css-is-awesome@1/public/themes/press/theme.css">

The ThemePicker in the site header does exactly that live — pick another theme from the menu and every preview on this page, including the button and card above, re-skins as you scroll. No reload, no rebuild. That is the entire theme contract.

What next

Theme