Skip to content

Progress

import { Progress } from '@delightstack/components';

By default, Progress renders as a circular indeterminate spinner.

View code
<Progress />

Omit the value prop for an indeterminate loading animation.

View code
<!-- Default circular spinner -->
<Progress />
<!-- Linear indeterminate bar -->
<Progress circular={false} />

Provide a value (0-100) to show progress.

75%
45% Uploading...
View code
<!-- Circular progress with percentage -->
<Progress value={75} show_value />
<!-- Linear progress bar -->
<Progress circular={false} value={45} />
<!-- Linear with label and percentage -->
<Progress circular={false} value={45} show_value label="Uploading..." />
Circular sizes
View code
<!-- Circular sizes -->
<Progress size="00" />
<Progress size="0" />
<Progress size="1" />
<Progress size="2" />
<Progress size="3" />
Linear sizes
View code
<!-- Linear sizes -->
<Progress circular={false} value={60} size="00" />
<Progress circular={false} value={60} size="1" />
<Progress circular={false} value={60} size="3" />

Add an animated stripe effect to a linear progress bar.

View code
<Progress circular={false} value={60} striped />

Display multiple segments with different colors in a single linear bar.

Disk Usage

Documents (40%) Photos (25%) System (10%)
View code
<Progress
circular={false}
segments={[
{ value: 40, color: 'var(--color-success)', label: 'Documents' },
{ value: 25, color: 'var(--color-warning)', label: 'Photos' },
{ value: 10, color: 'var(--color-error)', label: 'System' },
]}
/>

Use overlay to cover a parent element, or full_screen to cover the entire viewport.

NameStatusAmount
Alice JohnsonActive$1,200
Bob SmithPending$850
Carol DavisActive$2,340
View code
<script>
import { Progress } from '@delightstack/components';
let isLoading = $state(false);
</script>
<button onclick={() => { isLoading = true; setTimeout(() => isLoading = false, 3000); }}>
Reload Table Data
</button>
<div style="position: relative;">
<table>...</table>
{#if isLoading}
<Progress overlay label="Loading data..." />
{/if}
</div>
View code
<Progress value={100} success />
<Progress value={30} error />
PropTypeDefaultDescription
valuenumber-Progress value (0-100). Omit for indeterminate
maxnumber100Maximum value
circularbooleantrueCircular mode (false = linear bar)
loadingbooleanfalseForce indeterminate animation regardless of value
size'00' | '0' | '1' | '2' | '3''1'Size of the indicator
colorstring-Custom fill color (overrides currentColor)
labelstring-Text label (below spinner or beside bar)
show_valuebooleanfalseDisplay the current percentage
stripedbooleanfalseStriped animation on fill (linear mode only)
overlaybooleanfalseCover parent element with backdrop
full_screenbooleanfalseCover entire viewport
successbooleanfalseSuccess color variant
errorbooleanfalseError color variant
segmentsProgressSegment[]-Multi-segment progress (linear only)
idstringautoElement ID
classstring''Additional CSS classes
interface ProgressSegment {
value: number;
color?: string;
label?: string;
}
  • Uses role="progressbar" for determinate mode with aria-valuenow, aria-valuemin, and aria-valuemax
  • Uses role="status" for indeterminate mode
  • aria-label provides context (e.g., “Uploading file” or “75% complete”)
  • Respects prefers-reduced-motion — shows a static partial arc instead of spinning
  • Overlay mode uses backdrop-filter: blur(2px) for subtle background blur