import { Component, signal } from '@angular/core'; import { CommonModule } from '@angular/common'; import { FormsModule, ReactiveFormsModule, FormBuilder, FormGroup } from '@angular/forms'; import { RangeSliderComponent, RangeSliderTickMark } from '../../../../../ui-essentials/src/public-api'; @Component({ selector: 'ui-range-slider-demo', standalone: true, imports: [CommonModule, FormsModule, ReactiveFormsModule, RangeSliderComponent], template: `

Range Slider Demo

Sizes

@for (size of sizes; track size) {
}

Variants

@for (variant of variants; track variant) {
}

States

Range Configurations

Tick Marks

Interactive Configuration

Form Integration

Form Values:

{{ getFormValues() | json }}

Event Handling

Event Log:

@for (event of eventLog(); track $index) {
{{ event }}
}
`, styleUrl: './range-slider-demo.component.scss' }) export class RangeSliderDemoComponent { private fb = new FormBuilder(); sizes = ['sm', 'md', 'lg'] as const; variants = ['primary', 'secondary', 'success', 'warning', 'danger'] as const; // Interactive demo state interactiveValue = signal(50); interactiveMin = signal(0); interactiveMax = signal(100); interactiveStep = signal(1); interactiveSize = signal<'sm' | 'md' | 'lg'>('md'); interactiveVariant = signal<'primary' | 'secondary' | 'success' | 'warning' | 'danger'>('primary'); interactiveShowValue = signal(true); interactiveDisabled = signal(false); // Event demo state eventSliderValue = signal(25); eventLog = signal([]); // Tick mark configurations basicTicks: RangeSliderTickMark[] = [ { value: 0 }, { value: 25 }, { value: 50 }, { value: 75 }, { value: 100 } ]; labeledTicks: RangeSliderTickMark[] = [ { value: 0, label: 'Min' }, { value: 1, label: 'Low' }, { value: 2, label: 'Med' }, { value: 3, label: 'High' }, { value: 4, label: 'Very High' }, { value: 5, label: 'Max' } ]; majorMinorTicks: RangeSliderTickMark[] = [ { value: 0, label: '0%', major: true }, { value: 25, major: false }, { value: 50, label: '50%', major: true }, { value: 75, major: false }, { value: 100, label: '100%', major: true } ]; temperatureTicks: RangeSliderTickMark[] = [ { value: 16, label: '16°' }, { value: 18, label: '18°' }, { value: 20, label: '20°' }, { value: 22, label: '22°' }, { value: 24, label: '24°' }, { value: 26, label: '26°' }, { value: 28, label: '28°' }, { value: 30, label: '30°' } ]; // Form setup demoForm: FormGroup = this.fb.group({ volume: [75], brightness: [128], temperature: [22] }); // Interactive controls updateMin(event: Event): void { const target = event.target as HTMLInputElement; const newMin = parseInt(target.value, 10); this.interactiveMin.set(newMin); // Adjust value if it's now below min if (this.interactiveValue() < newMin) { this.interactiveValue.set(newMin); } } updateMax(event: Event): void { const target = event.target as HTMLInputElement; const newMax = parseInt(target.value, 10); this.interactiveMax.set(newMax); // Adjust value if it's now above max if (this.interactiveValue() > newMax) { this.interactiveValue.set(newMax); } } updateStep(event: Event): void { const target = event.target as HTMLSelectElement; this.interactiveStep.set(parseFloat(target.value)); } updateSize(event: Event): void { const target = event.target as HTMLSelectElement; this.interactiveSize.set(target.value as any); } updateVariant(event: Event): void { const target = event.target as HTMLSelectElement; this.interactiveVariant.set(target.value as any); } toggleShowValue(event: Event): void { const target = event.target as HTMLInputElement; this.interactiveShowValue.set(target.checked); } toggleDisabled(event: Event): void { const target = event.target as HTMLInputElement; this.interactiveDisabled.set(target.checked); } onInteractiveValueChange(value: number): void { this.interactiveValue.set(value); } // Event handlers onValueChange(value: number): void { this.eventSliderValue.set(value); this.addEventLog(`Value changed: ${value}`); } onSlideStart(value: number): void { this.addEventLog(`Slide started at: ${value}`); } onSlideEnd(value: number): void { this.addEventLog(`Slide ended at: ${value}`); } onSliderFocus(): void { this.addEventLog('Slider focused'); } onSliderBlur(): void { this.addEventLog('Slider blurred'); } private addEventLog(message: string): void { const timestamp = new Date().toLocaleTimeString(); const newLog = `[${timestamp}] ${message}`; this.eventLog.update(log => [newLog, ...log.slice(0, 9)]); // Keep last 10 events } clearEventLog(): void { this.eventLog.set([]); } getFormValues(): any { return this.demoForm.value; } }