Docs Components Primitives

Loader

React example follows below.
ts
const loaderFixture = {
id: "loader",
variants: [
{ variant: "rotator", size: "md" },
{ variant: "equalizer", size: "lg" },
{ variant: "noodle", size: "md", speed: 0.6, label: "Compiling" },
],
} satisfies {
id: string;
variants: Array<{
variant: "rotator" | "equalizer" | "noodle";
size: "sm" | "md" | "lg";
speed?: number;
label?: string;
}>;
};
import { Loader } from "@grassroot/ui-react";
export default function LoaderDemo() {
return (
<div className="vs-ldr-list">
{loaderFixture.variants.map((v) => (
<Loader key={v.variant} variant={v.variant} size={v.size} speed={v.speed} label={v.label} />
))}
</div>
);
}
ts
<script setup lang="ts">
const loaderFixture = {
id: "loader",
variants: [
{ variant: "rotator", size: "md" },
{ variant: "equalizer", size: "lg" },
{ variant: "noodle", size: "md", speed: 0.6, label: "Compiling" },
],
} satisfies {
id: string;
variants: Array<{
variant: "rotator" | "equalizer" | "noodle";
size: "sm" | "md" | "lg";
speed?: number;
label?: string;
}>;
};
import { Loader } from "@grassroot/ui-vue";
</script>
<template>
<div class="vs-ldr-list">
<Loader
v-for="v in loaderFixture.variants"
:key="v.variant"
:variant="v.variant"
:size="v.size"
:speed="v.speed ?? 1"
:label="v.label ?? 'Loading'"
/>
</div>
</template>
ts
import { Component } from "@angular/core";
const loaderFixture = {
id: "loader",
variants: [
{ variant: "rotator", size: "md" },
{ variant: "equalizer", size: "lg" },
{ variant: "noodle", size: "md", speed: 0.6, label: "Compiling" },
],
} satisfies {
id: string;
variants: Array<{
variant: "rotator" | "equalizer" | "noodle";
size: "sm" | "md" | "lg";
speed?: number;
label?: string;
}>;
};
import { GrassrootLoader } from "@grassroot/ui-angular";
@Component({
selector: "app-loader-demo",
standalone: true,
imports: [GrassrootLoader],
host: { style: "display: contents" },
template: `
<div class="vs-ldr-list">
@for (v of variants; track v.variant) {
<grassroot-loader
[variant]="v.variant"
[size]="v.size"
[speed]="v.speed"
[label]="v.label"
/>
}
</div>
`,
})
export class LoaderDemoComponent {
// Angular's signal inputs only fall back to their default when the
// consumer omits the binding entirely — an explicitly-bound `undefined`
// (what the fixture's optional speed/label fields would produce for the
// first two variants) overwrites the default instead of preserving it.
// Resolve the component's own defaults here so every variant binds a
// concrete value, matching the other four frameworks' rendered output.
protected readonly variants = loaderFixture.variants.map((v) => ({
...v,
speed: v.speed ?? 1,
label: v.label ?? "Loading",
}));
}
export default LoaderDemoComponent;
ts
<script lang="ts">
import { Loader } from "@grassroot/ui-svelte";
const loaderFixture = {
id: "loader",
variants: [
{ variant: "rotator", size: "md" },
{ variant: "equalizer", size: "lg" },
{ variant: "noodle", size: "md", speed: 0.6, label: "Compiling" },
],
} satisfies {
id: string;
variants: Array<{
variant: "rotator" | "equalizer" | "noodle";
size: "sm" | "md" | "lg";
speed?: number;
label?: string;
}>;
};
</script>
<div class="vs-ldr-list">
{#each loaderFixture.variants as v (v.variant)}
<Loader variant={v.variant} size={v.size} speed={v.speed ?? 1} label={v.label ?? "Loading"} />
{/each}
</div>
ts
/** @jsxImportSource solid-js */
import { For } from "solid-js";
const loaderFixture = {
id: "loader",
variants: [
{ variant: "rotator", size: "md" },
{ variant: "equalizer", size: "lg" },
{ variant: "noodle", size: "md", speed: 0.6, label: "Compiling" },
],
} satisfies {
id: string;
variants: Array<{
variant: "rotator" | "equalizer" | "noodle";
size: "sm" | "md" | "lg";
speed?: number;
label?: string;
}>;
};
import { Loader } from "@grassroot/ui-solid";
export default function LoaderDemo() {
return (
<div class="vs-ldr-list">
<For each={loaderFixture.variants}>
{(v) => (
<Loader
variant={v.variant}
size={v.size}
speed={v.speed ?? 1}
label={v.label ?? "Loading"}
/>
)}
</For>
</div>
);
}

Installation

API Reference

Import

import { Loader } from "@grassroot/ui-react";

Props

Prop
Type
Default
Requirement
Description
variant
LoaderVariant | undefined
"rotator"
optional
Which indicator to render.
size
"sm" | "md" | "lg" | undefined
"md"
optional
Overall scale.
speed
number | undefined
1
optional
Animation speed multiplier (0.25–3 in the design).
label
string | undefined
"Loading"
optional
Accessible label for assistive tech.
Prop
variant
Type
LoaderVariant | undefined
Default
"rotator"
Requirement
optional
Description
Which indicator to render.
Prop
size
Type
"sm" | "md" | "lg" | undefined
Default
"md"
Requirement
optional
Description
Overall scale.
Prop
speed
Type
number | undefined
Default
1
Requirement
optional
Description
Animation speed multiplier (0.25–3 in the design).
Prop
label
Type
string | undefined
Default
"Loading"
Requirement
optional
Description
Accessible label for assistive tech.

Native attributes

Standard DOM and ARIA attributes not listed above spread onto the root element.

Import

import { Loader } from "@grassroot/ui-vue";

Props

Prop
Type
Default
Requirement
variant
LoaderVariant | undefined
"rotator"
optional
size
"sm" | "md" | "lg" | undefined
"md"
optional
speed
number | undefined
—
optional
label
string | undefined
"Loading"
optional
Prop
variant
Type
LoaderVariant | undefined
Default
"rotator"
Requirement
optional
Prop
size
Type
"sm" | "md" | "lg" | undefined
Default
"md"
Requirement
optional
Prop
speed
Type
number | undefined
Default
—
Requirement
optional
Prop
label
Type
string | undefined
Default
"Loading"
Requirement
optional

Import

import { Component } from "@angular/core";
import { GrassrootLoader } from "@grassroot/ui-angular";

Props

Prop
Type
Default
Requirement
variant
LoaderVariant
"rotator"
optional
size
"sm" | "md" | "lg"
"md"
optional
speed
number
—
optional
label
string
"Loading"
optional
Prop
variant
Type
LoaderVariant
Default
"rotator"
Requirement
optional
Prop
size
Type
"sm" | "md" | "lg"
Default
"md"
Requirement
optional
Prop
speed
Type
number
Default
—
Requirement
optional
Prop
label
Type
string
Default
"Loading"
Requirement
optional

Import

import { Loader } from "@grassroot/ui-svelte";

Props

Prop
Type
Default
Requirement
variant
LoaderVariant
"rotator"
optional
size
"sm" | "md" | "lg"
"md"
optional
speed
number
—
optional
label
string
"Loading"
optional
Prop
variant
Type
LoaderVariant
Default
"rotator"
Requirement
optional
Prop
size
Type
"sm" | "md" | "lg"
Default
"md"
Requirement
optional
Prop
speed
Type
number
Default
—
Requirement
optional
Prop
label
Type
string
Default
"Loading"
Requirement
optional

Import

import { For } from "solid-js";
import { Loader } from "@grassroot/ui-solid";

Props

Prop
Type
Default
Requirement
variant
LoaderVariant
—
optional
size
"sm" | "md" | "lg"
—
optional
speed
number
—
optional
label
string
—
optional
className
string
—
optional
Prop
variant
Type
LoaderVariant
Default
—
Requirement
optional
Prop
size
Type
"sm" | "md" | "lg"
Default
—
Requirement
optional
Prop
speed
Type
number
Default
—
Requirement
optional
Prop
label
Type
string
Default
—
Requirement
optional
Prop
className
Type
string
Default
—
Requirement
optional

Native attributes

Standard DOM and ARIA attributes not listed above spread onto the root element.