diff --git a/src/form/Calendar/Calendar.story.tsx b/src/form/Calendar/Calendar.story.tsx index 869baec5..85bdd51d 100644 --- a/src/form/Calendar/Calendar.story.tsx +++ b/src/form/Calendar/Calendar.story.tsx @@ -25,6 +25,25 @@ export const Simple = () => { ); }; +export const Today = () => { + const [date, setDate] = useState(); + + return ( + + setDate(date)} + /> + + + {date?.toLocaleDateString() ?? 'No date selected'} + + + ); +}; + export const Disabled = () => { const [date, setDate] = useState(); @@ -121,6 +140,7 @@ export const Range = () => { onChange={val => setRange(val as [Date, Date | undefined])} isRange showDayOfWeek + showToday /> diff --git a/src/form/Calendar/Calendar.tsx b/src/form/Calendar/Calendar.tsx index af0f5236..fcd60d33 100644 --- a/src/form/Calendar/Calendar.tsx +++ b/src/form/Calendar/Calendar.tsx @@ -74,6 +74,11 @@ export interface CalendarProps { */ showDayOfWeek?: boolean; + /** + * Whether to highlight the today. + */ + showToday?: boolean; + /** * Whether to animate the calendar. */ @@ -101,9 +106,10 @@ export const Calendar: FC = ({ value, disabled, isRange, - previousArrow = '←', - nextArrow = '→', + previousArrow = '‹', + nextArrow = '›', showDayOfWeek, + showToday, animated = true, onChange, onViewChange, @@ -221,7 +227,7 @@ export const Calendar: FC = ({ variant="text" disabled={disabled} onClick={previousClickHandler} - className={twMerge(theme.header.prev)} + className={theme.header.prev} disablePadding > {previousArrow} @@ -230,11 +236,11 @@ export const Calendar: FC = ({ disabled={disabled} variant="text" onClick={headerClickHandler} - className={twMerge(theme.header.mid)} + className={theme.header.mid} disablePadding fullWidth > - + {view === 'days' && format(viewValue, 'MMMM')} {view === 'months' && <>{yearValue}} {view === 'years' && ( @@ -248,7 +254,7 @@ export const Calendar: FC = ({ variant="text" disabled={disabled} onClick={nextClickHandler} - className={twMerge(theme.header.next)} + className={theme.header.next} disablePadding > {nextArrow} @@ -277,6 +283,7 @@ export const Calendar: FC = ({ isRange={isRange} current={isRange ? [rangeStart, rangeEnd] : value} showDayOfWeek={showDayOfWeek} + showToday={showToday} xAnimation={xAnimation} animated={animated} onChange={dateChangeHandler} diff --git a/src/form/Calendar/CalendarDays/CalendarDays.tsx b/src/form/Calendar/CalendarDays/CalendarDays.tsx index 0208c8cc..7db689ac 100644 --- a/src/form/Calendar/CalendarDays/CalendarDays.tsx +++ b/src/form/Calendar/CalendarDays/CalendarDays.tsx @@ -1,5 +1,5 @@ import React, { FC, useCallback, useMemo, useState } from 'react'; -import { isAfter, isBefore } from 'date-fns'; +import { isAfter, isBefore, isToday } from 'date-fns'; import { Button } from '@/elements'; import { daysOfWeek, @@ -9,7 +9,7 @@ import { isPreviousWeekEmpty } from '@/form/Calendar/utils'; import { AnimatePresence, motion } from 'framer-motion'; -import { useComponentTheme } from '@/utils'; +import { cn, useComponentTheme } from '@/utils'; import { CalendarTheme } from '@/form/Calendar/CalendarTheme'; import { twMerge } from 'tailwind-merge'; @@ -64,6 +64,11 @@ export interface CalendarDaysProps { */ showDayOfWeek?: boolean; + /** + * Whether to highlight the today. + */ + showToday?: boolean; + /** * Customize the labels for the days of the week. */ @@ -116,6 +121,7 @@ export const CalendarDays: FC = ({ animated, xAnimation = 0, showDayOfWeek, + showToday, dayOfWeekLabels = daysOfWeek, hidePrevMonthDays, hideNextMonthDays, @@ -187,17 +193,19 @@ export const CalendarDays: FC = ({ return ( - + {displayMonths.map(i => ( {format(addMonths(viewValue, showPast ? -i : i), 'MMMM')} @@ -174,7 +173,7 @@ export const CalendarRange: FC = ({ variant="text" disabled={disabled} onClick={nextClickHandler} - className={twMerge(theme.header.next)} + className={theme.header.next} disablePadding > {nextArrow} @@ -201,7 +200,7 @@ export const CalendarRange: FC = ({ scale: { type: animated ? 'tween' : false } }} > -
+
{displayMonths.map((offset, idx) => ( = ({ return ( = ({ {yearDates.map(year => (