Skip to content

Variant / State

SpiraCSS splits traditional Modifiers into Variant and State.

Role breakdown

  • Structure (Block / Element): expressed with classes
  • Variant: static appearance differences (size/tone/layout)
  • State: dynamic toggles (open/closed/loading/selected)

Important: whether JS toggles it is not a classification criterion. Decide by meaning.

Expression modes

Configure in spiracss.config.js.

Data mode (default)

TypePurposeHTMLSCSS
Variantvisual variationsdata-variant="primary"&[data-variant="primary"]
Stateinteraction statedata-state="active"&[data-state="active"]
ARIAaccessibility statearia-expanded="true"&[aria-expanded="true"]

Placement rules:

Class mode

TypeNaming ruleExamples
Modifierprefix - (kebab-case, 1–2 words).-primary, .-active

In class mode, you cannot distinguish Variant from State by class name alone. Use the same placement criteria as data mode.

Data attribute naming

TypeDefault attributeValue formatExample
Variantdata-variantkebab-case, 1–2 wordsdata-variant="primary-dark"
Statedata-statekebab-case, 1–2 wordsdata-state="loading"

You can split Variant into multiple attributes (e.g. data-variant="primary" + data-size="large").