Time Picker

Times entered fast, validated quietly.

v1.0.0·Updated Jul 8, 2026 · 10:45
Live Demo — Fully Interactive
Scroll each column; the selection snaps to centre. AM / PM on the right
9:00 AM
Hr
Min
 
9:00 AM
Configuration
Format
Minute step
Footer
9:00 AM
Hr
Min
 
9:00 AM
<TimePicker step={1} />
Behavior — The Engineering Contract
Props
PropTypeDefaultDescription
value / onChange{h, m}Controlled time, 24-hour internally
hour12booleantrueAM/PM columns, or a 24-hour clock
stepnumber1Minute increment: 1 (every minute, 0–59) · 5 · 15 · 30
initial{h, m}09:00Uncontrolled starting time
min / max{h, m}Bounds; out-of-range options disable
footerbooleantrueReadout + Now shortcut
Events & keyboard
TriggerResult
Click an optionCommits that hour, minute or period
↑ ↓ within a columnMove focus through the list
Enter / SpaceSelect the focused option
NowJumps to the current time, rounded to the step
Live behavior — every demo is real
Optimistic reminder timePUT
9:00 AM
Hr
Min
 
Reminder at 9:00 AM
change the time to fire a request
The new time reflects the instant you pick it; the server confirms a beat later. One in three writes fails on purpose and honestly rolls back to the last saved time.
Anatomy
9:30 AM
Hr
7891011
Min
2829303132
 
AMPM
9:30 AMNow
1243
1ReadoutThe chosen time in the machine's mono voice, updated on every pick.
2Selector columnsHours and minutes as scroll lists; each keeps its selection centred. Minutes thin by the step.
3PeriodAM / PM as two buttons on the right, present only in 12-hour mode.
4FooterA readable echo of the time and a Now shortcut, rounded to the step.
Do's and Don'ts
✓ Do
Every 15 min · :00 :15 :30 :45

Match the step to the task. Booking slots rarely need per-minute precision.

✕ Don't
60 minutes, one at a time, for a 9am slot

Don't make the user scroll sixty rows when four would do the job.

✓ Do
09:00 AM

Show AM/PM explicitly. "9:00" alone is ambiguous; "9:00 AM" never is.

✕ Don't
13:00 PM

Don't mix a 24-hour number with a period. Pick one clock and hold it.

In context: Examples
A · A meeting field
9:30 AM

Collapsed into a field, the picker opens in a popover only when needed.

B · A reminder
9:30 AM
Hr
7891011
Min
2829303132
 
AMPM
9:30 AMNow

Standalone, the columns make setting a one-off reminder quick and precise.

C · A time range
9:00 AM5:30 PM

Two fields set an interval — office hours, a shift, an availability window.

Measurements & Tokens
TokenValueRole
--time-w184pxPanel width
--time-bg#0E0F12Panel surface
--time-border#1E1F24Panel & footer hairline
--time-col-h176pxScroll column height
--time-opt34px · radius 8Option row height
--time-selected#FF7A00Selected option & period, near-black label
--time-readout1.4rem monoHeader time display
--time-focusrgba(255,122,0,.55)2px keyboard focus ring
Code
<div class="o-time">
  <div class="o-time__head">09:00 AM</div>
  <div class="o-time__cols">
    <div class="o-time__col" role="listbox">
      <button class="o-time__opt is-selected">9</button>
      <button class="o-time__opt">10</button>
    </div>
    <span class="o-time__sep">:</span>
    <div class="o-time__col" role="listbox">
      <button class="o-time__opt is-selected">00</button>
      <button class="o-time__opt">05</button>
    </div>
    <div class="o-time__period">
      <button class="is-selected">AM</button>
      <button>PM</button>
    </div>
  </div>
</div>