@react-types/calendar
Version:
Spectrum UI components in React
122 lines (110 loc) • 5.11 kB
TypeScript
/*
* Copyright 2020 Adobe. All rights reserved.
* This file is licensed to you under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. You may obtain a copy
* of the License at http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under
* the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
* OF ANY KIND, either express or implied. See the License for the specific language
* governing permissions and limitations under the License.
*/
import {AriaLabelingProps, DOMProps, RangeValue, StyleProps, ValidationState, ValueBase} from '@react-types/shared';
import type {CalendarDate, CalendarDateTime, CalendarIdentifier, Calendar as ICalendar, ZonedDateTime} from '@internationalized/date';
import {ReactNode} from 'react';
export type DateValue = CalendarDate | CalendarDateTime | ZonedDateTime;
type MappedDateValue<T> =
T extends ZonedDateTime ? ZonedDateTime :
T extends CalendarDateTime ? CalendarDateTime :
T extends CalendarDate ? CalendarDate :
never;
export interface CalendarPropsBase {
/** The minimum allowed date that a user may select. */
minValue?: DateValue | null,
/** The maximum allowed date that a user may select. */
maxValue?: DateValue | null,
/** Callback that is called for each date of the calendar. If it returns true, then the date is unavailable. */
isDateUnavailable?: (date: DateValue) => boolean,
/**
* Whether the calendar is disabled.
* @default false
*/
isDisabled?: boolean,
/**
* Whether the calendar value is immutable.
* @default false
*/
isReadOnly?: boolean,
/**
* Whether to automatically focus the calendar when it mounts.
* @default false
*/
autoFocus?: boolean,
/** Controls the currently focused date within the calendar. */
focusedValue?: DateValue | null,
/** The date that is focused when the calendar first mounts (uncontrolled). */
defaultFocusedValue?: DateValue | null,
/** Handler that is called when the focused date changes. */
onFocusChange?: (date: CalendarDate) => void,
/**
* Whether the current selection is valid or invalid according to application logic.
* @deprecated Use `isInvalid` instead.
*/
validationState?: ValidationState,
/** Whether the current selection is invalid according to application logic. */
isInvalid?: boolean,
/** An error message to display when the selected value is invalid. */
errorMessage?: ReactNode,
/**
* Controls the behavior of paging. Pagination either works by advancing the visible page by visibleDuration (default) or one unit of visibleDuration.
* @default visible
*/
pageBehavior?: PageBehavior,
/**
* The day that starts the week.
*/
firstDayOfWeek?: 'sun' | 'mon' | 'tue' | 'wed' | 'thu' | 'fri' | 'sat',
/**
* Determines the alignment of the visible months on initial render based on the current selection or current date if there is no selection.
* @default 'center'
*/
selectionAlignment?: 'start' | 'center' | 'end'
}
export type DateRange = RangeValue<DateValue> | null;
export interface CalendarProps<T extends DateValue> extends CalendarPropsBase, ValueBase<T | null, MappedDateValue<T>> {}
export interface RangeCalendarProps<T extends DateValue> extends CalendarPropsBase, ValueBase<RangeValue<T> | null, RangeValue<MappedDateValue<T>>> {
/**
* When combined with `isDateUnavailable`, determines whether non-contiguous ranges,
* i.e. ranges containing unavailable dates, may be selected.
*/
allowsNonContiguousRanges?: boolean
}
export interface AriaCalendarProps<T extends DateValue> extends CalendarProps<T>, DOMProps, AriaLabelingProps {}
export interface AriaRangeCalendarProps<T extends DateValue> extends RangeCalendarProps<T>, DOMProps, AriaLabelingProps {}
export type PageBehavior = 'single' | 'visible';
export interface SpectrumCalendarProps<T extends DateValue> extends AriaCalendarProps<T>, StyleProps {
/**
* The number of months to display at once. Up to 3 months are supported.
* @default 1
*/
visibleMonths?: number,
/**
* A function to create a new [Calendar](https://react-spectrum.adobe.com/internationalized/date/Calendar.html)
* object for a given calendar identifier. If not provided, the `createCalendar` function
* from `@internationalized/date` will be used.
*/
createCalendar?: (identifier: CalendarIdentifier) => ICalendar
}
export interface SpectrumRangeCalendarProps<T extends DateValue> extends AriaRangeCalendarProps<T>, StyleProps {
/**
* The number of months to display at once. Up to 3 months are supported.
* @default 1
*/
visibleMonths?: number,
/**
* A function to create a new [Calendar](https://react-spectrum.adobe.com/internationalized/date/Calendar.html)
* object for a given calendar identifier. If not provided, the `createCalendar` function
* from `@internationalized/date` will be used.
*/
createCalendar?: (identifier: CalendarIdentifier) => ICalendar
}