Skip to content

Date and time picker

A date field takes a day you type or pick from a calendar. A time field takes a time you type or pick from a list.

When to use it

Use a date field for one day, such as a start date, a passport expiry or an interview. For a period, use two fields labelled Start and End. The second calendar opens on the month of the first and does not offer earlier days.

For a date of birth or any day far from today, typing is faster. The calendar is for days close to today.

Anatomy

The date field is a text field with a calendar button at its end. The calendar shows one month from Monday, with a dot under today and the chosen day in brand blue. Days of the months around it are left blank, and days that cannot be chosen fade.

Field
a text field with a 32 px calendar button at its end
Calendar width
284 px
Calendar padding
12 px
--space-3
Calendar corner radius
12 px
--radius-xl
Day
36 px high, 14 px figures
--text
Gap between days
2 px
Weekday names
11 px on 16 px
--text-muted
Chosen day
brand fill, white bold figures
--brand-true
Today
a 4 px dot under the figures
--brand-true
Days that cannot be chosen
faded to 30 percent

Time

Type a time as 14:30, or pick one from a list of slots 30minutes apart, grouped into morning, afternoon and evening. The clock is 24 hour unless the person's settings say otherwise.

When people in different time zones read the same time, as for an interview, the hint names the zone.

A date without a time is a calendar day. It is stored and shown without a time zone, so it does not move by a day for a colleague in Kathmandu.

Shown in your time zone, Central European Time.

Slots
every 30 minutes, 08:00 to 21:00
Slot row
36 px, 44 px on touch

Typing a date

The field reads a date written day first, with dots, slashes or spaces, or with the name of the month: 28.9.2026, 28/09/2026 and 28 Sep 2026 all work. Write the year in full.

When the person leaves the field, the date shows as 28 Sep 2026, with the month in their language. A date the field cannot read keeps its text and gets an error with an example.

Shown as
28 Sep 2026
Order
Day, month, year
Week starts on
Monday

Keyboard

The calendar opens with focus on the chosen day, or on today. One day is a tab stop, and the arrow keys move between days and across months.

Left and Right arrows
Previous and next day
Up and Down arrows
Same day of the previous and next week
Home and End
First and last day of the week
Page Up and Page Down
Previous and next month
Shift with Page Up or Page Down
Previous and next year
Enter or Space
Chooses the day and closes
Escape
Closes without a change

Touch screens and screen readers

On a touch screen the field opens the device's own date or time picker. It is made for fingers, speaks the person's language and does not zoom the page.

The calendar is a dialog named after the field. Each day is read with its full date, the chosen day as selected and today as the current date. The month name above the grid is announced when it changes.

Permitted and not permitted

Permitted

  • 28 Sep 2026

    It reads the same in Kathmandu, Zagreb and Chicago.

Not permitted

  • 09/10/2026

    It is 10 September in Chicago and 9 October in Zagreb.

NextCheckbox

Date and time picker

Takes a calendar day or a time of day, typed or picked from a month calendar or a list of times.

  • Kind: component
  • Name: DatePicker
  • Page: https://design.werklist.com/components/date-picker
  • Version: 2.1.2

When to use it

  • One day: a start date, a passport expiry, an interview
  • A period, as two fields labelled Start and End
  • A time of day, with the time field

When not to use it

  • A date shown in figures only, such as 09/10/2026
  • A year in two digits
  • A calendar as the only way to reach a day far from today

Rules

  • A date without a time is a calendar day, stored and shown without a time zone
  • A period is two fields. The End calendar opens on the month of the start and offers no earlier day
  • Slots are 30 minutes apart, or 15 when the task needs it

Anatomy

  • Field: a text field with a 32 px icon button at its end, named Choose date, holding a 16 px calendar icon (--input-border)
  • Calendar: 284 px wide, narrower in a small window, padding 12 px, corner radius 12 px (--glass-fill-raised)
  • Calendar shadow: the raised shadow, with a top highlight and a fine ring in dark (--glass-shadow-raised)
  • Header: the month and the year, 14 px on 20 px, weight 700, between 32 px buttons for the previous and the next month (--text)
  • Weekday row: short day names in the reader's language, 11 px on 16 px, weight 500, 4 px above the days, Monday first (--text-muted)
  • Day: 36 px high, as wide as its column, corner radius 8 px, 14 px aligned figures, in seven columns 2 px apart (--text)
  • Day under the pointer: a light fill (--glass-fill-hover)
  • Day in focus: a 2 px ring of the brand blue at 40 percent (--brand-blue)
  • Chosen day: the brand fill with white figures at weight 700 (--brand-true)
  • Today: a 4 px dot in the brand colour, 4 px above the bottom of the day, hidden on the chosen day (--brand-true)
  • Day that cannot be chosen: faded to 30 percent, with aria-disabled
  • Days of other months: left blank
  • Time list: slots every 30 minutes from 08:00 to 21:00, under the headings Morning, Afternoon and Evening in 11 px on 16 px, with the rows of the combobox (--text)

Sizes

  • md: height 44 px
  • lg: height 48 px

States

  • Field states: As the text field, with no hover state (--input-border, --brand-blue, --error)
  • A date the field cannot read: The text is kept, and the error gives an example: Enter a date like 28 Sep 2026. (--error)
  • Touch screen: The device's own date or time picker takes the place of the calendar and the list

Keyboard

  • Left and Right arrows: Previous and next day
  • Up and Down arrows: Same day of the previous and next week
  • Home and End: First and last day of the week
  • Page Up and Page Down: Previous and next month
  • Shift+Page Up and Shift+Page Down: Previous and next year
  • Enter or Space: Chooses the day and closes
  • Escape: Closes without a change. Focus returns to the calendar button
  • Tab: Moves between the month buttons and the grid. One day is in the tab order

Accessibility

  • The calendar is a dialog with aria-modal="true", named after the field label
  • The month is a grid. Each day is a button named with its full date
  • aria-selected="true" on the chosen day, and aria-current="date" on today
  • The month heading is announced when it changes
  • With reduced motion the calendar only fades, and months do not slide

Content

  • Display: the day, the short month and the full year in the reader's language, such as 28 Sep 2026
  • Input: the day first with dots, slashes or spaces, the month by name, or year, month and day in that order. The year is written in full
  • Clock: 24 hour, or 12 hour when the person's settings say so
  • Time zone: named in the hint when readers in more than one zone see the value

Tokens

  • --glass-fill-input
  • --input-border
  • --glass-fill-raised
  • --glass-shadow-raised
  • --glass-fill-hover
  • --brand-blue
  • --brand-true
  • --on-brand
  • --text
  • --text-muted
  • --radius-lg
  • --radius-xl
  • --space-1
  • --space-3
  • --layer-popover

JSON

{
  "title": "Date and time picker",
  "path": "/components/date-picker",
  "url": "https://design.werklist.com/components/date-picker",
  "text": "https://design.werklist.com/agent/components/date-picker",
  "summary": "Fields for a date or a time that accept typing and open a calendar or a list of times.",
  "version": "2.1.2",
  "kind": "component",
  "name": "DatePicker",
  "purpose": "Takes a calendar day or a time of day, typed or picked from a month calendar or a list of times.",
  "use": [
    "One day: a start date, a passport expiry, an interview",
    "A period, as two fields labelled Start and End",
    "A time of day, with the time field"
  ],
  "avoid": [
    "A date shown in figures only, such as 09/10/2026",
    "A year in two digits",
    "A calendar as the only way to reach a day far from today"
  ],
  "anatomy": [
    {
      "part": "Field",
      "measure": "a text field with a 32 px icon button at its end, named Choose date, holding a 16 px calendar icon",
      "token": "--input-border"
    },
    {
      "part": "Calendar",
      "measure": "284 px wide, narrower in a small window, padding 12 px, corner radius 12 px",
      "token": "--glass-fill-raised"
    },
    {
      "part": "Calendar shadow",
      "measure": "the raised shadow, with a top highlight and a fine ring in dark",
      "token": "--glass-shadow-raised"
    },
    {
      "part": "Header",
      "measure": "the month and the year, 14 px on 20 px, weight 700, between 32 px buttons for the previous and the next month",
      "token": "--text"
    },
    {
      "part": "Weekday row",
      "measure": "short day names in the reader's language, 11 px on 16 px, weight 500, 4 px above the days, Monday first",
      "token": "--text-muted"
    },
    {
      "part": "Day",
      "measure": "36 px high, as wide as its column, corner radius 8 px, 14 px aligned figures, in seven columns 2 px apart",
      "token": "--text"
    },
    {
      "part": "Day under the pointer",
      "measure": "a light fill",
      "token": "--glass-fill-hover"
    },
    {
      "part": "Day in focus",
      "measure": "a 2 px ring of the brand blue at 40 percent",
      "token": "--brand-blue"
    },
    {
      "part": "Chosen day",
      "measure": "the brand fill with white figures at weight 700",
      "token": "--brand-true"
    },
    {
      "part": "Today",
      "measure": "a 4 px dot in the brand colour, 4 px above the bottom of the day, hidden on the chosen day",
      "token": "--brand-true"
    },
    {
      "part": "Day that cannot be chosen",
      "measure": "faded to 30 percent, with aria-disabled"
    },
    {
      "part": "Days of other months",
      "measure": "left blank"
    },
    {
      "part": "Time list",
      "measure": "slots every 30 minutes from 08:00 to 21:00, under the headings Morning, Afternoon and Evening in 11 px on 16 px, with the rows of the combobox",
      "token": "--text"
    }
  ],
  "sizes": [
    {
      "name": "md",
      "height": "44 px"
    },
    {
      "name": "lg",
      "height": "48 px"
    }
  ],
  "states": [
    {
      "name": "Field states",
      "change": "As the text field, with no hover state",
      "tokens": [
        "--input-border",
        "--brand-blue",
        "--error"
      ]
    },
    {
      "name": "A date the field cannot read",
      "change": "The text is kept, and the error gives an example: Enter a date like 28 Sep 2026.",
      "tokens": [
        "--error"
      ]
    },
    {
      "name": "Touch screen",
      "change": "The device's own date or time picker takes the place of the calendar and the list"
    }
  ],
  "keys": [
    {
      "key": "Left and Right arrows",
      "action": "Previous and next day"
    },
    {
      "key": "Up and Down arrows",
      "action": "Same day of the previous and next week"
    },
    {
      "key": "Home and End",
      "action": "First and last day of the week"
    },
    {
      "key": "Page Up and Page Down",
      "action": "Previous and next month"
    },
    {
      "key": "Shift+Page Up and Shift+Page Down",
      "action": "Previous and next year"
    },
    {
      "key": "Enter or Space",
      "action": "Chooses the day and closes"
    },
    {
      "key": "Escape",
      "action": "Closes without a change. Focus returns to the calendar button"
    },
    {
      "key": "Tab",
      "action": "Moves between the month buttons and the grid. One day is in the tab order"
    }
  ],
  "accessibility": [
    "The calendar is a dialog with aria-modal=\"true\", named after the field label",
    "The month is a grid. Each day is a button named with its full date",
    "aria-selected=\"true\" on the chosen day, and aria-current=\"date\" on today",
    "The month heading is announced when it changes",
    "With reduced motion the calendar only fades, and months do not slide"
  ],
  "content": [
    "Display: the day, the short month and the full year in the reader's language, such as 28 Sep 2026",
    "Input: the day first with dots, slashes or spaces, the month by name, or year, month and day in that order. The year is written in full",
    "Clock: 24 hour, or 12 hour when the person's settings say so",
    "Time zone: named in the hint when readers in more than one zone see the value"
  ],
  "tokens": [
    "--glass-fill-input",
    "--input-border",
    "--glass-fill-raised",
    "--glass-shadow-raised",
    "--glass-fill-hover",
    "--brand-blue",
    "--brand-true",
    "--on-brand",
    "--text",
    "--text-muted",
    "--radius-lg",
    "--radius-xl",
    "--space-1",
    "--space-3",
    "--layer-popover"
  ],
  "rules": [
    "A date without a time is a calendar day, stored and shown without a time zone",
    "A period is two fields. The End calendar opens on the month of the start and offers no earlier day",
    "Slots are 30 minutes apart, or 15 when the task needs it"
  ]
}

Raw file: https://design.werklist.com/agent/components/date-picker