A quiet circular system with one precise point of energy.
Loader v1 is Irozon's second canonical component —
packages/design-system/src/components/loader.css. A ring and one
orbiting point, monochrome via currentColor so the surface it sits on
decides its color. Not a generic browser spinner — an Irozon Orbit.
.iz-loader — a <span>, ring + orbit point.data-variant="brand" — optional, for deliberate brand moments only.data-size="small | large" — default requires no attribute.currentColor — no iz-loader--green, --white, etc.<span class="iz-loader" role="status" aria-label="Loading"></span>
One default. One deliberate exception.
Default is monochrome and belongs anywhere in the product. Brand is Green-on-the- point, reserved for app-load, a branded processing screen, or a splash moment — never inside an ordinary button.
currentColor
data-variant="brand" — Green point, Ink ring
Three sizes, matched to Button's scale.
currentColor reads the room.
The same markup, three surfaces — the loader never needs a color prop.
Button doesn't have its own spinner. It has this.
Button's loading state nests an
.iz-loader at data-size="small", aria-hidden
since the button's own aria-busy already carries the meaning. It
inherits currentColor, so it's always the button's own foreground —
the Brand variant never appears inside a button.
Named when standalone. Silent when nested.
role="status" and an aria-label (or visible adjacent text) — it's the only thing on screen announcing that something is happening.aria-hidden="true" — the parent control's aria-busy="true" already carries the semantics; a second announcement would be redundant.prefers-reduced-motion: reduce — the ring and offset point stay as a static, legible busy indicator. Animation was never the thing carrying the meaning; role="status"/aria-busy always was.Loader from @irozon/design-system-react.
Sets role="status" and an accessible label for you; pass
aria-hidden when the loader sits beside its own visible loading text
so the state isn't announced twice.
import { Loader } from "@irozon/design-system-react";
<p style={{ display: "flex", alignItems: "center", gap: 12 }}>
<Loader size="small" aria-hidden />
Loading invoices…
</p>