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) {
}
Interactive Configuration
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;
}
}