Every individual component is using Chakra UI. So it should respect all Chakra UI Configs without problem.
The componenent itself has to use some date library
Highly recommend just copy/paste the source code from /src to customize however you want.
Npm
npm i date-fns dayzed
npm i chakra-dayzed-datepicker
Yarn:
yarn add date-fns dayzed
yarn add chakra-dayzed-datepicker
import { SingleDatepicker } from "chakra-dayzed-datepicker";
const [date, setDate] = useState(new Date());
<SingleDatepicker
name="date-input"
date={date}
onDateChange={setDate}
/>Note that this list will have one value during the selection process. Your system won't work if you try to control this directly as [startDate, endDate] because we'll try to set selectedDates to [intermediateSelection] and the length of the resulting selectedDates is meaningful to the datepicker.
import { RangeDatepicker } from "chakra-dayzed-datepicker";
const [selectedDates, setSelectedDates] = useState<Date[]>([new Date(), new Date()]);
<RangeDatepicker
selectedDates={selectedDates}
onDateChange={setSelectedDates}
/>dateNavBtnProps extends from ButtonProps of Chakra-UI
This allows you to override the default behavior however your want as long as supported by Chakra-UI.
dayOfMonthBtnProps = {
defaultBtnProps,
isInRangeBtnProp,
selectedBtnProps,
todayBtnProps
}dayOfMonthBtnProps allows you to customzie date btn style based on the state.
Style precedence: default < isInRange < seleted < today.
popoverCompProps might be useful when you want to setup some simple styles like text color globally
popoverCompProps = {
popoverContentProps,
popoverBodyProps
}To sum them up:
propsConfigs={{
dateNavBtnProps: {},
dayOfMonthBtnProps: {
defaultBtnProps: {},
isInRangeBtnProps: {},
selectedBtnProps: {},
todayBtnProps: {}
},
inputProps: {},
popoverCompProps: {
popoverContentProps: {},
popoverBodyProps: {}
},
calendarPanelProps: {
wrapperProps: {},
contentProps: {},
headerProps: {},
dividerProps: {},
},
weekdayLabelProps: {},
dateHeadingProps: {}
}}
Example:
propsConfigs={{
dateNavBtnProps: {
colorScheme: "blue",
variant: "outline"
},
dayOfMonthBtnProps: {
defaultBtnProps: {
borderColor: "red.300",
_hover: {
background: 'blue.400',
}
},
isInRangeBtnProps: {
color: "yellow",
},
selectedBtnProps: {
background: "blue.200",
color: "green",
},
todayBtnProps: {
background: "teal.400",
}
},
inputProps: {
size: "sm"
},
popoverCompProps: {
popoverContentProps: {
background: "gray.700",
color: "white",
},
},
calendarPanelProps: {
wrapperProps: {
borderColor: 'green',
},
contentProps: {
borderWidth: 0,
},
headerProps: {
padding: '5px',
},
dividerProps: {
display: "none",
},
},
weekdayLabelProps: {
fontWeight: 'normal'
},
dateHeadingProps: {
fontWeight: 'semibold'
}
}}Non Chakra-related configurations :
configs={{
dateFormat: 'yyyy-MM-dd',
dayNames: 'abcdefg'.split(''), // length of 7
monthNames: 'ABCDEFGHIJKL'.split(''), // length of 12
firstDayOfWeek: 2, // default is 0, the dayNames[0], which is Sunday if you don't specify your own dayNames,
}}
| Name | single/range | Type | Default value | Description |
|---|---|---|---|---|
| name | both | string | undefined | name attribute for <input /> element |
| usePortal | both | boolean | undefined | to prevent parent styles from clipping or hiding content |
| defaultIsOpen | both | boolean | false | open the date panel at the beginning |
| closeOnSelect | both | boolean | true | close the date panel upon the complete selection |
| minDate | both | Date | undefined | minimum date |
| maxDate | both | Date | undefined | maximum date |
| disabledDates | single | Set | undefined | for single datepicker only, uses startOfDay as comparison, e.g., disabledDates={new Set([startOfDay(new Date()).getTime()} |
For version < [email protected]:
dayOfMonthBtnProps extends from ButtonProps and has only selectedBg support,
dayOfMonthBtnProps: {
borderColor: "red.300",
selectedBg: "blue.200",
_hover: {
bg: 'blue.400',
}
},
