/** @jsxRuntime classic */
/** @jsx jsx */
import { DayPicker, type DayPickerProps } from '@daypicker/react'
import { jsx, useTheme } from '@keystone-ui/core'
import { getContrastText } from './utils/getContrastText'
import { hexToRgb } from './utils/hexToRgb'
export const Calendar = (props: DayPickerProps) => {
const styles = useCalendarStyles()
return (
)
}
// Styles
// ------------------------------
const useCalendarStyles = () => {
const { colors, palette } = useTheme()
const cellSize = 40
const navButtonSize = 32
const interactionColor = '#007AFF'
const rangeBetweenColor = hexToRgb(interactionColor, 0.2)
return {
padding: 8,
'.rdp-root': {
boxSizing: 'border-box',
display: 'inline-block',
fontSize: '1rem',
position: 'relative',
userSelect: 'none',
'*': {
boxSizing: 'border-box',
},
},
'.rdp-months': {
display: 'flex',
flexWrap: 'wrap',
justifyContent: 'center',
},
'.rdp-month': {
margin: 8,
position: 'relative',
},
'.rdp-month_grid': {
borderCollapse: 'separate',
borderSpacing: '0 2px',
},
// the caption is the day/month title e.g. "July 2020"
'.rdp-month_caption': {
alignItems: 'center',
display: 'flex',
height: navButtonSize,
marginBottom: '0.5em',
padding: '0 72px 0 0.5em',
textAlign: 'left',
},
'.rdp-caption_label': {
border: 0,
fontSize: '1rem',
fontWeight: 500,
position: 'relative',
whiteSpace: 'nowrap',
},
// weekdays
'.rdp-weekday': {
color: colors.foregroundDim,
fontSize: '0.875rem',
fontWeight: 500,
padding: '0.5em',
textAlign: 'center',
'abbr[title]': {
borderBottom: 'none',
textDecoration: 'none',
},
},
'.rdp-weeks': {
fontSize: '0.875rem',
fontWeight: 500,
},
'.rdp-week_number': {
borderRight: `1px solid ${colors.border}`,
color: colors.foregroundDim,
fontSize: '0.75em',
minWidth: '1em',
padding: '0.5em',
textAlign: 'right',
verticalAlign: 'middle',
},
// navigation buttons
'.rdp-nav': {
display: 'flex',
position: 'absolute',
right: 12,
top: 8,
zIndex: 1,
},
'.rdp-button_previous, .rdp-button_next': {
alignItems: 'center',
appearance: 'none',
backgroundColor: 'transparent',
border: 0,
borderRadius: 4,
color: colors.foreground,
cursor: 'pointer',
display: 'inline-flex',
font: 'inherit',
height: navButtonSize,
justifyContent: 'center',
margin: 0,
padding: 0,
width: navButtonSize,
'&:hover, &:focus-visible': {
backgroundColor: colors.backgroundHover,
outline: 0,
},
'&:focus-visible': {
boxShadow: `0 0 0 2px ${colors.focusRing}`,
},
'&:active': {
backgroundColor: colors.backgroundDim,
},
'&[aria-disabled="true"]': {
color: colors.foregroundDisabled,
cursor: 'default',
},
},
'.rdp-chevron': {
fill: 'currentColor',
height: 18,
width: 18,
},
// day grid cells and buttons
'.rdp-day': {
height: cellSize,
padding: 0,
position: 'relative',
textAlign: 'center',
verticalAlign: 'middle',
width: cellSize,
},
'.rdp-day_button': {
alignItems: 'center',
appearance: 'none',
backgroundColor: 'transparent',
border: 0,
borderRadius: '50%',
color: 'inherit',
display: 'inline-flex',
font: 'inherit',
height: cellSize,
justifyContent: 'center',
margin: 0,
outline: 0,
padding: 0,
position: 'relative',
width: cellSize,
},
'.rdp-outside, .rdp-disabled': {
color: colors.foregroundDim,
},
'.rdp-disabled .rdp-day_button': {
cursor: 'default',
},
'.rdp-day:not(.rdp-disabled):not(.rdp-outside) .rdp-day_button': {
cursor: 'pointer',
'&:hover, &:focus-visible': {
boxShadow: `inset 0 0 0 2px ${interactionColor}`,
outline: 0,
},
},
'.rdp-today:not(.rdp-outside)': {
color: palette.red400,
fontWeight: 700,
},
'.rdp-selected:not(.rdp-outside) .rdp-day_button': {
backgroundColor: interactionColor,
color: getContrastText(interactionColor),
},
// range-specific day styles
'.rdp-range_start:not(.rdp-outside)': {
background: `linear-gradient(to right, transparent 50%, ${rangeBetweenColor} 50%)`,
},
'.rdp-range_end:not(.rdp-outside)': {
background: `linear-gradient(to left, transparent 50%, ${rangeBetweenColor} 50%)`,
},
'.rdp-range_start.rdp-range_end:not(.rdp-outside)': {
background: 'transparent',
},
'.rdp-range_middle:not(.rdp-outside)': {
backgroundColor: rangeBetweenColor,
color: colors.foreground,
'.rdp-day_button': {
backgroundColor: 'transparent',
borderRadius: 0,
color: 'inherit',
},
},
} as const
}