import { Button as AriaButton, Calendar as AriaCalendar, CalendarGridHeader as AriaCalendarGridHeader, CalendarCell, CalendarGrid, CalendarGridBody, CalendarHeaderCell, Heading, } from 'react-aria-components'; import { getLocalTimeZone, today } from '@internationalized/date'; import { tv } from 'tailwind-variants'; import { ChevronLeftIcon, ChevronRightIcon } from '@/components/icons'; import { calendarDateToDate, dateToCalendarDate } from './utils'; const cellStyles = tv({ base: 'flex h-[30px] w-[30px] cursor-default items-center justify-center rounded-full text-xs outline-none', variants: { isSelected: { true: 'bg-primary font-bold text-white', false: '', }, isDisabled: { true: 'cursor-default text-dabeeo-gray-be', }, isUnavailable: { true: 'cursor-default text-dabeeo-gray-be line-through', }, isOutsideMonth: { true: 'text-dabeeo-gray-be', }, isSunday: { true: 'text-[#e48686]', }, isSaturday: { true: 'text-[#7b8cc8]', }, isToday: { true: 'font-bold text-primary', }, isHovered: { true: 'bg-primary-tertiary01', }, isFocusVisible: { true: 'ring-2 ring-offset-2 ring-primary', }, }, compoundVariants: [ { isSelected: true, isSunday: true, className: 'text-white', }, { isSelected: true, isSaturday: true, className: 'text-white', }, { isSelected: true, isToday: true, className: 'text-white', }, { isSelected: true, isHovered: true, className: 'bg-primary', }, ], }); export interface CalendarProps { value?: Date | null; defaultValue?: Date | null; onChange?: (date: Date | null) => void; maxValue?: Date | null; minValue?: Date | null; isDisabled?: boolean; className?: string; } export function Calendar({ value, defaultValue, onChange, maxValue, minValue, isDisabled, className }: CalendarProps) { const todayDate = today(getLocalTimeZone()); return ( onChange?.(calendarDateToDate(val))} maxValue={maxValue !== undefined ? dateToCalendarDate(maxValue) : undefined} minValue={minValue !== undefined ? dateToCalendarDate(minValue) : undefined} isDisabled={isDisabled} firstDayOfWeek="sun" className={className} > {(date) => { const dayOfWeek = date.toDate('UTC').getDay(); const isSunday = dayOfWeek === 0; const isSaturday = dayOfWeek === 6; const isToday = date.compare(todayDate) === 0; return ( cellStyles({ isSelected, isDisabled: isCellDisabled, isUnavailable, isOutsideMonth, isSunday: !isSelected && !isDisabled && !isOutsideMonth ? isSunday : false, isSaturday: !isSelected && !isDisabled && !isOutsideMonth ? isSaturday : false, isToday: !isSelected ? isToday : false, isHovered: !isSelected ? isHovered : false, isFocusVisible, }) } /> ); }} ); } const navButton = tv({ base: 'flex h-7 w-7 items-center justify-center rounded-sm border-none bg-transparent outline-none', variants: { isDisabled: { true: 'cursor-default text-dabeeo-gray-be', false: 'cursor-pointer text-dabeeo-black-34 hover:bg-dabeeo-gray-eb', }, isFocusVisible: { true: 'ring-2 ring-offset-2 ring-primary', }, }, defaultVariants: { isDisabled: false, }, }); export function CalendarHeader() { return (
navButton(renderProps)}> navButton(renderProps)}>
); } export function CalendarGridHeader() { return ( {(day) => ( {day} )} ); }