Class syntax

Atomizer follow a strict syntax, which makes the classnames easier to interpret by humans.

Syntax

[<context>[:<pseudo-class>]<combinator>]<Style>[(<value>,<value>?,...)][<!>][:<pseudo-class>][::<pseudo-element>][--<breakpoint_identifier>]

At its core, an Atomizer or Helper class is represented by a <Style>.

Atomizer classes typically require one <value>, enclosed in parentheses, though some classes may accept more (e.g., the helper class LineClamp() accepts two.) Helper classes may not require a <value>, in which case the parentheses may be omitted.

Optionally, you may prefix the style with a <context> class and <combinator>. The context class may optionally include a <pseudo-class>.

You may also optionally suffix the style with <!> (for !important), a <pseudo-class>, a <pseudo-element>, and a <breakpoint_identifier>.

RTL/LTR

Any occurrence of left and right keywords or their abbreviated form ala Emmet (i.e., l and r) in <Style> or <value> must be replaced with the keywords start and end. Atomizer will automatically translate the CSS output for left-to-right (LTR) or right-to-left (RTL) depending on options passed during execution.

For example, Mend(2px) maps to margin-right: 2px in an LTR context and margin-left: 2px in an RTL context, and Pstart(1em) would map to padding-left: 1em in an LTR context, etc.

Examples

HTML classes What they do
D(n) This is mapped to display: none
D(n)! This is mapped to display: none !important
Fz(1em) This is mapped to font-size: 1em
Fz(18px) This is mapped to font-size: 18px
Td(u):h This underlines text on mouseover
Bxs(n) This is mapped to box-shadow: none
Bxs(foo)--lg This applies a custom box-shadow inside the “lg” breakpoint [1]
Bxs(foo):h--lg Same styling as above but on mouseover only [1]
C(#000) This sets the color to black
C(#000.5) This sets the color to black with a 50% opacity
M(bar) This applies a custom value to margin [2]
Mend(0) This is mapped to margin-right: 0 in a LTR context
Ta(start) This is mapped to text-align:left in a LTR context [3]
Bdstartw(0) This is mapped to border-left-width:0 in a LTR context [3]
Rotate(-90deg) This is an alias mapped to transform: rotate(-90deg)
LineClamp(2,50px) This is a helper which truncates text after 2 lines
list_D(ib) This element is styled with display:inline-block when it is a descendant of a node to which the class list is applied [4]
list>D(ib) This element is styled with display:inline-block when it is a direct child of a node to which the class list is applied to [4]
box:h_D(n) This element is hidden when users hover over its ancestor with the class .box [4]
The reference page lets you quickly search for properties, values, or class names.

Syntax Definitions

<context>

Optional.

A class applied to an ancestor or sibling of the node (see examples).

<div class="foo">
    <div class="foo:h_D(n)"></div>
</div>

The above creates the following rule:

.foo:hover .foo:h_D(n) {
  display: none;
}

This class hides the current element whenever its ancestor (.foo) is hovered over.

<pseudo-class>

Optional.

A suffix mapped to a pseudo-class, for example:

Pseudo-Element Suffix
:active :a
:checked :c
:default :d
:disabled :di
:empty :e
:enabled :en
:first :fi
:first-child :fc
:first-of-type :fot
:fullscreen :fs
:focus :f
:focus-within :fw
:focus-visible :fv
:hover :h
:indeterminate :ind
:in-range :ir
:invalid :inv
:last-child :lc
:last-of-type :lot
:left :l
:link :li
:only-child :oc
:only-of-type :oot
:optional :o
:out-of-range :oor
:placeholder-shown :ps
:read-only :ro
:read-write :rw
:required :req
:right :r
:root :rt
:scope :s
:target :t
:valid :va
:visited :vi

Pseudo-classes may be applied to any regular class or <context> class. For example:

Regular class

<div class="foo">
    <div class="D(n):h"></div>
</div>

The above creates the following rule:

.D(n):h:hover {
  display: none;
}

This causes the display: none style to be applied to the current element when hovered over.

Context class

<div class="foo">
    <div class="foo:h_D(n)"></div>
</div>

The above creates the following rule:

.foo:hover .foo:h_D(n) {
  display: none;
}

This class hides the current element whenever its ancestor (.foo) is hovered over.

<pseudo-element>

Optional.

A suffix mapped to a pseudo-element. The following pseudo-elements are supported:

Pseudo-Element Suffix
::after ::a
::before ::b
::backdrop ::bd
::cue ::c
::file-selector-button ::fsb
::first-letter ::fl
::first-line ::fli
::marker ::m
::placeholder ::ph
::selection ::s

This example uses the content property to add open and closed quotes with the ::b and ::a pseudo-elements.

<p class="Cnt(oq)::b Cnt(cq)::a">Hello world!</p>

Hello world!

<combinator>

Required if <context> is provided. One of the following may be used:

The underscore character (_)

Use this to create a contextual style based on the descendant combinator.

<div class="foo">
    <div class="foo_D(n)"></div>
</div>

This class hides the element whenever one of its ancestors has the class `foo’ attached.

The right angle bracket character (&gt;)

Use this to create a contextual style based on the child combinator.

Example:

<div class="foo">
    <div class="foo>D(n)"></div>
</div>

This class hides the element if its parent has the class foo attached to it.

The plus sign (+)

Use the adjacent sibling combinator to style only if the immediate next sibling of an particular element.

Example:

<div class="foo"></div>
<div class="foo+D(n)"></div>

This class hides the element if its immediate previous sibling has the class foo attached to it.

The tilde sign (~)

Use the general sibling combinator to style only if the sibling of an particular element.

Example:

<div class="foo"></div>
<div class="bar"></div>
<div class="foo~D(n)"></div>

This class hides the element if one of its previous siblings has the class `foo’ attached.

<Style>

Required.

CSS property or helper class. Capitalized with no separator between words such as dashes or new capitals.

Atomizer classes generally follow the Emmet syntax for their naming convention.

<value>

Optional for helper classes, required for Atomizer classes.

Examples:

.Ta(c) {
    text-align: center;
}
.M(20px) {
    margin: 20px;
}

There are three value types: Defined, Literal, and Variable.

Defined values

This is the abbreviation of a defined value. Defined values are valid keywords for any given property. (For example, inherit (inh), auto (a), etc.) Defined values attempt to follow Emmet syntax as closely as possible.

Defined values are enumerated in Atomizer's ruleset, so there is no need to define such values in Atomizer configuration before using such values.

Defined values that are not present in Emmet are named according to the rules below:

Literal values

Literals are strings whose values are not defined in configuration but can be machine-interpreted. 1em, 5px, 20%, 1/2, and #fff are examples of literals.

Units in literal values

Use any unit you want (e.g., W(50%), M(20px), Fz(1em)).

Valid CSS number values must always be followed by its unit if applicable (e.g. 100% and 100px). These numbers can also be represented as keywords such as top and bottom if it makes sense in the context of the property.

Unit-less values

Use unit-less values to set styles like line-height (e.g., Lh(1.5)), font-weight (e.g., Fw(500)), etc.

Negative values

Use the minus sign (-) to set negative values (e.g., M(-20px))

Hexadecimal colors

Use three or 6-character hexadecimal colors with a # prefix as a value identifier (e.g., C(#fff)).

hex values for colors must be written in lowercase (i.e. #ccc, not #CCC).

Hexadecimal colors with alpha

Use hexadecimal colors as value identifiers followed by an opacity suffix (e.g., C(#fff.5)).

Fractions

Use any fraction you want (e.g., W(1/2)), and Atomizer will create the proper CSS declaration for you (e.g., width: 50%)

Multiple values

Pass multiple values separated by commas (,) when supported (e.g., Bgp(20px,50px)).

Remember, this is a CSS class, not a programming language, so you can't leave a space before or after commas!

Variable values

A "variable" is mapped to a global value set in the config object. It is different than a custom class as it is not bound to a property, for example:

custom: {
    gutter: '20px'
}

Usage:

<div class="M(gutter) P(gutter)"></div>

Changing the value of gutter in the config object would change the value of both the margin and paddingas well as the value of any other class using gutter.

CSS variables

CSS variables can be referenced as class values. Note that Atomizer does not manage values and must be defined independently.

Usage:

<div class="C(--primary-color)">Hello World</div>

External stylesheet:

:root {
    --primary-color: #400090
}

Output:

.C(--primary-color) {
    color: var(--primary-color);
}

<!> important

Optional.

The ! character adds !important to the style.

Example:

.D(b) {
    display: block;
}
.D(b)! {
    display: block !important;
}

<breakpoint_identifier>

Optional.

A suffix that adds the breakpoint context to the rule. A breakpoint indicates that this rule will only take effect within the scope of a media query. Each breakpoint’s name and length values are defined in the config object.

Example:

breakPoints: {
    sm: '@media(min-width:500px)', // breakpoint 1
    md: '@media(min-width:900px)', // breakpoint 2
    lg: '@media(min-width:1200px)' // breakpoint 3
},

Usage:

<div class="W(50%)--sm W(33%)--md W(25%)--lg">...</div>

The width of the box is auto below 500px, then 50% between 500px and 899px, then 33% between 900px and 1199px, then 25% above 1199px.


  1. Bxs(foo) uses a custom variable foo set in the config object [↩].
  2. bar is mapped to a custom value that can be used with any relevant styling (i.e., P(bar) for padding, H(bar) for height, etc.) [↩].
  3. start is mapped to either "left" or "right" depending on the config file [↩].
  4. Unlike all other Atomizer classes, those containing descendant selectors are not sandboxed via the namespace (if you have chosen to set one in the config). Instead, Atomizer adds !important to these styles [↩].