Skip to content
Navigation

Day Time Picker

Added 14 October 2026

React

Codecomponents/react/day-time-picker-demo.tsx
import {useState} from 'react';
import {DAYS_OF_WEEK, DaypartPicker, ScheduleGrid, SchedulePresets, type HourRange, type ScheduleValue} from '@stroeer-labs/design-library/react';

function week(time: ReadonlyArray<HourRange>): ScheduleValue {
    return DAYS_OF_WEEK.map((day) => ({day, time}));
}

function describe(value: ScheduleValue): string {
    if (value.length === 0) {
        return 'nothing selected';
    }
    return value.map((entry) => `${entry.day.slice(0, 3)} ${entry.time.map((range) => `${range.from}–${range.to}`).join(', ')}`).join(' · ');
}

export function DayTimePickerDemo() {
    const [uniform, setUniform] = useState<ScheduleValue>(() =>
        week([
            {from: 6, to: 10},
            {from: 18, to: 22},
        ]),
    );
    const [shared, setShared] = useState<ScheduleValue>(() => DAYS_OF_WEEK.slice(0, 5).map((day) => ({day, time: [{from: 8, to: 18}]})));

    return (
        <div className="space-y-8">
            <div className="space-y-2">
                <p className="text-xs font-medium text-muted-foreground">Daypart picker</p>
                <DaypartPicker value={uniform} onValueChange={setUniform} />
                <p className="text-xs tabular-nums text-muted-foreground">{describe(uniform)}</p>
            </div>
            <div className="space-y-2">
                <p className="text-xs font-medium text-muted-foreground">Schedule grid — presets above, drag to paint</p>
                <SchedulePresets value={shared} onValueChange={setShared} />
                <ScheduleGrid value={shared} onValueChange={setShared} />
                <p className="text-xs tabular-nums text-muted-foreground">{describe(shared)}</p>
            </div>
            <div className="space-y-2">
                <p className="text-xs font-medium text-muted-foreground">Disabled</p>
                <DaypartPicker value={week([{from: 6, to: 10}])} onValueChange={() => undefined} disabled />
            </div>
        </div>
    );
}

Angular

Codecomponents/angular/day-time-picker-demo.ts
import '@angular/compiler';
import {Component, signal} from '@angular/core';
import {DAYS_OF_WEEK, DayTimePickerImports, type HourRange, type ScheduleValue} from '@stroeer-labs/design-library/angular';

function week(time: ReadonlyArray<HourRange>): ScheduleValue {
    return DAYS_OF_WEEK.map((day) => ({day, time}));
}

@Component({
    selector: 'dl-day-time-picker-demo',
    standalone: true,
    imports: [DayTimePickerImports],
    template: `
    <div class="space-y-8">
      <div class="space-y-2">
        <p class="text-xs font-medium text-muted-foreground">Daypart picker</p>
        <dl-daypart-picker [(value)]="uniform" />
        <p class="text-xs tabular-nums text-muted-foreground">{{ describe(uniform()) }}</p>
      </div>
      <div class="space-y-2">
        <p class="text-xs font-medium text-muted-foreground">Schedule grid — presets above, drag to paint</p>
        <dl-schedule-presets [(value)]="shared" />
        <dl-schedule-grid [(value)]="shared" />
        <p class="text-xs tabular-nums text-muted-foreground">{{ describe(shared()) }}</p>
      </div>
      <div class="space-y-2">
        <p class="text-xs font-medium text-muted-foreground">Disabled</p>
        <dl-daypart-picker [value]="disabledValue" [disabled]="true" />
      </div>
    </div>
  `,
})
export class DayTimePickerDemoComponent {
    protected readonly uniform = signal<ScheduleValue>(
        week([
            {from: 6, to: 10},
            {from: 18, to: 22},
        ]),
    );
    protected readonly shared = signal<ScheduleValue>(DAYS_OF_WEEK.slice(0, 5).map((day) => ({day, time: [{from: 8, to: 18}]})));
    protected readonly disabledValue = week([{from: 6, to: 10}]);

    protected describe(value: ScheduleValue): string {
        if (value.length === 0) {
            return 'nothing selected';
        }
        return value.map((entry) => `${entry.day.slice(0, 3)} ${entry.time.map((range) => `${range.from}–${range.to}`).join(', ')}`).join(' · ');
    }
}