Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/zendeskgarden/website/llms.txt

Use this file to discover all available pages before exploring further.

Package: @zendeskgarden/react-datepickers
import { DatePicker, DatePickerRange } from '@zendeskgarden/react-datepickers';
import { Field, Input } from '@zendeskgarden/react-forms';

When to use it

  • To select a single date, use DatePicker.
  • To select a start and an end date, use DatePickerRange.

Basic usage

DatePicker wraps an Input and manages calendar state. Bind value and onChange for controlled usage.
import React, { useState } from 'react';
import { DatePicker } from '@zendeskgarden/react-datepickers';
import { Field, Input } from '@zendeskgarden/react-forms';

const Example = () => {
  const [date, setDate] = useState(new Date());

  return (
    <Field>
      <Field.Label>Select a date</Field.Label>
      <DatePicker value={date} onChange={setDate}>
        <Input />
      </DatePicker>
    </Field>
  );
};

export default Example;

Date range picker

DatePickerRange manages two inputs and a shared calendar. Use DatePickerRange.Start and DatePickerRange.End to wrap each input, and DatePickerRange.Calendar to render the calendar.
import React, { useState } from 'react';
import { DatePickerRange } from '@zendeskgarden/react-datepickers';
import { Field, Input } from '@zendeskgarden/react-forms';
import { compareAsc, addDays } from 'date-fns';

const Example = () => {
  const [startValue, setStartValue] = useState(new Date());
  const [endValue, setEndValue] = useState(addDays(new Date(), 16));

  const isInvalid = compareAsc(startValue, endValue) === 1;

  return (
    <DatePickerRange
      startValue={startValue}
      endValue={endValue}
      onChange={changes => {
        if (changes.startValue) setStartValue(changes.startValue);
        if (changes.endValue)   setEndValue(changes.endValue);
      }}
    >
      <div style={{ display: 'flex', gap: 16 }}>
        <Field>
          <Field.Label>Start</Field.Label>
          <DatePickerRange.Start>
            <Input />
          </DatePickerRange.Start>
        </Field>
        <Field>
          <Field.Label>End</Field.Label>
          <DatePickerRange.End>
            <Input validation={isInvalid ? 'error' : undefined} />
          </DatePickerRange.End>
          {isInvalid && (
            <Field.Message validation="error">
              End date must occur after the start date
            </Field.Message>
          )}
        </Field>
      </div>
      <DatePickerRange.Calendar />
    </DatePickerRange>
  );
};

export default Example;

Localization

Dates are formatted and parsed using the browser’s built-in Intl.DateTimeFormat API. Pass the locale prop to change the calendar and input language.
import React, { useState } from 'react';
import { DatePicker } from '@zendeskgarden/react-datepickers';
import { Field, Input } from '@zendeskgarden/react-forms';

const Example = () => {
  const [date, setDate] = useState(new Date());

  return (
    <Field>
      <Field.Label>Select a date</Field.Label>
      <Field.Hint>Arabic localization</Field.Hint>
      <DatePicker value={date} onChange={setDate} locale="ar-EG">
        <Input lang="ar-EG" />
      </DatePicker>
    </Field>
  );
};

export default Example;
For custom date formats beyond what Intl.DateTimeFormat supports, use the customParseDate prop alongside a formatting library such as date-fns or Day.js.

Custom date format

Use the formatDate prop (or pair customParseDate with a library) to control how dates are displayed in the input.
import React, { useState } from 'react';
import { DatePicker } from '@zendeskgarden/react-datepickers';
import { Field, Input } from '@zendeskgarden/react-forms';
import { format, parse } from 'date-fns';

const Example = () => {
  const [date, setDate] = useState(new Date());

  return (
    <Field>
      <Field.Label>Select a date</Field.Label>
      <DatePicker
        value={date}
        onChange={setDate}
        formatDate={d => format(d, 'MM/dd/yyyy')}
        customParseDate={str => parse(str, 'MM/dd/yyyy', new Date())}
      >
        <Input placeholder="MM/DD/YYYY" />
      </DatePicker>
    </Field>
  );
};

export default Example;

Time window (min/max dates)

Disable dates outside an allowed range using minValue and maxValue.
import React, { useState } from 'react';
import { DatePicker } from '@zendeskgarden/react-datepickers';
import { Field, Input } from '@zendeskgarden/react-forms';
import { addDays, subDays } from 'date-fns';

const Example = () => {
  const [date, setDate] = useState(new Date());
  const today = new Date();

  return (
    <Field>
      <Field.Label>Select a date</Field.Label>
      <Field.Hint>Available dates: next 30 days only</Field.Hint>
      <DatePicker
        value={date}
        onChange={setDate}
        minValue={today}
        maxValue={addDays(today, 30)}
      >
        <Input />
      </DatePicker>
    </Field>
  );
};

export default Example;

Compact size

Use isCompact to render a smaller DatePicker.
import React, { useState } from 'react';
import { DatePicker } from '@zendeskgarden/react-datepickers';
import { Field, Input } from '@zendeskgarden/react-forms';

const Example = () => {
  const [date, setDate] = useState(new Date());

  return (
    <Field>
      <Field.Label>Select a date</Field.Label>
      <DatePicker value={date} onChange={setDate} isCompact>
        <Input isCompact />
      </DatePicker>
    </Field>
  );
};

export default Example;

Component structure

{/* Single date */}
<Field>
  <Field.Label />
  <DatePicker value={date} onChange={setDate}>
    <Input />
  </DatePicker>
</Field>

{/* Date range */}
<DatePickerRange startValue={start} endValue={end} onChange={handleChange}>
  <Field>
    <Field.Label />
    <DatePickerRange.Start>
      <Input />
    </DatePickerRange.Start>
  </Field>
  <Field>
    <Field.Label />
    <DatePickerRange.End>
      <Input />
    </DatePickerRange.End>
  </Field>
  <DatePickerRange.Calendar />
</DatePickerRange>

API reference

DatePicker

Manages the calendar state for a single date. Nest an Input as its child.
body.value
Date
The currently selected date (controlled usage).
body.onChange
(date: Date) => void
Called with the newly selected Date when the user makes a selection.
body.locale
string
A BCP 47 language tag (e.g. "ar-EG", "fr-FR") passed to Intl.DateTimeFormat for calendar and input localization.
body.formatDate
(date: Date) => string
Custom function for formatting the date displayed in the input.
body.customParseDate
(inputValue: string) => Date
Custom function for parsing the string typed into the input back into a Date.
body.minValue
Date
Disables calendar dates before this value.
body.maxValue
Date
Disables calendar dates after this value.
body.isCompact
boolean
Renders a smaller calendar and input.

DatePickerRange

Manages start and end date state for a range selection. Nest DatePickerRange.Start, DatePickerRange.End, and DatePickerRange.Calendar as children.
body.startValue
Date
The currently selected start date.
body.endValue
Date
The currently selected end date.
body.onChange
(changes: { startValue?: Date; endValue?: Date }) => void
Called when the user selects a start or end date.
body.isCompact
boolean
Renders a smaller calendar and inputs.

DatePickerRange.Start

Wraps the start date Input. Nest inside DatePickerRange.

DatePickerRange.End

Wraps the end date Input. Nest inside DatePickerRange.

DatePickerRange.Calendar

Renders the shared date range calendar. Nest inside DatePickerRange.

Build docs developers (and LLMs) love