TimePicker

Компонент для выбора времени в потоке формы: колонки часов/минут/секунд с прокруткой и фокусной навигацией. Делит контекст с календарём через внутренний CalendarContext, если используется рядом с Calendar в кастомной композиции.

Когда использовать

  • Нужен только выбор времени без даты на той же панели.
  • Поле должно оставаться инлайн без выпадающего попапа.

Когда не нужен: если время выбирают редко и уместнее попап — используйте TimePickerDropdown.

  • ✅ Синхронизировать значение с полем ввода через value / onChangeValue.
  • ❌ Блокировать onChangeValue заглушкой — состояние не обновится и пример перестанет быть показательным.

Анатомия

Size

ЗначениеНазначение
sУзкие колонки и плотные таблицы
mЗначение по умолчанию
lКрупные тач-цели

Секунды

showSeconds (true по умолчанию) скрывает третью колонку, если достаточно часов и минут.

Установка

pnpm add @cloud-ru/ds-calendar
import { TimePicker, SIZE } from '@cloud-ru/ds-calendar'

Примеры использования

Базовый выбор

Базовый выбор
tsx
import { SIZE, TimePicker, TimeValue } from '@cloud-ru/ds-calendar';
import { useState } from 'react';

export function TimePickerBasic() {
  const [value, setValue] = useState<TimeValue | undefined>({ hours: 9, minutes: 15, seconds: 0 });

  return (
    <div style={{ width: 280, maxWidth: '100%' }}>
      <TimePicker fitToContainer size={SIZE.M} value={value} onChangeValue={v => setValue(v)} />
    </div>
  );
}

Без секунд

Без секунд
tsx
import { SIZE, TimePicker, TimeValue } from '@cloud-ru/ds-calendar';
import { useState } from 'react';

export function TimePickerNoSeconds() {
  const [value, setValue] = useState<TimeValue | undefined>({ hours: 11, minutes: 45, seconds: 0 });

  return (
    <div style={{ width: 240, maxWidth: '100%' }}>
      <TimePicker fitToContainer showSeconds={false} size={SIZE.M} value={value} onChangeValue={v => setValue(v)} />
    </div>
  );
}

Размеры

Размеры
tsx
import { SIZE, TimePicker } from '@cloud-ru/ds-calendar';

export function TimePickerSizes() {
  return (
    <div style={{ display: 'flex', gap: 12, flexWrap: 'wrap', alignItems: 'flex-start' }}>
      <div style={{ width: 200 }}>
        <TimePicker fitToContainer defaultValue={{ hours: 8, minutes: 0, seconds: 0 }} size={SIZE.S} />
      </div>
      <div style={{ width: 220 }}>
        <TimePicker fitToContainer defaultValue={{ hours: 12, minutes: 30, seconds: 0 }} size={SIZE.M} />
      </div>
      <div style={{ width: 240 }}>
        <TimePicker fitToContainer defaultValue={{ hours: 18, minutes: 45, seconds: 30 }} size={SIZE.L} />
      </div>
    </div>
  );
}

Props

Types

PropsTimePickerProps
PropTypeDefaultRequiredDescription
classNamestringnoCSS-класс контейнера
data-test-idstringno
defaultValueTimeValuenoЗначение по-умолчанию для uncontrolled.
fitToContainerbooleantruenoОтключает предустановленный размер, заставляя компонент подстраиваться к размеру контейнра: (width: 100%, height: 100%).
navigationStartRefRefObject<{ focus(): void; }>noСсылка на управление первым элементом навигации
onChangeValue((value?: TimeValue) => void)noКолбек выбора значения
onFocusLeave((direction: FocusDirection) => void)noКолбек потери фокуса. Вызывается со значением `next`, когда фокус покидает компонент, передвигаясь вперед, по клавише `tab`. Со значением `prev` - по клавише стрелки вверх или `shift + tab`.
showSecondsbooleantruenoПоказывать ли секунды
size"l" | "m" | "s"mnoРазмер
todaynumber | DatenoДата сегодняшнего дня
valueTimeValuenoВыбранное значение.

Unions

Types

TimePickerProps

Unions

Storybook

Figma

Смотри также