An ESM date input component with a composable datepicker UI for React.
- Calendar datepicker UI for date selection.
- Composable components for flexible customisation (optional).
- Customisable display and value formats (as per date-fns format).
- Maximum/minimum date range.
- Uses the Constraint Validation API to setCustomValidity (with optional message customisation).
- User typing support.
- ARIA screen reader support.
- Keyboard navigation support with
Tab,Space/Enter&Esc/Escapekeys. - Locale support for internationalisation.
- Inherited text direction support for "RTL" (Right To Left) written languages.
- Light & dark themes with prefers-color-scheme.
- React controlled component.
Check out the Storybook docs for working examples.
Update/install the peer dependencies as needed.
Install the package:
npm i @idesigncode/date-input
Here is a basic example of how to set up the component:
import React from 'react';
import DateInput from '@idesigncode/date-input/DateInput.mjs';
import '@idesigncode/date-input/theme.css';
import '@idesigncode/date-input/layout.css';
const BasicUsage = () => {
const [value, setValue] = React.useState('');
const handleOnChange = (event, formatValue) => {
setValue(formatValue);
};
return (
<DateInput name="field_name" onChange={handleOnChange} value={value} />
);
};
export default BasicUsage;For more information see the Required Props example.
If you want further customisation of the components you can compose them yourself:
import React from 'react';
import '@idesigncode/date-input/theme.css';
import Calendar from '@idesigncode/date-input/Calendar.mjs';
import '@idesigncode/date-input/Calendar.css';
import CalendarArrow from '@idesigncode/date-input/CalendarArrow.mjs';
import '@idesigncode/date-input/CalendarArrow.css';
import DateInput from '@idesigncode/date-input/DateInput.mjs';
import '@idesigncode/date-input/DateInput.css';
import CalendarTabs from '@idesigncode/date-input/CalendarTabs.mjs';
import '@idesigncode/date-input/CalendarTabs.css';
import Field from '@idesigncode/date-input/Field.mjs';
import '@idesigncode/date-input/Field.css';
import View from '@idesigncode/date-input/View.mjs';
import '@idesigncode/date-input/View.css';
import ViewBody from '@idesigncode/date-input/ViewBody.mjs';
import '@idesigncode/date-input/ViewBody.css';
import ViewHead from '@idesigncode/date-input/ViewHead.mjs';
import '@idesigncode/date-input/ViewHead.css';
import ViewWeekDays from '@idesigncode/date-input/ViewWeekDays.mjs';
import '@idesigncode/date-input/ViewWeekDays.css';
const ComposableUsage = () => {
const [value, setValue] = React.useState('');
const handleOnChange = (event, formatValue) => {
setValue(formatValue);
};
return (
<DateInput name="field_name" onChange={handleOnChange} value={value}>
<Field />
<Calendar>
<CalendarArrow />
<CalendarTabs />
<View>
<ViewHead />
<ViewBody>
<ViewWeekDays />
</ViewBody>
</View>
</Calendar>
</DateInput>
);
};
export default ComposableUsage;For more information about composable usage, please see the props/children example.
The CSS (themes) & CSS (layout) are exported for use via stylesheets. It is best to declare these default styles before your own styles.
You can also supply your own pre-styled component for the input field with the as prop (see the props/as documentation for more information).
Validation of the value is performed with the displayFormat, format, max, min and required props (if given).
This validation occurs during the input field's onInput event, and also on initial load (if there is a given value).
For more information about validation, please see the Validation example.
You can also set your own custom validity messages with the onValidationMessage prop (see the props/onValidationMessage example).
ARIA attributes are used to provide screen reader support.
All interactive elements are keyboard accessible by using the standard Tab & Space/Enter key navigation. The Esc/Escape key can also be used to close the <Calendar /> while open.
Upon the user opening the <Calendar />, either the selected date or first selectable date recieves :focus.
| Prop | Type | Description |
|---|---|---|
name |
string | Standard HTML attribute for the field name. |
onChange |
func | A function for custom handling of onChange events. Receives the input field's onChange event and the formatValue (formatted as per format). |
value |
string | A date string formatted as per the format prop or an empty string. |
Note: It is recommended to update your local state with the
formatValuerather than theevent.target.value.
| Prop | Type | Default | Description |
|---|---|---|---|
as |
elementType OR string | Customise the input field with either a custom component or an HTML element. | |
className |
string | Can be directly given to each component. | |
disabled |
bool | Disable the input field and prevent calendar opening. | |
displayFormat |
string | dd/MM/yyyy |
The date-fns format of the selected date when displayed to the user. This also becomes the placeholder text (lowercase). |
format |
string | yyyy-MM-dd |
The date-fns format of the max, min and value props. Also formats the formatValue returned from the onChange function. |
initialView |
string | Day |
The view to open the calendar to (either Day, Month or Year). |
locale |
object | en-AU | The date-fns locale object used for formatting and text translation. |
max |
string | A date string formatted as per the format prop. This will prevent the user selecting a date after this date. |
|
min |
string | A date string formatted as per the format prop. This will prevent the user selecting a date before this date. |
|
onValidationMessage |
function | A function for custom handling of validation messages. Receives an error message string (due to an invalid value) or an empty string from the input field's onInput event. |
|
open |
bool | false |
Shows the <Calendar /> on initial load. |
ref |
ref object | A React ref for referencing the input field. This must only be applied to the <DateInput /> component. |
|
required |
bool | Standard HTML attribute for specifying a value is required. | |
| ...HTML attributes | These will be passed to the input field unless they are reserved for use within the component. |