UNPKG

react-day-picker

Version:

Customizable Date Picker for React

380 lines (379 loc) 13.6 kB
import type { CSSProperties } from "react"; import { UI, DayFlag, SelectionState, Animation } from "../UI.js"; import * as components from "../components/custom-components.js"; import { formatCaption, formatDay, formatMonthCaption, formatMonthDropdown, formatWeekdayName, formatWeekNumber, formatWeekNumberHeader, formatYearCaption, formatYearDropdown } from "../formatters/index.js"; import { labelDayButton, labelNav, labelGrid, labelGridcell, labelMonthDropdown, labelNext, labelPrevious, labelWeekday, labelWeekNumber, labelWeekNumberHeader, labelYearDropdown } from "../labels/index.js"; /** * Selection modes supported by DayPicker. * * - `single`: use DayPicker to select single days. * - `multiple`: allow selecting multiple days. * - `range`: use DayPicker to select a range of days. * * @see https://daypicker.dev/docs/selection-modes */ export type Mode = "single" | "multiple" | "range"; /** * The components that can be changed using the `components` prop. * * @see https://daypicker.dev/guides/custom-components */ export type CustomComponents = { /** * Render any button element in DayPicker. * * @deprecated Use {@link CustomComponents.NextMonthButton} or * {@link CustomComponents.PreviousMonthButton} instead. */ Button: typeof components.Button; /** Render the chevron icon used in the navigation buttons and dropdowns. */ Chevron: typeof components.Chevron; /** Render the caption label of the month grid. */ CaptionLabel: typeof components.CaptionLabel; /** Render the day cell in the month grid. */ Day: typeof components.Day; /** Render the button containing the day in the day cell. */ DayButton: typeof components.DayButton; /** Render the dropdown element to select years and months. */ Dropdown: typeof components.Dropdown; /** Render the container of the dropdowns. */ DropdownNav: typeof components.DropdownNav; /** Render the footer element announced by screen readers. */ Footer: typeof components.Footer; /** Render the container of the MonthGrid. */ Month: typeof components.Month; /** Render the caption of the month grid. */ MonthCaption: typeof components.MonthCaption; /** Render the grid of days in a month. */ MonthGrid: typeof components.MonthGrid; /** Wrapper of the month grids. */ Months: typeof components.Months; /** Render the navigation element with the next and previous buttons. */ Nav: typeof components.Nav; /** Render the `<option>` HTML element in the dropdown. */ Option: typeof components.Option; /** Render the previous month button element in the navigation. */ PreviousMonthButton: typeof components.PreviousMonthButton; /** Render the next month button element in the navigation. */ NextMonthButton: typeof components.NextMonthButton; /** Render the root element of the calendar. */ Root: typeof components.Root; /** Render the select element in the dropdowns. */ Select: typeof components.Select; /** Render the weeks section in the month grid. */ Weeks: typeof components.Weeks; /** Render the week rows. */ Week: typeof components.Week; /** Render the weekday name in the header. */ Weekday: typeof components.Weekday; /** Render the row containing the week days. */ Weekdays: typeof components.Weekdays; /** Render the cell with the number of the week. */ WeekNumber: typeof components.WeekNumber; /** Render the header of the week number column. */ WeekNumberHeader: typeof components.WeekNumberHeader; /** Render the dropdown with the months. */ MonthsDropdown: typeof components.MonthsDropdown; /** Render the dropdown with the years. */ YearsDropdown: typeof components.YearsDropdown; }; /** Represent a map of formatters used to render localized content. */ export type Formatters = { /** Format the caption of a month grid. */ formatCaption: typeof formatCaption; /** Format the day in the day cell. */ formatDay: typeof formatDay; /** Format the label in the month dropdown. */ formatMonthDropdown: typeof formatMonthDropdown; /** * @ignore * @deprecated Use {@link Formatters.formatCaption} instead. */ formatMonthCaption: typeof formatMonthCaption; /** Format the week number. */ formatWeekNumber: typeof formatWeekNumber; /** Format the header of the week number column. */ formatWeekNumberHeader: typeof formatWeekNumberHeader; /** Format the week day name in the header. */ formatWeekdayName: typeof formatWeekdayName; /** Format the label in the year dropdown. */ formatYearDropdown: typeof formatYearDropdown; /** * @ignore * @deprecated Use {@link Formatters.formatYearDropdown} instead. */ formatYearCaption: typeof formatYearCaption; }; /** Map of functions to translate ARIA labels for the relative elements. */ export type Labels = { /** The label for the navigation toolbar. */ labelNav: typeof labelNav; /** The label for the month grid. */ labelGrid: typeof labelGrid; /** The label for the gridcell, when the calendar is not interactive. */ labelGridcell: typeof labelGridcell; /** The label for the month dropdown. */ labelMonthDropdown: typeof labelMonthDropdown; /** The label for the year dropdown. */ labelYearDropdown: typeof labelYearDropdown; /** The label for the "next month" button. */ labelNext: typeof labelNext; /** The label for the "previous month" button. */ labelPrevious: typeof labelPrevious; /** The label for the day button. */ labelDayButton: typeof labelDayButton; /** * @ignore * @deprecated Use {@link labelDayButton} instead. */ labelDay: typeof labelDayButton; /** The label for the weekday. */ labelWeekday: typeof labelWeekday; /** The label for the week number. */ labelWeekNumber: typeof labelWeekNumber; /** * Return the label for the column of the week number. * * @since 9.0.0 */ labelWeekNumberHeader: typeof labelWeekNumberHeader; }; /** * A value or a function that matches a specific day. * * @example * // will always match the day * const booleanMatcher: Matcher = true; * * // will match the today's date * const dateMatcher: Matcher = new Date(); * * // will match the days in the array * const arrayMatcher: Matcher = [ * new Date(2019, 1, 2), * new Date(2019, 1, 4) * ]; * * // will match days after the 2nd of February 2019 * const afterMatcher: DateAfter = { after: new Date(2019, 1, 2) }; * * // will match days before the 2nd of February 2019 } * const beforeMatcher: DateBefore = { before: new Date(2019, 1, 2) }; * * // will match Sundays * const dayOfWeekMatcher: DayOfWeek = { * dayOfWeek: 0 * }; * * // will match the included days, except the two dates * const intervalMatcher: DateInterval = { * after: new Date(2019, 1, 2), * before: new Date(2019, 1, 5) * }; * * // will match the included days, including the two dates * const rangeMatcher: DateRange = { * from: new Date(2019, 1, 2), * to: new Date(2019, 1, 5) * }; * * // will match when the function return true * const functionMatcher: Matcher = (day: Date) => { * return day.getMonth() === 2; // match when month is March * }; */ export type Matcher = boolean | ((date: Date) => boolean) | Date | Date[] | DateRange | DateBefore | DateAfter | DateInterval | DayOfWeek; /** * Match a day falling after the specified date, with the date not included. * * @example * // Match days after the 2nd of February 2019 * const matcher: DateAfter = { after: new Date(2019, 1, 2) }; */ export type DateAfter = { after: Date; }; /** * Match a day falling before the specified date, with the date not included. * * @example * // Match days before the 2nd of February 2019 * const matcher: DateBefore = { before: new Date(2019, 1, 2) }; */ export type DateBefore = { before: Date; }; /** * An interval of dates. Differently from {@link DateRange}, the range ends here * are not included. * * @example * // Match the days between the 2nd and the 5th of February 2019 * const matcher: DateInterval = { * after: new Date(2019, 1, 2), * before: new Date(2019, 1, 5) * }; */ export type DateInterval = { before: Date; after: Date; }; /** * A range of dates. The range can be open. Differently from * {@link DateInterval}, the range ends here are included. * * @example * // Match the days between the 2nd and the 5th of February 2019 * const matcher: DateRange = { * from: new Date(2019, 1, 2), * to: new Date(2019, 1, 5) * }; */ export type DateRange = { from: Date | undefined; to?: Date | undefined; }; /** * Match dates being one of the specified days of the week (`0-6`, where `0` is * Sunday). * * @example * // Match Sundays * const matcher: DayOfWeek = { dayOfWeek: 0 }; * // Match weekends * const matcher: DayOfWeek = { dayOfWeek: [0, 6] }; */ export type DayOfWeek = { dayOfWeek: number | number[]; }; /** * The event handler triggered when clicking or interacting with a day. * * @template EventType - The event type that triggered the event (e.g. * `React.MouseEvent`, `React.KeyboardEvent`, etc.). * @param date - The date that has triggered the event. * @param modifiers - The modifiers belonging to the date. * @param e - The DOM event that triggered the event. */ export type DayEventHandler<EventType> = (date: Date, modifiers: Modifiers, e: EventType) => void; /** * The event handler when a month is changed in the calendar. * * ```tsx * <DayPicker onMonthChange={(month) => console.log(month)} /> * ``` * * @see https://daypicker.dev/docs/navigation */ export type MonthChangeEventHandler = (month: Date) => void; /** * The CSS classnames to use for the {@link UI} elements, the * {@link SelectionState} and the {@link DayFlag}. * * @example * const classNames: ClassNames = { * [UI.Root]: "root", * [UI.Outside]: "outside", * [UI.Nav]: "nav" * // etc. * }; */ export type ClassNames = { [key in UI | SelectionState | DayFlag | Animation]: string; }; /** * The CSS styles to use for the {@link UI} elements, the {@link SelectionState} * and the {@link DayFlag}. */ export type Styles = { [key in UI | SelectionState | DayFlag]: CSSProperties | undefined; }; /** * Represents the modifiers that match a specific day in the calendar. * * - Retrieve modifiers using the {@link OnSelectHandler} via the `onSelect` prop, * or within custom components using the {@link useDayPicker} hook. * - Includes built-in modifiers from {@link DayFlag} and {@link SelectionState}. * - Add custom modifiers using the `modifiers` prop. * * @example * const modifiers: Modifiers = { * today: false, // the day is not today * selected: true, // the day is selected * disabled: false, // the day is not disabled * outside: false, // the day is not outside the month * focused: false, // the day is not focused * * weekend: false // custom modifier example for matching a weekend * booked: true // custom modifier example for matching a booked day * available: false // custom modifier example for matching an available day * }; * * @see https://daypicker.dev/guides/custom-modifiers */ export type Modifiers = Record<string, boolean>; /** * The style to apply to each day element matching a modifier. * * @example * const modifiersStyles: ModifiersStyles = { * today: { color: "red" }, * selected: { backgroundColor: "blue" }, * weekend: { color: "green" } * }; */ export type ModifiersStyles = Record<string, CSSProperties>; /** * The classnames to assign to each day element matching a modifier. * * @example * const modifiersClassNames: ModifiersClassNames = { * today: "today", // Use the "today" class for the today's day * selected: "highlight", // Use the "highlight" class for the selected day * weekend: "weekend" // Use the "weekend" class for the weekend days * }; */ export type ModifiersClassNames = Record<string, string>; /** * The props that have been deprecated since version 9.0.0. * * @private * @since 9.0.0 * @see https://daypicker.dev/upgrading */ export type V9DeprecatedProps = /** Use `hidden` prop instead. */ "fromDate" /** Use `hidden` prop instead. */ | "toDate" /** Use `startMonth` instead. */ | "fromMonth" /** Use `endMonth` instead. */ | "toMonth" /** Use `startMonth` instead. */ | "fromYear" /** Use `endMonth` instead. */ | "toYear"; /** The direction to move the focus relative to the current focused date. */ export type MoveFocusDir = "after" | "before"; /** The temporal unit to move the focus by. */ export type MoveFocusBy = "day" | "week" | "startOfWeek" | "endOfWeek" | "month" | "year"; /** * The numbering system supported by DayPicker. * * - `latn`: Latin (Western Arabic) * - `arab`: Arabic-Indic * - `arabext`: Eastern Arabic-Indic (Persian) * - `deva`: Devanagari * - `beng`: Bengali * - `guru`: Gurmukhi * - `gujr`: Gujarati * - `orya`: Oriya * - `tamldec`: Tamil * - `telu`: Telugu * - `knda`: Kannada * - `mlym`: Malayalam * * @see https://daypicker.dev/docs/translation#numeral-systems */ export type Numerals = "latn" | "arab" | "arabext" | "deva" | "beng" | "guru" | "gujr" | "orya" | "tamldec" | "telu" | "knda" | "mlym";