Skip to content
Navigation

Slider

Added 14 October 2026

React

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

export function SliderDemo() {
    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">Adjustable value</span>
                    </div>
                    <Slider defaultValue={40} aria-label="Default — adjustable value" />
                </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">Within target</span>
                    </div>
                    <Slider variant="success" defaultValue={100} aria-label="Success — within target" />
                </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>
                    <Slider variant="warning" defaultValue={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</span>
                    </div>
                    <Slider variant="destructive" defaultValue={90} aria-label="Destructive — over limit" />
                </div>
            </div>
            <div className="space-y-3">
                <p className="text-xs font-medium text-muted-foreground">Values</p>
                <Slider defaultValue={25} aria-label="25 percent" />
                <Slider defaultValue={50} aria-label="50 percent" />
                <Slider defaultValue={75} aria-label="75 percent" />
            </div>
            <div className="space-y-2">
                <p className="text-xs font-medium text-muted-foreground">Range (two thumbs)</p>
                <Slider defaultValue={[25, 60]} aria-label="Range" />
            </div>
            <div className="space-y-2">
                <p className="text-xs font-medium text-muted-foreground">Disabled</p>
                <Slider defaultValue={50} disabled aria-label="Disabled" />
            </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. */}
                <Slider defaultValue={80} indicatorClassName="bg-linear-to-r from-attention to-brand-interactive" aria-label="Gradient" />
            </div>
        </div>
    );
}

Angular

Codecomponents/angular/slider-demo.ts
import '@angular/compiler';
import {Component, signal} from '@angular/core';
import {HlmSliderImports} from '@stroeer-labs/design-library/angular';

@Component({
    selector: 'dl-slider-demo',
    standalone: true,
    imports: [HlmSliderImports],
    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">Adjustable value</span>
          </div>
          <hlm-slider [(value)]="valueDefault" aria-label="Default — adjustable value" />
        </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">Within target</span>
          </div>
          <hlm-slider [(value)]="valueSuccess" variant="success" aria-label="Success — within target" />
        </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-slider [(value)]="valueWarning" variant="warning" aria-label="Warning — approaching a limit" />
        </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</span>
          </div>
          <hlm-slider [(value)]="valueDestructive" variant="destructive" aria-label="Destructive — over limit" />
        </div>
      </div>
      <div class="space-y-3">
        <p class="text-xs font-medium text-muted-foreground">Values</p>
        <hlm-slider [(value)]="value25" aria-label="25 percent" />
        <hlm-slider [(value)]="value50" aria-label="50 percent" />
        <hlm-slider [(value)]="value75" aria-label="75 percent" />
      </div>
      <div class="space-y-2">
        <p class="text-xs font-medium text-muted-foreground">Range (two thumbs)</p>
        <hlm-slider [(value)]="valueRange" aria-label="Range" />
      </div>
      <div class="space-y-2">
        <p class="text-xs font-medium text-muted-foreground">Disabled</p>
        <hlm-slider [(value)]="valueDisabled" [disabled]="true" aria-label="Disabled" />
      </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 slider demo exactly. -->
        <hlm-slider [(value)]="valueGradient" indicatorClass="bg-linear-to-r from-attention to-brand-interactive" aria-label="Gradient" />
      </div>
    </div>
  `,
})
export class SliderDemoComponent {
    protected readonly valueDefault = signal([40]);
    protected readonly valueSuccess = signal([100]);
    protected readonly valueWarning = signal([70]);
    protected readonly valueDestructive = signal([90]);
    protected readonly value25 = signal([25]);
    protected readonly value50 = signal([50]);
    protected readonly value75 = signal([75]);
    protected readonly valueRange = signal([25, 60]);
    protected readonly valueDisabled = signal([50]);
    protected readonly valueGradient = signal([80]);
}