import type {Meta} from "@storybook/react"; import type {CalendarProps, DateValue} from "../src"; import React from "react"; import {calendar} from "@heroui/theme"; import { today, parseDate, getLocalTimeZone, isWeekend, startOfWeek, startOfMonth, } from "@internationalized/date"; import {I18nProvider, useLocale} from "@react-aria/i18n"; import {Button, ButtonGroup} from "@heroui/button"; import {Radio, RadioGroup} from "@heroui/radio"; import {cn} from "@heroui/theme"; import {HeroUIProvider} from "@heroui/system"; import {Calendar} from "../src"; export default { title: "Components/Calendar", component: Calendar, parameters: { layout: "centered", }, argTypes: { visibleMonths: { control: {type: "number", min: 1, max: 3}, }, color: { control: { type: "select", }, options: ["foreground", "primary", "secondary", "success", "warning", "danger"], }, weekdayStyle: { control: { type: "select", }, options: ["narrow", "short", "long"], }, disableAnimation: { control: { type: "boolean", }, }, firstDayOfWeek: { control: "select", options: [undefined, "sun", "mon", "tue", "wed", "thu", "fri", "sat"], }, }, } as Meta; const defaultProps = { ...calendar.defaultVariants, visibleMonths: 1, }; const Template = (args: CalendarProps) => ; const ControlledTemplate = (args: CalendarProps) => { let [value, setValue] = React.useState(parseDate("2024-03-07")); return (

Date (uncontrolled)

Date (controlled)

); }; const UnavailableDatesTemplate = (args: CalendarProps) => { let now = today(getLocalTimeZone()); let disabledRanges = [ [now, now.add({days: 5})], [now.add({days: 14}), now.add({days: 16})], [now.add({days: 23}), now.add({days: 24})], ]; let {locale} = useLocale(); let isDateUnavailable = (date) => isWeekend(date, locale) || disabledRanges.some( (interval) => date.compare(interval[0]) >= 0 && date.compare(interval[1]) <= 0, ); return ( ); }; const ControlledFocusedValueTemplate = (args: CalendarProps) => { let defaultDate = today(getLocalTimeZone()); let [focusedDate, setFocusedDate] = React.useState(defaultDate); return (
); }; const InvalidDateTemplate = (args: CalendarProps) => { let [date, setDate] = React.useState(today(getLocalTimeZone())); let {locale} = useLocale(); let isInvalid = isWeekend(date, locale); return ( ); }; const InternationalCalendarsTemplate = (args: CalendarProps) => { return (
); }; const PresetsTemplate = (args: CalendarProps) => { let defaultDate = today(getLocalTimeZone()); let [value, setValue] = React.useState(defaultDate); let {locale} = useLocale(); let now = today(getLocalTimeZone()); let nextWeek = startOfWeek(now.add({weeks: 1}), locale); let nextMonth = startOfMonth(now.add({months: 1})); const CustomRadio = (props) => { const {children, ...otherProps} = props; return ( {children} ); }; return (
Exact dates 1 day 2 days 3 days 7 days 14 days } classNames={{ content: "w-full", }} focusedValue={value} nextButtonProps={{ variant: "bordered", }} prevButtonProps={{ variant: "bordered", }} topContent={ } value={value} onChange={setValue} onFocusChange={setValue} {...args} />
); }; const CalendarWidthTemplate = (args: CalendarProps) => { return (

calendarWidth: 300

calendarWidth: 300px

calendarWidth: 30em

); }; const ReducedMotionTemplate = (args: CalendarProps) => { return (

reducedMotion: never

reducedMotion: always

reducedMotion: user

); }; export const Default = { render: Template, args: { ...defaultProps, }, }; export const Disabled = { render: Template, args: { ...defaultProps, isDisabled: true, }, }; export const ReadOnly = { render: Template, args: { ...defaultProps, value: today(getLocalTimeZone()), isReadOnly: true, }, }; export const Controlled = { render: ControlledTemplate, args: { ...defaultProps, }, }; export const MinDateValue = { render: Template, args: { ...defaultProps, defaultValue: today(getLocalTimeZone()), minValue: today(getLocalTimeZone()), }, }; export const MaxDateValue = { render: Template, args: { ...defaultProps, defaultValue: today(getLocalTimeZone()), maxValue: today(getLocalTimeZone()), }, }; export const UnavailableDates = { render: UnavailableDatesTemplate, args: { ...defaultProps, defaultValue: today(getLocalTimeZone()), unavailableDates: [today(getLocalTimeZone())], }, }; export const ControlledFocusedValue = { render: ControlledFocusedValueTemplate, args: { ...defaultProps, }, }; export const InvalidDate = { render: InvalidDateTemplate, args: { ...defaultProps, }, }; export const WithMonthAndYearPickers = { render: Template, args: { ...defaultProps, showMonthAndYearPickers: true, }, }; export const InternationalCalendars = { render: InternationalCalendarsTemplate, args: { ...defaultProps, showMonthAndYearPickers: true, }, }; export const VisibleMonths = { render: Template, args: { ...defaultProps, visibleMonths: 3, }, }; export const PageBehavior = { render: Template, args: { ...defaultProps, visibleMonths: 3, pageBehavior: "single", }, }; export const Presets = { render: PresetsTemplate, args: { ...defaultProps, }, }; export const CalendarWidth = { render: CalendarWidthTemplate, args: { ...defaultProps, }, }; export const ReducedMotion = { render: ReducedMotionTemplate, args: { ...defaultProps, }, }; export const FirstDayOfWeek = { render: Template, args: { ...defaultProps, firstDayOfWeek: "mon", }, };