| 173 | } |
| 174 | |
| 175 | function CalendarDayButton({ |
| 176 | className, |
| 177 | day, |
| 178 | modifiers, |
| 179 | ...props |
| 180 | }: React.ComponentProps<typeof DayButton>) { |
| 181 | const defaultClassNames = getDefaultClassNames() |
| 182 | |
| 183 | const ref = React.useRef<HTMLButtonElement>(null) |
| 184 | React.useEffect(() => { |
| 185 | if (modifiers.focused) ref.current?.focus() |
| 186 | }, [modifiers.focused]) |
| 187 | |
| 188 | return ( |
| 189 | <Button |
| 190 | ref={ref} |
| 191 | variant="ghost" |
| 192 | size="icon" |
| 193 | data-day={day.date.toLocaleDateString()} |
| 194 | data-selected-single={ |
| 195 | modifiers.selected && |
| 196 | !modifiers.range_start && |
| 197 | !modifiers.range_end && |
| 198 | !modifiers.range_middle |
| 199 | } |
| 200 | data-range-start={modifiers.range_start} |
| 201 | data-range-end={modifiers.range_end} |
| 202 | data-range-middle={modifiers.range_middle} |
| 203 | className={cn( |
| 204 | "data-[selected-single=true]:bg-primary data-[selected-single=true]:text-primary-foreground data-[range-middle=true]:bg-accent data-[range-middle=true]:text-accent-foreground data-[range-start=true]:bg-primary data-[range-start=true]:text-primary-foreground data-[range-end=true]:bg-primary data-[range-end=true]:text-primary-foreground group-data-[focused=true]/day:border-ring group-data-[focused=true]/day:ring-ring/50 dark:hover:text-accent-foreground flex aspect-square size-auto w-full min-w-(--cell-size) flex-col gap-1 leading-none font-normal group-data-[focused=true]/day:relative group-data-[focused=true]/day:z-10 group-data-[focused=true]/day:ring-[3px] data-[range-end=true]:rounded-md data-[range-end=true]:rounded-r-md data-[range-middle=true]:rounded-none data-[range-start=true]:rounded-md data-[range-start=true]:rounded-l-md [&>span]:text-xs [&>span]:opacity-70", |
| 205 | defaultClassNames.day, |
| 206 | className |
| 207 | )} |
| 208 | {...props} |
| 209 | /> |
| 210 | ) |
| 211 | } |
| 212 | |
| 213 | export { Calendar, CalendarDayButton } |