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.