Skip to content
Navigation

Progress

Added 14 October 2026

React

Codecomponents/react/progress-demo.tsx
import {Progress} from '@stroeer-labs/design-library/react';

export function ProgressDemo() {
    return (
        <div className="space-y-6">
            <div className="space-y-4">
                <p className="text-xs font-medium text-muted-foreground">Variants</p>
                <div className="space-y-1.5">
                    <div className="flex items-baseline justify-between text-xs">
                        <span className="font-medium">Default</span>
                        <span className="text-muted-foreground">Ongoing process</span>
                    </div>
                    <Progress value={40} aria-label="Default — ongoing process" />
                </div>
                <div className="space-y-1.5">
                    <div className="flex items-baseline justify-between text-xs">
                        <span className="font-medium">Success</span>
                        <span className="text-muted-foreground">Complete · goal reached</span>
                    </div>
                    <Progress variant="success" value={100} aria-label="Success — complete" />
                </div>
                <div className="space-y-1.5">
                    <div className="flex items-baseline justify-between text-xs">
                        <span className="font-medium">Warning</span>
                        <span className="text-muted-foreground">Approaching a limit</span>
                    </div>
                    <Progress variant="warning" value={70} aria-label="Warning — approaching a limit" />
                </div>
                <div className="space-y-1.5">
                    <div className="flex items-baseline justify-between text-xs">
                        <span className="font-medium">Destructive</span>
                        <span className="text-muted-foreground">Over limit · error</span>
                    </div>
                    <Progress variant="destructive" value={90} aria-label="Destructive — over limit" />
                </div>
            </div>
            <div className="space-y-3">
                <p className="text-xs font-medium text-muted-foreground">Values</p>
                <Progress value={25} aria-label="25 percent" />
                <Progress value={50} aria-label="50 percent" />
                <Progress value={75} aria-label="75 percent" />
            </div>
            <div className="space-y-2">
                <p className="text-xs font-medium text-muted-foreground">App-injected gradient (indicatorClassName)</p>
                {/* App-owned gradient: its meaning is the app's, so it rides the passthrough rather
                    than being a library variant — composed here from semantic tokens. */}
                <Progress value={80} indicatorClassName="bg-linear-to-r from-attention to-brand-interactive" aria-label="Reach" />
            </div>
        </div>
    );
}

Angular

Codecomponents/angular/progress-demo.ts
import '@angular/compiler';
import {Component} from '@angular/core';
import {HlmProgressImports} from '@stroeer-labs/design-library/angular';

@Component({
    selector: 'dl-progress-demo',
    standalone: true,
    imports: [HlmProgressImports],
    template: `
    <div class="space-y-6">
      <div class="space-y-4">
        <p class="text-xs font-medium text-muted-foreground">Variants</p>
        <div class="space-y-1.5">
          <div class="flex items-baseline justify-between text-xs">
            <span class="font-medium">Default</span>
            <span class="text-muted-foreground">Ongoing process</span>
          </div>
          <hlm-progress [value]="40" aria-label="Default — ongoing process"><hlm-progress-indicator /></hlm-progress>
        </div>
        <div class="space-y-1.5">
          <div class="flex items-baseline justify-between text-xs">
            <span class="font-medium">Success</span>
            <span class="text-muted-foreground">Complete · goal reached</span>
          </div>
          <hlm-progress [value]="100" aria-label="Success — complete"><hlm-progress-indicator variant="success" /></hlm-progress>
        </div>
        <div class="space-y-1.5">
          <div class="flex items-baseline justify-between text-xs">
            <span class="font-medium">Warning</span>
            <span class="text-muted-foreground">Approaching a limit</span>
          </div>
          <hlm-progress [value]="70" aria-label="Warning — approaching a limit"><hlm-progress-indicator variant="warning" /></hlm-progress>
        </div>
        <div class="space-y-1.5">
          <div class="flex items-baseline justify-between text-xs">
            <span class="font-medium">Destructive</span>
            <span class="text-muted-foreground">Over limit · error</span>
          </div>
          <hlm-progress [value]="90" aria-label="Destructive — over limit"><hlm-progress-indicator variant="destructive" /></hlm-progress>
        </div>
      </div>
      <div class="space-y-3">
        <p class="text-xs font-medium text-muted-foreground">Values</p>
        <hlm-progress [value]="25" aria-label="25 percent"><hlm-progress-indicator /></hlm-progress>
        <hlm-progress [value]="50" aria-label="50 percent"><hlm-progress-indicator /></hlm-progress>
        <hlm-progress [value]="75" aria-label="75 percent"><hlm-progress-indicator /></hlm-progress>
      </div>
      <div class="space-y-2">
        <p class="text-xs font-medium text-muted-foreground">App-injected gradient (indicatorClass)</p>
        <!-- App-owned gradient: its meaning is the app's, so it rides the passthrough rather than being
             a library variant — composed from semantic tokens. Mirrors the React progress demo exactly. -->
        <hlm-progress [value]="80" aria-label="Reach">
          <hlm-progress-indicator indicatorClass="bg-linear-to-r from-attention to-brand-interactive" />
        </hlm-progress>
      </div>
    </div>
  `,
})
export class ProgressDemoComponent {}