State modifiers

The state vocabulary: 77 is-* and has-* modifiers. A modifier never stands alone; it qualifies an element's own class (.hero.has-live, .tab.is-current).

Foundation · stable · v1.0.0 · owner: Site system lead · contract 19 of 20 points (open: figma)

Reference

Source reference; not an executed check.

has-aside
variant
has-figure
variant
has-frag
variant
has-live
variant
has-toc
variant
is-active
state
is-add
state
is-after
state
is-agenda
state
is-away
state
is-bare
state
is-broken
state
is-compact
state
is-current
state
is-default
state
is-del
state
is-done
state
is-draft
state
is-empty
state
is-end
state
is-error
state
is-exception
state
is-extendable
state
is-fail
state
is-five
state
is-found
state
is-idle
state
is-in
state
is-info
state
is-ink
state
is-live
state
is-locked
state
is-long
state
is-loom
state
is-loop
state
is-loose
state
is-low
state
is-m
state
is-marked
state
is-me
state
is-medium
state
is-merged
state
is-mid
state
is-model
state
is-moving
state
is-na
state
is-next
state
is-notice
state
is-now
state
is-ok
state
is-on
state
is-out
state
is-overridable
state
is-own
state
is-pass
state
is-path
state
is-pending
state
is-pile
state
is-placeholder
state
is-plain
state
is-playing
state
is-pr
state
is-ready
state
is-root
state
is-running
state
is-s
state
is-same
state
is-seven
state
is-source
state
is-start
state
is-task
state
is-team
state
is-typing
state
is-wait
state
is-with
state
is-without
state
is-woven
state

Do and don't

2 positive / 2 negative authored documentation examples (2 each required); 1 reference (1 required); 0 failed. References and failures do not count; this is not behavior acceptance.

Do: Current navigation keeps native semantics

Authored by state-modifiers.ts

Rendered consumer example; not an executed correctness check. breadcrumbs Isolated document follows the browser's colour and contrast preferences. The outer theme toolbar does not control this document.

Open example: State modifiers · Do: Current navigation keeps native semantics Use the full-page example to follow page links.

The real current item is named and carries aria-current; a class vocabulary is not substituted for that navigation meaning.

Do: A state mark also has its word

Authored by state-modifiers.ts

Rendered consumer example; not an executed correctness check. band-word Isolated document follows the browser's colour and contrast preferences. The outer theme toolbar does not control this document.

Open example: State modifiers · Do: A state mark also has its word Use the full-page example to follow page links.

The native mark retains written meaning instead of implying that an is-* class supplies the message on its own.

Don't: A modifier styles an unrelated element

Authored by state-modifiers.ts

Rule illustration; not an executed check. state-modifiers / modifiers.qualify

.is-broken { color: var(--madder-ink); }
No owning component class qualifies this standalone selector.
A global modifier would affect elements it does not own; state styling belongs to the component that implements that state.

Don't: A current class replaces current-page semantics

Authored by state-modifiers.ts

Rule illustration; not an executed check. breadcrumbs / crumbs.current-not-link

<a class="is-current" href="/product/operations/">Operations</a>
The already-current destination remains a link; no native current-page item is supplied.
A CSS class cannot repair a redundant current-page link or provide the native semantics of the Breadcrumbs consumer.

Rules

RuleWhyCheck
Modifiers appear only compounded with an element's class.Scope: a modifier changes its element and nothing else.Automated: scripts/site/system/check.ts (modifier ownership)

API

No props.

Contract details

The full contract: identity, anatomy, variants, states, tokens, layout, motion, accessibility, content, tests

Identity

AspectValue
Idstate-modifiers
LayerFoundations
Categoryfoundation
OwnerSite system lead
Statusstable
Version1.0.0
Sourceapps/showcase/site/system/foundations/state-modifiers.ts (private repository; the contract and the render function are this one module)
VersionDateChange
1.0.02026-10-26State modifiers as one module: its markup moved out of the page builder (scripts/site) into the system.

Use when

  • A state or a structural variant of an element. Why: One naming pattern makes states searchable and scriptable.

Do not use when

  • As a standalone style. Why: A modifier without its element would style things it does not know.

Anatomy

PartWhat it is
isis-*: a state (is-current, is-done, is-broken)
hashas-*: a structural variant (has-toc, has-live)

Made of: nothing (a base element).

Used in: pages directly.

Variants

VariantWhenWhy
light and darkEvery page, following the reader's setting.The same roles resolve to light or dark values, so no element chooses its own.

States

StateRendered or not applicable
defaultThe specimen.
hoverNot applicable: A foundation is not interactive.
focus-visibleNot applicable: Not focusable.
activeNot applicable: Not interactive.
disabledNot applicable: Nothing to disable.
loadingNot applicable: Values are built into the stylesheet.
emptyNot applicable: The build fails if a value is missing.
errorNot applicable: Unresolved values fail the brand gate, not the reader.
currentNot applicable: No current item.
visitedNot applicable: Not a link.
expandedNot applicable: Does not open.

Tokens

PartToken
state.marksSmall dye marks with their word (D-SITE-004)

Layout

AspectValue
breakpointsRequired review at 390, 768, 1024 and 1440 px; execution is not implied by this declaration; columns stack under 768 px; the wrap keeps a 16 px gutter on phones.
wrappingText wraps; nothing scrolls sideways.
textExpansionJapanese runs 20 to 40% longer; headings break between phrases (jaBreaks) and blocks grow downwards.

Spacing and rhythm

AspectValue
internalNot applicable: a foundation has no box of its own.
externalNot applicable.
rhythmApplies to every element that reads it.

Motion

AspectValue
NoneA foundation does not move.

Runtime and reuse

  1. Render-only element; mount any registered child enhancements separately. Preserve required Site CSS, fonts, responsive and locale rules from nativeElement.

Accessibility passport

AspectValue
roleNot rendered on the site; its specimen in the Library is a list
nameThe foundation's name
keyboardNot interactive.
focusNot focusable.
screenReaderThe specimen is a plain list of names and values.
contrastEvery text and ground pair in the palette is checked (check-brand).
targetNot a target.

Content

SlotLengthVoice
visible state words and programmatic state (consumer-owned)The owning element's state-label budgetUse the meaningful word and native semantics as well as the modifier. .is-current cannot replace aria-current on navigation, and a dyed class cannot replace a health word.
modifier names and kind (fixed Library specimen)The complete discovered modifier; kind is state or variantKeep is-* and has-* as code identifiers. Discovery records CSS vocabulary and hooks, not a universal state API or a promise that every modifier works on every element.

Good: “The current breadcrumb's page name with aria-current=page (Breadcrumbs)” · “Holding together beside its mark (BandWord); the class does not supply the word”

Bad: “is-current displayed as the reader's page name” · “A standalone .is-broken class used as the entire error message”

Japanese: Translate the owning element's visible and accessible state wording through its existing catalogue; never translate CSS modifier identifiers. Keep the same semantic current/pressed state in Japanese. Enumerating modifiers does not verify Japanese state announcements or complete native review.

Icons and illustrations

None: this element uses no icon or illustration of its own.

Decisions and exceptions

Usage

524 owned-class occurrences in built pages plus metadata-token references in built CSS (measured by npm run site:system).

No application mechanism is declared.

Current check result: not assessed by this report. Declarations and source-file presence do not establish executed enforcement or accepted coverage.

Tests

AspectValue
unittests/unit/site-system.test.ts: renders every do and don't example through the registry and checks the classes it owns
visualNot yet: there are no screenshot baselines; the Library page is checked for sideways scroll at 1440 px by tests/site/system.spec.ts
a11ytests/site/system.spec.ts: axe (0 serious or critical) on the element's Library page in light and dark
parityscripts/site/system/check.ts: Library examples are rendered by the same render function the site imports

Figma

not-yet: The Loom Site Figma library is the last stage of the plan; this element is not mapped yet.

Open in Storybook

Start with a conversation about your system.

We read your system, show you what we found, and agree with your team what to fix first.