SmoothCSS
  • Introduction
  • Design tokens
  • Global styles
  • Layouts
  • Styling skins
  • Utility classes
  • Customisation

SmoothCSS is in active development

As a result, this documentation and the underlying code will change before a stable release.

Utility classes

Because so much of the styling is already done in the lower layers, there are times when you just need to change one property. And that's where SmoothCSS utilities shine – they do one thing, and they do it well.

Compared to utility-first approaches you'll find the set of SmoothCSS utilities limited, and the class names long.

This is by design.

Unlike utility-first approaches, SmoothCSS isn't trying to recreate every CSS feature as a class. The global and styling skin layers of SmoothCSS are used for generic or complex styles.

And the class names are long because they are similar to the CSS they implement, making them easy to remember. You'll also find that the effort to write out a long list of utility classes will help you know when a styling skin may be a better fit.

A benefit of having a limited set of utility classes is that they are all included in the SmoothCSS file. As a result there is little benefit to adding a complex build step to find which utility classes are used, and purge unused classes. An additional benefit of this approach is you can safely use dynamic class names in your templates and components.

As utility classes apply a single CSS property, or a group of related properties, they can be grouped by property:

  • Alignment
  • Border
  • Color
  • Font size
  • Font weight
  • Gap
  • Margin
  • Padding
  • Stack
  • Visibility
  • Wrapper

Alignment

Align text or items in a flexbox or grid.

Class Styles
text-align-start text-align: start;
text-align-center text-align: center;
text-align-end text-align: end;
align-items-start align-items: start;
align-items-center align-items: center;
align-items-end align-items: end;
justify-content-start justify-content: start;
justify-content-center justify-content: center;
justify-content-end justify-content: end;

Border

All the variants of the border and border radius tokens.

Class Styles
border-outline border: var(--outline);
border-block-outline border-block: var(--outline);
border-block-start-outline border-block-start: var(--outline);
border-block-end-outline border-block-end: var(--outline);
border-inline-outline border-inline: var(--outline);
border-inline-start-outline border-inline-start: var(--outline);
border-inline-end-outline border-inline-end: var(--outline);
border-outline-variant border: var(--outline-variant);
border-block-outline-variant border-block: var(--outline-variant);
border-block-start-outline-variant border-block-start: var(--outline-variant);
border-block-end-outline-variant border-block-end: var(--outline-variant);
border-inline-outline-variant border-inline: var(--outline-variant);
border-inline-start-outline-variant border-inline-start: var(--outline-variant);
border-inline-end-outline-variant border-inline-end: var(--outline-variant);
border-radius-0 border-radius: 0;
border-radius-1 border-radius: var(--border-radius-1);
border-radius-2 border-radius: var(--border-radius-2);
border-radius-3 border-radius: var(--border-radius-3);
border-radius-4 border-radius: var(--border-radius-4);
border-radius-full border-radius: var(--border-radius-full);

Color

Variants of specific colors, and groups of colors to apply to sections of a page and/or components.

Specific colors

Color is applied as either color or background-color depending on whether the design token is for foreground or background.

Class Styles
color-on-surface color: var(--color-on-surface);
color-on-surface-variant color: var(--color-on-surface-variant);
color-primary color: var(--color-primary);
color-on-primary color: var(--color-on-primary);
color-on-primary-container color: var(--color-on-primary-container);
color-outline color: var(--color-outline);
color-outline-variant color: var(--color-outline-variant);
color-error color: var(--color-error);
color-on-error color: var(--color-on-error);
color-on-error-container color: var(--color-on-error-container);
background-color-surface-lowest background-color: var(--color-surface-lowest);
background-color-surface-mid background-color: var(--color-surface-mid);
background-color-surface-highest background-color: var(--color-surface-highest);
background-color-primary background-color: var(--color-primary);
background-color-primary-container background-color: var(--color-primary-container);
background-color-error background-color: var(--color-error);
background-color-error-container background-color: var(--color-error-container);

Button colors

The following color utility classes can be added to the button component class to change the style of the button.

Hard colors, such as primary and error, are reserved for buttons to make primary action clear.

Class Styles
primary
--button-color: var(--color-on-primary);
--button-background: var(--color-primary);
--button-border-color: var(--color-primary);
error
--button-color: var(--color-on-error);
--button-background: var(--color-error);
--button-border-color: var(--color-error);
plain
--button-background: transparent;
--button-border-color: var(--button-hover-color);

Container colors

Container colors change the color scheme of the container they are applied to. This includes the surface colors, on-surface colors, and outlines.

There are the following container utility classes:

  • primary-container
  • error-container

Color scheme

SmoothCSS uses the CSS light-dark() function to change the site's theme based on the user's preference for light or dark mode. This approach also allows us to set an explicit color-scheme property to change a page, section of a page, or element to the light or dark version.

The color scheme utility classes set the color scheme for the container they are applied to, and all its decendents. These sections of the page will remain in the chosen color scheme – they will no longer change with the user's preferences.

There are two color scheme utility classes:

  • color-scheme-light
  • color-scheme-dark

Font size

All the variants of the font step tokens, and the font-size-base.

Class Styles
font-size-1 font-size: var(--step-1);
font-size-2 font-size: var(--step-2);
font-size-3 font-size: var(--step-3);
font-size-4 font-size: var(--step-4);
font-size-5 font-size: var(--step-5);
font-size-6 font-size: var(--step-6);
font-size-7 font-size: var(--step-7);
font-size-8 font-size: var(--step-8);
font-size-base font-size: var(--font-size-base);

Font weight

All the variants used for font weights.

Class Styles
font-weight-regular font-weight: var(--font-weight-regular);
font-weight-medium font-weight: var(--font-weight-medium);
font-weight-semibold font-weight: var(--font-weight-semibold);
font-weight-bold font-weight: var(--font-weight-bold);
font-weight-extra-bold font-weight: var(--font-weight-extra-bold);
font-weight-black font-weight: var(--font-weight-black);
font-weight-heading font-weight: var(--font-weight-heading);
font-weight-body-emphasis font-weight: var(--font-weight-body-emphasis);

Gap

All the variants of the space tokens. Value 0 is used for no gap.

Class Styles
gap-0 gap: 0;
gap-1 gap: var(--space-1);
gap-2 gap: var(--space-2);
gap-3 gap: var(--space-3);
gap-4 gap: var(--space-4);
gap-5 gap: var(--space-5);
gap-6 gap: var(--space-6);
gap-7 gap: var(--space-7);
gap-8 gap: var(--space-8);
gap-9 gap: var(--space-9);
gap-1-2 gap: var(--space-1-2);
gap-2-3 gap: var(--space-2-3);
gap-3-4 gap: var(--space-3-4);
gap-4-5 gap: var(--space-4-5);
gap-5-6 gap: var(--space-5-6);
gap-6-7 gap: var(--space-6-7);
gap-7-8 gap: var(--space-7-8);
gap-8-9 gap: var(--space-8-9);

Margin

All variations of margin combinations and space tokens. Value 0 is used for no margin.

Class Styles
margin-0 margin: 0;
margin-1 margin: var(--space-1);
margin-2 margin: var(--space-2);
margin-3 margin: var(--space-3);
margin-4 margin: var(--space-4);
margin-5 margin: var(--space-5);
margin-6 margin: var(--space-6);
margin-7 margin: var(--space-7);
margin-8 margin: var(--space-8);
margin-9 margin: var(--space-9);
margin-1-2 margin: var(--space-1-2);
margin-2-3 margin: var(--space-2-3);
margin-3-4 margin: var(--space-3-4);
margin-4-5 margin: var(--space-4-5);
margin-5-6 margin: var(--space-5-6);
margin-6-7 margin: var(--space-6-7);
margin-7-8 margin: var(--space-7-8);
margin-8-9 margin: var(--space-8-9);
margin-block-0 margin-block: 0;
margin-block-1 margin-block: var(--space-1);
margin-block-2 margin-block: var(--space-2);
margin-block-3 margin-block: var(--space-3);
margin-block-4 margin-block: var(--space-4);
margin-block-5 margin-block: var(--space-5);
margin-block-6 margin-block: var(--space-6);
margin-block-7 margin-block: var(--space-7);
margin-block-8 margin-block: var(--space-8);
margin-block-9 margin-block: var(--space-9);
margin-block-1-2 margin-block: var(--space-1-2);
margin-block-2-3 margin-block: var(--space-2-3);
margin-block-3-4 margin-block: var(--space-3-4);
margin-block-4-5 margin-block: var(--space-4-5);
margin-block-5-6 margin-block: var(--space-5-6);
margin-block-6-7 margin-block: var(--space-6-7);
margin-block-7-8 margin-block: var(--space-7-8);
margin-block-8-9 margin-block: var(--space-8-9);
margin-block-start-0 margin-block-start: 0;
margin-block-start-1 margin-block-start: var(--space-1);
margin-block-start-2 margin-block-start: var(--space-2);
margin-block-start-3 margin-block-start: var(--space-3);
margin-block-start-4 margin-block-start: var(--space-4);
margin-block-start-5 margin-block-start: var(--space-5);
margin-block-start-6 margin-block-start: var(--space-6);
margin-block-start-7 margin-block-start: var(--space-7);
margin-block-start-8 margin-block-start: var(--space-8);
margin-block-start-9 margin-block-start: var(--space-9);
margin-block-start-1-2 margin-block-start: var(--space-1-2);
margin-block-start-2-3 margin-block-start: var(--space-2-3);
margin-block-start-3-4 margin-block-start: var(--space-3-4);
margin-block-start-4-5 margin-block-start: var(--space-4-5);
margin-block-start-5-6 margin-block-start: var(--space-5-6);
margin-block-start-6-7 margin-block-start: var(--space-6-7);
margin-block-start-7-8 margin-block-start: var(--space-7-8);
margin-block-start-8-9 margin-block-start: var(--space-8-9);
margin-block-end-0 margin-block-end: 0;
margin-block-end-1 margin-block-end: var(--space-1);
margin-block-end-2 margin-block-end: var(--space-2);
margin-block-end-3 margin-block-end: var(--space-3);
margin-block-end-4 margin-block-end: var(--space-4);
margin-block-end-5 margin-block-end: var(--space-5);
margin-block-end-6 margin-block-end: var(--space-6);
margin-block-end-7 margin-block-end: var(--space-7);
margin-block-end-8 margin-block-end: var(--space-8);
margin-block-end-9 margin-block-end: var(--space-9);
margin-block-end-1-2 margin-block-end: var(--space-1-2);
margin-block-end-2-3 margin-block-end: var(--space-2-3);
margin-block-end-3-4 margin-block-end: var(--space-3-4);
margin-block-end-4-5 margin-block-end: var(--space-4-5);
margin-block-end-5-6 margin-block-end: var(--space-5-6);
margin-block-end-6-7 margin-block-end: var(--space-6-7);
margin-block-end-7-8 margin-block-end: var(--space-7-8);
margin-block-end-8-9 margin-block-end: var(--space-8-9);
margin-inline-0 margin-inline: 0;
margin-inline-1 margin-inline: var(--space-1);
margin-inline-2 margin-inline: var(--space-2);
margin-inline-3 margin-inline: var(--space-3);
margin-inline-4 margin-inline: var(--space-4);
margin-inline-5 margin-inline: var(--space-5);
margin-inline-6 margin-inline: var(--space-6);
margin-inline-7 margin-inline: var(--space-7);
margin-inline-8 margin-inline: var(--space-8);
margin-inline-9 margin-inline: var(--space-9);
margin-inline-1-2 margin-inline: var(--space-1-2);
margin-inline-2-3 margin-inline: var(--space-2-3);
margin-inline-3-4 margin-inline: var(--space-3-4);
margin-inline-4-5 margin-inline: var(--space-4-5);
margin-inline-5-6 margin-inline: var(--space-5-6);
margin-inline-6-7 margin-inline: var(--space-6-7);
margin-inline-7-8 margin-inline: var(--space-7-8);
margin-inline-8-9 margin-inline: var(--space-8-9);
margin-inline-start-0 margin-inline-start: 0;
margin-inline-start-1 margin-inline-start: var(--space-1);
margin-inline-start-2 margin-inline-start: var(--space-2);
margin-inline-start-3 margin-inline-start: var(--space-3);
margin-inline-start-4 margin-inline-start: var(--space-4);
margin-inline-start-5 margin-inline-start: var(--space-5);
margin-inline-start-6 margin-inline-start: var(--space-6);
margin-inline-start-7 margin-inline-start: var(--space-7);
margin-inline-start-8 margin-inline-start: var(--space-8);
margin-inline-start-9 margin-inline-start: var(--space-9);
margin-inline-start-1-2 margin-inline-start: var(--space-1-2);
margin-inline-start-2-3 margin-inline-start: var(--space-2-3);
margin-inline-start-3-4 margin-inline-start: var(--space-3-4);
margin-inline-start-4-5 margin-inline-start: var(--space-4-5);
margin-inline-start-5-6 margin-inline-start: var(--space-5-6);
margin-inline-start-6-7 margin-inline-start: var(--space-6-7);
margin-inline-start-7-8 margin-inline-start: var(--space-7-8);
margin-inline-start-8-9 margin-inline-start: var(--space-8-9);
margin-inline-end-0 margin-inline-end: 0;
margin-inline-end-1 margin-inline-end: var(--space-1);
margin-inline-end-2 margin-inline-end: var(--space-2);
margin-inline-end-3 margin-inline-end: var(--space-3);
margin-inline-end-4 margin-inline-end: var(--space-4);
margin-inline-end-5 margin-inline-end: var(--space-5);
margin-inline-end-6 margin-inline-end: var(--space-6);
margin-inline-end-7 margin-inline-end: var(--space-7);
margin-inline-end-8 margin-inline-end: var(--space-8);
margin-inline-end-9 margin-inline-end: var(--space-9);
margin-inline-end-1-2 margin-inline-end: var(--space-1-2);
margin-inline-end-2-3 margin-inline-end: var(--space-2-3);
margin-inline-end-3-4 margin-inline-end: var(--space-3-4);
margin-inline-end-4-5 margin-inline-end: var(--space-4-5);
margin-inline-end-5-6 margin-inline-end: var(--space-5-6);
margin-inline-end-6-7 margin-inline-end: var(--space-6-7);
margin-inline-end-7-8 margin-inline-end: var(--space-7-8);
margin-inline-end-8-9 margin-inline-end: var(--space-8-9);

Padding

All variations of padding combinations and space tokens. Value 0 is used for no padding.

Class Styles
padding-0 padding: 0;
padding-1 padding: var(--space-1);
padding-2 padding: var(--space-2);
padding-3 padding: var(--space-3);
padding-4 padding: var(--space-4);
padding-5 padding: var(--space-5);
padding-6 padding: var(--space-6);
padding-7 padding: var(--space-7);
padding-8 padding: var(--space-8);
padding-9 padding: var(--space-9);
padding-1-2 padding: var(--space-1-2);
padding-2-3 padding: var(--space-2-3);
padding-3-4 padding: var(--space-3-4);
padding-4-5 padding: var(--space-4-5);
padding-5-6 padding: var(--space-5-6);
padding-6-7 padding: var(--space-6-7);
padding-7-8 padding: var(--space-7-8);
padding-8-9 padding: var(--space-8-9);
padding-block-0 padding-block: 0;
padding-block-1 padding-block: var(--space-1);
padding-block-2 padding-block: var(--space-2);
padding-block-3 padding-block: var(--space-3);
padding-block-4 padding-block: var(--space-4);
padding-block-5 padding-block: var(--space-5);
padding-block-6 padding-block: var(--space-6);
padding-block-7 padding-block: var(--space-7);
padding-block-8 padding-block: var(--space-8);
padding-block-9 padding-block: var(--space-9);
padding-block-1-2 padding-block: var(--space-1-2);
padding-block-2-3 padding-block: var(--space-2-3);
padding-block-3-4 padding-block: var(--space-3-4);
padding-block-4-5 padding-block: var(--space-4-5);
padding-block-5-6 padding-block: var(--space-5-6);
padding-block-6-7 padding-block: var(--space-6-7);
padding-block-7-8 padding-block: var(--space-7-8);
padding-block-8-9 padding-block: var(--space-8-9);
padding-block-start-0 padding-block-start: 0;
padding-block-start-1 padding-block-start: var(--space-1);
padding-block-start-2 padding-block-start: var(--space-2);
padding-block-start-3 padding-block-start: var(--space-3);
padding-block-start-4 padding-block-start: var(--space-4);
padding-block-start-5 padding-block-start: var(--space-5);
padding-block-start-6 padding-block-start: var(--space-6);
padding-block-start-7 padding-block-start: var(--space-7);
padding-block-start-8 padding-block-start: var(--space-8);
padding-block-start-9 padding-block-start: var(--space-9);
padding-block-start-1-2 padding-block-start: var(--space-1-2);
padding-block-start-2-3 padding-block-start: var(--space-2-3);
padding-block-start-3-4 padding-block-start: var(--space-3-4);
padding-block-start-4-5 padding-block-start: var(--space-4-5);
padding-block-start-5-6 padding-block-start: var(--space-5-6);
padding-block-start-6-7 padding-block-start: var(--space-6-7);
padding-block-start-7-8 padding-block-start: var(--space-7-8);
padding-block-start-8-9 padding-block-start: var(--space-8-9);
padding-block-end-0 padding-block-end: 0;
padding-block-end-1 padding-block-end: var(--space-1);
padding-block-end-2 padding-block-end: var(--space-2);
padding-block-end-3 padding-block-end: var(--space-3);
padding-block-end-4 padding-block-end: var(--space-4);
padding-block-end-5 padding-block-end: var(--space-5);
padding-block-end-6 padding-block-end: var(--space-6);
padding-block-end-7 padding-block-end: var(--space-7);
padding-block-end-8 padding-block-end: var(--space-8);
padding-block-end-9 padding-block-end: var(--space-9);
padding-block-end-1-2 padding-block-end: var(--space-1-2);
padding-block-end-2-3 padding-block-end: var(--space-2-3);
padding-block-end-3-4 padding-block-end: var(--space-3-4);
padding-block-end-4-5 padding-block-end: var(--space-4-5);
padding-block-end-5-6 padding-block-end: var(--space-5-6);
padding-block-end-6-7 padding-block-end: var(--space-6-7);
padding-block-end-7-8 padding-block-end: var(--space-7-8);
padding-block-end-8-9 padding-block-end: var(--space-8-9);
padding-inline-0 padding-inline: 0;
padding-inline-1 padding-inline: var(--space-1);
padding-inline-2 padding-inline: var(--space-2);
padding-inline-3 padding-inline: var(--space-3);
padding-inline-4 padding-inline: var(--space-4);
padding-inline-5 padding-inline: var(--space-5);
padding-inline-6 padding-inline: var(--space-6);
padding-inline-7 padding-inline: var(--space-7);
padding-inline-8 padding-inline: var(--space-8);
padding-inline-9 padding-inline: var(--space-9);
padding-inline-1-2 padding-inline: var(--space-1-2);
padding-inline-2-3 padding-inline: var(--space-2-3);
padding-inline-3-4 padding-inline: var(--space-3-4);
padding-inline-4-5 padding-inline: var(--space-4-5);
padding-inline-5-6 padding-inline: var(--space-5-6);
padding-inline-6-7 padding-inline: var(--space-6-7);
padding-inline-7-8 padding-inline: var(--space-7-8);
padding-inline-8-9 padding-inline: var(--space-8-9);
padding-inline-start-0 padding-inline-start: 0;
padding-inline-start-1 padding-inline-start: var(--space-1);
padding-inline-start-2 padding-inline-start: var(--space-2);
padding-inline-start-3 padding-inline-start: var(--space-3);
padding-inline-start-4 padding-inline-start: var(--space-4);
padding-inline-start-5 padding-inline-start: var(--space-5);
padding-inline-start-6 padding-inline-start: var(--space-6);
padding-inline-start-7 padding-inline-start: var(--space-7);
padding-inline-start-8 padding-inline-start: var(--space-8);
padding-inline-start-9 padding-inline-start: var(--space-9);
padding-inline-start-1-2 padding-inline-start: var(--space-1-2);
padding-inline-start-2-3 padding-inline-start: var(--space-2-3);
padding-inline-start-3-4 padding-inline-start: var(--space-3-4);
padding-inline-start-4-5 padding-inline-start: var(--space-4-5);
padding-inline-start-5-6 padding-inline-start: var(--space-5-6);
padding-inline-start-6-7 padding-inline-start: var(--space-6-7);
padding-inline-start-7-8 padding-inline-start: var(--space-7-8);
padding-inline-start-8-9 padding-inline-start: var(--space-8-9);
padding-inline-end-0 padding-inline-end: 0;
padding-inline-end-1 padding-inline-end: var(--space-1);
padding-inline-end-2 padding-inline-end: var(--space-2);
padding-inline-end-3 padding-inline-end: var(--space-3);
padding-inline-end-4 padding-inline-end: var(--space-4);
padding-inline-end-5 padding-inline-end: var(--space-5);
padding-inline-end-6 padding-inline-end: var(--space-6);
padding-inline-end-7 padding-inline-end: var(--space-7);
padding-inline-end-8 padding-inline-end: var(--space-8);
padding-inline-end-9 padding-inline-end: var(--space-9);
padding-inline-end-1-2 padding-inline-end: var(--space-1-2);
padding-inline-end-2-3 padding-inline-end: var(--space-2-3);
padding-inline-end-3-4 padding-inline-end: var(--space-3-4);
padding-inline-end-4-5 padding-inline-end: var(--space-4-5);
padding-inline-end-5-6 padding-inline-end: var(--space-5-6);
padding-inline-end-6-7 padding-inline-end: var(--space-6-7);
padding-inline-end-7-8 padding-inline-end: var(--space-7-8);
padding-inline-end-8-9 padding-inline-end: var(--space-8-9);

Stack

Like the stack layout the stack utility classes add space between vertical elements by adding margin to the top of all but the first element.

The stack utility classes make it easy to space elements based on the space tokens. As the stack works on immediate children only, stack utility classes can be nested.

Class Styles
stack-1 margin-block-start: var(--space-1);
stack-2 margin-block-start: var(--space-2);
stack-3 margin-block-start: var(--space-3);
stack-4 margin-block-start: var(--space-4);
stack-5 margin-block-start: var(--space-5);
stack-6 margin-block-start: var(--space-6);
stack-7 margin-block-start: var(--space-7);
stack-8 margin-block-start: var(--space-8);
stack-9 margin-block-start: var(--space-9);
stack-1-2 margin-block-start: var(--space-1-2);
stack-2-3 margin-block-start: var(--space-2-3);
stack-3-4 margin-block-start: var(--space-3-4);
stack-4-5 margin-block-start: var(--space-4-5);
stack-5-6 margin-block-start: var(--space-5-6);
stack-6-7 margin-block-start: var(--space-6-7);
stack-7-8 margin-block-start: var(--space-7-8);
stack-8-9 margin-block-start: var(--space-8-9);

Visibility

The visually-hidden class hides content visually in the UI, but leaves it accessible to screen readers.

There is no utility class in SmoothCSS to set display: none;. To hide and display content use the hidden attribute instead.

Class Styles
visually-hidden
position: absolute;
clip: rect(0 0 0 0);
clip-path: inset(50%);
height: 1px;
width: 1px;
overflow: hidden;
white-space: nowrap;

Wrapper

The wrapper utility classes make it easy to add a wrapper layout of a specific container size. Like the wrapper layout, the content will be the width of the container (padding and border are outside the container width).

The utility classes can be used on their own – you don't need to add the generic wrapper class.

Class Styles
wrapper-1 --wrapper-max-inline-size: var(--container-1);
wrapper-2 --wrapper-max-inline-size: var(--container-2);
wrapper-3 --wrapper-max-inline-size: var(--container-3);
wrapper-4 --wrapper-max-inline-size: var(--container-4);
wrapper-5 --wrapper-max-inline-size: var(--container-5);
wrapper-6 --wrapper-max-inline-size: var(--container-6);
wrapper-7 --wrapper-max-inline-size: var(--container-7);
wrapper-8 --wrapper-max-inline-size: var(--container-8);
wrapper-9 --wrapper-max-inline-size: var(--container-9);
wrapper-10 --wrapper-max-inline-size: var(--container-10);
wrapper-11 --wrapper-max-inline-size: var(--container-11);
wrapper-12 --wrapper-max-inline-size: var(--container-12);