Reka UI logoReka
backdrop
Components

Month Range Picker

Alpha
Presents a calendar view tailored for selecting month ranges.
Month Picker, 2024
2024
Jan
Feb
Mar
Apr
May
Jun
Jul
Aug
Sep
Oct
Nov
Dec

Features

  • Full keyboard navigation
  • Can be controlled or uncontrolled
  • Focus is fully managed
  • Localization support
  • Highly composable

Preface

The component depends on the @internationalized/date package, which solves a lot of the problems that come with working with dates and times in JavaScript.

We highly recommend reading through the documentation for the package to get a solid feel for how it works, and you'll need to install it in your project to use the date-related components.

Installation

Install the date package.

sh
$ npm add @internationalized/date

Install the component from your command line.

sh
$ npm add reka-ui

Anatomy

Import all parts and piece them together.

vue
<script setup>
import {
  MonthRangePickerCell,
  MonthRangePickerCellTrigger,
  MonthRangePickerGrid,
  MonthRangePickerGridBody,
  MonthRangePickerGridRow,
  MonthRangePickerHeader,
  MonthRangePickerHeading,
  MonthRangePickerNext,
  MonthRangePickerPrev,
  MonthRangePickerRoot,
} from 'reka-ui'
</script>

<template>
  <MonthRangePickerRoot>
    <MonthRangePickerHeader>
      <MonthRangePickerPrev />
      <MonthRangePickerHeading />
      <MonthRangePickerNext />
    </MonthRangePickerHeader>
    <MonthRangePickerGrid>
      <MonthRangePickerGridBody>
        <MonthRangePickerGridRow>
          <MonthRangePickerCell>
            <MonthRangePickerCellTrigger />
          </MonthRangePickerCell>
        </MonthRangePickerGridRow>
      </MonthRangePickerGridBody>
    </MonthRangePickerGrid>
  </MonthRangePickerRoot>
</template>

API Reference

Root

Contains all the parts of a month range picker

PropDefaultType
allowNonContiguousRanges
false
boolean

When combined with isMonthUnavailable, determines whether non-contiguous ranges may be selected.

as
'div'
AsTag | Component

The element or component this component should render as. Can be overwritten by asChild.

asChild
boolean

Change the default rendered element for the one passed as a child, merging their props and behavior.

Read our Composition guide for more details.

calendarLabel
string

The accessible label for the calendar

defaultPlaceholder
DateValue

The default placeholder date

defaultValue
{ start: undefined, end: undefined }
DateRange

The default value for the calendar

dir
'ltr' | 'rtl'

The reading direction of the calendar when applicable.

disabled
false
boolean

Whether or not the calendar is disabled

fixedDate
'start' | 'end'

Which part of the range should be fixed

initialFocus
false
boolean

If true, the calendar will focus the selected month on mount

isMonthDisabled
Matcher

A function that returns whether or not a month is disabled

isMonthUnavailable
Matcher

A function that returns whether or not a month is unavailable

locale
string

The locale to use for formatting dates

maximumMonths
number

The maximum number of months that can be selected in a range

maxValue
DateValue

The maximum date that can be selected

minValue
DateValue

The minimum date that can be selected

modelValue
DateRange | null

The controlled checked state of the calendar. Can be bound as v-model.

nextPage
((placeholder: DateValue) => DateValue)

A function that returns the next page of the calendar.

placeholder
DateValue

The placeholder date, which is used to determine what year to display when no date is selected.

preventDeselect
false
boolean

Whether or not to prevent the user from deselecting a date without selecting another date first

prevPage
((placeholder: DateValue) => DateValue)

A function that returns the previous page of the calendar.

readonly
false
boolean

Whether or not the calendar is readonly

EmitPayload
update:modelValue
[date: DateRange]

Event handler called whenever the model value changes

update:placeholder
[date: DateValue]

Event handler called whenever the placeholder value changes

update:startValue
[date: DateValue]

Event handler called whenever the start value changes

Slots (default)Payload
date
DateValue

The current date of the placeholder

grid
Grid<DateValue>

The grid of months

locale
string

The calendar locale

modelValue
DateRange

The current date range

MethodsType
isMonthDisabled
Matcher

A function that returns whether or not a month is disabled

isMonthUnavailable
Matcher

A function that returns whether or not a month is unavailable

Data AttributeValue
[data-readonly]Present when readonly
[data-disabled]Present when disabled
[data-invalid]Present when invalid

Contains the navigation buttons and the heading segments.

PropDefaultType
as
'div'
AsTag | Component

The element or component this component should render as. Can be overwritten by asChild.

asChild
boolean

Change the default rendered element for the one passed as a child, merging their props and behavior.

Read our Composition guide for more details.

Prev Button

Calendar navigation button. It navigates the calendar one year in the past.

PropDefaultType
as
'button'
AsTag | Component

The element or component this component should render as. Can be overwritten by asChild.

asChild
boolean

Change the default rendered element for the one passed as a child, merging their props and behavior.

Read our Composition guide for more details.

prevPage
((placeholder: DateValue) => DateValue)

The function to be used for the prev page. Overwrites the prevPage function set on the Root.

Slots (default)Payload
disabled
boolean

Current disable state

Data AttributeValue
[data-disabled]Present when disabled

Next Button

Calendar navigation button. It navigates the calendar one year in the future.

PropDefaultType
as
'button'
AsTag | Component

The element or component this component should render as. Can be overwritten by asChild.

asChild
boolean

Change the default rendered element for the one passed as a child, merging their props and behavior.

Read our Composition guide for more details.

nextPage
((placeholder: DateValue) => DateValue)

The function to be used for the next page. Overwrites the nextPage function set on the Root.

Slots (default)Payload
disabled
boolean

Current disable state

Data AttributeValue
[data-disabled]Present when disabled

Heading

Heading for displaying the current year.

PropDefaultType
as
'div'
AsTag | Component

The element or component this component should render as. Can be overwritten by asChild.

asChild
boolean

Change the default rendered element for the one passed as a child, merging their props and behavior.

Read our Composition guide for more details.

Slots (default)Payload
headingValue
string

Current year heading

Data AttributeValue
[data-disabled]Present when disabled

Grid

Container for wrapping the month range picker grid.

PropDefaultType
as
'table'
AsTag | Component

The element or component this component should render as. Can be overwritten by asChild.

asChild
boolean

Change the default rendered element for the one passed as a child, merging their props and behavior.

Read our Composition guide for more details.

Data AttributeValue
[data-readonly]Present when readonly
[data-disabled]Present when disabled

Grid Body

Container for wrapping the grid body.

PropDefaultType
as
'tbody'
AsTag | Component

The element or component this component should render as. Can be overwritten by asChild.

asChild
boolean

Change the default rendered element for the one passed as a child, merging their props and behavior.

Read our Composition guide for more details.

Grid Row

Container for wrapping the grid row.

PropDefaultType
as
'tr'
AsTag | Component

The element or component this component should render as. Can be overwritten by asChild.

asChild
boolean

Change the default rendered element for the one passed as a child, merging their props and behavior.

Read our Composition guide for more details.

Cell

Container for wrapping the month range picker cells.

PropDefaultType
as
'td'
AsTag | Component

The element or component this component should render as. Can be overwritten by asChild.

asChild
boolean

Change the default rendered element for the one passed as a child, merging their props and behavior.

Read our Composition guide for more details.

date*
DateValue

The date value for the cell

Data AttributeValue
[data-disabled]Present when disabled

Cell Trigger

Interactable container for displaying the cell months. Clicking it selects the month.

PropDefaultType
as
'div'
AsTag | Component

The element or component this component should render as. Can be overwritten by asChild.

asChild
boolean

Change the default rendered element for the one passed as a child, merging their props and behavior.

Read our Composition guide for more details.

month*
DateValue

The date value provided to the cell trigger

Slots (default)Payload
monthValue
string

Current month value (short name)

disabled
boolean

Current disable state

selected
boolean

Current selected state

today
boolean

Current month is today's month state

unavailable
boolean

Current unavailable state

highlighted
boolean

Current highlighted state

highlightedStart
boolean

Current highlighted start state

highlightedEnd
boolean

Current highlighted end state

selectionStart
boolean

Current selection start state

selectionEnd
boolean

Current selection end state

Data AttributeValue
[data-selected]Present when selected
[data-value]The ISO string value of the date.
[data-disabled]Present when disabled
[data-unavailable]Present when unavailable
[data-today]Present when the month is the current month
[data-selection-start]Present when the month is the start of the selection.
[data-selection-end]Present when the month is the end of the selection.
[data-highlighted]Present when the month is highlighted by the user as they select a range.
[data-highlighted-start]Present when the month is the start of the range that is highlighted by the user.
[data-highlighted-end]Present when the month is the end of the range that is highlighted by the user.
[data-focused]Present when focused

Accessibility

Keyboard Interactions

KeyDescription
Tab
When focus moves onto the month range picker, focuses the first navigation button.
Space
When the focus is on either MonthRangePickerNext or MonthRangePickerPrev, it navigates the calendar. Otherwise, it selects the month.
Enter
When the focus is on either MonthRangePickerNext or MonthRangePickerPrev, it navigates the calendar. Otherwise, it selects the month.
ArrowLeftArrowRightArrowUpArrowDown
When the focus is on MonthRangePickerCellTrigger, it navigates the months, changing the year if necessary.
PageUp
When the focus is on MonthRangePickerCellTrigger, it navigates to the same month in the previous year.
PageDown
When the focus is on MonthRangePickerCellTrigger, it navigates to the same month in the next year.
Escape
Cancels the current range selection and restores the previous valid range.