-
Notifications
You must be signed in to change notification settings - Fork 1.2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat: Custom calendar support #7949
Conversation
… the type checker
Finally learned how to run `make check-examples` myself
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
pretty cool!
} | ||
|
||
export function isSameCalendar(a: Calendar, b: Calendar): boolean { | ||
return Object.getPrototypeOf(a) === Object.getPrototypeOf(b); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
going to be problematic for MFE's? this will only work for a single copy of the library
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Behavior looks sound to me. As for whether or not DatePicker should also support createCalendar
, would it just be passing that option down through to the Calendar within? Would be nice to support but if its a bunch of work I'm happy making it a followup for later
|
||
#getCurrentYear(year: number): [CalendarDate, boolean] { | ||
let anchor = this.#anchorDate.set({year}); | ||
let startOfYear = startOfWeek(anchor, 'en', 'sun'); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Maybe non important since this work is to support any type of custom calendar but I was curious during testing:
if someone wanted to make their 454 calendar work in whatever locale, they would just need to make sure their implementation has a variable locale here instead of hard coding it? Or would the expectation be that a 454 calendar doesn't actually change with respect to locale and should always have the same week start day, thus they should hardcode the firstDayOfWeek
in the Calendar?
2661cf8
to
c960800
Compare
## API Changes
react-aria-components/react-aria-components:Calendar Calendar <T extends DateValue> {
aria-describedby?: string
aria-details?: string
aria-label?: string
aria-labelledby?: string
autoFocus?: boolean = false
children?: ReactNode | ((CalendarRenderProps & {
defaultChildren: ReactNode | undefined
})) => ReactNode
className?: string | ((CalendarRenderProps & {
defaultClassName: string | undefined
})) => string
+ createCalendar?: (CalendarIdentifier) => Calendar
defaultFocusedValue?: DateValue | null
defaultValue?: DateValue | null
firstDayOfWeek?: 'sun' | 'mon' | 'tue' | 'wed' | 'thu' | 'fri' | 'sat'
focusedValue?: DateValue | null
isDateUnavailable?: (DateValue) => boolean
isDisabled?: boolean = false
isInvalid?: boolean
isReadOnly?: boolean = false
maxValue?: DateValue | null
minValue?: DateValue | null
onChange?: (MappedDateValue<DateValue>) => void
onFocusChange?: (CalendarDate) => void
pageBehavior?: PageBehavior = visible
slot?: string | null
style?: CSSProperties | ((CalendarRenderProps & {
defaultStyle: CSSProperties
})) => CSSProperties | undefined
value?: DateValue | null
visibleDuration?: DateDuration = {months: 1}
} /react-aria-components:RangeCalendar RangeCalendar <T extends DateValue> {
allowsNonContiguousRanges?: boolean
aria-describedby?: string
aria-details?: string
aria-label?: string
aria-labelledby?: string
autoFocus?: boolean = false
children?: ReactNode | ((RangeCalendarRenderProps & {
defaultChildren: ReactNode | undefined
})) => ReactNode
className?: string | ((RangeCalendarRenderProps & {
defaultClassName: string | undefined
})) => string
+ createCalendar?: (CalendarIdentifier) => Calendar
defaultFocusedValue?: DateValue | null
defaultValue?: RangeValue<DateValue> | null
firstDayOfWeek?: 'sun' | 'mon' | 'tue' | 'wed' | 'thu' | 'fri' | 'sat'
focusedValue?: DateValue | null
isDateUnavailable?: (DateValue) => boolean
isDisabled?: boolean = false
isInvalid?: boolean
isReadOnly?: boolean = false
maxValue?: DateValue | null
minValue?: DateValue | null
onChange?: (RangeValue<MappedDateValue<DateValue>>) => void
onFocusChange?: (CalendarDate) => void
pageBehavior?: PageBehavior = visible
slot?: string | null
style?: CSSProperties | ((RangeCalendarRenderProps & {
defaultStyle: CSSProperties
})) => CSSProperties | undefined
value?: RangeValue<DateValue> | null
visibleDuration?: DateDuration = {months: 1}
} /react-aria-components:CalendarProps CalendarProps <T extends DateValue> {
aria-describedby?: string
aria-details?: string
aria-label?: string
aria-labelledby?: string
autoFocus?: boolean = false
children?: ReactNode | ((CalendarRenderProps & {
defaultChildren: ReactNode | undefined
})) => ReactNode
className?: string | ((CalendarRenderProps & {
defaultClassName: string | undefined
})) => string
+ createCalendar?: (CalendarIdentifier) => Calendar
defaultFocusedValue?: DateValue | null
defaultValue?: DateValue | null
firstDayOfWeek?: 'sun' | 'mon' | 'tue' | 'wed' | 'thu' | 'fri' | 'sat'
focusedValue?: DateValue | null
isDateUnavailable?: (DateValue) => boolean
isDisabled?: boolean = false
isInvalid?: boolean
isReadOnly?: boolean = false
maxValue?: DateValue | null
minValue?: DateValue | null
onChange?: (MappedDateValue<DateValue>) => void
onFocusChange?: (CalendarDate) => void
pageBehavior?: PageBehavior = visible
slot?: string | null
style?: CSSProperties | ((CalendarRenderProps & {
defaultStyle: CSSProperties
})) => CSSProperties | undefined
value?: DateValue | null
visibleDuration?: DateDuration = {months: 1}
} /react-aria-components:RangeCalendarProps RangeCalendarProps <T extends DateValue> {
allowsNonContiguousRanges?: boolean
aria-describedby?: string
aria-details?: string
aria-label?: string
aria-labelledby?: string
autoFocus?: boolean = false
children?: ReactNode | ((RangeCalendarRenderProps & {
defaultChildren: ReactNode | undefined
})) => ReactNode
className?: string | ((RangeCalendarRenderProps & {
defaultClassName: string | undefined
})) => string
+ createCalendar?: (CalendarIdentifier) => Calendar
defaultFocusedValue?: DateValue | null
defaultValue?: RangeValue<DateValue> | null
firstDayOfWeek?: 'sun' | 'mon' | 'tue' | 'wed' | 'thu' | 'fri' | 'sat'
focusedValue?: DateValue | null
isDateUnavailable?: (DateValue) => boolean
isDisabled?: boolean = false
isInvalid?: boolean
isReadOnly?: boolean = false
maxValue?: DateValue | null
minValue?: DateValue | null
onChange?: (RangeValue<MappedDateValue<DateValue>>) => void
onFocusChange?: (CalendarDate) => void
pageBehavior?: PageBehavior = visible
slot?: string | null
style?: CSSProperties | ((RangeCalendarRenderProps & {
defaultStyle: CSSProperties
})) => CSSProperties | undefined
value?: RangeValue<DateValue> | null
visibleDuration?: DateDuration = {months: 1}
} @internationalized/date/@internationalized/date:Calendar Calendar {
fromJulianDay: (number) => CalendarDate
getDaysInMonth: (AnyCalendarDate) => number
getEras: () => Array<string>
+ getFormattableMonth: (AnyCalendarDate) => CalendarDate
getMinimumDayInMonth: (AnyCalendarDate) => number
getMinimumMonthInYear: (AnyCalendarDate) => number
getMonthsInYear: (AnyCalendarDate) => number
getYearsInEra: (AnyCalendarDate) => number
- identifier: string
+ identifier: CalendarIdentifier
+ isEqual: (Calendar) => boolean
toJulianDay: (AnyCalendarDate) => number
} /@internationalized/date:GregorianCalendar GregorianCalendar {
balanceDate: (Mutable<AnyCalendarDate>) => void
fromJulianDay: (number) => CalendarDate
getDaysInMonth: (AnyCalendarDate) => number
getDaysInYear: (AnyCalendarDate) => number
getEras: () => Array<string>
getMonthsInYear: (AnyCalendarDate) => number
getYearsInEra: (AnyCalendarDate) => number
- identifier: any
+ identifier: CalendarIdentifier
isInverseEra: (AnyCalendarDate) => boolean
toJulianDay: (AnyCalendarDate) => number
} /@internationalized/date:JapaneseCalendar JapaneseCalendar {
balanceDate: (Mutable<AnyCalendarDate>) => void
constrainDate: (Mutable<AnyCalendarDate>) => void
fromJulianDay: (number) => CalendarDate
getDaysInMonth: (AnyCalendarDate) => number
getDaysInYear: (AnyCalendarDate) => number
getEras: () => Array<string>
getMinimumDayInMonth: (AnyCalendarDate) => number
getMinimumMonthInYear: (AnyCalendarDate) => number
getMonthsInYear: (AnyCalendarDate) => number
getYearsInEra: (AnyCalendarDate) => number
- identifier: any
+ identifier: CalendarIdentifier
isInverseEra: (AnyCalendarDate) => boolean
toJulianDay: (AnyCalendarDate) => number
} /@internationalized/date:BuddhistCalendar BuddhistCalendar {
balanceDate: () => void
fromJulianDay: (number) => CalendarDate
getDaysInMonth: (AnyCalendarDate) => number
getDaysInYear: (AnyCalendarDate) => number
getEras: () => Array<string>
getMonthsInYear: (AnyCalendarDate) => number
getYearsInEra: (AnyCalendarDate) => number
- identifier: any
+ identifier: CalendarIdentifier
isInverseEra: (AnyCalendarDate) => boolean
toJulianDay: (AnyCalendarDate) => number
} /@internationalized/date:TaiwanCalendar TaiwanCalendar {
balanceDate: (Mutable<AnyCalendarDate>) => void
fromJulianDay: (number) => CalendarDate
getDaysInMonth: (AnyCalendarDate) => number
getDaysInYear: (AnyCalendarDate) => number
getEras: () => Array<string>
getMonthsInYear: (AnyCalendarDate) => number
getYearsInEra: (AnyCalendarDate) => number
- identifier: any
+ identifier: CalendarIdentifier
isInverseEra: (AnyCalendarDate) => boolean
toJulianDay: (AnyCalendarDate) => number
} /@internationalized/date:PersianCalendar PersianCalendar {
fromJulianDay: (number) => CalendarDate
getDaysInMonth: (AnyCalendarDate) => number
getEras: () => Array<string>
getMonthsInYear: () => number
getYearsInEra: () => number
- identifier: any
+ identifier: CalendarIdentifier
toJulianDay: (AnyCalendarDate) => number
} /@internationalized/date:IndianCalendar IndianCalendar {
balanceDate: () => void
fromJulianDay: (number) => CalendarDate
getDaysInMonth: (AnyCalendarDate) => number
getDaysInYear: (AnyCalendarDate) => number
getEras: () => Array<string>
getMonthsInYear: (AnyCalendarDate) => number
getYearsInEra: () => number
- identifier: any
+ identifier: CalendarIdentifier
isInverseEra: (AnyCalendarDate) => boolean
toJulianDay: (AnyCalendarDate) => number
} /@internationalized/date:IslamicCivilCalendar IslamicCivilCalendar {
fromJulianDay: (number) => CalendarDate
getDaysInMonth: (AnyCalendarDate) => number
getDaysInYear: (AnyCalendarDate) => number
getEras: () => Array<string>
getMonthsInYear: () => number
getYearsInEra: () => number
- identifier: any
+ identifier: CalendarIdentifier
toJulianDay: (AnyCalendarDate) => number
} /@internationalized/date:IslamicTabularCalendar IslamicTabularCalendar {
fromJulianDay: (number) => CalendarDate
getDaysInMonth: (AnyCalendarDate) => number
getDaysInYear: (AnyCalendarDate) => number
getEras: () => Array<string>
getMonthsInYear: () => number
getYearsInEra: () => number
- identifier: any
+ identifier: CalendarIdentifier
toJulianDay: (AnyCalendarDate) => number
} /@internationalized/date:IslamicUmalquraCalendar IslamicUmalquraCalendar {
constructor: () => void
fromJulianDay: (number) => CalendarDate
getDaysInMonth: (AnyCalendarDate) => number
getDaysInYear: (AnyCalendarDate) => number
getEras: () => Array<string>
getMonthsInYear: () => number
getYearsInEra: () => number
- identifier: any
+ identifier: CalendarIdentifier
toJulianDay: (AnyCalendarDate) => number
} /@internationalized/date:HebrewCalendar HebrewCalendar {
balanceYearMonth: (Mutable<AnyCalendarDate>, AnyCalendarDate) => void
fromJulianDay: (number) => CalendarDate
getDaysInMonth: (AnyCalendarDate) => number
getDaysInYear: (AnyCalendarDate) => number
getEras: () => Array<string>
getMonthsInYear: (AnyCalendarDate) => number
getYearsInEra: () => number
- identifier: any
+ identifier: CalendarIdentifier
toJulianDay: (AnyCalendarDate) => number
} /@internationalized/date:EthiopicCalendar EthiopicCalendar {
fromJulianDay: (number) => CalendarDate
getDaysInMonth: (AnyCalendarDate) => number
getDaysInYear: (AnyCalendarDate) => number
getEras: () => Array<string>
getMonthsInYear: () => number
getYearsInEra: (AnyCalendarDate) => number
- identifier: any
+ identifier: CalendarIdentifier
toJulianDay: (AnyCalendarDate) => number
} /@internationalized/date:EthiopicAmeteAlemCalendar EthiopicAmeteAlemCalendar {
fromJulianDay: (number) => CalendarDate
getDaysInMonth: (AnyCalendarDate) => number
getDaysInYear: (AnyCalendarDate) => number
getEras: () => Array<string>
getMonthsInYear: () => number
getYearsInEra: () => number
- identifier: any
+ identifier: CalendarIdentifier
toJulianDay: (AnyCalendarDate) => number
} /@internationalized/date:CopticCalendar CopticCalendar {
balanceDate: (Mutable<AnyCalendarDate>) => void
fromJulianDay: (number) => CalendarDate
getDaysInMonth: (AnyCalendarDate) => number
getDaysInYear: (AnyCalendarDate) => number
getEras: () => Array<string>
getMonthsInYear: () => number
getYearsInEra: (AnyCalendarDate) => number
- identifier: any
+ identifier: CalendarIdentifier
isInverseEra: (AnyCalendarDate) => boolean
toJulianDay: (AnyCalendarDate) => number
} /@internationalized/date:createCalendar createCalendar {
- name: string
+ name: CalendarIdentifier
returnVal: undefined
} /@internationalized/date:CalendarIdentifier+CalendarIdentifier {
+ C: undefined
+} /@internationalized/date:isEqualCalendar+isEqualCalendar {
+ a: Calendar
+ b: Calendar
+ returnVal: undefined
+} @react-aria/calendar/@react-aria/calendar:CalendarGridAria CalendarGridAria {
gridProps: DOMAttributes
headerProps: DOMAttributes
weekDays: Array<string>
+ weeksInMonth: number
} @react-spectrum/calendar/@react-spectrum/calendar:Calendar Calendar <T extends DateValue> {
UNSAFE_className?: string
UNSAFE_style?: CSSProperties
alignSelf?: Responsive<'auto' | 'normal' | 'start' | 'end' | 'center' | 'flex-start' | 'flex-end' | 'self-start' | 'self-end' | 'stretch'>
aria-describedby?: string
aria-details?: string
aria-label?: string
aria-labelledby?: string
autoFocus?: boolean = false
bottom?: Responsive<DimensionValue>
+ createCalendar?: (CalendarIdentifier) => Calendar
defaultFocusedValue?: DateValue | null
defaultValue?: DateValue | null
end?: Responsive<DimensionValue>
errorMessage?: ReactNode
flex?: Responsive<string | number | boolean>
flexBasis?: Responsive<number | string>
flexGrow?: Responsive<number>
flexShrink?: Responsive<number>
focusedValue?: DateValue | null
gridArea?: Responsive<string>
gridColumn?: Responsive<string>
gridColumnEnd?: Responsive<string>
gridColumnStart?: Responsive<string>
gridRow?: Responsive<string>
gridRowEnd?: Responsive<string>
gridRowStart?: Responsive<string>
height?: Responsive<DimensionValue>
id?: string
isDateUnavailable?: (DateValue) => boolean
isDisabled?: boolean = false
isHidden?: Responsive<boolean>
isInvalid?: boolean
isReadOnly?: boolean = false
justifySelf?: Responsive<'auto' | 'normal' | 'start' | 'end' | 'flex-start' | 'flex-end' | 'self-start' | 'self-end' | 'center' | 'left' | 'right' | 'stretch'>
left?: Responsive<DimensionValue>
margin?: Responsive<DimensionValue>
marginBottom?: Responsive<DimensionValue>
marginEnd?: Responsive<DimensionValue>
marginStart?: Responsive<DimensionValue>
marginTop?: Responsive<DimensionValue>
marginX?: Responsive<DimensionValue>
marginY?: Responsive<DimensionValue>
maxHeight?: Responsive<DimensionValue>
maxValue?: DateValue | null
maxWidth?: Responsive<DimensionValue>
minHeight?: Responsive<DimensionValue>
minValue?: DateValue | null
minWidth?: Responsive<DimensionValue>
onChange?: (MappedDateValue<DateValue>) => void
onFocusChange?: (CalendarDate) => void
order?: Responsive<number>
pageBehavior?: PageBehavior = visible
position?: Responsive<'static' | 'relative' | 'absolute' | 'fixed' | 'sticky'>
right?: Responsive<DimensionValue>
start?: Responsive<DimensionValue>
top?: Responsive<DimensionValue>
value?: DateValue | null
visibleMonths?: number = 1
width?: Responsive<DimensionValue>
zIndex?: Responsive<number>
} /@react-spectrum/calendar:RangeCalendar RangeCalendar <T extends DateValue> {
UNSAFE_className?: string
UNSAFE_style?: CSSProperties
alignSelf?: Responsive<'auto' | 'normal' | 'start' | 'end' | 'center' | 'flex-start' | 'flex-end' | 'self-start' | 'self-end' | 'stretch'>
allowsNonContiguousRanges?: boolean
aria-describedby?: string
aria-details?: string
aria-label?: string
aria-labelledby?: string
autoFocus?: boolean = false
bottom?: Responsive<DimensionValue>
+ createCalendar?: (CalendarIdentifier) => Calendar
defaultFocusedValue?: DateValue | null
defaultValue?: RangeValue<DateValue> | null
end?: Responsive<DimensionValue>
errorMessage?: ReactNode
flex?: Responsive<string | number | boolean>
flexBasis?: Responsive<number | string>
flexGrow?: Responsive<number>
flexShrink?: Responsive<number>
focusedValue?: DateValue | null
gridArea?: Responsive<string>
gridColumn?: Responsive<string>
gridColumnEnd?: Responsive<string>
gridColumnStart?: Responsive<string>
gridRow?: Responsive<string>
gridRowEnd?: Responsive<string>
gridRowStart?: Responsive<string>
height?: Responsive<DimensionValue>
id?: string
isDateUnavailable?: (DateValue) => boolean
isDisabled?: boolean = false
isHidden?: Responsive<boolean>
isInvalid?: boolean
isReadOnly?: boolean = false
justifySelf?: Responsive<'auto' | 'normal' | 'start' | 'end' | 'flex-start' | 'flex-end' | 'self-start' | 'self-end' | 'center' | 'left' | 'right' | 'stretch'>
left?: Responsive<DimensionValue>
margin?: Responsive<DimensionValue>
marginBottom?: Responsive<DimensionValue>
marginEnd?: Responsive<DimensionValue>
marginStart?: Responsive<DimensionValue>
marginTop?: Responsive<DimensionValue>
marginX?: Responsive<DimensionValue>
marginY?: Responsive<DimensionValue>
maxHeight?: Responsive<DimensionValue>
maxValue?: DateValue | null
maxWidth?: Responsive<DimensionValue>
minHeight?: Responsive<DimensionValue>
minValue?: DateValue | null
minWidth?: Responsive<DimensionValue>
onChange?: (RangeValue<MappedDateValue<DateValue>>) => void
onFocusChange?: (CalendarDate) => void
order?: Responsive<number>
pageBehavior?: PageBehavior = visible
position?: Responsive<'static' | 'relative' | 'absolute' | 'fixed' | 'sticky'>
right?: Responsive<DimensionValue>
start?: Responsive<DimensionValue>
top?: Responsive<DimensionValue>
value?: RangeValue<DateValue> | null
visibleMonths?: number = 1
width?: Responsive<DimensionValue>
zIndex?: Responsive<number>
} /@react-spectrum/calendar:SpectrumCalendarProps SpectrumCalendarProps <T extends DateValue> {
UNSAFE_className?: string
UNSAFE_style?: CSSProperties
alignSelf?: Responsive<'auto' | 'normal' | 'start' | 'end' | 'center' | 'flex-start' | 'flex-end' | 'self-start' | 'self-end' | 'stretch'>
aria-describedby?: string
aria-details?: string
aria-label?: string
aria-labelledby?: string
autoFocus?: boolean = false
bottom?: Responsive<DimensionValue>
+ createCalendar?: (CalendarIdentifier) => Calendar
defaultFocusedValue?: DateValue | null
defaultValue?: DateValue | null
end?: Responsive<DimensionValue>
errorMessage?: ReactNode
flex?: Responsive<string | number | boolean>
flexBasis?: Responsive<number | string>
flexGrow?: Responsive<number>
flexShrink?: Responsive<number>
focusedValue?: DateValue | null
gridArea?: Responsive<string>
gridColumn?: Responsive<string>
gridColumnEnd?: Responsive<string>
gridColumnStart?: Responsive<string>
gridRow?: Responsive<string>
gridRowEnd?: Responsive<string>
gridRowStart?: Responsive<string>
height?: Responsive<DimensionValue>
id?: string
isDateUnavailable?: (DateValue) => boolean
isDisabled?: boolean = false
isHidden?: Responsive<boolean>
isInvalid?: boolean
isReadOnly?: boolean = false
justifySelf?: Responsive<'auto' | 'normal' | 'start' | 'end' | 'flex-start' | 'flex-end' | 'self-start' | 'self-end' | 'center' | 'left' | 'right' | 'stretch'>
left?: Responsive<DimensionValue>
margin?: Responsive<DimensionValue>
marginBottom?: Responsive<DimensionValue>
marginEnd?: Responsive<DimensionValue>
marginStart?: Responsive<DimensionValue>
marginTop?: Responsive<DimensionValue>
marginX?: Responsive<DimensionValue>
marginY?: Responsive<DimensionValue>
maxHeight?: Responsive<DimensionValue>
maxValue?: DateValue | null
maxWidth?: Responsive<DimensionValue>
minHeight?: Responsive<DimensionValue>
minValue?: DateValue | null
minWidth?: Responsive<DimensionValue>
onChange?: (MappedDateValue<DateValue>) => void
onFocusChange?: (CalendarDate) => void
order?: Responsive<number>
pageBehavior?: PageBehavior = visible
position?: Responsive<'static' | 'relative' | 'absolute' | 'fixed' | 'sticky'>
right?: Responsive<DimensionValue>
start?: Responsive<DimensionValue>
top?: Responsive<DimensionValue>
value?: DateValue | null
visibleMonths?: number = 1
width?: Responsive<DimensionValue>
zIndex?: Responsive<number>
} /@react-spectrum/calendar:SpectrumRangeCalendarProps SpectrumRangeCalendarProps <T extends DateValue> {
UNSAFE_className?: string
UNSAFE_style?: CSSProperties
alignSelf?: Responsive<'auto' | 'normal' | 'start' | 'end' | 'center' | 'flex-start' | 'flex-end' | 'self-start' | 'self-end' | 'stretch'>
allowsNonContiguousRanges?: boolean
aria-describedby?: string
aria-details?: string
aria-label?: string
aria-labelledby?: string
autoFocus?: boolean = false
bottom?: Responsive<DimensionValue>
+ createCalendar?: (CalendarIdentifier) => Calendar
defaultFocusedValue?: DateValue | null
defaultValue?: RangeValue<DateValue> | null
end?: Responsive<DimensionValue>
errorMessage?: ReactNode
flex?: Responsive<string | number | boolean>
flexBasis?: Responsive<number | string>
flexGrow?: Responsive<number>
flexShrink?: Responsive<number>
focusedValue?: DateValue | null
gridArea?: Responsive<string>
gridColumn?: Responsive<string>
gridColumnEnd?: Responsive<string>
gridColumnStart?: Responsive<string>
gridRow?: Responsive<string>
gridRowEnd?: Responsive<string>
gridRowStart?: Responsive<string>
height?: Responsive<DimensionValue>
id?: string
isDateUnavailable?: (DateValue) => boolean
isDisabled?: boolean = false
isHidden?: Responsive<boolean>
isInvalid?: boolean
isReadOnly?: boolean = false
justifySelf?: Responsive<'auto' | 'normal' | 'start' | 'end' | 'flex-start' | 'flex-end' | 'self-start' | 'self-end' | 'center' | 'left' | 'right' | 'stretch'>
left?: Responsive<DimensionValue>
margin?: Responsive<DimensionValue>
marginBottom?: Responsive<DimensionValue>
marginEnd?: Responsive<DimensionValue>
marginStart?: Responsive<DimensionValue>
marginTop?: Responsive<DimensionValue>
marginX?: Responsive<DimensionValue>
marginY?: Responsive<DimensionValue>
maxHeight?: Responsive<DimensionValue>
maxValue?: DateValue | null
maxWidth?: Responsive<DimensionValue>
minHeight?: Responsive<DimensionValue>
minValue?: DateValue | null
minWidth?: Responsive<DimensionValue>
onChange?: (RangeValue<MappedDateValue<DateValue>>) => void
onFocusChange?: (CalendarDate) => void
order?: Responsive<number>
pageBehavior?: PageBehavior = visible
position?: Responsive<'static' | 'relative' | 'absolute' | 'fixed' | 'sticky'>
right?: Responsive<DimensionValue>
start?: Responsive<DimensionValue>
top?: Responsive<DimensionValue>
value?: RangeValue<DateValue> | null
visibleMonths?: number = 1
width?: Responsive<DimensionValue>
zIndex?: Responsive<number>
} @react-spectrum/datepicker/@react-spectrum/datepicker:DatePicker DatePicker <T extends DateValue> {
UNSAFE_className?: string
UNSAFE_style?: CSSProperties
alignSelf?: Responsive<'auto' | 'normal' | 'start' | 'end' | 'center' | 'flex-start' | 'flex-end' | 'self-start' | 'self-end' | 'stretch'>
aria-describedby?: string
aria-details?: string
aria-label?: string
aria-labelledby?: string
autoFocus?: boolean
bottom?: Responsive<DimensionValue>
contextualHelp?: ReactNode
+ createCalendar?: (CalendarIdentifier) => Calendar
defaultOpen?: boolean
defaultValue?: DateValue | null
description?: ReactNode
end?: Responsive<DimensionValue>
firstDayOfWeek?: 'sun' | 'mon' | 'tue' | 'wed' | 'thu' | 'fri' | 'sat'
flex?: Responsive<string | number | boolean>
flexBasis?: Responsive<number | string>
flexGrow?: Responsive<number>
flexShrink?: Responsive<number>
granularity?: Granularity
gridArea?: Responsive<string>
gridColumn?: Responsive<string>
gridColumnEnd?: Responsive<string>
gridColumnStart?: Responsive<string>
gridRow?: Responsive<string>
gridRowEnd?: Responsive<string>
gridRowStart?: Responsive<string>
height?: Responsive<DimensionValue>
hideTimeZone?: boolean = false
hourCycle?: number | number
id?: string
isDateUnavailable?: (DateValue) => boolean
isDisabled?: boolean
isHidden?: Responsive<boolean>
isOpen?: boolean
isQuiet?: boolean = false
isReadOnly?: boolean
isRequired?: boolean
justifySelf?: Responsive<'auto' | 'normal' | 'start' | 'end' | 'flex-start' | 'flex-end' | 'self-start' | 'self-end' | 'center' | 'left' | 'right' | 'stretch'>
label?: ReactNode
labelAlign?: Alignment = 'start'
labelPosition?: LabelPosition = 'top'
left?: Responsive<DimensionValue>
margin?: Responsive<DimensionValue>
marginBottom?: Responsive<DimensionValue>
marginEnd?: Responsive<DimensionValue>
marginStart?: Responsive<DimensionValue>
marginTop?: Responsive<DimensionValue>
marginX?: Responsive<DimensionValue>
marginY?: Responsive<DimensionValue>
maxHeight?: Responsive<DimensionValue>
maxValue?: DateValue | null
maxVisibleMonths?: number = 1
maxWidth?: Responsive<DimensionValue>
minHeight?: Responsive<DimensionValue>
minValue?: DateValue | null
minWidth?: Responsive<DimensionValue>
name?: string
necessityIndicator?: NecessityIndicator = 'icon'
onBlur?: (FocusEvent<Target>) => void
onChange?: (MappedDateValue<DateValue> | null) => void
onFocus?: (FocusEvent<Target>) => void
onFocusChange?: (boolean) => void
onKeyDown?: (KeyboardEvent) => void
onKeyUp?: (KeyboardEvent) => void
onOpenChange?: (boolean) => void
order?: Responsive<number>
pageBehavior?: PageBehavior = visible
placeholderValue?: DateValue | null
position?: Responsive<'static' | 'relative' | 'absolute' | 'fixed' | 'sticky'>
right?: Responsive<DimensionValue>
shouldFlip?: boolean = true
shouldForceLeadingZeros?: boolean
showFormatHelpText?: boolean = false
start?: Responsive<DimensionValue>
top?: Responsive<DimensionValue>
validate?: (MappedDateValue<DateValue>) => ValidationError | boolean | null | undefined
validationBehavior?: 'aria' | 'native' = 'aria'
validationState?: ValidationState
value?: DateValue | null
width?: Responsive<DimensionValue>
zIndex?: Responsive<number>
} /@react-spectrum/datepicker:DateRangePicker DateRangePicker <T extends DateValue> {
UNSAFE_className?: string
UNSAFE_style?: CSSProperties
alignSelf?: Responsive<'auto' | 'normal' | 'start' | 'end' | 'center' | 'flex-start' | 'flex-end' | 'self-start' | 'self-end' | 'stretch'>
allowsNonContiguousRanges?: boolean
aria-describedby?: string
aria-details?: string
aria-label?: string
aria-labelledby?: string
autoFocus?: boolean
bottom?: Responsive<DimensionValue>
contextualHelp?: ReactNode
+ createCalendar?: (CalendarIdentifier) => Calendar
defaultOpen?: boolean
defaultValue?: RangeValue<DateValue> | null
description?: ReactNode
end?: Responsive<DimensionValue>
errorMessage?: ReactNode | (ValidationResult) => ReactNode
firstDayOfWeek?: 'sun' | 'mon' | 'tue' | 'wed' | 'thu' | 'fri' | 'sat'
flex?: Responsive<string | number | boolean>
flexBasis?: Responsive<number | string>
flexGrow?: Responsive<number>
flexShrink?: Responsive<number>
granularity?: Granularity
gridArea?: Responsive<string>
gridColumn?: Responsive<string>
gridColumnEnd?: Responsive<string>
gridColumnStart?: Responsive<string>
gridRow?: Responsive<string>
gridRowEnd?: Responsive<string>
gridRowStart?: Responsive<string>
height?: Responsive<DimensionValue>
hideTimeZone?: boolean = false
hourCycle?: number | number
id?: string
isDateUnavailable?: (DateValue) => boolean
isDisabled?: boolean
isHidden?: Responsive<boolean>
isOpen?: boolean
isQuiet?: boolean = false
isReadOnly?: boolean
isRequired?: boolean
justifySelf?: Responsive<'auto' | 'normal' | 'start' | 'end' | 'flex-start' | 'flex-end' | 'self-start' | 'self-end' | 'center' | 'left' | 'right' | 'stretch'>
label?: ReactNode
labelAlign?: Alignment = 'start'
labelPosition?: LabelPosition = 'top'
left?: Responsive<DimensionValue>
margin?: Responsive<DimensionValue>
marginBottom?: Responsive<DimensionValue>
marginEnd?: Responsive<DimensionValue>
marginStart?: Responsive<DimensionValue>
marginTop?: Responsive<DimensionValue>
marginX?: Responsive<DimensionValue>
marginY?: Responsive<DimensionValue>
maxHeight?: Responsive<DimensionValue>
maxValue?: DateValue | null
maxVisibleMonths?: number = 1
maxWidth?: Responsive<DimensionValue>
minHeight?: Responsive<DimensionValue>
minValue?: DateValue | null
minWidth?: Responsive<DimensionValue>
necessityIndicator?: NecessityIndicator = 'icon'
onBlur?: (FocusEvent<Target>) => void
onChange?: (RangeValue<MappedDateValue<DateValue>> | null) => void
onFocus?: (FocusEvent<Target>) => void
onFocusChange?: (boolean) => void
onKeyDown?: (KeyboardEvent) => void
onKeyUp?: (KeyboardEvent) => void
onOpenChange?: (boolean) => void
order?: Responsive<number>
pageBehavior?: PageBehavior = visible
placeholderValue?: DateValue | null
position?: Responsive<'static' | 'relative' | 'absolute' | 'fixed' | 'sticky'>
right?: Responsive<DimensionValue>
shouldFlip?: boolean = true
shouldForceLeadingZeros?: boolean
showFormatHelpText?: boolean = false
start?: Responsive<DimensionValue>
startName?: string
top?: Responsive<DimensionValue>
validate?: (RangeValue<MappedDateValue<DateValue>>) => ValidationError | boolean | null | undefined
validationBehavior?: 'aria' | 'native' = 'aria'
validationState?: ValidationState
value?: RangeValue<DateValue> | null
width?: Responsive<DimensionValue>
zIndex?: Responsive<number>
} /@react-spectrum/datepicker:SpectrumDatePickerProps SpectrumDatePickerProps <T extends DateValue> {
UNSAFE_className?: string
UNSAFE_style?: CSSProperties
alignSelf?: Responsive<'auto' | 'normal' | 'start' | 'end' | 'center' | 'flex-start' | 'flex-end' | 'self-start' | 'self-end' | 'stretch'>
aria-describedby?: string
aria-details?: string
aria-label?: string
aria-labelledby?: string
autoFocus?: boolean
bottom?: Responsive<DimensionValue>
contextualHelp?: ReactNode
+ createCalendar?: (CalendarIdentifier) => Calendar
defaultOpen?: boolean
defaultValue?: DateValue | null
description?: ReactNode
end?: Responsive<DimensionValue>
firstDayOfWeek?: 'sun' | 'mon' | 'tue' | 'wed' | 'thu' | 'fri' | 'sat'
flex?: Responsive<string | number | boolean>
flexBasis?: Responsive<number | string>
flexGrow?: Responsive<number>
flexShrink?: Responsive<number>
granularity?: Granularity
gridArea?: Responsive<string>
gridColumn?: Responsive<string>
gridColumnEnd?: Responsive<string>
gridColumnStart?: Responsive<string>
gridRow?: Responsive<string>
gridRowEnd?: Responsive<string>
gridRowStart?: Responsive<string>
height?: Responsive<DimensionValue>
hideTimeZone?: boolean = false
hourCycle?: number | number
id?: string
isDateUnavailable?: (DateValue) => boolean
isDisabled?: boolean
isHidden?: Responsive<boolean>
isOpen?: boolean
isQuiet?: boolean = false
isReadOnly?: boolean
isRequired?: boolean
justifySelf?: Responsive<'auto' | 'normal' | 'start' | 'end' | 'flex-start' | 'flex-end' | 'self-start' | 'self-end' | 'center' | 'left' | 'right' | 'stretch'>
label?: ReactNode
labelAlign?: Alignment = 'start'
labelPosition?: LabelPosition = 'top'
left?: Responsive<DimensionValue>
margin?: Responsive<DimensionValue>
marginBottom?: Responsive<DimensionValue>
marginEnd?: Responsive<DimensionValue>
marginStart?: Responsive<DimensionValue>
marginTop?: Responsive<DimensionValue>
marginX?: Responsive<DimensionValue>
marginY?: Responsive<DimensionValue>
maxHeight?: Responsive<DimensionValue>
maxValue?: DateValue | null
maxVisibleMonths?: number = 1
maxWidth?: Responsive<DimensionValue>
minHeight?: Responsive<DimensionValue>
minValue?: DateValue | null
minWidth?: Responsive<DimensionValue>
name?: string
necessityIndicator?: NecessityIndicator = 'icon'
onBlur?: (FocusEvent<Target>) => void
onChange?: (MappedDateValue<DateValue> | null) => void
onFocus?: (FocusEvent<Target>) => void
onFocusChange?: (boolean) => void
onKeyDown?: (KeyboardEvent) => void
onKeyUp?: (KeyboardEvent) => void
onOpenChange?: (boolean) => void
order?: Responsive<number>
pageBehavior?: PageBehavior = visible
placeholderValue?: DateValue | null
position?: Responsive<'static' | 'relative' | 'absolute' | 'fixed' | 'sticky'>
right?: Responsive<DimensionValue>
shouldFlip?: boolean = true
shouldForceLeadingZeros?: boolean
showFormatHelpText?: boolean = false
start?: Responsive<DimensionValue>
top?: Responsive<DimensionValue>
validate?: (MappedDateValue<DateValue>) => ValidationError | boolean | null | undefined
validationBehavior?: 'aria' | 'native' = 'aria'
validationState?: ValidationState
value?: DateValue | null
width?: Responsive<DimensionValue>
zIndex?: Responsive<number>
} /@react-spectrum/datepicker:SpectrumDateRangePickerProps SpectrumDateRangePickerProps <T extends DateValue> {
UNSAFE_className?: string
UNSAFE_style?: CSSProperties
alignSelf?: Responsive<'auto' | 'normal' | 'start' | 'end' | 'center' | 'flex-start' | 'flex-end' | 'self-start' | 'self-end' | 'stretch'>
allowsNonContiguousRanges?: boolean
aria-describedby?: string
aria-details?: string
aria-label?: string
aria-labelledby?: string
autoFocus?: boolean
bottom?: Responsive<DimensionValue>
contextualHelp?: ReactNode
+ createCalendar?: (CalendarIdentifier) => Calendar
defaultOpen?: boolean
defaultValue?: RangeValue<DateValue> | null
description?: ReactNode
end?: Responsive<DimensionValue>
errorMessage?: ReactNode | (ValidationResult) => ReactNode
firstDayOfWeek?: 'sun' | 'mon' | 'tue' | 'wed' | 'thu' | 'fri' | 'sat'
flex?: Responsive<string | number | boolean>
flexBasis?: Responsive<number | string>
flexGrow?: Responsive<number>
flexShrink?: Responsive<number>
granularity?: Granularity
gridArea?: Responsive<string>
gridColumn?: Responsive<string>
gridColumnEnd?: Responsive<string>
gridColumnStart?: Responsive<string>
gridRow?: Responsive<string>
gridRowEnd?: Responsive<string>
gridRowStart?: Responsive<string>
height?: Responsive<DimensionValue>
hideTimeZone?: boolean = false
hourCycle?: number | number
id?: string
isDateUnavailable?: (DateValue) => boolean
isDisabled?: boolean
isHidden?: Responsive<boolean>
isOpen?: boolean
isQuiet?: boolean = false
isReadOnly?: boolean
isRequired?: boolean
justifySelf?: Responsive<'auto' | 'normal' | 'start' | 'end' | 'flex-start' | 'flex-end' | 'self-start' | 'self-end' | 'center' | 'left' | 'right' | 'stretch'>
label?: ReactNode
labelAlign?: Alignment = 'start'
labelPosition?: LabelPosition = 'top'
left?: Responsive<DimensionValue>
margin?: Responsive<DimensionValue>
marginBottom?: Responsive<DimensionValue>
marginEnd?: Responsive<DimensionValue>
marginStart?: Responsive<DimensionValue>
marginTop?: Responsive<DimensionValue>
marginX?: Responsive<DimensionValue>
marginY?: Responsive<DimensionValue>
maxHeight?: Responsive<DimensionValue>
maxValue?: DateValue | null
maxVisibleMonths?: number = 1
maxWidth?: Responsive<DimensionValue>
minHeight?: Responsive<DimensionValue>
minValue?: DateValue | null
minWidth?: Responsive<DimensionValue>
necessityIndicator?: NecessityIndicator = 'icon'
onBlur?: (FocusEvent<Target>) => void
onChange?: (RangeValue<MappedDateValue<DateValue>> | null) => void
onFocus?: (FocusEvent<Target>) => void
onFocusChange?: (boolean) => void
onKeyDown?: (KeyboardEvent) => void
onKeyUp?: (KeyboardEvent) => void
onOpenChange?: (boolean) => void
order?: Responsive<number>
pageBehavior?: PageBehavior = visible
placeholderValue?: DateValue | null
position?: Responsive<'static' | 'relative' | 'absolute' | 'fixed' | 'sticky'>
right?: Responsive<DimensionValue>
shouldFlip?: boolean = true
shouldForceLeadingZeros?: boolean
showFormatHelpText?: boolean = false
start?: Responsive<DimensionValue>
startName?: string
top?: Responsive<DimensionValue>
validate?: (RangeValue<MappedDateValue<DateValue>>) => ValidationError | boolean | null | undefined
validationBehavior?: 'aria' | 'native' = 'aria'
validationState?: ValidationState
value?: RangeValue<DateValue> | null
width?: Responsive<DimensionValue>
zIndex?: Responsive<number>
} @react-stately/calendar/@react-stately/calendar:CalendarStateOptions CalendarStateOptions <T extends DateValue = DateValue> {
autoFocus?: boolean = false
- createCalendar: (string) => Calendar
+ createCalendar: (CalendarIdentifier) => Calendar
defaultFocusedValue?: DateValue | null
defaultValue?: DateValue | null
errorMessage?: ReactNode
firstDayOfWeek?: 'sun' | 'mon' | 'tue' | 'wed' | 'thu' | 'fri' | 'sat'
isDateUnavailable?: (DateValue) => boolean
isDisabled?: boolean = false
isInvalid?: boolean
isReadOnly?: boolean = false
locale: string
maxValue?: DateValue | null
minValue?: DateValue | null
onChange?: (MappedDateValue<DateValue>) => void
onFocusChange?: (CalendarDate) => void
pageBehavior?: PageBehavior = visible
selectionAlignment?: 'start' | 'center' | 'end'
value?: DateValue | null
visibleDuration?: DateDuration = {months: 1}
} /@react-stately/calendar:RangeCalendarStateOptions RangeCalendarStateOptions <T extends DateValue = DateValue> {
allowsNonContiguousRanges?: boolean
autoFocus?: boolean = false
- createCalendar: (string) => Calendar
+ createCalendar: (CalendarIdentifier) => Calendar
defaultFocusedValue?: DateValue | null
defaultValue?: RangeValue<DateValue> | null
errorMessage?: ReactNode
firstDayOfWeek?: 'sun' | 'mon' | 'tue' | 'wed' | 'thu' | 'fri' | 'sat'
isDateUnavailable?: (DateValue) => boolean
isDisabled?: boolean = false
isInvalid?: boolean
isReadOnly?: boolean = false
locale: string
maxValue?: DateValue | null
minValue?: DateValue | null
onChange?: (RangeValue<MappedDateValue<DateValue>>) => void
onFocusChange?: (CalendarDate) => void
pageBehavior?: PageBehavior = visible
value?: RangeValue<DateValue> | null
visibleDuration?: DateDuration = {months: 1}
} @react-stately/datepicker/@react-stately/datepicker:DateFieldStateOptions DateFieldStateOptions <T extends DateValue = DateValue> {
autoFocus?: boolean
- createCalendar: (string) => Calendar
+ createCalendar: (CalendarIdentifier) => Calendar
defaultOpen?: boolean
defaultValue?: DateValue | null
description?: ReactNode
errorMessage?: ReactNode | (ValidationResult) => ReactNode
granularity?: Granularity
hideTimeZone?: boolean = false
hourCycle?: number | number
isDateUnavailable?: (DateValue) => boolean
isDisabled?: boolean
isInvalid?: boolean
isOpen?: boolean
isReadOnly?: boolean
isRequired?: boolean
label?: ReactNode
locale: string
maxGranularity?: 'year' | 'month' | Granularity = 'year'
maxValue?: DateValue | null
minValue?: DateValue | null
onBlur?: (FocusEvent<Target>) => void
onChange?: (MappedDateValue<DateValue> | null) => void
onFocus?: (FocusEvent<Target>) => void
onFocusChange?: (boolean) => void
onKeyDown?: (KeyboardEvent) => void
onKeyUp?: (KeyboardEvent) => void
onOpenChange?: (boolean) => void
pageBehavior?: PageBehavior = visible
placeholderValue?: DateValue | null
shouldForceLeadingZeros?: boolean
validate?: (MappedDateValue<DateValue>) => ValidationError | boolean | null | undefined
validationBehavior?: 'aria' | 'native' = 'aria'
value?: DateValue | null
} |
Closing in favor of #7803. |
Refactored version of #7803 that implements a different approach that doesn't require as many new Calendar methods. See #7803 (comment)
Question: do we need to pass add the
createCalendar
prop toDatePicker
as well?