@stenajs-webui/calendar 25.1.2 → 25.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/util/date/DateFormats.ts","../src/util/calendar/StateModifier.ts","../src/features/today-state/UseHighlightToday.ts","../src/util/caseFormat/CaseFormat.ts","../src/util/calendar/CalendarDataFactory.ts","../src/util/calendar/StateHelper.ts","../src/components/calendar/CalendarTheme.tsx","../src/components/calendar/renderers/WeekDayCell.tsx","../src/components/calendar/renderers/CalendarDay.tsx","../src/components/calendar/renderers/WeekNumberCell.tsx","../src/util/date/DateMinMaxValidator.ts","../src/components/calendar/DisabledDayWrapper.tsx","../src/components/calendar/CalendarMonth.tsx","../src/components/calendar/Calendar.tsx","../src/features/month-picker/MonthPickerKeyboardNavigation.ts","../src/features/localize-date-format/LocaleMapper.ts","../src/features/month-picker/MonthPickerCell.tsx","../src/features/month-picker/MonthPickerDataFactory.ts","../src/features/month-picker/MonthPicker.tsx","../src/features/preset-picker/PresetFactory.ts","../src/features/preset-picker/PresetPicker.tsx","../src/features/calendar-with-month-year-pickers/CalendarWithMonthYearPickers.tsx","../src/features/month-switcher/hooks/UseSelectedMonthStepperLogic.ts","../src/features/month-switcher/MonthSwitcherBelow.tsx","../src/features/month-switcher/CalendarWithMonthSwitcher.tsx","../src/util/date-range/DateRangeTransformer.ts","../src/util/date-range/DateRangeValidator.ts","../src/features/date-range/hooks/UseDateRangeOnClickDayHandler.ts","../src/features/internal-panel-state/UseInternalPanelState.tsx","../src/components/calendar-types/date-range-calendar/hooks/UseDateRangeSelection.ts","../src/components/calendar-types/date-range-calendar/DateRangeCalendar.tsx","../src/components/calendar-types/date-range-calendar/hooks/UseDateRangeCalendarState.ts","../src/components/calendar-types/single-date-calendar/UseSingleDateSelection.ts","../src/components/calendar-types/single-date-calendar/SingleDateCalendar.tsx","../src/components/calendar-types/multi-date-calendar/UseMultiDateSelection.ts","../src/components/calendar-types/multi-date-calendar/MultiDateCalendar.tsx","../src/components/calendar-types/single-week-calendar/UseSingleWeekSelection.ts","../src/components/calendar-types/single-week-calendar/SingleWeekCalendar.tsx","../src/config/DefaultPopoverPlacement.ts","../src/components/input-types/date-input/UseDateInput.tsx","../src/config/DefaultMaxDate.ts","../src/components/input-types/date-input/DateInput.tsx","../src/components/input-types/date-range-input/hooks/UseDateRangeInput.tsx","../src/components/input-types/date-range-input/DateRangeInput.tsx","../src/components/input-types/date-text-input/DateTextInput.tsx","../src/util/time/TimeStringFormatValidator.ts","../src/components/input-types/time-text-input/TimeTextInput.tsx","../src/features/dual-text-input/DualTextInput.tsx","../src/util/time/TimeTransformer.ts","../src/features/time-picker/TimePickerCell.tsx","../src/features/time-picker/TimePickerColumn.tsx","../src/features/time-picker/TimePicker.tsx","../src/components/input-types/date-time-input/hooks/UseDateRangeEffects.ts","../src/components/input-types/date-time-input/hooks/UseDateRangeHandlers.ts","../src/components/input-types/date-time-input/hooks/UseInputStates.ts","../src/components/input-types/date-time-input/hooks/UseUserInputHandlers.ts","../src/components/input-types/date-time-input/DateTimeInput.tsx","../src/features/year-picker/YearPickerCell.tsx","../src/features/year-picker/YearPicker.tsx","../src/components/input-types/date-range-dual-text-input/hooks/UseDateRangeEffects.ts","../src/components/input-types/date-range-dual-text-input/hooks/UseDateRangeHandlers.ts","../src/components/input-types/date-range-dual-text-input/hooks/UseInputStates.ts","../src/components/input-types/date-range-dual-text-input/hooks/UseUserInputHandlers.ts","../src/components/input-types/date-range-dual-text-input/DateRangeDualTextInput.tsx","../src/features/travel-calendar/components/TravelDateTextInput.tsx","../src/features/localize-date-format/InputMaskProvider.ts","../src/features/localize-date-format/DateFormatProvider.ts","../src/features/localize-date-format/LocalizedDateParser.ts","../src/features/localize-date-format/LocalizedDateFormatter.ts","../src/features/localize-date-format/LocalizedDateReformatter.ts","../src/features/travel-calendar/components/TravelDateRangeTextInputFields.tsx","../src/features/travel-calendar/hooks/UseControlledVisibleMonth.ts","../src/features/travel-calendar/util/DateDescriptionFormatter.ts","../src/features/travel-calendar/util/DateRangeNormalizer.ts","../src/features/travel-calendar/hooks/UseTravelDateRangeInput.ts","../src/features/travel-calendar/components/MonthHeader.tsx","../src/features/travel-calendar/util/CellBgColors.ts","../src/features/travel-calendar/util/KeyboardNavigation.tsx","../src/features/travel-calendar/util/DayIdGenerator.ts","../src/features/travel-calendar/components/TravelDateCellBackground.tsx","../src/features/travel-calendar/components/TravelDateCell.tsx","../src/features/travel-calendar/components/TravelCalendar.tsx","../src/components/input-types/travel-date-range-input/TravelDateRangeInput.tsx","../src/features/travel-calendar/components/TravelDateTextInputField.tsx","../src/features/travel-calendar/hooks/UseTravelDateInput.ts","../src/components/input-types/travel-date-input/TravelDateInput.tsx","../src/features/travel-calendar/components/TravelDateCalendarBody.tsx","../src/components/calendar-types/travel-date-calendar/TravelDateCalendar.tsx","../src/components/calendar-types/travel-date-calendar-panel/TravelDateCalendarPanel.tsx","../src/components/calendar-types/travel-date-range-calendar/TravelDateRangeCalendar.tsx","../src/features/travel-calendar/hooks/DisabledDateHooks.ts","../src/features/travel-calendar/hooks/UseVisibleMonthState.ts"],"sourcesContent":["export const DateFormats = {\n yearAndMonth: \"yyyy-MM\",\n fullDate: \"yyyy-MM-dd\",\n fullMonthName: \"LLLL\",\n fullDateAndTime: \"yyyy-MM-dd HH:mm\",\n fullDateAndTimeSystem: \"yyyy-MM-ddTHH:MM\",\n weekDayName: \"EEEE\", // Tuesday\n weekDayNameShort: \"EEE\", // Tue\n dateAndMonth: \"d MMM\", // 2 Jan\n monthAndDate: \"MMM do\", // Jan 2nd\n};\n","import {\n addDays,\n eachDayOfInterval,\n endOfMonth,\n format,\n getDate,\n getISOWeek,\n isAfter,\n isSameDay,\n max,\n min,\n startOfMonth,\n subDays,\n} from \"date-fns\";\nimport { last } from \"lodash-es\";\nimport {\n CalendarState,\n CalendarUserData,\n DayState,\n DayStateHighlight,\n StateForWeek,\n} from \"../../types/CalendarTypes\";\nimport { DateFormats } from \"../date/DateFormats\";\nimport { WeekData } from \"./CalendarDataFactory\";\n\nexport const buildDayStateForDateRange = (\n statePerMonth: CalendarUserData<DayState> = {},\n start?: Date,\n end?: Date,\n): CalendarUserData<DayState> | undefined => {\n if (start && end && isAfter(end, start)) {\n return eachDayOfInterval({ start, end }).reduce(\n (result: CalendarUserData<DayState>, date: Date) => {\n const isFirstInRange = isSameDay(date, start);\n const isLastInRange = isSameDay(date, end);\n const highlights = isFirstInRange\n ? [\"selected\", \"selectedStart\", \"range\"]\n : isLastInRange\n ? [\"selected\", \"selectedEnd\", \"range\"]\n : [\"range\"];\n return addDayStateHighlights(result, date, highlights);\n },\n statePerMonth,\n );\n }\n\n let state = statePerMonth;\n\n if (start) {\n state = addDayStateHighlights(state, start, [\"selected\", \"singleSelected\"]);\n }\n\n if (end) {\n state = addDayStateHighlights(state, end, [\"selected\", \"singleSelected\"]);\n }\n\n return state;\n};\n\nexport const buildDayStateForSingleMonth = (\n statePerMonth: CalendarUserData<DayState> = {},\n start: Date | undefined,\n end: Date | undefined,\n dateInFocus: Date,\n): CalendarUserData<DayState> | undefined =>\n buildDayStateForRange(\n statePerMonth,\n start,\n end,\n startOfMonth(dateInFocus),\n endOfMonth(dateInFocus),\n );\n\nexport const buildDayStateForRange = (\n statePerMonth: CalendarUserData<DayState> = {},\n start: Date | undefined,\n end: Date | undefined,\n startLimit: Date,\n endLimit: Date,\n): CalendarUserData<DayState> | undefined => {\n if (start && end) {\n return buildDayStateForDateRange(\n statePerMonth,\n max([start, subDays(startLimit, 1)]),\n min([end, addDays(endLimit, 1)]),\n );\n } else {\n return buildDayStateForDateRange(statePerMonth, start, end);\n }\n};\n\nexport const setDayStateValue = (\n state: CalendarUserData<DayState> | undefined,\n date: Date,\n values: Partial<DayState>,\n): CalendarUserData<DayState> => {\n const monthString = format(date, DateFormats.yearAndMonth);\n const weekNumber = getISOWeek(date);\n const dayInMonth = getDate(date);\n return {\n ...state,\n [monthString]: {\n ...(state && state[monthString]),\n [weekNumber]: {\n ...(state && state[monthString] && state[monthString][weekNumber]),\n [dayInMonth]: {\n ...(state &&\n state[monthString] &&\n state[monthString][weekNumber] &&\n state[monthString][weekNumber][dayInMonth]),\n ...values,\n },\n },\n },\n };\n};\n\nexport const setDayStateValueFunction = (\n state: CalendarUserData<DayState> | undefined,\n date: Date,\n setter: (dayState: DayState | undefined) => Partial<DayState>,\n): CalendarUserData<DayState> => {\n const monthString = format(date, DateFormats.yearAndMonth);\n const weekNumber = getISOWeek(date);\n const dayInMonth = getDate(date);\n return {\n ...state,\n [monthString]: {\n ...(state && state[monthString]),\n [weekNumber]: {\n ...(state && state[monthString] && state[monthString][weekNumber]),\n [dayInMonth]: {\n ...(state &&\n state[monthString] &&\n state[monthString][weekNumber] &&\n state[monthString][weekNumber][dayInMonth]),\n ...setter(\n state &&\n state[monthString] &&\n state[monthString][weekNumber] &&\n state[monthString][weekNumber][dayInMonth],\n ),\n },\n },\n },\n };\n};\n\nexport const addDayStateHighlights = (\n calendarState: CalendarState | undefined,\n date: Date,\n highlights: Array<DayStateHighlight>,\n): CalendarUserData<DayState> => {\n const month = date.getMonth() + 1;\n const monthString = `${date.getFullYear()}-${month < 10 ? \"0\" : \"\"}${month}`;\n const weekNumber = getISOWeek(date);\n const dayInMonth = getDate(date);\n const dayState: DayState | undefined =\n calendarState &&\n calendarState[monthString] &&\n calendarState[monthString][weekNumber] &&\n calendarState[monthString][weekNumber][dayInMonth];\n\n return {\n ...calendarState,\n [monthString]: {\n ...(calendarState && calendarState[monthString]),\n [weekNumber]: {\n ...(calendarState &&\n calendarState[monthString] &&\n calendarState[monthString][weekNumber]),\n [dayInMonth]: addDayStateHighlightsOnSingleDay(dayState, highlights),\n },\n },\n };\n};\n\nexport const addDayStateHighlightsOnSingleDay = (\n dayState: DayState | undefined,\n highlights: Array<DayStateHighlight>,\n): DayState => {\n return {\n ...dayState,\n highlights: [...(dayState?.highlights ?? []), ...highlights],\n };\n};\n\nexport const addWeekStateHighlights = (\n calendarState: CalendarState | undefined,\n week: WeekData,\n highlights: Array<DayStateHighlight>,\n): CalendarUserData<DayState> => {\n const date = week.days[0].date;\n const month = date.getMonth() + 1;\n const monthString = `${date.getFullYear()}-${month < 10 ? \"0\" : \"\"}${month}`;\n const weekNumber = week.weekNumber;\n\n let state = calendarState;\n week.days.forEach((day) => {\n state = addDayStateHighlights(state, day.date, highlights);\n });\n\n const weekState =\n state && state[monthString] ? state[monthString][weekNumber] : undefined;\n\n const newHighlights: Array<DayStateHighlight> =\n weekState && weekState.highlights\n ? [...weekState.highlights, ...highlights]\n : highlights;\n\n const newWeekState: StateForWeek = {\n ...weekState,\n highlights: newHighlights,\n };\n\n return {\n ...state,\n [monthString]: {\n ...(calendarState && calendarState[monthString]),\n [weekNumber]: newWeekState,\n },\n };\n};\n\nexport const addWeekRangeHighlights = (\n calendarState: CalendarState | undefined,\n week: WeekData,\n): CalendarUserData<DayState> => {\n if (!week.days.length) {\n return { ...calendarState };\n }\n const startDate = week.days[0].date;\n const endDate = last(week.days)?.date;\n return {\n ...buildDayStateForDateRange(calendarState, startDate, endDate),\n };\n};\n","import { useMemo } from \"react\";\nimport { CalendarState } from \"../../types/CalendarTypes\";\nimport { addDayStateHighlights } from \"../../util/calendar/StateModifier\";\n\nexport const useHighlightToday = (\n enabled: boolean | undefined,\n statePerMonth: CalendarState | undefined,\n) => {\n return useMemo(() => {\n return enabled\n ? addDayStateHighlights(statePerMonth, new Date(), [\"today\"])\n : statePerMonth;\n }, [enabled, statePerMonth]);\n};\n","export const convertFirstCharToUpper = (value: string): string => {\n if (value.length === 0) {\n return value;\n }\n\n if (value.length === 1) {\n return value.toUpperCase();\n }\n\n return value.charAt(0).toUpperCase() + value.slice(1);\n};\n","import {\n addDays,\n addHours,\n addWeeks,\n eachDayOfInterval,\n endOfMonth,\n format,\n getDate,\n getISODay,\n getMonth,\n getWeek,\n getYear,\n isSameDay,\n Locale,\n startOfMonth,\n startOfWeek,\n} from \"date-fns\";\nimport { DateFormats } from \"../date/DateFormats\";\nimport { convertFirstCharToUpper } from \"../caseFormat/CaseFormat\";\n\nexport enum Month {\n JANUARY = 0,\n FEBRUARY,\n MARCH,\n APRIL,\n MAY,\n JUNE,\n JULY,\n AUGUST,\n SEPTEMBER,\n OCTOBER,\n NOVEMBER,\n DECEMBER,\n}\n\nexport enum WeekDay {\n SUNDAY = 0,\n MONDAY,\n TUESDAY,\n WEDNESDAY,\n THURSDAY,\n FRIDAY,\n SATURDAY,\n}\n\nexport interface DayData {\n name: string;\n fullName: string;\n date: Date; // YYYY-MM\n dateString: string; // YYYY-MM\n weekNumber: number;\n year: number; // 2018\n month: number; // 0-11\n dayOfMonth: number; // 1-31\n dayOfWeek: number; // 1-7\n isFirstDayOfWeek: boolean;\n isLastDayOfWeek: boolean;\n isFirstDayOfMonth: boolean;\n isLastDayOfMonth: boolean;\n}\n\nexport interface WeekData {\n weekNumber: number;\n startMonth: number;\n startYear: number;\n endMonth: number;\n endYear: number;\n isLastWeekOfMonth: boolean;\n days: Array<DayData>;\n}\n\nexport interface MonthData {\n monthString: string;\n name: string;\n year: number;\n monthInYear: number;\n weeks: Array<WeekData>;\n}\n\nexport const getMonthsInYear = (\n year: number,\n startMonth: number,\n numMonths: number,\n locale: Locale,\n): Array<MonthData> => {\n const months = [];\n for (let i = 0; i < numMonths; i++) {\n months.push(getMonthInYear(year, startMonth + i, locale));\n }\n return months;\n};\n\nexport const getMonthInYear = (\n year: number,\n month: number,\n locale: Locale,\n): MonthData => {\n if (isNaN(year) || isNaN(month)) {\n throw new Error(\"getMonthInYear() received NaN.\");\n }\n const yearToUse = year + Math.floor(month / 12);\n const monthToUse = month % 12;\n const firstDayOfMonth = new Date(yearToUse, monthToUse, 1);\n return {\n monthString: format(firstDayOfMonth, DateFormats.yearAndMonth),\n name: convertFirstCharToUpper(\n format(firstDayOfMonth, DateFormats.fullMonthName, { locale }),\n ),\n year: yearToUse,\n monthInYear: monthToUse,\n weeks: getWeeksForMonth(yearToUse, monthToUse, locale),\n };\n};\n\nexport const getWeeksForMonth = (\n year: number,\n month: number,\n locale: Locale,\n forceSixWeeks: boolean = true,\n): Array<WeekData> => {\n const firstDayOfMonth = new Date(year, month, 1);\n const firstDayOfFirstWeek = startOfWeek(firstDayOfMonth, { locale });\n\n const weeks = [];\n\n for (let i = 0; i < 6; i++) {\n const week = getWeekForDate(addWeeks(firstDayOfFirstWeek, i), locale);\n if (i > 0 && week.startMonth !== month && !forceSixWeeks) {\n return weeks;\n }\n weeks.push(week);\n }\n return weeks;\n};\n\nexport const getWeekForDate = (\n firstDayOfWeek: Date,\n locale: Locale,\n): WeekData => {\n const isLastWeekOfMonth =\n getMonth(addDays(firstDayOfWeek, 7)) !== getMonth(firstDayOfWeek);\n return {\n weekNumber: getWeek(firstDayOfWeek, { locale }),\n startMonth: getMonth(firstDayOfWeek),\n startYear: getYear(firstDayOfWeek),\n endMonth: getMonth(addDays(firstDayOfWeek, 6)),\n endYear: getYear(addDays(firstDayOfWeek, 6)),\n days: getDaysForWeekForDate(firstDayOfWeek, locale),\n isLastWeekOfMonth,\n };\n};\n\nexport const createDay = (date: Date, locale: Locale): DayData => {\n const dayOfWeek = getISODay(date);\n return {\n date,\n name: format(date, \"EEE\", locale ? { locale } : undefined),\n fullName: format(date, \"EEEE\", locale ? { locale } : undefined),\n dateString: format(addHours(date, 12), DateFormats.fullDate),\n weekNumber: getWeek(date, { locale }),\n year: getYear(date),\n month: getMonth(date),\n dayOfMonth: getDate(date),\n dayOfWeek,\n isFirstDayOfWeek: dayOfWeek === 1,\n isLastDayOfWeek: dayOfWeek === 7,\n isFirstDayOfMonth: isSameDay(startOfMonth(date), date),\n isLastDayOfMonth: isSameDay(endOfMonth(date), date),\n };\n};\n\nexport const getDaysForWeekForDate = (\n firstDayOfWeek: Date,\n locale: Locale,\n): Array<DayData> => {\n return eachDayOfInterval({\n start: firstDayOfWeek,\n end: addDays(firstDayOfWeek, 6),\n }).map((d) => createDay(d, locale));\n};\n\nexport const calculateOverflowingMonth = (\n year: number,\n month: number,\n): { year: number; month: number } => {\n if (month > Month.DECEMBER) {\n return { year: year + Math.floor(month / 12), month: month % 12 };\n }\n if (month < Month.JANUARY) {\n return { year: year + Math.floor(month / 12), month: 12 + (month % 12) };\n }\n return { year, month };\n};\n","import { DayState, DayStateHighlight } from \"../../types/CalendarTypes\";\n\nexport const dayHasHighlight = (\n dayState: DayState | undefined,\n defaultHighlights: Array<DayStateHighlight> | undefined,\n highlight: string,\n): boolean => {\n if (defaultHighlights && defaultHighlights.indexOf(highlight) >= 0) {\n return true;\n }\n if (\n dayState &&\n dayState.highlights &&\n dayState.highlights.indexOf(highlight) >= 0\n ) {\n return true;\n }\n return false;\n};\n\nexport const dayHighlightSelect = <T>(\n dayState: DayState | undefined,\n defaultHighlights: Array<DayStateHighlight> | undefined,\n highlightsOrBoolean: Array<string | boolean>,\n returnValues: Array<T>,\n fallbackValue?: T,\n): T | undefined => {\n if (highlightsOrBoolean.length !== returnValues.length) {\n throw new Error(\n \"Select highlight failed, number of values do not equal number of highlights.\",\n );\n }\n if (highlightsOrBoolean.length === 0) {\n return fallbackValue;\n }\n for (let i = 0; i < highlightsOrBoolean.length; i++) {\n if (typeof highlightsOrBoolean[i] === \"boolean\" && highlightsOrBoolean[i]) {\n return returnValues[i];\n }\n if (\n typeof highlightsOrBoolean[i] === \"string\" &&\n dayHasHighlight(\n dayState,\n defaultHighlights,\n highlightsOrBoolean[i] as string,\n )\n ) {\n return returnValues[i];\n }\n }\n return fallbackValue;\n};\n","import { IconDefinition } from \"@fortawesome/fontawesome-svg-core\";\nimport { TextProps } from \"@stenajs-webui/core\";\nimport { CSSProperties } from \"react\";\nimport { DayState, DayStateHighlight } from \"../../types/CalendarTypes\";\n\nimport {\n DayData,\n MonthData,\n WeekData,\n} from \"../../util/calendar/CalendarDataFactory\";\nimport { dayHighlightSelect } from \"../../util/calendar/StateHelper\";\n\nexport interface CalendarTheme<TUserData = unknown> {\n width: string;\n height: string;\n WeekNumber: WeekNumberTheme;\n WeekDay: WeekDayTheme;\n CalendarDay: CalendarDayTheme<TUserData>;\n CalendarMonth: CalendarMonthTheme;\n}\n\nexport interface WeekNumberTheme {\n backgroundColor: string;\n textColor?: string;\n clickableTextColor?: string;\n}\n\nexport interface CalendarMonthTheme {\n headerTextColor?: string;\n cellSpacing?: string;\n headerLeftIcon?: IconDefinition;\n headerRightIcon?: IconDefinition;\n}\n\nexport interface WeekDayTheme {\n textColor?: string;\n clickableTextColor?: string;\n}\n\nexport type CalendarStyleProvider<TUserData, TResult> = (\n defaultHighlights: Array<DayStateHighlight> | undefined,\n dayState: DayState | undefined,\n day: DayData,\n week: WeekData,\n month: MonthData,\n userData?: TUserData,\n) => TResult;\n\nexport type CalendarWrapperStyleProvider<TUserData> = CalendarStyleProvider<\n TUserData,\n CSSProperties | undefined\n>;\n\ntype TextPropsProvider<TUserData> = CalendarStyleProvider<\n TUserData,\n TextProps | undefined\n>;\n\nexport interface CalendarDayTheme<TUserData> {\n tdStyle?: CalendarWrapperStyleProvider<TUserData>;\n innerWrapperStyle?: CalendarWrapperStyleProvider<TUserData>;\n cellWrapperStyle?: CalendarWrapperStyleProvider<TUserData>;\n textProps?: TextPropsProvider<TUserData>;\n}\n\nexport interface CalendarDefaultWrapperColors {\n selectedBackground: string;\n rangeBackground: string;\n todayBackground: string;\n borderColor?: string;\n borderRadius?: string;\n rangeBorderRadius?: string;\n}\n\nexport const defaultWrapperStyleProvider =\n ({\n selectedBackground,\n todayBackground,\n rangeBackground,\n borderColor = \"transparent\",\n }: CalendarDefaultWrapperColors): CalendarWrapperStyleProvider<unknown> =>\n (defaultHighlights, dayState, day, _, month) => {\n const backgroundColor = dayHighlightSelect(\n dayState,\n defaultHighlights,\n [\"selected\", \"range\", \"today\", day.month === month.monthInYear],\n [selectedBackground, rangeBackground, todayBackground, \"#fff\"],\n \"transparent\",\n );\n\n return {\n backgroundColor,\n borderWidth: \"1px\",\n borderStyle: \"solid\",\n borderColor: dayHighlightSelect(\n dayState,\n defaultHighlights,\n [\"selectedStart\", \"selectedEnd\", \"singleSelected\", \"range\", \"today\"],\n [\n \"var(--swui-calendar-wrapper-range-background)\",\n \"var(--swui-calendar-wrapper-range-background)\",\n \"var(--swui-calendar-wrapper-range-background)\",\n \"var(--swui-calendar-wrapper-range-border)\",\n \"var(--lhds-color-ui-500)\",\n ],\n borderColor,\n ),\n borderTopLeftRadius: dayHighlightSelect(\n dayState,\n defaultHighlights,\n [\"selectedStart\", \"singleSelected\", \"today\"],\n [\n \"var(--swui-calendar-day-border-radius)\",\n \"var(--swui-calendar-day-border-radius)\",\n \"var(--swui-calendar-day-border-radius)\",\n ],\n \"unset\",\n ),\n borderBottomLeftRadius: dayHighlightSelect(\n dayState,\n defaultHighlights,\n [\"selectedStart\", \"singleSelected\", \"today\"],\n [\n \"var(--swui-calendar-day-border-radius)\",\n \"var(--swui-calendar-day-border-radius)\",\n \"var(--swui-calendar-day-border-radius)\",\n ],\n \"unset\",\n ),\n borderTopRightRadius: dayHighlightSelect(\n dayState,\n defaultHighlights,\n [\"selectedEnd\", \"singleSelected\", \"today\"],\n [\n \"var(--swui-calendar-day-border-radius)\",\n \"var(--swui-calendar-day-border-radius)\",\n \"var(--swui-calendar-day-border-radius)\",\n ],\n \"unset\",\n ),\n borderBottomRightRadius: dayHighlightSelect(\n dayState,\n defaultHighlights,\n [\"selectedEnd\", \"singleSelected\", \"today\"],\n [\n \"var(--swui-calendar-day-border-radius)\",\n \"var(--swui-calendar-day-border-radius)\",\n \"var(--swui-calendar-day-border-radius)\",\n ],\n \"unset\",\n ),\n boxSizing: \"border-box\",\n };\n };\n\ninterface DefaultTextColors {\n disabledColor: string;\n inOtherMonthColor: string;\n selectedColor: string;\n rangeTextColor?: string;\n}\n\nexport const defaultTextPropsProvider = ({\n selectedColor,\n disabledColor,\n inOtherMonthColor,\n rangeTextColor,\n}: DefaultTextColors): TextPropsProvider<unknown> => {\n return (defaultHighlights, dayState, day, _, month) => {\n const isOtherMonth = day.month !== month.monthInYear;\n const color = dayHighlightSelect(\n dayState,\n defaultHighlights,\n [isOtherMonth, \"selected\", \"range\", \"enabled\", \"disabled\"],\n [\n inOtherMonthColor,\n selectedColor,\n rangeTextColor,\n undefined,\n disabledColor,\n ],\n );\n return {\n color,\n };\n };\n};\n\nexport const defaultCalendarTheme: CalendarTheme = {\n width: \"var(--swui-calendar-day-width)\",\n height: \"var(--swui-calendar-day-height)\",\n WeekNumber: {\n backgroundColor: \"var(--swui-calendar-week-number-bg-color)\",\n textColor: \"var(--swui-calendar-week-number-text-color)\",\n clickableTextColor: \"var(--swui-calendar-week-number-clickable-text-color)\",\n },\n WeekDay: {\n textColor: \"var(--swui-calendar-week-day-text-color)\",\n clickableTextColor: \"var(--swui-calendar-week-day-clickable-text-color)\",\n },\n CalendarDay: {\n tdStyle: defaultWrapperStyleProvider({\n selectedBackground: \"var(--swui-calendar-wrapper-selected-background)\",\n rangeBackground: \"var(--swui-calendar-wrapper-range-background)\",\n todayBackground: \"var(--swui-calendar-wrapper-today-background)\",\n }),\n textProps: defaultTextPropsProvider({\n selectedColor: \"var(--swui-calendar-text-selected-color)\",\n disabledColor: \"var(--swui-calendar-text-disabled-color)\",\n inOtherMonthColor: \"var(--swui-calendar-text-in-other-month-color)\",\n }),\n },\n CalendarMonth: {\n headerTextColor: \"var(--swui-calendar-week-day-text-color)\",\n },\n};\n\nexport const extranetCalendarTheme: CalendarTheme = {\n ...defaultCalendarTheme,\n width: \"37px\",\n height: \"37px\",\n};\n","import { Box, Clickable, Text } from \"@stenajs-webui/core\";\nimport * as React from \"react\";\nimport { OnClickWeekDay } from \"../../../types/CalendarTypes\";\nimport { DayData } from \"../../../util/calendar/CalendarDataFactory\";\nimport { CalendarTheme } from \"../CalendarTheme\";\n\nexport interface WeekDayCellProps {\n onClickWeekDay?: OnClickWeekDay;\n day: DayData;\n theme: CalendarTheme;\n}\n\nexport const WeekDayCell = ({\n onClickWeekDay,\n day,\n theme,\n}: WeekDayCellProps) => {\n const content = (\n <Box\n width={theme.width}\n height={theme.height}\n justifyContent={\"center\"}\n alignItems={\"center\"}\n >\n <Text\n size={\"small\"}\n color={\n onClickWeekDay\n ? theme.WeekDay.clickableTextColor\n : theme.WeekDay.textColor\n }\n >\n {day.name}\n </Text>\n </Box>\n );\n\n if (onClickWeekDay) {\n return (\n <Clickable\n borderRadius={\"var(--swui-calendar-day-border-radius)\"}\n onClick={(ev) => onClickWeekDay(day.dayOfWeek, ev)}\n disableFocusHighlight={!onClickWeekDay}\n >\n {content}\n </Clickable>\n );\n }\n\n return content;\n};\n","import styled from \"@emotion/styled\";\nimport { Box, Text } from \"@stenajs-webui/core\";\nimport * as React from \"react\";\nimport {\n CalendarDayProps,\n DayState,\n DayStateHighlight,\n} from \"../../../types/CalendarTypes\";\nimport { dayHighlightSelect } from \"../../../util/calendar/StateHelper\";\n\nexport const CalendarDay = function CalendarDay<T>({\n day,\n week,\n month,\n dayState,\n userData,\n onClickDay,\n theme,\n extraDayContent: ExtraDayContent,\n defaultHighlights,\n showDatesInOtherMonths,\n}: CalendarDayProps<T>) {\n const content = (\n <Box\n width={\"100%\"}\n height={\"100%\"}\n justifyContent={\"center\"}\n alignItems={\"center\"}\n >\n <Text\n {...(theme.CalendarDay.textProps &&\n theme.CalendarDay.textProps(\n defaultHighlights,\n dayState,\n day,\n week,\n month,\n userData,\n ))}\n >\n {day.dayOfMonth}\n </Text>\n </Box>\n );\n\n const WrapperTd = styled.td({\n ...(theme.CalendarDay.tdStyle &&\n theme.CalendarDay.tdStyle(\n defaultHighlights,\n dayState,\n day,\n week,\n month,\n userData,\n )),\n });\n\n const InnerWrapperDiv = styled.div({\n ...(theme.CalendarDay.innerWrapperStyle &&\n theme.CalendarDay.innerWrapperStyle(\n defaultHighlights,\n dayState,\n day,\n week,\n month,\n userData,\n )),\n width: \"100%\",\n height: \"100%\",\n });\n\n const CellWrapperDiv = styled.div({\n ...(theme.CalendarDay.cellWrapperStyle &&\n theme.CalendarDay.cellWrapperStyle(\n defaultHighlights,\n dayState,\n day,\n week,\n month,\n userData,\n )),\n width: \"100%\",\n height: \"100%\",\n position: \"relative\",\n });\n\n const disabled = isDisabled(defaultHighlights, dayState);\n\n return (\n <WrapperTd\n onClick={disabled ? undefined : (ev) => onClickDay?.(day, userData, ev)}\n >\n <InnerWrapperDiv>\n <CellWrapperDiv>\n {(day.month === month.monthInYear || showDatesInOtherMonths) && (\n <>\n {ExtraDayContent && (\n <ExtraDayContent\n week={week}\n month={month}\n day={day}\n dayState={dayState}\n theme={theme}\n userData={userData}\n />\n )}\n {content}\n </>\n )}\n </CellWrapperDiv>\n </InnerWrapperDiv>\n </WrapperTd>\n );\n};\n\nconst isDisabled = (\n defaultHighlights: Array<DayStateHighlight> | undefined,\n dayState: DayState | undefined,\n): boolean =>\n !!dayHighlightSelect<boolean>(\n dayState,\n defaultHighlights,\n [\"enabled\", \"disabled\"],\n [false, true],\n false,\n );\n","import { Box, Clickable, Text } from \"@stenajs-webui/core\";\nimport * as React from \"react\";\nimport { ReactNode } from \"react\";\nimport { OnClickWeek } from \"../../../types/CalendarTypes\";\nimport { WeekData } from \"../../../util/calendar/CalendarDataFactory\";\nimport { CalendarTheme } from \"../CalendarTheme\";\n\nexport interface WeekNumberCellProps {\n week: WeekData;\n onClickWeek?: OnClickWeek;\n theme: CalendarTheme;\n background?: ReactNode;\n prefix?: string;\n backgroundColor?: string;\n}\n\nexport const WeekNumberCell: React.FC<WeekNumberCellProps> = ({\n onClickWeek,\n theme,\n week,\n background,\n backgroundColor,\n prefix,\n}) => {\n const content = (\n <Box\n width={theme.width}\n height={theme.height}\n justifyContent={\"center\"}\n alignItems={\"center\"}\n >\n {background && <Box position={\"absolute\"}>{background}</Box>}\n <Box position={\"absolute\"}>\n <Text\n color={\n onClickWeek\n ? theme.WeekNumber.clickableTextColor\n : theme.WeekNumber.textColor\n }\n >\n {prefix}\n {week.weekNumber}\n </Text>\n </Box>\n </Box>\n );\n return (\n <Box\n background={backgroundColor || theme.WeekNumber.backgroundColor}\n position={\"relative\"}\n >\n {onClickWeek ? (\n <Clickable\n borderRadius={\"var(--swui-calendar-day-border-radius)\"}\n onClick={(ev) => onClickWeek(week, ev)}\n disableFocusHighlight={!onClickWeek}\n >\n {content}\n </Clickable>\n ) : (\n content\n )}\n </Box>\n );\n};\n","import { isAfter, isBefore, isSameDay } from \"date-fns\";\n\nexport const isDateInMinMaxRange = (\n date: Date,\n min: Date | undefined,\n max: Date | undefined,\n): boolean => {\n if (min && isBefore(date, min)) {\n return isSameDay(date, min);\n }\n if (max && isAfter(date, max)) {\n return isSameDay(date, max);\n }\n return true;\n};\n","import * as React from \"react\";\nimport { useMemo } from \"react\";\nimport {\n CalendarDayProps,\n OptionalMinMaxDates,\n} from \"../../types/CalendarTypes\";\nimport { addDayStateHighlightsOnSingleDay } from \"../../util/calendar/StateModifier\";\nimport { isDateInMinMaxRange } from \"../../util/date/DateMinMaxValidator\";\n\ninterface DisabledDayWrapperProps<T>\n extends CalendarDayProps<T>,\n OptionalMinMaxDates {\n dayComponent: React.ComponentType<CalendarDayProps<T>>;\n}\n\nexport const DisabledDayWrapper = function DisabledDayWrapper<T>({\n dayComponent: DayComponent,\n minDate,\n maxDate,\n dayState,\n day,\n ...props\n}: DisabledDayWrapperProps<T>) {\n const activeDayState = useMemo(\n () =>\n !isDateInMinMaxRange(day.date, minDate, maxDate)\n ? addDayStateHighlightsOnSingleDay(dayState, [\"disabled\"])\n : dayState,\n [day.date, dayState, maxDate, minDate],\n );\n\n return <DayComponent day={day} {...props} dayState={activeDayState} />;\n};\n","import { Box, Row, Text } from \"@stenajs-webui/core\";\nimport * as React from \"react\";\nimport { ReactNode } from \"react\";\nimport {\n CalendarDayProps,\n CalendarOnClicks,\n CalendarUserMonthData,\n DayState,\n DayStateHighlight,\n ExtraDayContentProps,\n OptionalMinMaxDates,\n Renderers,\n} from \"../../types/CalendarTypes\";\nimport {\n DayData,\n MonthData,\n WeekData,\n} from \"../../util/calendar/CalendarDataFactory\";\nimport { CalendarTheme, defaultCalendarTheme } from \"./CalendarTheme\";\nimport { WeekDayCell } from \"./renderers/WeekDayCell\";\nimport { CalendarDay } from \"./renderers/CalendarDay\";\nimport { FlatButton, stenaAngleDown } from \"@stenajs-webui/elements\";\nimport { WeekNumberCell } from \"./renderers/WeekNumberCell\";\nimport { DisabledDayWrapper } from \"./DisabledDayWrapper\";\n\nexport interface CalendarMonthProps<T>\n extends CalendarOnClicks<T>,\n Renderers,\n OptionalMinMaxDates {\n month: MonthData;\n dayComponent?: React.ComponentType<CalendarDayProps<T>>;\n userDataPerWeek?: CalendarUserMonthData<T>;\n statePerWeek?: CalendarUserMonthData<DayState>;\n theme?: CalendarTheme;\n headerRightContent?: ReactNode;\n extraDayContent?: React.ComponentType<ExtraDayContentProps<T>>;\n defaultHighlights?: Array<DayStateHighlight>;\n showWeekNumber: boolean;\n}\n\nexport function CalendarMonth<T>({\n month,\n dayComponent = CalendarDay,\n statePerWeek,\n userDataPerWeek,\n minDate,\n maxDate,\n onClickDay,\n onClickWeek,\n onClickWeekDay,\n onClickMonth,\n renderWeekNumber,\n renderWeekDay,\n headerRightContent,\n theme = defaultCalendarTheme,\n extraDayContent,\n defaultHighlights,\n showWeekNumber,\n}: CalendarMonthProps<T>) {\n return (\n <>\n <Box alignItems={\"stretch\"}>\n <Row\n justifyContent={headerRightContent ? \"space-between\" : \"center\"}\n alignItems={\"center\"}\n >\n <Row justifyContent={\"center\"} alignItems={\"center\"}>\n {onClickMonth ? (\n <FlatButton\n onClick={() => onClickMonth(month)}\n label={month.name + \" \" + String(month.year)}\n rightIcon={stenaAngleDown}\n />\n ) : (\n <Text whiteSpace={\"nowrap\"}>\n {month.name} {month.year}\n </Text>\n )}\n </Row>\n\n {headerRightContent && (\n <Box alignItems={\"center\"}>{headerRightContent}</Box>\n )}\n </Row>\n\n <table>\n <tbody>\n <tr>\n {showWeekNumber && (\n <td>\n <Box width={theme.width} height={theme.height} />\n </td>\n )}\n {month.weeks[0].days.map((day: DayData) => (\n <td key={day.name}>\n {renderWeekDay ? (\n renderWeekDay(day.name, theme, onClickWeekDay)\n ) : (\n <WeekDayCell\n day={day}\n onClickWeekDay={onClickWeekDay}\n theme={theme}\n />\n )}\n </td>\n ))}\n </tr>\n {month.weeks.map((week: WeekData) => (\n <tr key={week.weekNumber}>\n {showWeekNumber && (\n <td>\n {renderWeekNumber ? (\n renderWeekNumber(week, theme, onClickWeek)\n ) : (\n <WeekNumberCell\n week={week}\n onClickWeek={onClickWeek}\n theme={theme}\n />\n )}\n </td>\n )}\n {week.days.map((day) => (\n <DisabledDayWrapper\n dayComponent={dayComponent}\n key={day.dateString}\n day={day}\n week={week}\n month={month}\n dayState={\n statePerWeek &&\n statePerWeek[week.weekNumber] &&\n statePerWeek[week.weekNumber][day.dayOfMonth]\n }\n userData={\n userDataPerWeek &&\n userDataPerWeek[week.weekNumber] &&\n userDataPerWeek[week.weekNumber][day.dayOfMonth]\n }\n onClickDay={onClickDay}\n theme={theme}\n extraDayContent={extraDayContent}\n defaultHighlights={defaultHighlights}\n minDate={minDate}\n maxDate={maxDate}\n />\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </Box>\n </>\n );\n}\n","import { Row, Spacing } from \"@stenajs-webui/core\";\nimport { getMonth, getYear, Locale, parse } from \"date-fns\";\nimport { enGB } from \"date-fns/locale\";\nimport { chunk } from \"lodash-es\";\nimport * as React from \"react\";\nimport { useMemo } from \"react\";\nimport { useHighlightToday } from \"../../features/today-state/UseHighlightToday\";\nimport {\n CalendarOnClicks,\n CalendarProps,\n CalendarUserData,\n DayState,\n Renderers,\n} from \"../../types/CalendarTypes\";\nimport {\n calculateOverflowingMonth,\n getMonthInYear,\n getMonthsInYear,\n MonthData,\n} from \"../../util/calendar/CalendarDataFactory\";\nimport cx from \"classnames\";\nimport styles from \"./Calendar.module.css\";\n\nimport { CalendarMonth } from \"./CalendarMonth\";\nimport { CalendarTheme, defaultCalendarTheme } from \"./CalendarTheme\";\nimport { CalendarDay } from \"./renderers/CalendarDay\";\n\ninterface CalendarPanelProps<T>\n extends CalendarProps<T>,\n CalendarOnClicks<T>,\n Renderers {\n year: number;\n month: number;\n monthRows: Array<Array<MonthData>>;\n userDataPerMonth?: CalendarUserData<T>;\n statePerMonth?: CalendarUserData<DayState>;\n width?: string;\n height?: string;\n theme?: CalendarTheme;\n}\n\nfunction CalendarPanel<T>({\n monthRows,\n dayComponent = CalendarDay,\n userDataPerMonth,\n statePerMonth,\n minDate,\n maxDate,\n onClickDay,\n onClickWeekDay,\n onClickWeek,\n onClickMonth,\n renderWeekDay,\n renderWeekNumber,\n headerRightContent,\n extraDayContent,\n defaultHighlights,\n showWeekNumber,\n theme = defaultCalendarTheme,\n}: CalendarPanelProps<T>) {\n const minDateObj = useMemo(\n () => (minDate ? parse(minDate, \"yyyy-MM-dd\", new Date()) : undefined),\n [minDate],\n );\n\n const maxDateObj = useMemo(\n () => (maxDate ? parse(maxDate, \"yyyy-MM-dd\", new Date()) : undefined),\n [maxDate],\n );\n\n return (\n <div\n className={cx(\n styles.calendar,\n showWeekNumber && styles.weekNumberVisible,\n )}\n >\n {monthRows.map((monthRow, rowIndex) => (\n <Spacing key={rowIndex}>\n <Row gap={2}>\n {monthRow.map((month) => (\n <CalendarMonth<T>\n key={month.name}\n month={month}\n dayComponent={dayComponent}\n userDataPerWeek={\n userDataPerMonth && userDataPerMonth[month.monthString]\n }\n statePerWeek={statePerMonth && statePerMonth[month.monthString]}\n onClickDay={onClickDay}\n onClickWeekDay={onClickWeekDay}\n onClickWeek={onClickWeek}\n onClickMonth={onClickMonth}\n theme={theme}\n renderWeekNumber={renderWeekNumber}\n renderWeekDay={renderWeekDay}\n headerRightContent={headerRightContent}\n extraDayContent={extraDayContent}\n defaultHighlights={defaultHighlights}\n minDate={minDateObj}\n maxDate={maxDateObj}\n showWeekNumber={showWeekNumber ?? false}\n />\n ))}\n </Row>\n </Spacing>\n ))}\n </div>\n );\n}\n\nexport function Calendar<T>(props: CalendarProps<T>) {\n const initialDate = getInitialDate(props.year, props.month, props.date);\n const { year, month } = calculateOverflowingMonth(\n initialDate.year,\n initialDate.month,\n );\n const monthRows = getMonthRows(\n year,\n month,\n props.locale ?? enGB,\n props.numMonths,\n props.monthsPerRow,\n );\n\n const statePerMonth = useHighlightToday(\n props.highlightToday,\n props.statePerMonth,\n );\n\n return (\n <CalendarPanel<T>\n year={year}\n month={month}\n monthRows={monthRows}\n {...props}\n statePerMonth={statePerMonth}\n />\n );\n}\n\nconst getInitialDate = (year?: number, month?: number, date?: Date) => {\n if (month && year) {\n return {\n month,\n year,\n };\n }\n if (date) {\n return {\n month: getMonth(date),\n year: getYear(date),\n };\n }\n const now = new Date();\n return {\n month: getMonth(now),\n year: getYear(now),\n };\n};\n\nconst getMonthRows = (\n year: number,\n month: number,\n locale: Locale,\n numMonths?: number,\n monthsPerRow?: number,\n): Array<Array<MonthData>> => {\n if (numMonths == null) {\n return [[getMonthInYear(year, month, locale)]];\n }\n if (monthsPerRow == null) {\n return [getMonthsInYear(year, month, numMonths, locale)];\n }\n return chunk(getMonthsInYear(year, month, numMonths, locale), monthsPerRow);\n};\n","import { Position } from \"./Position\";\n\nexport const getDomIdForMonth = (\n position: Position,\n monthPickerId: string,\n): string => {\n return `${position.row}-${position.column}-${monthPickerId}`;\n};\n\nexport const getDomIdForKeyboardKey = (\n key: string,\n currentPosition: Position,\n monthPickerId: string,\n numColumnsPerRow: number,\n): string | undefined => {\n let next = currentPosition;\n for (let i = 0; i < numColumnsPerRow; i++) {\n next = movePositionByKey(next, key, numColumnsPerRow);\n const id = getDomIdForMonth(next, monthPickerId);\n if (document.getElementById(id)) {\n return id;\n }\n }\n return undefined;\n};\n\nexport const movePositionByKey = (\n currentPosition: Position,\n key: string,\n numColumnsPerRow: number,\n): Position => {\n let row = currentPosition.row;\n let column = currentPosition.column;\n if (key === \"ArrowLeft\") {\n column--;\n } else if (key === \"ArrowUp\") {\n row--;\n } else if (key === \"ArrowRight\") {\n column++;\n } else if (key === \"ArrowDown\") {\n row++;\n }\n\n if (column < 0) {\n column = numColumnsPerRow - 1;\n row--;\n }\n if (column > numColumnsPerRow - 1) {\n column = 0;\n row++;\n }\n\n return {\n column,\n row,\n };\n};\n","import { Locale } from \"date-fns\";\nimport {\n da,\n de,\n deAT,\n enGB,\n enIE,\n enUS,\n es,\n cs,\n it,\n fi,\n fr,\n lv,\n nb,\n nl,\n et,\n nlBE,\n pl,\n lt,\n sv,\n} from \"date-fns/locale\";\n\ntype LocalesMap = {\n [key: string]: Locale;\n};\n\nexport type SupportedLocaleCode =\n | \"en\"\n | \"en-US\"\n | \"en-GB\"\n | \"en-IE\"\n | \"de-AT\"\n | \"nl-BE\"\n | \"nl-NL\"\n | \"de-DE\"\n | \"nb-NO\"\n | \"sv-SE\"\n | \"da-DK\"\n | \"lv-LV\"\n | \"lt-LT\"\n | \"it-IT\"\n | \"et-EE\"\n | \"fi-FI\"\n | \"cs-CZ\"\n | \"es-ES\"\n | \"fr-FR\"\n | \"pl-PL\"\n | \"nl\"\n | \"de\"\n | \"nb\"\n | \"sv\"\n | \"da\"\n | \"lv\"\n | \"lt\"\n | \"it\"\n | \"et\"\n | \"fi\"\n | \"cs\"\n | \"es\"\n | \"fr\"\n | \"pl\";\n\nconst locales: LocalesMap = {\n en: enGB,\n \"en-US\": enUS,\n \"en-GB\": enGB,\n \"en-IE\": enIE,\n \"de-AT\": deAT,\n \"nl-BE\": nlBE,\n \"nl-NL\": nl,\n \"de-DE\": de,\n \"nb-NO\": nb,\n \"sv-SE\": sv,\n \"da-DK\": da,\n \"lv-LV\": lv,\n \"lt-LT\": lt,\n \"it-IT\": it,\n \"et-EE\": et,\n \"fi-FI\": fi,\n \"cs-CZ\": cs,\n \"es-ES\": es,\n \"fr-FR\": fr,\n \"pl-PL\": pl,\n nl,\n de,\n nb,\n sv,\n da,\n lv,\n lt,\n it,\n et,\n fi,\n cs,\n es,\n fr,\n pl,\n};\n\nexport const fallbackLocaleCode: SupportedLocaleCode = \"en-GB\";\nexport const fallbackLocaleCodeForFormatting: SupportedLocaleCode = \"sv\";\n\nexport const getSupportedLocaleCode = (\n localeCode: string,\n matchLanguage: boolean,\n fallback: SupportedLocaleCode,\n): SupportedLocaleCode => {\n if (locales[localeCode]) {\n return localeCode as SupportedLocaleCode;\n }\n if (matchLanguage) {\n const languageCode = getSupportedLocaleCodeMatchingLanguage(localeCode);\n if (languageCode) {\n return languageCode;\n }\n }\n return fallback;\n};\n\nexport const getLocaleForLocaleCode = (\n localeCode: SupportedLocaleCode,\n): Locale => {\n return locales[localeCode];\n};\n\nexport const getSupportedLocaleCodeMatchingLanguage = (\n localeCode: string,\n): SupportedLocaleCode | undefined => {\n const [lang] = localeCode.split(\"-\");\n const localeCodes = Object.keys(locales);\n for (const l of localeCodes) {\n if (l.startsWith(lang)) {\n return l as SupportedLocaleCode;\n }\n }\n return undefined;\n};\n\nexport const getDefaultLocaleForFormatting = (): Locale => {\n return locales[\"sv\"];\n};\n\n/**\n * This is only used by old calendar components, to pass localeCode to updated components.\n * All updated calendar components just take localeCode, for example \"en-GB\", since that is what the browser provides,\n * and is not library dependent.\n */\nexport const getLocaleCodeForLocale = (\n locale: Locale,\n): SupportedLocaleCode | undefined => {\n const localeCodes = Object.keys(locales);\n for (const localeCode of localeCodes) {\n if (locales[localeCode].code === locale.code) {\n return localeCode as SupportedLocaleCode;\n }\n }\n return undefined;\n};\n","import * as React from \"react\";\nimport {\n KeyboardEventHandler,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n} from \"react\";\nimport { Row } from \"@stenajs-webui/core\";\nimport { FlatButton, PrimaryButton } from \"@stenajs-webui/elements\";\nimport { format } from \"date-fns\";\nimport {\n getDomIdForKeyboardKey,\n getDomIdForMonth,\n} from \"./MonthPickerKeyboardNavigation\";\nimport { Position } from \"./Position\";\nimport { MonthPickerSizeVariant } from \"./MonthPicker\";\nimport {\n getLocaleForLocaleCode,\n SupportedLocaleCode,\n} from \"../localize-date-format/LocaleMapper\";\nimport { convertFirstCharToUpper } from \"../../util/caseFormat/CaseFormat\";\n\ninterface MonthPickerCellProps {\n month: Date;\n onClick: () => void;\n selected: boolean;\n localeCode: SupportedLocaleCode;\n autoFocus: boolean;\n monthPickerId: string;\n firstAvailableMonth: Date;\n lastAvailableMonth: Date;\n position: Position;\n size: MonthPickerSizeVariant;\n}\n\nexport const MonthPickerCell: React.FC<MonthPickerCellProps> = ({\n month,\n onClick,\n selected,\n localeCode,\n autoFocus,\n monthPickerId,\n position,\n size,\n}) => {\n const locale = useMemo(\n () => getLocaleForLocaleCode(localeCode) ?? getLocaleForLocaleCode(\"en-GB\"),\n [localeCode],\n );\n\n const label = useMemo(\n () => convertFirstCharToUpper(format(month, \"LLL\", { locale })),\n [locale, month],\n );\n\n const abbr = useMemo(\n () => format(month, \"LLLL\", { locale }),\n [locale, month],\n );\n\n const ref = useRef<HTMLButtonElement>(null);\n\n const domId = getDomIdForMonth(position, monthPickerId);\n const tabIndex = selected ? 0 : -1;\n\n useEffect(() => {\n ref.current?.focus();\n }, []);\n\n const onKeyDown = useCallback<KeyboardEventHandler<HTMLDivElement>>(\n (ev) => {\n const nextDomId = getDomIdForKeyboardKey(\n ev.key,\n position,\n monthPickerId,\n 4,\n );\n if (nextDomId) {\n document.getElementById(nextDomId)?.focus();\n }\n },\n [monthPickerId, position],\n );\n\n return (\n <Row justifyContent={\"center\"} onKeyDown={onKeyDown}>\n {selected ? (\n <PrimaryButton\n id={domId}\n aria-label={abbr}\n label={label}\n onClick={onClick}\n aria-selected={true}\n autoFocus={autoFocus}\n ref={ref}\n size={size === \"large\" ? \"large\" : \"medium\"}\n tabIndex={tabIndex}\n />\n ) : (\n <FlatButton\n id={domId}\n label={label}\n aria-label={abbr}\n onClick={onClick}\n size={size === \"large\" ? \"large\" : \"medium\"}\n tabIndex={tabIndex}\n />\n )}\n </Row>\n );\n};\n","import { addMonths } from \"date-fns\";\nimport { Position } from \"./Position\";\n\nexport interface MonthInput {\n yearOrder: Array<number>;\n years: Record<number, YearInput>;\n rows: Array<RowInput>;\n lastMonthRow: number;\n lastMonthColumn: number;\n}\n\nexport interface YearInput {\n year: number;\n rows: Array<number>;\n}\n\nexport interface RowInput {\n rowIndex: number;\n columns: Array<Columns>;\n}\n\nexport interface Columns {\n position: Position;\n month: Date;\n}\n\nexport const createMonths = (\n firstMonth: Date,\n numMonths: number,\n numColumnsPerRow: number,\n): MonthInput => {\n let currentYear = firstMonth.getFullYear();\n let currentRow = 0;\n let currentColumn = 0;\n let currentMonth = firstMonth;\n\n const input: MonthInput = {\n yearOrder: [],\n rows: [],\n years: {},\n lastMonthColumn: -1,\n lastMonthRow: -1,\n };\n\n for (let i = 0; i < numMonths; i++) {\n if (input.years[currentYear] == null) {\n input.yearOrder.push(currentYear);\n input.years[currentYear] = { year: currentYear, rows: [] };\n }\n\n input.rows[currentRow] = input.rows[currentRow] ?? {\n columns: [],\n rowIndex: currentRow,\n };\n\n input.rows[currentRow].columns[currentColumn] = {\n position: {\n column: currentColumn,\n row: currentRow,\n },\n month: currentMonth,\n };\n\n if (i === numMonths - 1) {\n // Last one, add it and exit\n input.years[currentYear].rows.push(currentRow);\n break;\n }\n\n currentMonth = addMonths(currentMonth, 1);\n\n if (currentMonth.getFullYear() !== currentYear) {\n input.years[currentYear].rows.push(currentRow);\n currentYear++;\n currentColumn = 0;\n currentRow++;\n } else {\n currentColumn++;\n if (currentColumn > numColumnsPerRow - 1) {\n input.years[currentYear].rows.push(currentRow);\n currentColumn = 0;\n currentRow++;\n }\n }\n }\n\n input.lastMonthColumn = currentColumn;\n input.lastMonthRow = currentRow;\n\n return input;\n};\n","import * as React from \"react\";\nimport {\n KeyboardEventHandler,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useState,\n} from \"react\";\nimport { ValueAndOnValueChangeProps } from \"@stenajs-webui/forms\";\nimport {\n Column,\n exhaustSwitchCase,\n Heading,\n useToday,\n} from \"@stenajs-webui/core\";\nimport { MonthPickerCell } from \"./MonthPickerCell\";\nimport { addMonths, isSameMonth } from \"date-fns\";\nimport { createMonths } from \"./MonthPickerDataFactory\";\nimport { SupportedLocaleCode } from \"../localize-date-format/LocaleMapper\";\n\nexport type MonthPickerSizeVariant = \"smaller\" | \"small\" | \"medium\" | \"large\";\n\nexport interface MonthPickerProps extends ValueAndOnValueChangeProps<Date> {\n localeCode: SupportedLocaleCode;\n firstMonth: Date;\n numMonths: number;\n onCancel?: () => void;\n size?: MonthPickerSizeVariant;\n}\n\nexport const MonthPicker: React.FC<MonthPickerProps> = ({\n value,\n onValueChange,\n firstMonth,\n localeCode,\n numMonths,\n onCancel,\n size = \"medium\",\n}) => {\n const monthPickerId = useId();\n const today = useToday();\n\n const clampedNumMonths = numMonths > 0 ? numMonths : 12;\n\n const [inited, setInited] = useState(false);\n\n const input = createMonths(firstMonth, clampedNumMonths, getNumColumns(size));\n\n const lastMonth = useMemo(() => {\n return addMonths(firstMonth, clampedNumMonths);\n }, [clampedNumMonths, firstMonth]);\n\n useEffect(() => {\n setInited(true);\n }, []);\n\n const onKeyDown = useCallback<KeyboardEventHandler>(\n (ev) => {\n if (ev.key === \"Escape\") {\n onCancel?.();\n ev.preventDefault();\n ev.stopPropagation();\n }\n },\n [onCancel],\n );\n\n return (\n <Column gap={1} maxWidth={getWidth(size)} onKeyDown={onKeyDown}>\n {input.yearOrder.map((year, yearIndex) => {\n const { rows } = input.years[year];\n return (\n <React.Fragment key={year}>\n {(yearIndex !== 0 || year !== today.getFullYear()) && (\n <Heading variant={\"h4\"}>{year}</Heading>\n )}\n <table style={{ borderSpacing: \"0 8px\" }}>\n <tbody>\n {rows.map((r) => {\n const { columns } = input.rows[r];\n return (\n <tr key={r}>\n {columns.map(({ month, position }) => (\n <td key={month.getMonth()}>\n <MonthPickerCell\n month={month}\n firstAvailableMonth={firstMonth}\n lastAvailableMonth={lastMonth}\n localeCode={localeCode}\n selected={value ? isSameMonth(value, month) : false}\n autoFocus={inited}\n onClick={() => onValueChange?.(month)}\n monthPickerId={monthPickerId}\n position={position}\n size={size}\n />\n </td>\n ))}\n </tr>\n );\n })}\n </tbody>\n </table>\n </React.Fragment>\n );\n })}\n </Column>\n );\n};\n\nconst getWidth = (size: MonthPickerSizeVariant) => {\n // For cell size = 48px, 48*7 = 336px\n switch (size) {\n case \"smaller\":\n return \"280px\";\n case \"small\":\n return \"308px\";\n case \"medium\":\n return \"336px\";\n case \"large\":\n return \"448px\";\n default:\n return exhaustSwitchCase(size, \"336px\");\n }\n};\n\nconst getNumColumns = (size: MonthPickerSizeVariant): number => {\n switch (size) {\n case \"smaller\":\n case \"small\":\n return 3;\n case \"medium\":\n case \"large\":\n return 4;\n default:\n return exhaustSwitchCase(size, 4);\n }\n};\n","import { PresetPage } from \"./CalendarPreset\";\nimport { addDays, subDays } from \"date-fns\";\n\nexport const createStandardDateRangePresets = (\n now: Date,\n): Array<PresetPage> => [\n {\n label: \"Past\",\n presets: [\n { label: \"Last 3 days\", startDate: now, endDate: subDays(now, 2) },\n { label: \"Last 7 days\", startDate: now, endDate: subDays(now, 6) },\n { label: \"Last 30 days\", startDate: now, endDate: subDays(now, 29) },\n { label: \"Last 45 days\", startDate: now, endDate: subDays(now, 44) },\n ],\n },\n {\n label: \"Future\",\n presets: [\n { label: \"Next 3 days\", startDate: now, endDate: addDays(now, 2) },\n { label: \"Next 7 days\", startDate: now, endDate: addDays(now, 6) },\n { label: \"Next 30 days\", startDate: now, endDate: addDays(now, 29) },\n { label: \"Next 45 days\", startDate: now, endDate: addDays(now, 44) },\n ],\n },\n];\n","import * as React from \"react\";\nimport { useMemo, useState } from \"react\";\nimport { createStandardDateRangePresets } from \"./PresetFactory\";\nimport { Column, Row, Space, Text } from \"@stenajs-webui/core\";\nimport {\n FlatButton,\n PrimaryButton,\n stenaAngleLeft,\n stenaAngleRight,\n} from \"@stenajs-webui/elements\";\nimport { CalendarPreset } from \"./CalendarPreset\";\n\nexport interface PresetPickerProps {\n onClickPreset: (preset: CalendarPreset) => void;\n}\n\nexport const PresetPicker: React.FC<PresetPickerProps> = ({\n onClickPreset,\n}) => {\n const [pageIndex, setPageIndex] = useState(0);\n const pages = useMemo(() => createStandardDateRangePresets(new Date()), []);\n\n const currentPage = pages[pageIndex] ?? pages[0];\n\n return (\n <Column>\n <Row\n justifyContent={\"space-between\"}\n alignItems={\"center\"}\n width={\"200px\"}\n >\n <FlatButton\n size={\"small\"}\n leftIcon={stenaAngleLeft}\n disabled={pageIndex === 0}\n onClick={() => setPageIndex(pageIndex - 1)}\n />\n <Text>{currentPage.label}</Text>\n <FlatButton\n size={\"small\"}\n leftIcon={stenaAngleRight}\n disabled={pageIndex === pages.length - 1}\n onClick={() => setPageIndex(pageIndex + 1)}\n />\n </Row>\n <Space />\n <Column alignItems={\"center\"}>\n {currentPage.presets.map((preset) => (\n <React.Fragment key={preset.label}>\n <PrimaryButton\n label={preset.label}\n onClick={() => onClickPreset(preset)}\n />\n <Space />\n </React.Fragment>\n ))}\n </Column>\n </Column>\n );\n};\n","import { Box, useToday } from \"@stenajs-webui/core\";\nimport { PrimaryButton } from \"@stenajs-webui/elements\";\nimport * as React from \"react\";\nimport { ReactNode, useCallback, useMemo } from \"react\";\nimport { Calendar } from \"../../components/calendar/Calendar\";\nimport {\n CalendarProps,\n RenderMonthPickerArgs,\n} from \"../../types/CalendarTypes\";\nimport { MonthPicker } from \"../month-picker/MonthPicker\";\nimport { CalendarPreset } from \"../preset-picker/CalendarPreset\";\nimport { PresetPicker } from \"../preset-picker/PresetPicker\";\nimport { CalendarPanelType } from \"./CalendarPanelType\";\nimport {\n getLocaleCodeForLocale,\n SupportedLocaleCode,\n} from \"../localize-date-format/LocaleMapper\";\n\ninterface CalendarWithMonthYearPickersProps<T>\n extends Omit<CalendarProps<T>, \"date\" | \"year\" | \"month\"> {\n dateInFocus: Date;\n firstMonthInMonthPicker?: Date;\n numMonthsInMonthPicker?: number;\n setDateInFocus: (dateInFocus: Date) => void;\n currentPanel: CalendarPanelType;\n setCurrentPanel: (currentPanel: CalendarPanelType) => void;\n onSelectPreset: (preset: CalendarPreset) => void;\n renderMonthPicker?: (args: RenderMonthPickerArgs) => ReactNode;\n}\n\nexport const CalendarWithMonthYearPickers =\n function CalendarWithMonthYearPickers<T>({\n locale,\n dateInFocus,\n setDateInFocus,\n currentPanel,\n setCurrentPanel,\n renderMonthPicker,\n firstMonthInMonthPicker,\n numMonthsInMonthPicker,\n ...props\n }: CalendarWithMonthYearPickersProps<T>) {\n const localeCode = useMemo<SupportedLocaleCode>(\n () =>\n locale == null ? \"en-GB\" : (getLocaleCodeForLocale(locale) ?? \"en-GB\"),\n [locale],\n );\n const today = useToday();\n\n const onChangeSelectedMonth = useCallback(\n (selectedMonth: Date) => {\n if (setDateInFocus) {\n setDateInFocus(selectedMonth);\n }\n setCurrentPanel(\"calendar\");\n },\n [setDateInFocus, setCurrentPanel],\n );\n\n const onClickMonth = useCallback(() => {\n setCurrentPanel(\"month\");\n }, [setCurrentPanel]);\n\n switch (currentPanel) {\n case \"calendar\":\n return (\n <Calendar<T>\n {...props}\n date={dateInFocus}\n onClickMonth={onClickMonth}\n locale={locale}\n />\n );\n case \"month\":\n return renderMonthPicker ? (\n renderMonthPicker({\n value: dateInFocus,\n onValueChange: onChangeSelectedMonth,\n locale: locale,\n firstMonth: firstMonthInMonthPicker ?? today,\n numMonths: numMonthsInMonthPicker ?? 24,\n dateInFocus,\n })\n ) : (\n <MonthPicker\n value={dateInFocus}\n onValueChange={onChangeSelectedMonth}\n localeCode={localeCode}\n firstMonth={firstMonthInMonthPicker ?? today}\n numMonths={numMonthsInMonthPicker ?? 24}\n />\n );\n case \"presets\":\n return <PresetPicker onClickPreset={() => {}} />;\n\n default:\n return (\n <Box>\n <PrimaryButton\n label={\"Show calendar\"}\n onClick={() => setCurrentPanel(\"calendar\")}\n />\n </Box>\n );\n }\n };\n","import { addMonths, addYears, subMonths, subYears } from \"date-fns\";\nimport { useCallback } from \"react\";\n\nexport const useSelectedMonthStepperLogic = (\n dateInFocus: Date,\n setDateInFocus?: (dateInFocus: Date) => void,\n monthsPerRow?: number,\n numMonths?: number,\n) => {\n const nextMonth = useCallback(() => {\n const d = addMonths(dateInFocus, monthsPerRow ?? numMonths ?? 1);\n setDateInFocus?.(d);\n }, [setDateInFocus, dateInFocus, monthsPerRow, numMonths]);\n\n const nextYear = useCallback(() => {\n const d = addYears(dateInFocus, 1);\n setDateInFocus?.(d);\n }, [setDateInFocus, dateInFocus]);\n\n const prevMonth = useCallback(() => {\n const d = subMonths(dateInFocus, monthsPerRow ?? numMonths ?? 1);\n setDateInFocus?.(d);\n }, [setDateInFocus, dateInFocus, monthsPerRow, numMonths]);\n\n const prevYear = useCallback(() => {\n const d = subYears(dateInFocus, 1);\n setDateInFocus?.(d);\n }, [setDateInFocus, dateInFocus]);\n\n return {\n nextMonth,\n prevMonth,\n nextYear,\n prevYear,\n };\n};\n","import { Indent, Row, Space } from \"@stenajs-webui/core\";\nimport {\n SecondaryButton,\n stenaAngleLeftDouble,\n stenaAngleRightDouble,\n stenaArrowLeft,\n stenaArrowRight,\n} from \"@stenajs-webui/elements\";\nimport * as React from \"react\";\nimport { ReactNode } from \"react\";\nimport { CalendarTheme } from \"../../components/calendar/CalendarTheme\";\n\nexport interface WithMonthSwitcherBelowProps {\n theme: CalendarTheme;\n nextMonth: () => void;\n prevMonth: () => void;\n nextYear: () => void;\n prevYear: () => void;\n children?: ReactNode;\n}\n\nexport const WithMonthSwitcherBelow: React.FC<WithMonthSwitcherBelowProps> = ({\n children,\n prevMonth,\n nextMonth,\n prevYear,\n nextYear,\n}) => (\n <div>\n {children}\n <Indent>\n <Row gap={1}>\n <SecondaryButton onClick={prevYear} leftIcon={stenaAngleLeftDouble} />\n <SecondaryButton onClick={prevMonth} leftIcon={stenaArrowLeft} />\n <Indent num={2} />\n <SecondaryButton onClick={nextMonth} leftIcon={stenaArrowRight} />\n <SecondaryButton onClick={nextYear} leftIcon={stenaAngleRightDouble} />\n </Row>\n </Indent>\n <Space />\n </div>\n);\n","import { Column, Row } from \"@stenajs-webui/core\";\nimport {\n SecondaryButton,\n stenaArrowLeft,\n stenaArrowRight,\n} from \"@stenajs-webui/elements\";\nimport * as React from \"react\";\nimport { Calendar } from \"../../components/calendar/Calendar\";\nimport { defaultCalendarTheme } from \"../../components/calendar/CalendarTheme\";\nimport {\n CalendarProps,\n RenderMonthPickerArgs,\n} from \"../../types/CalendarTypes\";\nimport { CalendarPanelType } from \"../calendar-with-month-year-pickers/CalendarPanelType\";\nimport { CalendarWithMonthYearPickers } from \"../calendar-with-month-year-pickers/CalendarWithMonthYearPickers\";\nimport { CalendarPreset } from \"../preset-picker/CalendarPreset\";\nimport { useSelectedMonthStepperLogic } from \"./hooks/UseSelectedMonthStepperLogic\";\nimport { WithMonthSwitcherBelow } from \"./MonthSwitcherBelow\";\nimport { ReactNode } from \"react\";\n\nexport type MonthSwitcherPlacement = \"header\" | \"below\";\n\nexport interface CalendarWithMonthSwitcherProps<T> extends CalendarProps<T> {\n monthSwitcherPlacement?: MonthSwitcherPlacement;\n dateInFocus: Date;\n setDateInFocus: (dateInFocus: Date) => void;\n currentPanel: CalendarPanelType;\n setCurrentPanel: (currentPanel: CalendarPanelType) => void;\n onSelectPreset?: (preset: CalendarPreset) => void;\n renderMonthPicker?: (args: RenderMonthPickerArgs) => ReactNode;\n firstMonthInMonthPicker?: Date;\n numMonthsInMonthPicker?: number;\n}\n\nconst noop = () => {};\n\nexport function CalendarWithMonthSwitcher<T>({\n monthSwitcherPlacement,\n theme = defaultCalendarTheme,\n dateInFocus,\n setDateInFocus,\n currentPanel,\n setCurrentPanel,\n onSelectPreset = noop,\n renderMonthPicker,\n firstMonthInMonthPicker,\n numMonthsInMonthPicker,\n ...calendarProps\n}: CalendarWithMonthSwitcherProps<T>) {\n const { nextMonth, prevMonth, nextYear, prevYear } =\n useSelectedMonthStepperLogic(\n dateInFocus,\n setDateInFocus,\n calendarProps.monthsPerRow,\n calendarProps.numMonths,\n );\n\n const placement = fallbackIfNoPlacement(\n monthSwitcherPlacement,\n calendarProps.numMonths,\n );\n\n switch (placement) {\n case \"below\": {\n return (\n <WithMonthSwitcherBelow\n theme={theme}\n nextMonth={nextMonth}\n prevMonth={prevMonth}\n nextYear={nextYear}\n prevYear={prevYear}\n >\n <Calendar<T> {...calendarProps} theme={theme} date={dateInFocus} />\n </WithMonthSwitcherBelow>\n );\n }\n case \"header\": {\n return (\n <Column>\n <CalendarWithMonthYearPickers<T>\n {...calendarProps}\n theme={theme}\n renderMonthPicker={renderMonthPicker}\n dateInFocus={dateInFocus}\n setDateInFocus={setDateInFocus}\n currentPanel={currentPanel}\n setCurrentPanel={setCurrentPanel}\n onSelectPreset={onSelectPreset}\n firstMonthInMonthPicker={firstMonthInMonthPicker}\n numMonthsInMonthPicker={numMonthsInMonthPicker}\n headerRightContent={\n <Row alignItems={\"center\"} gap={1}>\n <SecondaryButton\n onClick={prevMonth}\n leftIcon={stenaArrowLeft}\n />\n <SecondaryButton\n onClick={nextMonth}\n leftIcon={stenaArrowRight}\n />\n </Row>\n }\n />\n </Column>\n );\n }\n default: {\n return (\n <Calendar<T> {...calendarProps} theme={theme} date={dateInFocus} />\n );\n }\n }\n}\n\nconst fallbackIfNoPlacement = (\n monthSwitcherPlacement: MonthSwitcherPlacement | undefined,\n numMonths: number | undefined,\n): MonthSwitcherPlacement => {\n return monthSwitcherPlacement || (numMonths || 1) > 1 ? \"below\" : \"header\";\n};\n","import { DateRange, DateStringRange } from \"../../types/DateRange\";\nimport { format, parse } from \"date-fns\";\n\nexport const dateRangeToStrings = (dateRange: DateRange): DateStringRange => ({\n startDate: dateRange.startDate\n ? format(dateRange.startDate, \"yyyy-MM-dd\")\n : undefined,\n endDate: dateRange.endDate\n ? format(dateRange.endDate, \"yyyy-MM-dd\")\n : undefined,\n});\n\nexport const stringsToDateRange = ({\n startDate,\n endDate,\n}: DateStringRange): DateRange => {\n const now = new Date();\n return {\n startDate: startDate ? parse(startDate, \"yyyy-MM-dd\", now) : undefined,\n endDate: endDate ? parse(endDate, \"yyyy-MM-dd\", now) : undefined,\n };\n};\n","import { isAfter, isSameDay } from \"date-fns\";\nimport { DateRange, DateStringRange } from \"../../types/DateRange\";\nimport { dateRangeToStrings, stringsToDateRange } from \"./DateRangeTransformer\";\n\nexport const isDateRangeInvalid = ({\n startDate,\n endDate,\n}: DateRange): boolean =>\n Boolean(\n startDate &&\n endDate &&\n !isSameDay(startDate, endDate) &&\n isAfter(startDate, endDate),\n );\n\nexport const toggleDatesIfEndIsEarlierThanStart = (\n dateRange: DateRange,\n): DateRange => {\n if (isDateRangeInvalid(dateRange)) {\n return {\n startDate: dateRange.endDate,\n endDate: dateRange.startDate,\n };\n }\n return dateRange;\n};\n\nexport const toggleDateStringsIfEndIsEarlierThanStart = (\n dateRange: DateStringRange,\n): DateStringRange => {\n if (dateRange.startDate && dateRange.endDate) {\n return dateRangeToStrings(\n toggleDatesIfEndIsEarlierThanStart(stringsToDateRange(dateRange)),\n );\n }\n return dateRange;\n};\n","import { useCallback } from \"react\";\nimport { DateRangeFocusedInput } from \"../../../components/calendar-types/date-range-calendar/DateRangeCalendar\";\nimport { OnClickDay } from \"../../../types/CalendarTypes\";\nimport { DayData } from \"../../../util/calendar/CalendarDataFactory\";\nimport {\n isDateRangeInvalid,\n toggleDatesIfEndIsEarlierThanStart,\n} from \"../../../util/date-range/DateRangeValidator\";\nimport { DateRange } from \"../../../types/DateRange\";\n\nexport const useDateRangeOnClickDayHandler = <T>(\n value: DateRange | undefined,\n onValueChange: ((dateRange: DateRange) => void) | undefined,\n focusedInput: DateRangeFocusedInput,\n setFocusedInput: (focusedInput: DateRangeFocusedInput) => void,\n): OnClickDay<T> => {\n return useCallback(\n (day: DayData) => {\n const dateRange = {\n startDate: focusedInput === \"startDate\" ? day.date : value?.startDate,\n endDate: focusedInput === \"endDate\" ? day.date : value?.endDate,\n };\n\n if (!isDateRangeInvalid(dateRange)) {\n setFocusedInput(focusedInput === \"startDate\" ? \"endDate\" : \"startDate\");\n }\n onValueChange?.(toggleDatesIfEndIsEarlierThanStart(dateRange));\n },\n [\n focusedInput,\n onValueChange,\n setFocusedInput,\n value?.endDate,\n value?.startDate,\n ],\n );\n};\n","import { CalendarPanelType } from \"../calendar-with-month-year-pickers/CalendarPanelType\";\nimport { useCallback, useState } from \"react\";\n\nexport type OnChangePanel = (panel: CalendarPanelType) => void;\n\nexport interface UseInternalPanelStateProps {\n onChangePanel?: OnChangePanel;\n}\n\nexport const useInternalPanelState = (\n onChangePanel: OnChangePanel | undefined,\n) => {\n const [currentPanel, _setCurrentPanel] =\n useState<CalendarPanelType>(\"calendar\");\n\n const setCurrentPanel = useCallback(\n (currentPanel: CalendarPanelType) => {\n _setCurrentPanel(currentPanel);\n onChangePanel?.(currentPanel);\n },\n [onChangePanel],\n );\n\n return {\n currentPanel,\n setCurrentPanel,\n };\n};\n","import { useMemo, useState } from \"react\";\nimport { useDateRangeOnClickDayHandler } from \"../../../../features/date-range/hooks/UseDateRangeOnClickDayHandler\";\nimport { DateRangeCalendarProps } from \"../DateRangeCalendar\";\nimport { CalendarWithMonthSwitcherProps } from \"../../../../features/month-switcher/CalendarWithMonthSwitcher\";\nimport { buildDayStateForDateRange } from \"../../../../util/calendar/StateModifier\";\nimport { useInternalPanelState } from \"../../../../features/internal-panel-state/UseInternalPanelState\";\n\nexport const useDateRangeSelection = <T>({\n focusedInput,\n value,\n onValueChange,\n setFocusedInput,\n statePerMonth,\n onChangePanel,\n initialDateInFocus,\n}: DateRangeCalendarProps<T>): CalendarWithMonthSwitcherProps<T> => {\n const { currentPanel, setCurrentPanel } =\n useInternalPanelState(onChangePanel);\n const [dateInFocus, setDateInFocus] = useState(\n () => initialDateInFocus ?? new Date(),\n );\n\n const onClickDay = useDateRangeOnClickDayHandler(\n value,\n onValueChange,\n focusedInput,\n setFocusedInput,\n );\n\n const statePerMonthWithSelection = useMemo(\n () =>\n buildDayStateForDateRange(\n statePerMonth,\n value?.startDate,\n value?.endDate,\n ),\n [statePerMonth, value?.endDate, value?.startDate],\n );\n\n return {\n onClickDay,\n statePerMonth: statePerMonthWithSelection,\n currentPanel,\n setCurrentPanel,\n setDateInFocus,\n dateInFocus,\n };\n};\n","import * as React from \"react\";\nimport { CalendarWithMonthSwitcher } from \"../../../features/month-switcher/CalendarWithMonthSwitcher\";\nimport { useDateRangeSelection } from \"./hooks/UseDateRangeSelection\";\nimport { InternalPanelAndFocusStateProps } from \"../../../types/InternalPanelAndFocusStateProps\";\nimport { ValueAndOnValueChangeProps } from \"@stenajs-webui/forms\";\nimport { DateRange } from \"../../../types/DateRange\";\n\nexport type DateRangeFocusedInput = \"startDate\" | \"endDate\" | undefined;\n\nexport interface DateRangeCalendarProps<T>\n extends InternalPanelAndFocusStateProps<T>,\n ValueAndOnValueChangeProps<DateRange> {\n focusedInput?: DateRangeFocusedInput;\n setFocusedInput: (focusedInput: DateRangeFocusedInput) => void;\n initialDateInFocus?: Date;\n}\n\nexport function DateRangeCalendar<T>(props: DateRangeCalendarProps<T>) {\n const dateRangeSelectionProps = useDateRangeSelection(props);\n return (\n <CalendarWithMonthSwitcher<T> {...props} {...dateRangeSelectionProps} />\n );\n}\n\nexport type DateRangeInputCalendarProps<T> = Omit<\n DateRangeCalendarProps<T>,\n | \"startDateInFocus\"\n | \"value\"\n | \"onValueChange\"\n | \"focusedInput\"\n | \"setFocusedInput\"\n | \"theme\"\n | \"currentPanel\"\n | \"setCurrentPanel\"\n>;\n","import { useState } from \"react\";\nimport { DateRangeFocusedInput } from \"../DateRangeCalendar\";\n\nexport const useDateRangeCalendarState = () => {\n const [startDate, setStartDate] = useState<Date | undefined>();\n const [endDate, setEndDate] = useState<Date | undefined>();\n const [focusedInput, setFocusedInput] =\n useState<DateRangeFocusedInput>(\"startDate\");\n return {\n startDate,\n setStartDate,\n endDate,\n setEndDate,\n focusedInput,\n setFocusedInput,\n };\n};\n","import { useCallback, useMemo, useState } from \"react\";\nimport { OnClickDay } from \"../../../types/CalendarTypes\";\nimport { addDayStateHighlights } from \"../../../util/calendar/StateModifier\";\nimport { SingleDateCalendarProps } from \"./SingleDateCalendar\";\nimport { CalendarWithMonthSwitcherProps } from \"../../../features/month-switcher/CalendarWithMonthSwitcher\";\nimport { useInternalPanelState } from \"../../../features/internal-panel-state/UseInternalPanelState\";\n\nexport const useSingleDateSelection = <T>({\n onChange,\n value,\n statePerMonth,\n onChangePanel,\n}: SingleDateCalendarProps<T>): CalendarWithMonthSwitcherProps<T> => {\n const { currentPanel, setCurrentPanel } =\n useInternalPanelState(onChangePanel);\n\n const [dateInFocus, setDateInFocus] = useState(() => value ?? new Date());\n\n const onClickDay: OnClickDay<T> = useCallback(\n (day) => {\n if (onChange) {\n onChange(day.date);\n }\n },\n [onChange],\n );\n\n const statePerMonthWithSelectedDate = useMemo(\n () =>\n value\n ? addDayStateHighlights(statePerMonth, value, [\n \"selected\",\n \"singleSelected\",\n ])\n : statePerMonth,\n [statePerMonth, value],\n );\n\n return {\n onClickDay,\n statePerMonth: statePerMonthWithSelectedDate,\n date: value,\n currentPanel,\n setCurrentPanel,\n dateInFocus,\n setDateInFocus,\n };\n};\n","import * as React from \"react\";\nimport { CalendarWithMonthSwitcher } from \"../../../features/month-switcher/CalendarWithMonthSwitcher\";\n\nimport { useSingleDateSelection } from \"./UseSingleDateSelection\";\nimport { InternalPanelAndFocusStateProps } from \"../../../types/InternalPanelAndFocusStateProps\";\n\nexport interface SingleDateCalendarProps<T>\n extends InternalPanelAndFocusStateProps<T> {\n value: Date | undefined;\n onChange: (value: Date | undefined) => void;\n}\n\nexport function SingleDateCalendar<T>(props: SingleDateCalendarProps<T>) {\n const singleDateSelectionProps = useSingleDateSelection(props);\n return (\n <CalendarWithMonthSwitcher<T> {...props} {...singleDateSelectionProps} />\n );\n}\n","import { isSameDay } from \"date-fns\";\nimport { useCallback, useMemo, useState } from \"react\";\nimport { OnClickDay } from \"../../../types/CalendarTypes\";\nimport { addDayStateHighlights } from \"../../../util/calendar/StateModifier\";\nimport { MultiDateCalendarProps } from \"./MultiDateCalendar\";\nimport { CalendarWithMonthSwitcherProps } from \"../../../features/month-switcher/CalendarWithMonthSwitcher\";\nimport { useInternalPanelState } from \"../../../features/internal-panel-state/UseInternalPanelState\";\n\nexport const useMultiDateSelection = <T>({\n onChange,\n value,\n statePerMonth,\n onChangePanel,\n initialDateInFocus,\n}: MultiDateCalendarProps<T>): CalendarWithMonthSwitcherProps<T> => {\n const { currentPanel, setCurrentPanel } =\n useInternalPanelState(onChangePanel);\n const [dateInFocus, setDateInFocus] = useState(\n initialDateInFocus ?? new Date(),\n );\n\n const onClickDay: OnClickDay<T> = useCallback(\n (day) => {\n if (!onChange) {\n return;\n }\n const isSelected = value && value.find((d) => isSameDay(d, day.date));\n if (value && isSelected) {\n onChange(value.filter((v) => !isSameDay(v, day.date)));\n } else {\n onChange([...(value || []), day.date]);\n }\n },\n [onChange, value],\n );\n const statePerMonthWithSelectedDate = useMemo(() => {\n if (!value) {\n return statePerMonth;\n }\n return value.reduce(\n (stateSum, date) => addDayStateHighlights(stateSum, date, [\"selected\"]),\n statePerMonth,\n );\n }, [statePerMonth, value]);\n\n return {\n onClickDay,\n statePerMonth: statePerMonthWithSelectedDate,\n currentPanel,\n setCurrentPanel,\n dateInFocus,\n setDateInFocus,\n };\n};\n","import * as React from \"react\";\nimport { CalendarWithMonthSwitcher } from \"../../../features/month-switcher/CalendarWithMonthSwitcher\";\nimport { useMultiDateSelection } from \"./UseMultiDateSelection\";\nimport { UseInternalPanelStateProps } from \"../../../features/internal-panel-state/UseInternalPanelState\";\nimport { InternalPanelAndFocusStateProps } from \"../../../types/InternalPanelAndFocusStateProps\";\n\nexport interface MultiDateCalendarProps<T>\n extends InternalPanelAndFocusStateProps<T>,\n UseInternalPanelStateProps {\n initialDateInFocus?: Date;\n value?: Array<Date>;\n onChange?: (value: Array<Date>) => void;\n}\n\nexport function MultiDateCalendar<T>(props: MultiDateCalendarProps<T>) {\n const selectionProps = useMultiDateSelection(props);\n return <CalendarWithMonthSwitcher<T> {...props} {...selectionProps} />;\n}\n","import { Locale, setWeek, startOfWeek } from \"date-fns\";\nimport { enGB } from \"date-fns/locale\";\nimport { useCallback, useMemo, useState } from \"react\";\nimport { useInternalPanelState } from \"../../../features/internal-panel-state/UseInternalPanelState\";\nimport { CalendarWithMonthSwitcherProps } from \"../../../features/month-switcher/CalendarWithMonthSwitcher\";\nimport { OnClickDay, OnClickWeek } from \"../../../types/CalendarTypes\";\nimport {\n getWeekForDate,\n WeekData,\n} from \"../../../util/calendar/CalendarDataFactory\";\nimport { addWeekRangeHighlights } from \"../../../util/calendar/StateModifier\";\nimport { SingleWeekCalendarProps } from \"./SingleWeekCalendar\";\n\nexport const useSingleWeekSelection = <T>({\n onChange,\n value,\n statePerMonth,\n onChangePanel,\n locale = enGB,\n}: SingleWeekCalendarProps<T>): CalendarWithMonthSwitcherProps<T> => {\n const [dateInFocus, setDateInFocus] = useState(() => {\n const week = getWeekDataFromWeekString(value, locale);\n if (!week) {\n return new Date();\n }\n return week.days[0].date;\n });\n const { currentPanel, setCurrentPanel } =\n useInternalPanelState(onChangePanel);\n\n const onClickDay = useCallback<OnClickDay<T>>(\n (day) => {\n if (onChange) {\n onChange(getWeekStringFromWeekData(getWeekForDate(day.date, locale)));\n }\n },\n [locale, onChange],\n );\n const onClickWeek = useCallback<OnClickWeek>(\n (week) => {\n if (onChange) {\n onChange(getWeekStringFromWeekData(week));\n }\n },\n [onChange],\n );\n\n const statePerMonthWithSelection = useMemo(() => {\n const weekData = getWeekDataFromWeekString(value, locale);\n return weekData\n ? addWeekRangeHighlights(statePerMonth, weekData)\n : statePerMonth;\n }, [value, locale, statePerMonth]);\n\n const date = useMemo(() => {\n const week = getWeekDataFromWeekString(value, locale);\n if (!week) {\n return new Date();\n }\n return week.days[0].date;\n }, [locale, value]);\n\n return {\n statePerMonth: statePerMonthWithSelection,\n date,\n dateInFocus,\n setDateInFocus,\n onClickDay,\n onClickWeek,\n currentPanel,\n setCurrentPanel,\n };\n};\n\nconst getWeekStringFromWeekData = (\n week: WeekData | undefined,\n): string | undefined => {\n if (!week) {\n return undefined;\n }\n return `${week.endYear}-${week.weekNumber}`;\n};\n\nconst getWeekDataFromWeekString = (\n week: string | undefined,\n locale: Locale,\n): WeekData | undefined => {\n if (!week) {\n return undefined;\n }\n const parts = week.split(\"-\");\n const weekNumber = parseInt(parts[1], 10);\n const year = parseInt(parts[0], 10);\n const date = new Date();\n date.setFullYear(year);\n const firstDateOfWeek = startOfWeek(setWeek(date, weekNumber), { locale });\n return getWeekForDate(firstDateOfWeek, locale);\n};\n","import * as React from \"react\";\nimport { CalendarWithMonthSwitcher } from \"../../../features/month-switcher/CalendarWithMonthSwitcher\";\nimport { useSingleWeekSelection } from \"./UseSingleWeekSelection\";\nimport { InternalPanelAndFocusStateProps } from \"../../../types/InternalPanelAndFocusStateProps\";\n\nexport type SingleWeekValue = string;\n\nexport interface SingleWeekCalendarProps<T>\n extends InternalPanelAndFocusStateProps<T> {\n value: SingleWeekValue | undefined;\n onChange: (value: SingleWeekValue | undefined) => void;\n}\n\nexport function SingleWeekCalendar<T>(props: SingleWeekCalendarProps<T>) {\n const singleWeekSelectionProps = useSingleWeekSelection(props);\n return (\n <CalendarWithMonthSwitcher<T> {...props} {...singleWeekSelectionProps} />\n );\n}\n","export const defaultPopoverPlacement = \"bottom\";\n","import { useCallback, useState } from \"react\";\n\nexport const useDateInput = (\n onChange?: (date: Date | undefined) => void,\n onClose?: () => void,\n openOnMount?: boolean,\n) => {\n const [showingCalendar, setShowingCalendar] = useState(openOnMount || false);\n\n const showCalendar = useCallback(() => {\n setShowingCalendar(true);\n return true;\n }, [setShowingCalendar]);\n\n const hideCalendar = useCallback(() => {\n setShowingCalendar(false);\n if (onClose) {\n onClose();\n }\n }, [setShowingCalendar, onClose]);\n\n const onSelectDate = useCallback(\n (date: Date | undefined) => {\n if (onChange) {\n onChange(date);\n }\n setTimeout(hideCalendar, 150);\n },\n [onChange, hideCalendar],\n );\n\n return {\n showCalendar,\n hideCalendar,\n showingCalendar,\n onSelectDate,\n };\n};\n","export const defaultMaxDate = \"2999-12-31\";\n","import { Box } from \"@stenajs-webui/core\";\nimport { stenaCalendar, TextInputButton } from \"@stenajs-webui/elements\";\nimport { TextInput, TextInputProps } from \"@stenajs-webui/forms\";\nimport { ControlledPopover } from \"@stenajs-webui/tooltip\";\nimport { format } from \"date-fns\";\nimport * as React from \"react\";\nimport { defaultPopoverPlacement } from \"../../../config/DefaultPopoverPlacement\";\nimport { DateFormats } from \"../../../util/date/DateFormats\";\nimport { SingleDateCalendar } from \"../../calendar-types/single-date-calendar/SingleDateCalendar\";\nimport {\n CalendarTheme,\n defaultCalendarTheme,\n} from \"../../calendar/CalendarTheme\";\nimport { DateTextInputCalendarProps } from \"../date-text-input/DateTextInput\";\nimport { useDateInput } from \"./UseDateInput\";\nimport { OptionalMinMaxDatesAsString } from \"../../../types/CalendarTypes\";\nimport { defaultMaxDate } from \"../../../config/DefaultMaxDate\";\n\nexport interface DateInputProps<T = unknown>\n extends OptionalMinMaxDatesAsString {\n /** The current value */\n value?: Date;\n /** onChange handler for when the user selects a date. */\n onChange?: (date: Date | undefined) => void;\n /** Variant of the input field. */\n variant?: TextInputProps[\"variant\"];\n /** If true, calendar will be open when component mounts. */\n openOnMount?: boolean;\n /** Is invoked when user closes the calendar popup. */\n onClose?: () => void;\n /**\n * The date format in the input field. See date-fns docs.\n * @default YYYY-MM-dd\n */\n displayFormat?: string;\n /**\n * Placeholder when no date has been selected.\n * @default Enter date\n */\n placeholder?: string;\n /**\n * Portal target, HTML element. If not set, window.body is used.\n */\n portalTarget?: HTMLElement;\n zIndex?: number;\n width?: string;\n /**\n * The calendar theme to use.\n */\n calendarTheme?: CalendarTheme;\n /** Props to be passed to Calendar, see SingleDateCalendar. */\n calendarProps?: DateTextInputCalendarProps<T>;\n /**\n * Disables the TextInput, Calendar and Popover.\n */\n disabled?: boolean;\n}\n\nexport const DateInput: React.FC<DateInputProps> = ({\n displayFormat = DateFormats.fullDate,\n placeholder = \"Enter date\",\n value,\n calendarTheme = defaultCalendarTheme,\n calendarProps,\n openOnMount,\n onClose,\n onChange,\n variant,\n width,\n minDate,\n maxDate = defaultMaxDate,\n disabled,\n portalTarget,\n zIndex,\n}) => {\n const { hideCalendar, showingCalendar, onSelectDate, showCalendar } =\n useDateInput(onChange, onClose, openOnMount);\n\n return (\n <Box width={width}>\n <ControlledPopover\n hideArrow\n restoreFocus={false}\n returnFocus={false}\n open={showingCalendar}\n onRequestClose={hideCalendar}\n appendTo={portalTarget}\n zIndex={zIndex}\n renderTrigger={(props) => (\n <Box {...props}>\n <TextInput\n type={\"date\"}\n onFocus={showCalendar}\n buttonRight={\n <TextInputButton onClick={showCalendar} icon={stenaCalendar} />\n }\n value={value ? format(value, displayFormat) : \"\"}\n placeholder={placeholder}\n size={9}\n disabled={disabled}\n autoFocus={openOnMount}\n variant={variant}\n min={minDate}\n max={maxDate}\n />\n </Box>\n )}\n placement={defaultPopoverPlacement}\n >\n <SingleDateCalendar\n {...calendarProps}\n onChange={onSelectDate}\n value={value}\n theme={calendarTheme}\n minDate={minDate}\n maxDate={maxDate}\n />\n </ControlledPopover>\n </Box>\n );\n};\n","import { useCallback, useMemo, useRef, useState } from \"react\";\nimport { DateRangeFocusedInput } from \"../../../calendar-types/date-range-calendar/DateRangeCalendar\";\nimport { DayData } from \"../../../../util/calendar/CalendarDataFactory\";\nimport { isAfter } from \"date-fns\";\nimport { DateRange } from \"../../../../types/DateRange\";\n\nexport const useDateRangeInput = (\n value: DateRange | undefined,\n onValueChange: ((dateRange: DateRange) => void) | undefined,\n) => {\n const startDateInputRef = useRef<HTMLInputElement>(null);\n const endDateInputRef = useRef<HTMLInputElement>(null);\n\n const [showingCalendar, setShowingCalendar] = useState(false);\n const [focusedInput, setFocusedInput] = useState<\n DateRangeFocusedInput | undefined\n >(undefined);\n\n const showCalendarStartDate = useCallback(() => {\n setFocusedInput(\"startDate\");\n setShowingCalendar(true);\n return true;\n }, [setFocusedInput, setShowingCalendar]);\n\n const showCalendarEndDate = useCallback(() => {\n setFocusedInput(\"endDate\");\n setShowingCalendar(true);\n return true;\n }, [setFocusedInput, setShowingCalendar]);\n\n const hideCalendar = useCallback(() => {\n setShowingCalendar(false);\n }, [setShowingCalendar]);\n\n const onClickDay = useCallback(\n (day: DayData) => {\n if (focusedInput === \"startDate\") {\n onValueChange?.({\n startDate: day.date,\n endDate: value?.endDate,\n });\n if (!value?.endDate) {\n setFocusedInput(\"endDate\");\n endDateInputRef.current?.focus();\n } else {\n setTimeout(hideCalendar, 150);\n }\n } else if (focusedInput === \"endDate\") {\n onValueChange?.({\n startDate: value?.startDate,\n endDate: day.date,\n });\n if (!value?.startDate) {\n setFocusedInput(\"startDate\");\n startDateInputRef.current?.focus();\n } else {\n setTimeout(hideCalendar, 150);\n }\n }\n },\n [focusedInput, onValueChange, setFocusedInput, hideCalendar, value],\n );\n\n const startDateIsAfterEnd = useMemo(\n () =>\n value?.startDate &&\n value?.endDate &&\n isAfter(value.startDate, value.endDate),\n [value?.startDate, value?.endDate],\n );\n\n return {\n showingCalendar,\n hideCalendar,\n showCalendarEndDate,\n showCalendarStartDate,\n focusedInput,\n setFocusedInput,\n startDateInputRef,\n endDateInputRef,\n onClickDay,\n startDateIsAfterEnd,\n };\n};\n","import { Row, Space } from \"@stenajs-webui/core\";\nimport { TextInput, ValueAndOnValueChangeProps } from \"@stenajs-webui/forms\";\nimport { format } from \"date-fns\";\nimport * as React from \"react\";\nimport { useMemo, useState } from \"react\";\nimport { cssColor } from \"@stenajs-webui/theme\";\nimport { defaultPopoverPlacement } from \"../../../config/DefaultPopoverPlacement\";\nimport { DateFormats } from \"../../../util/date/DateFormats\";\nimport { DateRangeInputCalendarProps } from \"../../calendar-types/date-range-calendar/DateRangeCalendar\";\nimport {\n CalendarTheme,\n defaultCalendarTheme,\n} from \"../../calendar/CalendarTheme\";\nimport { useDateRangeInput } from \"./hooks/UseDateRangeInput\";\nimport {\n Icon,\n stenaArrowWideRight,\n stenaCalendar,\n} from \"@stenajs-webui/elements\";\nimport { CalendarWithMonthSwitcher } from \"../../../features/month-switcher/CalendarWithMonthSwitcher\";\nimport { CalendarPanelType } from \"../../../features/calendar-with-month-year-pickers/CalendarPanelType\";\nimport { ControlledPopover } from \"@stenajs-webui/tooltip\";\nimport { buildDayStateForDateRange } from \"../../../util/calendar/StateModifier\";\nimport { OptionalMinMaxDatesAsString } from \"../../../types/CalendarTypes\";\nimport { DateRange } from \"../../../types/DateRange\";\nimport { defaultMaxDate } from \"../../../config/DefaultMaxDate\";\n\nexport interface DateRangeInputProps<T>\n extends OptionalMinMaxDatesAsString,\n ValueAndOnValueChangeProps<DateRange> {\n /**\n * The date format in the input field. See date-fns docs.\n * @default YYYY-MM-dd\n */\n displayFormat?: string;\n\n /**\n * Placeholder for start date field when no date has been selected.\n * @default Start date\n */\n placeholderStartDate?: string;\n\n /**\n * Placeholder for end date field when no date has been selected.\n * @default End date\n */\n placeholderEndDate?: string;\n\n /**\n * Width of the input element.\n * * @default 125px\n */\n width?: string;\n\n /**\n * The calendar theme to use.\n */\n calendarTheme?: CalendarTheme;\n\n /** Props to be passed to DateRangeCalendar, see DateRangeCalendar. */\n calendarProps?: DateRangeInputCalendarProps<T>;\n\n /**\n * Disables the Popover and both TextInputs.\n */\n disabled?: boolean;\n\n /**\n * Portal target, HTML element. If not set, window.body is used.\n */\n portalTarget?: HTMLElement;\n zIndex?: number;\n}\n\n/**\n * @deprecated Please use DateRangeDualTextInput instead.\n */\nexport function DateRangeInput<T>({\n displayFormat = DateFormats.fullDate,\n placeholderStartDate = \"Start date\",\n placeholderEndDate = \"End date\",\n value,\n onValueChange,\n width,\n calendarTheme = defaultCalendarTheme,\n calendarProps,\n minDate,\n maxDate = defaultMaxDate,\n disabled,\n portalTarget,\n zIndex,\n}: DateRangeInputProps<T>): React.ReactElement<DateRangeInputProps<T>> {\n const [currentPanel, setCurrentPanel] =\n useState<CalendarPanelType>(\"calendar\");\n\n const {\n hideCalendar,\n showCalendarEndDate,\n showCalendarStartDate,\n showingCalendar,\n focusedInput,\n startDateInputRef,\n endDateInputRef,\n onClickDay,\n startDateIsAfterEnd,\n } = useDateRangeInput(value, onValueChange);\n\n const [dateInFocus, setDateInFocus] = useState(\n () => (focusedInput && value?.[focusedInput]) ?? new Date(),\n );\n const statePerMonth = useMemo(\n () =>\n buildDayStateForDateRange(undefined, value?.startDate, value?.endDate),\n [value],\n );\n\n return (\n <ControlledPopover\n hideArrow\n restoreFocus={false}\n returnFocus={false}\n appendTo={portalTarget}\n zIndex={zIndex}\n renderTrigger={(props) => (\n <Row alignItems={\"center\"} {...props}>\n <TextInput\n iconLeft={stenaCalendar}\n onFocus={showCalendarStartDate}\n value={\n value?.startDate ? format(value.startDate, displayFormat) : \"\"\n }\n placeholder={placeholderStartDate}\n width={width}\n disabled={disabled}\n inputRef={startDateInputRef}\n size={9}\n variant={startDateIsAfterEnd ? \"error\" : undefined}\n />\n <Space />\n <Icon\n icon={stenaArrowWideRight}\n color={cssColor(\"--lhds-color-ui-500\")}\n size={14}\n />\n <Space />\n <TextInput\n iconLeft={stenaCalendar}\n onFocus={showCalendarEndDate}\n value={value?.endDate ? format(value.endDate, displayFormat) : \"\"}\n placeholder={placeholderEndDate}\n width={width}\n disabled={disabled}\n inputRef={endDateInputRef}\n size={9}\n variant={startDateIsAfterEnd ? \"error\" : undefined}\n />\n </Row>\n )}\n open={showingCalendar}\n placement={defaultPopoverPlacement}\n onRequestClose={hideCalendar}\n >\n <CalendarWithMonthSwitcher\n {...calendarProps}\n dateInFocus={dateInFocus}\n setDateInFocus={setDateInFocus}\n statePerMonth={statePerMonth}\n theme={calendarTheme}\n onClickDay={onClickDay}\n currentPanel={currentPanel}\n setCurrentPanel={setCurrentPanel}\n minDate={minDate}\n maxDate={maxDate}\n />\n </ControlledPopover>\n );\n}\n","import { Box, Omit, Row } from \"@stenajs-webui/core\";\nimport { FlatButton, stenaCalendar } from \"@stenajs-webui/elements\";\nimport { TextInput, TextInputProps } from \"@stenajs-webui/forms\";\nimport { ControlledPopover } from \"@stenajs-webui/tooltip\";\nimport { format, isValid, parse } from \"date-fns\";\nimport * as React from \"react\";\nimport { RefObject, useCallback, useState } from \"react\";\nimport { defaultPopoverPlacement } from \"../../../config/DefaultPopoverPlacement\";\nimport { DateFormats } from \"../../../util/date/DateFormats\";\nimport {\n SingleDateCalendar,\n SingleDateCalendarProps,\n} from \"../../calendar-types/single-date-calendar/SingleDateCalendar\";\nimport {\n CalendarTheme,\n defaultCalendarTheme,\n} from \"../../calendar/CalendarTheme\";\nimport { OptionalMinMaxDatesAsString } from \"../../../types/CalendarTypes\";\nimport { defaultMaxDate } from \"../../../config/DefaultMaxDate\";\n\nexport type DateTextInputCalendarProps<T> = Omit<\n SingleDateCalendarProps<T>,\n \"value\" | \"onChange\" | \"theme\"\n>;\n\nexport interface DateTextInputProps<T>\n extends Omit<TextInputProps, \"onChange\" | \"theme\" | \"min\" | \"max\">,\n OptionalMinMaxDatesAsString {\n /** Props to be passed to Calendar, see SingleDateCalendar. */\n calendarProps?: DateTextInputCalendarProps<T>;\n /** Close calendar when date is selected, @default true */\n closeOnCalendarSelectDate?: boolean;\n /** Valid date format, @default YYYY-MM-DD */\n dateFormat?: string;\n /** Make the icon not clickable, @default false */\n disableCalender?: boolean;\n /** Show or hide the calender icon, @default false */\n hideCalenderIcon?: boolean;\n /** Placeholder for the input, @default YYYY-MM-DD */\n placeholder?: string;\n /** The date text input theme to use. */\n calendarTheme?: CalendarTheme;\n /**\n * Portal target for the popover, HTML element. If not set, window.body is used.\n */\n portalTarget?: HTMLElement;\n zIndex?: number;\n}\n\nexport const DateTextInput: React.FC<DateTextInputProps<unknown>> = ({\n calendarProps,\n closeOnCalendarSelectDate = true,\n dateFormat = DateFormats.fullDate,\n disableCalender = false,\n onValueChange,\n placeholder = \"yyyy-mm-dd\",\n value,\n width = \"130px\",\n calendarTheme = defaultCalendarTheme,\n hideCalenderIcon = false,\n minDate,\n maxDate = defaultMaxDate,\n variant,\n portalTarget,\n zIndex,\n ...props\n}) => {\n const [open, setOpen] = useState(false);\n\n const toggleCalendar = useCallback(() => {\n setOpen(!open);\n }, [setOpen, open]);\n\n const hideCalendar = useCallback(() => {\n setOpen(false);\n }, [setOpen]);\n\n const onValueChangeHandler = useCallback(\n (value: string) => {\n if (onValueChange) {\n onValueChange(value);\n }\n },\n [onValueChange],\n );\n\n const onCalendarSelectDate = useCallback(\n (date: Date | undefined) => {\n if (date) {\n onValueChangeHandler(format(date, dateFormat));\n if (closeOnCalendarSelectDate) {\n setTimeout(() => setOpen(!open), 200);\n }\n }\n },\n [\n onValueChangeHandler,\n dateFormat,\n closeOnCalendarSelectDate,\n setOpen,\n open,\n ],\n );\n\n const inValidInput = !!value && !/^[-/\\\\.0-9]+$/.test(value);\n\n const dateIsValid = !!value && isValid(parse(value, dateFormat, new Date()));\n\n const userInputCorrectLength = !!value && value.length >= dateFormat.length;\n\n const invalid: boolean =\n (userInputCorrectLength && !dateIsValid) || inValidInput;\n\n return (\n <Box width={width}>\n <ControlledPopover\n appendTo={portalTarget}\n zIndex={zIndex}\n renderTrigger={({ ref, ...popoverProps }) => (\n <TextInput\n {...props}\n variant={invalid ? \"error\" : variant}\n disableContentPaddingRight\n contentRight={\n !hideCalenderIcon ? (\n <Row alignItems={\"center\"} indent={0.5}>\n <FlatButton\n size={\"small\"}\n disabled={props.disabled || disableCalender}\n leftIcon={stenaCalendar}\n onClick={toggleCalendar}\n />\n </Row>\n ) : undefined\n }\n onValueChange={onValueChangeHandler}\n placeholder={placeholder}\n value={value || \"\"}\n min={minDate}\n max={maxDate}\n size={10}\n inputRef={ref as RefObject<HTMLInputElement>}\n {...popoverProps}\n />\n )}\n hideArrow\n open={open}\n placement={defaultPopoverPlacement}\n onRequestClose={hideCalendar}\n >\n <SingleDateCalendar\n {...calendarProps}\n onChange={onCalendarSelectDate}\n value={\n value && dateIsValid\n ? parse(value, dateFormat, new Date())\n : undefined\n }\n minDate={minDate}\n maxDate={maxDate}\n theme={calendarTheme}\n />\n </ControlledPopover>\n </Box>\n );\n};\n","export interface FormatTimeStringResult {\n time: string;\n success: boolean;\n}\n\nexport const formatHours = (hours: string): string => {\n if (hours === \"\") {\n return \"00\";\n }\n\n const h = parseInt(hours, 10);\n\n if (isNaN(h)) {\n throw new Error(\"Hours is not a number\");\n }\n\n if (h < 0 || h > 23) {\n throw new Error(\"Hours is an invalid number\");\n }\n\n switch (hours.length) {\n case 1:\n return `0${h}`;\n case 2:\n return hours;\n default:\n throw new Error(\"Invalid hour string\");\n }\n};\n\nexport const formatMinutes = (minutes: string): string => {\n if (minutes === \"\") {\n return \"00\";\n }\n\n const m = parseInt(minutes, 10);\n\n if (isNaN(m)) {\n throw new Error(\"Minutes is not a number\");\n }\n\n if (m < 0 || m > 59) {\n throw new Error(\"Minutes is an invalid number\");\n }\n\n switch (minutes.length) {\n case 1:\n return `0${m}`;\n case 2:\n return minutes;\n default:\n throw new Error(\"Invalid minute string\");\n }\n};\n\nexport const formatTimeString = (time: string): FormatTimeStringResult => {\n if (!validUserInput(time)) {\n return { time, success: false };\n }\n\n const arr = time && time.split(/-|:|,|;|[/]|[.]| /); // consider all these chars as user input separator\n if (arr && arr.length === 2) {\n try {\n const hours = formatHours(arr[0]);\n const minutes = formatMinutes(arr[1]);\n return { time: `${hours}:${minutes}`, success: true };\n } catch {\n return { time, success: false };\n }\n } else if (arr && arr.length === 1) {\n let hours = 0;\n let minutes = 0;\n switch (time.length) {\n case 1:\n return { time: `0${time}:00`, success: true };\n case 2: {\n const timeNumber = parseInt(arr[0], 10);\n if (timeNumber >= 0 && timeNumber < 24) {\n return { time: `${time}:00`, success: true };\n } else if (timeNumber >= 24 && timeNumber < 59) {\n return { time: `00:${time}`, success: true };\n }\n return { time, success: false };\n }\n case 3:\n minutes = parseInt(time.substring(1, 3), 10);\n if (minutes >= 0 && minutes <= 59) {\n return {\n time: `0${time.substring(0, 1)}:${time.substring(1, 3)}`,\n success: true,\n };\n }\n return { time, success: false };\n case 4:\n hours = parseInt(time.substring(0, 2), 10);\n minutes = parseInt(time.substring(2, 4), 10);\n if (hours < 0 || hours > 23) {\n return { time, success: false };\n }\n if (minutes < 0 || minutes > 59) {\n return { time, success: false };\n }\n return {\n time: `${time.substring(0, 2)}:${time.substring(2, 4)}`,\n success: true,\n };\n default:\n return { time, success: false };\n }\n }\n\n return { time, success: false };\n};\n\nexport const validUserInput = (input: string | undefined): boolean => {\n if (input) {\n return /^[-:.,/; 0-9]+$/.test(input);\n }\n\n return true;\n};\n","import { Omit } from \"@stenajs-webui/core\";\nimport { TextInput, TextInputProps } from \"@stenajs-webui/forms\";\nimport * as React from \"react\";\nimport { ChangeEventHandler, useCallback, useState } from \"react\";\nimport {\n formatTimeString,\n validUserInput,\n} from \"../../../util/time/TimeStringFormatValidator\";\n\nimport { stenaClock } from \"@stenajs-webui/elements\";\n\nexport interface TimeTextInputProps extends Omit<TextInputProps, \"onChange\"> {\n /** Show placeholder when true */\n showPlaceholder?: boolean;\n /** Show icon when true */\n useIcon?: boolean;\n /** Variant of the input field. */\n variant?: TextInputProps[\"variant\"];\n}\n\n/**\n * @deprecated\n */\nexport const TimeTextInput: React.FC<TimeTextInputProps> = ({\n onValueChange,\n showPlaceholder = true,\n useIcon = true,\n value,\n width = \"85px\",\n variant,\n ...props\n}) => {\n const [valid, setValid] = useState(() => validUserInput(value));\n\n const timeFormat = \"hh:mm\";\n\n const onBlur = useCallback(() => {\n if (value) {\n const formattedResult = formatTimeString(value);\n setValid(formattedResult.success);\n if (formattedResult.success) {\n if (onValueChange) {\n onValueChange(formattedResult.time);\n }\n }\n }\n }, [value, onValueChange, setValid]);\n\n const onChangeHandler = useCallback<ChangeEventHandler<HTMLInputElement>>(\n (ev) => {\n const time = ev.target.value;\n const validInput = validUserInput(time);\n\n setValid(validInput && time.length <= timeFormat.length);\n\n if (onValueChange) {\n onValueChange(time);\n }\n },\n [onValueChange, setValid],\n );\n\n return (\n <TextInput\n {...props}\n type={\"time\"}\n variant={!valid ? \"error\" : variant}\n iconLeft={useIcon ? stenaClock : undefined}\n value={value}\n placeholder={showPlaceholder ? timeFormat : undefined}\n onChange={onChangeHandler}\n onBlur={onBlur}\n width={width}\n />\n );\n};\n","import { IconDefinition } from \"@fortawesome/fontawesome-svg-core\";\nimport {\n Box,\n BoxProps,\n ButtonElementProps,\n Indent,\n Row,\n SeparatorLine,\n} from \"@stenajs-webui/core\";\nimport {\n FlatButton,\n Icon,\n stenaCalendar,\n stenaAngleDown,\n} from \"@stenajs-webui/elements\";\nimport {\n TextInput,\n TextInputBox,\n TextInputBoxProps,\n TextInputProps,\n} from \"@stenajs-webui/forms\";\nimport { debounce } from \"lodash-es\";\nimport * as React from \"react\";\nimport { FocusEventHandler, useCallback, useMemo, useRef } from \"react\";\nimport { cssColor } from \"@stenajs-webui/theme\";\n\nexport interface DualTextInputProps {\n onEsc?: TextInputProps[\"onEsc\"];\n onEnter?: TextInputProps[\"onEnter\"];\n widthLeft?: BoxProps[\"width\"];\n widthRight?: BoxProps[\"width\"];\n valueLeft?: TextInputProps[\"value\"];\n valueRight?: TextInputProps[\"value\"];\n minLeft?: string;\n maxLeft?: string;\n minRight?: string;\n maxRight?: string;\n typeLeft?: TextInputProps[\"type\"];\n typeRight?: TextInputProps[\"type\"];\n separatorIcon?: IconDefinition;\n placeholderLeft?: TextInputProps[\"placeholder\"];\n placeholderRight?: TextInputProps[\"placeholder\"];\n onValueChangeLeft?: TextInputProps[\"onValueChange\"];\n onValueChangeRight?: TextInputProps[\"onValueChange\"];\n onChangeLeft?: TextInputProps[\"onChange\"];\n onChangeRight?: TextInputProps[\"onChange\"];\n onClickLeft?: TextInputProps[\"onClick\"];\n onClickRight?: TextInputProps[\"onClick\"];\n onClickCalendar?: ButtonElementProps[\"onClick\"];\n onClickArrowDown?: ButtonElementProps[\"onClick\"];\n onFocusLeft?: TextInputProps[\"onFocus\"];\n onFocusRight?: TextInputProps[\"onFocus\"];\n onBlur?: () => void;\n onBlurLeft?: TextInputProps[\"onBlur\"];\n onBlurRight?: TextInputProps[\"onBlur\"];\n inputRefLeft?: TextInputProps[\"inputRef\"];\n inputRefRight?: TextInputProps[\"inputRef\"];\n variantLeft?: TextInputProps[\"variant\"];\n variantRight?: TextInputProps[\"variant\"];\n variant?: TextInputBoxProps[\"variant\"];\n showPresets?: false;\n autoFocusLeft?: boolean;\n autoFocusRight?: boolean;\n disabled?: boolean;\n}\n\nexport const DualTextInput: React.FC<DualTextInputProps> = ({\n autoFocusLeft,\n autoFocusRight,\n onEsc,\n onEnter,\n onValueChangeLeft,\n onValueChangeRight,\n separatorIcon,\n placeholderLeft,\n placeholderRight,\n typeLeft,\n typeRight,\n onChangeLeft,\n onChangeRight,\n valueLeft,\n valueRight,\n minLeft,\n maxLeft,\n minRight,\n maxRight,\n onClickLeft,\n onClickRight,\n onClickCalendar,\n onClickArrowDown,\n onBlurLeft,\n onBlurRight,\n onFocusLeft,\n onFocusRight,\n inputRefLeft,\n inputRefRight,\n variant,\n variantLeft,\n variantRight,\n onBlur,\n showPresets,\n widthLeft,\n widthRight,\n disabled,\n}) => {\n const focusCounter = useRef(0);\n\n const tryTriggerOnBlur = useMemo(\n () =>\n debounce((focusCounter: number) => {\n if (focusCounter === 0) {\n onBlur?.();\n }\n }, 10),\n [onBlur],\n );\n\n const focusLeftHandler = useCallback<FocusEventHandler<HTMLInputElement>>(\n (ev) => {\n focusCounter.current++;\n tryTriggerOnBlur(focusCounter.current);\n if (onFocusLeft) {\n onFocusLeft(ev);\n }\n },\n [onFocusLeft, focusCounter, tryTriggerOnBlur],\n );\n\n const focusRightHandler = useCallback<FocusEventHandler<HTMLInputElement>>(\n (ev) => {\n focusCounter.current++;\n tryTriggerOnBlur(focusCounter.current);\n if (onFocusRight) {\n onFocusRight(ev);\n }\n },\n [onFocusRight, focusCounter, tryTriggerOnBlur],\n );\n\n const blurLeftHandler = useCallback<FocusEventHandler<HTMLInputElement>>(\n (ev) => {\n focusCounter.current--;\n tryTriggerOnBlur(focusCounter.current);\n if (onBlurLeft) {\n onBlurLeft(ev);\n }\n },\n [onBlurLeft, focusCounter, tryTriggerOnBlur],\n );\n\n const blurRightHandler = useCallback<FocusEventHandler<HTMLInputElement>>(\n (ev) => {\n focusCounter.current--;\n tryTriggerOnBlur(focusCounter.current);\n if (onBlurRight) {\n onBlurRight(ev);\n }\n },\n [onBlurRight, focusCounter, tryTriggerOnBlur],\n );\n\n return (\n <Box>\n <TextInputBox\n disableContentPaddingRight\n disabled={disabled}\n variant={variant}\n contentRight={\n <Row alignItems={\"center\"}>\n <Indent num={0.5}>\n <FlatButton\n leftIcon={stenaCalendar}\n onClick={onClickCalendar}\n disabled={disabled}\n size={\"small\"}\n />\n </Indent>\n\n {showPresets ? (\n <>\n <Row height={\"22px\"}>\n <SeparatorLine vertical />\n </Row>\n\n <Indent num={0.5}>\n <FlatButton\n leftIcon={stenaAngleDown}\n onClick={onClickArrowDown}\n disabled={disabled}\n size={\"small\"}\n />\n </Indent>\n </>\n ) : null}\n </Row>\n }\n >\n <Box width={widthLeft}>\n <TextInput\n onEsc={onEsc}\n onEnter={onEnter}\n onClick={onClickLeft}\n disabled={disabled}\n hideBorder\n placeholder={placeholderLeft}\n value={valueLeft}\n onValueChange={onValueChangeLeft}\n onChange={onChangeLeft}\n onBlur={blurLeftHandler}\n onFocus={focusLeftHandler}\n inputRef={inputRefLeft}\n variant={variantLeft}\n type={typeLeft}\n autoFocus={autoFocusLeft}\n min={minLeft}\n max={maxLeft}\n />\n </Box>\n <Row indent={0.5} alignItems={\"center\"} justifyContent={\"center\"}>\n <Icon\n icon={separatorIcon}\n size={12}\n color={cssColor(\"--lhds-color-ui-500\")}\n />\n </Row>\n <Box width={widthRight}>\n <TextInput\n onEsc={onEsc}\n onEnter={onEnter}\n onClick={onClickRight}\n disabled={disabled}\n hideBorder\n placeholder={placeholderRight}\n value={valueRight}\n onValueChange={onValueChangeRight}\n onChange={onChangeRight}\n onBlur={blurRightHandler}\n onFocus={focusRightHandler}\n inputRef={inputRefRight}\n variant={variantRight}\n type={typeRight}\n autoFocus={autoFocusRight}\n min={minRight}\n max={maxRight}\n />\n </Box>\n </TextInputBox>\n </Box>\n );\n};\n","import { parseIntElseUndefined } from \"@stenajs-webui/core\";\nimport { formatHours, formatMinutes } from \"./TimeStringFormatValidator\";\n\nexport const transformNumberTimeToString = (\n time: number | undefined | null,\n): string | undefined => {\n if (time == null) {\n return undefined;\n }\n const timeStr = time.toString();\n if (timeStr.length === 3) {\n return `${timeStr.substr(0, 1)}:${timeStr.substr(1, 2)}`;\n }\n if (timeStr.length === 4) {\n return `${timeStr.substr(0, 2)}:${timeStr.substr(2, 2)}`;\n }\n if (timeStr.length === 2) {\n return `0:${timeStr}`;\n }\n if (timeStr.length === 1) {\n return `0:0${timeStr}`;\n }\n throw new Error(\"Invalid time number.\");\n};\n\nexport const transformTimeStringToNumber = (\n time: string | undefined | null,\n): number | null => {\n if (time == null) {\n throw new Error(\"Time is not set.\");\n }\n if (time === \"\") {\n throw new Error(\"Time is empty.\");\n }\n const parts = time.split(\":\");\n if (parts.length !== 2) {\n throw new Error(\"Invalid time.\");\n }\n\n if (parts[1].length !== 2) {\n throw new Error(\"Invalid time.\");\n }\n\n if (parts[0].length < 1 || parts[0].length > 2) {\n throw new Error(\"Invalid time.\");\n }\n\n const hours = parseInt(parts[0], 10);\n const minutes = parseInt(parts[1], 10);\n\n if (isNaN(hours)) {\n throw new Error(\"Invalid time.\");\n }\n if (isNaN(minutes)) {\n throw new Error(\"Invalid time.\");\n }\n if (hours < 0 || hours > 23) {\n throw new Error(\"Invalid time.\");\n }\n if (minutes < 0 || minutes > 59) {\n throw new Error(\"Invalid time.\");\n }\n return hours * 100 + minutes;\n};\n\nexport const isValidTimeString = (time: string | undefined): boolean => {\n try {\n transformTimeStringToNumber(time);\n return true;\n } catch {\n return false;\n }\n};\n\nexport const getHoursAndMinutesFromTimeString = (\n value: string | undefined,\n): {\n hour: number | undefined;\n minute: number | undefined;\n} => {\n if (value && isValidTimeString(value)) {\n const p = value.split(\":\");\n return {\n hour: parseIntElseUndefined(p[0]),\n minute: parseIntElseUndefined(p[1]),\n };\n }\n return {\n hour: undefined,\n minute: undefined,\n };\n};\n\nexport const transformTimeInDateToTimeString = (date: Date): string =>\n `${formatHours(String(date.getHours()))}:${formatMinutes(\n String(date.getMinutes()),\n )}`;\n","import { Row } from \"@stenajs-webui/core\";\nimport { FlatButton, PrimaryButton } from \"@stenajs-webui/elements\";\nimport * as React from \"react\";\nimport { RefObject, useEffect, useRef } from \"react\";\nimport { padStart } from \"lodash-es\";\n\nexport interface TimePickerCellProps {\n item: number;\n selected?: boolean;\n onClick: (label: number) => void;\n columnRef: RefObject<HTMLDivElement | null>;\n canScrollRef: RefObject<boolean>;\n}\n\nexport const TimePickerCell: React.FC<TimePickerCellProps> = ({\n onClick,\n item,\n selected,\n columnRef,\n canScrollRef,\n}) => {\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(\n function scrollToSelectedItem() {\n if (\n selected &&\n columnRef.current &&\n ref.current &&\n canScrollRef.current\n ) {\n const targetScroll = ref.current.scrollHeight * Math.max(item - 2, 0);\n columnRef.current.scrollTo(0, targetScroll);\n canScrollRef.current = false;\n }\n },\n [columnRef, item, selected, canScrollRef],\n );\n\n return (\n <Row\n width={\"64px\"}\n justifyContent={\"center\"}\n spacing={0.5}\n indent={0.5}\n ref={ref}\n >\n {selected ? (\n <PrimaryButton\n label={padStart(String(item), 2, \"0\")}\n onClick={() => onClick && onClick(item)}\n />\n ) : (\n <FlatButton\n label={String(item).padStart(2, \"0\")}\n onClick={() => onClick && onClick(item)}\n />\n )}\n </Row>\n );\n};\n","import { Column } from \"@stenajs-webui/core\";\nimport * as React from \"react\";\nimport { MutableRefObject, useRef } from \"react\";\nimport styles from \"./TimePicker.module.css\";\nimport { TimePickerCell } from \"./TimePickerCell\";\n\ninterface Props {\n items: Array<number>;\n onClick: (item: number) => void;\n selectedItem: number | undefined;\n canScrollRef: MutableRefObject<boolean>;\n}\n\nexport const TimePickerColumn: React.FC<Props> = ({\n onClick,\n items,\n selectedItem,\n canScrollRef,\n}) => {\n const columnRef = useRef<HTMLDivElement>(null);\n\n return (\n <Column className={styles.timePickerColumn} ref={columnRef}>\n {items.map((item) => (\n <TimePickerCell\n key={item}\n item={item}\n onClick={onClick}\n selected={item === selectedItem}\n columnRef={columnRef}\n canScrollRef={canScrollRef}\n />\n ))}\n </Column>\n );\n};\n","import { Indent, Row } from \"@stenajs-webui/core\";\nimport { ValueAndOnValueChangeProps } from \"@stenajs-webui/forms\";\nimport { range } from \"lodash-es\";\nimport * as React from \"react\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport {\n formatHours,\n formatMinutes,\n} from \"../../util/time/TimeStringFormatValidator\";\nimport { getHoursAndMinutesFromTimeString } from \"../../util/time/TimeTransformer\";\nimport styles from \"./TimePicker.module.css\";\nimport { TimePickerColumn } from \"./TimePickerColumn\";\n\nexport interface TimePickerProps extends ValueAndOnValueChangeProps<string> {}\n\nconst hours = range(0, 24);\nconst minutes = range(0, 60);\n\nexport const TimePicker: React.FC<TimePickerProps> = ({\n value,\n onValueChange,\n}) => {\n const canScrollRef = useRef(true);\n const [hour, setHour] = useState<number | undefined>(undefined);\n const [minute, setMinute] = useState<number | undefined>(undefined);\n\n useEffect(() => {\n if (value) {\n const { minute, hour } = getHoursAndMinutesFromTimeString(value);\n setHour(hour);\n setMinute(minute);\n }\n }, [value]);\n\n const onClickHour = useCallback(\n (h: number) => {\n setHour(h);\n onValueChange?.(\n `${formatHours(String(h ?? 0))}:${formatMinutes(String(minute ?? 0))}`,\n );\n },\n [minute, onValueChange],\n );\n\n const onClickMinutes = useCallback(\n (m: number) => {\n setMinute(m);\n onValueChange?.(\n `${formatHours(String(hour ?? 0))}:${formatMinutes(String(m ?? 0))}`,\n );\n },\n [hour, onValueChange],\n );\n\n return (\n <Row className={styles.timePicker}>\n <TimePickerColumn\n items={hours}\n onClick={onClickHour}\n selectedItem={hour}\n canScrollRef={canScrollRef}\n />\n <Indent />\n <TimePickerColumn\n items={minutes}\n onClick={onClickMinutes}\n selectedItem={minute}\n canScrollRef={canScrollRef}\n />\n </Row>\n );\n};\n","import { RefObject, useEffect } from \"react\";\n\nexport const useDateRangeEffects = (\n date: Date | undefined | null,\n setDateInFocus: (date: Date) => void,\n dateInputRef: RefObject<HTMLInputElement | null>,\n) => {\n useEffect(\n function moveFocusedDateWhenDateChanges() {\n if (date) {\n setDateInFocus(date);\n }\n },\n [date, setDateInFocus],\n );\n\n useEffect(\n function updateDateFieldWhenValueChanges() {\n if (dateInputRef.current) {\n if (date) {\n dateInputRef.current.valueAsDate = new Date(\n Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()),\n );\n } else {\n dateInputRef.current.valueAsDate = null;\n }\n }\n },\n [date, dateInputRef],\n );\n};\n","import { ChangeEvent, RefObject, useCallback } from \"react\";\nimport { getHoursAndMinutesFromTimeString } from \"../../../../util/time/TimeTransformer\";\nimport { DateTimeInputProps } from \"../DateTimeInput\";\nimport { UseInputStatesResult } from \"./UseInputStates\";\n\nexport const useDateRangeHandlers = (\n date: Date | undefined | null,\n onValueChange: DateTimeInputProps[\"onValueChange\"],\n {\n setDateInFocus,\n showCalendarInternal,\n hideCalendarInternal,\n setFirstFocusedInput,\n setCurrentPanel,\n localTime,\n setLocalTime,\n localDate,\n setLocalDate,\n }: UseInputStatesResult,\n dateInputRef: RefObject<HTMLInputElement | null>,\n) => {\n const onChangeDate = useCallback(\n (incomingDate: Date | null) => {\n if (!incomingDate) {\n return;\n }\n const newDate = new Date(incomingDate);\n\n if (date) {\n // Full date is available\n\n newDate.setHours(date.getHours());\n newDate.setMinutes(date.getMinutes());\n\n onValueChange?.(newDate);\n setLocalDate(undefined);\n } else if (localTime) {\n // Only time has been selected\n const { minute, hour } = getHoursAndMinutesFromTimeString(localTime);\n\n newDate.setHours(hour ?? 0);\n newDate.setMinutes(minute ?? 0);\n\n onValueChange?.(newDate);\n setLocalDate(undefined);\n } else {\n // Nothing has been selected\n setLocalDate(newDate);\n }\n setDateInFocus(newDate);\n if (dateInputRef.current) {\n dateInputRef.current.valueAsDate = new Date(\n Date.UTC(\n newDate.getFullYear(),\n newDate.getMonth(),\n newDate.getDate(),\n ),\n );\n }\n },\n [\n date,\n dateInputRef,\n localTime,\n onValueChange,\n setDateInFocus,\n setLocalDate,\n ],\n );\n\n const onChangeTime = useCallback(\n (time: string) => {\n if (!time) {\n return;\n }\n\n if (date) {\n // Full date is available\n const newTime = getHoursAndMinutesFromTimeString(time);\n const newDate = new Date(date);\n\n newDate.setHours(newTime.hour || 0);\n newDate.setMinutes(newTime.minute || 0);\n\n onValueChange?.(newDate);\n setLocalTime(undefined);\n } else if (localDate) {\n // Only date has already been selected\n const newTime = getHoursAndMinutesFromTimeString(time);\n const newDate = new Date(localDate);\n\n newDate.setHours(newTime.hour || 0);\n newDate.setMinutes(newTime.minute || 0);\n\n onValueChange?.(newDate);\n setLocalTime(undefined);\n } else {\n // Nothing has been selected\n setLocalTime(time);\n }\n },\n [onValueChange, date, localDate, setLocalTime],\n );\n\n const inputLeftChangeHandler = useCallback(\n (ev: ChangeEvent<HTMLInputElement>) => {\n if (ev.target.value[0] !== \"0\") {\n onChangeDate(ev.target.valueAsDate);\n }\n },\n [onChangeDate],\n );\n\n const inputRightChangeHandler = useCallback(\n (ev: ChangeEvent<HTMLInputElement>) => onChangeTime(ev.target.value),\n [onChangeTime],\n );\n\n const showCalendar = useCallback(() => {\n if (date) {\n setDateInFocus(date);\n } else {\n setDateInFocus(new Date());\n }\n setCurrentPanel(\"calendar\");\n showCalendarInternal();\n }, [date, setCurrentPanel, showCalendarInternal, setDateInFocus]);\n\n const hideCalendar = useCallback(() => {\n setFirstFocusedInput(undefined);\n hideCalendarInternal();\n }, [setFirstFocusedInput, hideCalendarInternal]);\n\n return {\n inputLeftChangeHandler,\n inputRightChangeHandler,\n hideCalendar,\n showCalendar,\n onChangeTime,\n onChangeDate,\n };\n};\n","import { useBoolean } from \"@stenajs-webui/core\";\nimport { useState } from \"react\";\nimport { DateRangeFocusedInput } from \"../../../calendar-types/date-range-calendar/DateRangeCalendar\";\nimport { CalendarPanelType } from \"../../../../features/calendar-with-month-year-pickers/CalendarPanelType\";\n\nexport type UseInputStatesResult = ReturnType<typeof useInputStates>;\n\nexport const useInputStates = (date: Date | undefined | null) => {\n const [localDate, setLocalDate] = useState<Date | undefined>(undefined);\n const [localTime, setLocalTime] = useState<string | undefined>(undefined);\n\n const [isCalendarVisible, showCalendarInternal, hideCalendarInternal] =\n useBoolean(false);\n\n const [isTimePickerVisible, showTimePicker, hideTimePicker] =\n useBoolean(false);\n\n const [firstFocusedInput, setFirstFocusedInput] = useState<\n DateRangeFocusedInput | undefined\n >(undefined);\n\n const [dateInFocus, setDateInFocus] = useState<Date>(\n () => date ?? new Date(),\n );\n\n const [currentPanel, setCurrentPanel] =\n useState<CalendarPanelType>(\"calendar\");\n\n return {\n isCalendarVisible,\n showCalendarInternal,\n hideCalendarInternal,\n firstFocusedInput,\n setFirstFocusedInput,\n dateInFocus,\n setDateInFocus,\n currentPanel,\n setCurrentPanel,\n isTimePickerVisible,\n showTimePicker,\n hideTimePicker,\n localDate,\n setLocalDate,\n localTime,\n setLocalTime,\n };\n};\n","import * as React from \"react\";\nimport { RefObject, useCallback } from \"react\";\nimport { DayData } from \"../../../../util/calendar/CalendarDataFactory\";\nimport { UseInputStatesResult } from \"./UseInputStates\";\n\nexport const useUserInputHandlers = (\n onChangeDate: (incomingDate: Date | null) => void,\n dateInputRef: RefObject<HTMLInputElement | null>,\n showCalendar: () => void,\n hideCalendar: () => void,\n {\n isCalendarVisible,\n setCurrentPanel,\n showTimePicker,\n hideTimePicker,\n }: UseInputStatesResult,\n) => {\n const onFocusLeft = useCallback(() => {\n if (!isCalendarVisible) {\n showCalendar();\n }\n setCurrentPanel(\"calendar\");\n hideTimePicker();\n }, [hideTimePicker, isCalendarVisible, setCurrentPanel, showCalendar]);\n\n const onFocusRight = useCallback(() => {\n hideCalendar();\n showTimePicker();\n }, [hideCalendar, showTimePicker]);\n\n const onClickDay = useCallback(\n (day: DayData) => {\n onChangeDate(day.date);\n hideCalendar();\n showTimePicker();\n },\n [onChangeDate, hideCalendar, showTimePicker],\n );\n\n const onClickArrowButton = useCallback(() => {\n setCurrentPanel(\"presets\");\n showCalendar();\n }, [setCurrentPanel, showCalendar]);\n\n const onClickCalendarButton = useCallback(() => {\n if (isCalendarVisible) {\n hideCalendar();\n } else {\n dateInputRef.current?.focus();\n setCurrentPanel(\"calendar\");\n showCalendar();\n }\n }, [\n isCalendarVisible,\n hideCalendar,\n dateInputRef,\n setCurrentPanel,\n showCalendar,\n ]);\n\n const onKeyDownHandler = useCallback(\n (ev: React.KeyboardEvent<HTMLDivElement>) => {\n if (ev.key === \"Escape\") {\n hideCalendar();\n }\n },\n [hideCalendar],\n );\n\n return {\n onFocusLeft,\n onFocusRight,\n onClickDay,\n onClickArrowButton,\n onClickCalendarButton,\n onKeyDownHandler,\n };\n};\n","import { Box, Column, Row, Space, useDelayedFalse } from \"@stenajs-webui/core\";\nimport { PrimaryButton, stenaClock } from \"@stenajs-webui/elements\";\nimport {\n TextInputProps,\n ValueAndOnValueChangeProps,\n} from \"@stenajs-webui/forms\";\nimport {\n ControlledPopover,\n ControlledPopoverProps,\n} from \"@stenajs-webui/tooltip\";\nimport * as React from \"react\";\nimport { useCallback, useMemo, useRef } from \"react\";\nimport { defaultPopoverPlacement } from \"../../../config/DefaultPopoverPlacement\";\nimport {\n DualTextInput,\n DualTextInputProps,\n} from \"../../../features/dual-text-input/DualTextInput\";\nimport { CalendarWithMonthSwitcher } from \"../../../features/month-switcher/CalendarWithMonthSwitcher\";\nimport { TimePicker } from \"../../../features/time-picker/TimePicker\";\nimport { addDayStateHighlights } from \"../../../util/calendar/StateModifier\";\nimport { transformTimeInDateToTimeString } from \"../../../util/time/TimeTransformer\";\nimport { useDateRangeEffects } from \"./hooks/UseDateRangeEffects\";\nimport { useDateRangeHandlers } from \"./hooks/UseDateRangeHandlers\";\nimport { useInputStates } from \"./hooks/UseInputStates\";\nimport { useUserInputHandlers } from \"./hooks/UseUserInputHandlers\";\nimport { OptionalMinMaxDatesAsString } from \"../../../types/CalendarTypes\";\nimport { defaultMaxDate } from \"../../../config/DefaultMaxDate\";\n\nexport interface DateTimeInputProps\n extends ValueAndOnValueChangeProps<Date | null>,\n OptionalMinMaxDatesAsString,\n Pick<DualTextInputProps, \"widthLeft\" | \"widthRight\" | \"variant\">,\n Pick<ControlledPopoverProps, \"zIndex\" | \"appendTo\"> {\n onEsc?: () => void;\n onEnter?: () => void;\n onBlur?: () => void;\n autoFocus?: boolean;\n disabled?: boolean;\n}\n\nexport const DateTimeInput: React.FC<DateTimeInputProps> = ({\n value,\n onValueChange,\n onEnter,\n onEsc,\n onBlur,\n autoFocus,\n minDate,\n widthLeft = 128,\n widthRight = 80,\n maxDate = defaultMaxDate,\n variant,\n disabled,\n zIndex,\n appendTo,\n}) => {\n const dateInputRef: TextInputProps[\"inputRef\"] = useRef(null);\n const timeInputRef: TextInputProps[\"inputRef\"] = useRef(null);\n\n const states = useInputStates(value);\n\n const {\n setCurrentPanel,\n currentPanel,\n isCalendarVisible,\n dateInFocus,\n setDateInFocus,\n isTimePickerVisible,\n hideTimePicker,\n localTime,\n localDate,\n } = states;\n\n const {\n showCalendar,\n hideCalendar,\n inputLeftChangeHandler,\n inputRightChangeHandler,\n onChangeTime,\n onChangeDate,\n } = useDateRangeHandlers(value, onValueChange, states, dateInputRef);\n\n const {\n onKeyDownHandler,\n onFocusRight,\n onFocusLeft,\n onClickDay,\n onClickCalendarButton,\n onClickArrowButton,\n } = useUserInputHandlers(\n onChangeDate,\n dateInputRef,\n showCalendar,\n hideCalendar,\n states,\n );\n\n useDateRangeEffects(value, setDateInFocus, dateInputRef);\n\n const statePerMonth = useMemo(() => {\n const dateToHighlight = value || localDate;\n if (!dateToHighlight) {\n return {};\n }\n return addDayStateHighlights(undefined, dateToHighlight, [\n \"singleSelected\",\n \"selected\",\n ]);\n }, [localDate, value]);\n\n const hideAll = useCallback(() => {\n hideCalendar();\n hideTimePicker();\n }, [hideCalendar, hideTimePicker]);\n\n const timeValue = useMemo<string | undefined>(\n () => (value ? transformTimeInDateToTimeString(value) : localTime),\n [value, localTime],\n );\n\n const delayedIsCalendarVisible = useDelayedFalse(isCalendarVisible, 300);\n const delayedIsTimePickerVisible = useDelayedFalse(isTimePickerVisible, 300);\n\n return (\n <Box onKeyDown={onKeyDownHandler}>\n <ControlledPopover\n hideArrow\n restoreFocus={false}\n returnFocus={false}\n zIndex={zIndex}\n appendTo={appendTo}\n renderTrigger={(props) => (\n <Box {...props}>\n <DualTextInput\n autoFocusLeft={autoFocus}\n onEsc={onEsc}\n onEnter={onEnter}\n onBlur={onBlur}\n disabled={disabled}\n separatorIcon={stenaClock}\n typeLeft={\"date\"}\n typeRight={\"time\"}\n placeholderLeft={\"yyyy-mm-dd\"}\n placeholderRight={\"hh:mm\"}\n onChangeLeft={inputLeftChangeHandler}\n onChangeRight={inputRightChangeHandler}\n onClickArrowDown={onClickArrowButton}\n onClickCalendar={onClickCalendarButton}\n onFocusLeft={onFocusLeft}\n onFocusRight={onFocusRight}\n onClickLeft={onFocusLeft}\n onClickRight={onFocusRight}\n inputRefLeft={dateInputRef}\n inputRefRight={timeInputRef}\n valueRight={timeValue ?? \"\"}\n widthLeft={widthLeft}\n widthRight={widthRight}\n minLeft={minDate}\n maxLeft={maxDate}\n variant={variant}\n />\n </Box>\n )}\n placement={defaultPopoverPlacement}\n open={isCalendarVisible || isTimePickerVisible}\n onRequestClose={hideAll}\n >\n {(delayedIsCalendarVisible || delayedIsTimePickerVisible) && (\n <Column>\n {delayedIsCalendarVisible ? (\n <CalendarWithMonthSwitcher\n statePerMonth={statePerMonth}\n onClickDay={onClickDay}\n dateInFocus={dateInFocus}\n setDateInFocus={setDateInFocus}\n currentPanel={currentPanel}\n setCurrentPanel={setCurrentPanel}\n minDate={minDate}\n maxDate={maxDate}\n />\n ) : delayedIsTimePickerVisible ? (\n <Column>\n <Column overflow={\"hidden\"} height={\"250px\"}>\n <TimePicker\n value={timeValue ?? \"\"}\n onValueChange={onChangeTime}\n />\n </Column>\n <Space />\n <Row justifyContent={\"flex-end\"}>\n <PrimaryButton label={\"Done\"} onClick={hideTimePicker} />\n </Row>\n </Column>\n ) : null}\n </Column>\n )}\n </ControlledPopover>\n </Box>\n );\n};\n","import * as React from \"react\";\nimport { Row } from \"@stenajs-webui/core\";\nimport { FlatButton, PrimaryButton } from \"@stenajs-webui/elements\";\nimport { ValueAndOnValueChangeProps } from \"@stenajs-webui/forms\";\n\ninterface Props extends ValueAndOnValueChangeProps<number> {\n year: number;\n}\n\nexport const YearPickerCell: React.FC<Props> = ({\n value,\n onValueChange,\n year,\n}) => {\n const label = String(year);\n return (\n <Row justifyContent={\"center\"}>\n {value === year ? (\n <PrimaryButton label={label} onClick={() => onValueChange?.(year)} />\n ) : (\n <FlatButton label={label} onClick={() => onValueChange?.(year)} />\n )}\n </Row>\n );\n};\n","import * as React from \"react\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport { ValueAndOnValueChangeProps } from \"@stenajs-webui/forms\";\nimport { Column, Row } from \"@stenajs-webui/core\";\nimport { YearPickerCell } from \"./YearPickerCell\";\nimport {\n FlatButton,\n stenaArrowLeft,\n stenaArrowRight,\n} from \"@stenajs-webui/elements\";\nimport { chunk, range } from \"lodash-es\";\n\nexport interface YearPickerProps extends ValueAndOnValueChangeProps<number> {\n initialLastYear?: number;\n}\n\nexport const YearPicker: React.FC<YearPickerProps> = ({\n value,\n onValueChange,\n initialLastYear,\n}) => {\n const [lastYear, setLastYear] = useState(() => {\n if (value) {\n return value + 4;\n }\n return initialLastYear ?? new Date().getFullYear() + 4;\n });\n\n const yearRows = useMemo(() => {\n const startYear = lastYear - 11;\n return chunk(range(startYear, lastYear + 1), 3);\n }, [lastYear]);\n\n useEffect(() => {\n setLastYear((prev) => calculateLastYearInFocus(value, prev));\n }, [value]);\n\n return (\n <Row>\n <Column justifyContent={\"center\"}>\n <FlatButton\n leftIcon={stenaArrowLeft}\n onClick={() => setLastYear(lastYear - 3)}\n />\n </Column>\n <Column gap={1}>\n {yearRows.map((yearRow) => (\n <Row key={yearRow[0]} gap={1}>\n {yearRow.map((year) => (\n <YearPickerCell\n key={year}\n year={year}\n onValueChange={onValueChange}\n value={value}\n />\n ))}\n </Row>\n ))}\n </Column>\n <Column justifyContent={\"center\"}>\n <FlatButton\n leftIcon={stenaArrowRight}\n onClick={() => setLastYear(lastYear + 3)}\n />\n </Column>\n </Row>\n );\n};\n\nconst calculateLastYearInFocus = (\n value: number | undefined,\n lastYear: number,\n): number => {\n if (value == null) {\n return lastYear;\n }\n if (value > lastYear) {\n const yearDiff = value - lastYear;\n const remaining = yearDiff % 3;\n const yearsToAdd = yearDiff - remaining + 3;\n return lastYear + yearsToAdd;\n }\n const startYear = lastYear - 11;\n if (value < startYear) {\n const yearDiff = startYear - value;\n const remaining = yearDiff % 3;\n const yearsToSubtract = yearDiff - remaining + 3;\n return lastYear - yearsToSubtract;\n }\n\n return lastYear;\n};\n","import { RefObject, useEffect } from \"react\";\n\nexport const useDateRangeEffects = (\n startDate: Date | undefined,\n endDate: Date | undefined,\n setDateInFocus: (date: Date) => void,\n startDateInputRef: RefObject<HTMLInputElement | null>,\n endDateInputRef: RefObject<HTMLInputElement | null>,\n) => {\n useEffect(\n function moveFocusedDateWhenStartDateChanges() {\n if (startDate) {\n setDateInFocus(startDate);\n }\n },\n [startDate, setDateInFocus],\n );\n\n useEffect(\n function moveFocusedDateWhenEndDateChanges() {\n if (endDate) {\n setDateInFocus(endDate);\n }\n },\n [endDate, setDateInFocus],\n );\n\n useEffect(\n function updateStartDateFieldWhenValueChanges() {\n if (startDateInputRef.current) {\n if (startDate) {\n startDateInputRef.current.valueAsDate = new Date(\n Date.UTC(\n startDate.getFullYear(),\n startDate.getMonth(),\n startDate.getDate(),\n ),\n );\n } else {\n startDateInputRef.current.valueAsDate = null;\n }\n }\n },\n [startDate, startDateInputRef],\n );\n\n useEffect(\n function updateEndDateFieldWhenValueChanges() {\n if (endDateInputRef.current) {\n if (endDate) {\n endDateInputRef.current.valueAsDate = new Date(\n Date.UTC(\n endDate.getFullYear(),\n endDate.getMonth(),\n endDate.getDate(),\n ),\n );\n } else {\n endDateInputRef.current.valueAsDate = null;\n }\n }\n },\n [endDate, endDateInputRef],\n );\n};\n","import { ChangeEvent, useCallback } from \"react\";\nimport { DateRangeDualTextInputProps } from \"../DateRangeDualTextInput\";\nimport { UseInputStatesResult } from \"./UseInputStates\";\n\nexport const useDateRangeHandlers = (\n startDate: Date | undefined,\n endDate: Date | undefined,\n onValueChange: DateRangeDualTextInputProps[\"onValueChange\"],\n {\n setDateInFocus,\n showCalendarInternal,\n hideCalendarInternal,\n setFirstFocusedInput,\n setCurrentPanel,\n }: UseInputStatesResult,\n) => {\n const inputLeftChangeHandler = useCallback(\n (ev: ChangeEvent<HTMLInputElement>) => {\n if (ev.target.value[0] !== \"0\") {\n onValueChange?.({\n startDate: ev.target.valueAsDate ?? undefined,\n endDate,\n });\n }\n },\n [onValueChange, endDate],\n );\n\n const inputRightChangeHandler = useCallback(\n (ev: ChangeEvent<HTMLInputElement>) => {\n if (ev.target.value[0] !== \"0\") {\n onValueChange?.({\n startDate,\n endDate: ev.target.valueAsDate ?? undefined,\n });\n }\n },\n [onValueChange, startDate],\n );\n\n const showCalendar = useCallback(\n (dateInFocus?: Date) => {\n if (dateInFocus != null) {\n setDateInFocus(dateInFocus);\n } else if (startDate) {\n setDateInFocus(startDate);\n } else if (endDate) {\n setDateInFocus(endDate);\n } else {\n setDateInFocus(new Date());\n }\n setCurrentPanel(\"calendar\");\n showCalendarInternal();\n },\n [startDate, endDate, setCurrentPanel, showCalendarInternal, setDateInFocus],\n );\n\n const hideCalendar = useCallback(() => {\n setFirstFocusedInput(undefined);\n hideCalendarInternal();\n }, [setFirstFocusedInput, hideCalendarInternal]);\n\n return {\n inputLeftChangeHandler,\n inputRightChangeHandler,\n hideCalendar,\n setDateInFocus,\n setCurrentPanel,\n showCalendar,\n };\n};\n","import { useBoolean } from \"@stenajs-webui/core\";\nimport { useState } from \"react\";\nimport { DateRangeFocusedInput } from \"../../../calendar-types/date-range-calendar/DateRangeCalendar\";\nimport { CalendarPanelType } from \"../../../../features/calendar-with-month-year-pickers/CalendarPanelType\";\n\nexport type UseInputStatesResult = ReturnType<typeof useInputStates>;\n\nexport const useInputStates = (\n startDate: Date | undefined,\n endDate: Date | undefined,\n) => {\n const [isCalendarVisible, showCalendarInternal, hideCalendarInternal] =\n useBoolean(false);\n\n const [firstFocusedInput, setFirstFocusedInput] = useState<\n DateRangeFocusedInput | undefined\n >(undefined);\n\n const [focusedInput, setFocusedInput] =\n useState<DateRangeFocusedInput>(\"startDate\");\n\n const [dateInFocus, setDateInFocus] = useState<Date>(() => {\n const fromValue =\n focusedInput === \"startDate\"\n ? startDate\n : focusedInput === \"endDate\"\n ? endDate\n : undefined;\n\n return fromValue ?? new Date();\n });\n\n const [currentPanel, setCurrentPanel] =\n useState<CalendarPanelType>(\"calendar\");\n\n return {\n isCalendarVisible,\n showCalendarInternal,\n hideCalendarInternal,\n firstFocusedInput,\n setFirstFocusedInput,\n focusedInput,\n setFocusedInput,\n dateInFocus,\n setDateInFocus,\n currentPanel,\n setCurrentPanel,\n };\n};\n","import { isAfter } from \"date-fns\";\nimport * as React from \"react\";\nimport { RefObject, useCallback } from \"react\";\nimport { DayData } from \"../../../../util/calendar/CalendarDataFactory\";\nimport { DateRangeDualTextInputProps } from \"../DateRangeDualTextInput\";\nimport { UseInputStatesResult } from \"./UseInputStates\";\n\nexport const useUserInputHandlers = (\n startDate: Date | undefined,\n endDate: Date | undefined,\n onValueChange: DateRangeDualTextInputProps[\"onValueChange\"],\n startDateInputRef: RefObject<HTMLInputElement | null>,\n endDateInputRef: RefObject<HTMLInputElement | null>,\n showCalendar: (dateInFocus?: Date) => void,\n hideCalendar: () => void,\n {\n firstFocusedInput,\n setFirstFocusedInput,\n isCalendarVisible,\n setFocusedInput,\n focusedInput,\n setCurrentPanel,\n setDateInFocus,\n }: UseInputStatesResult,\n) => {\n const onFocusLeft = useCallback(() => {\n if (firstFocusedInput == null) {\n setFirstFocusedInput(\"startDate\");\n }\n setFocusedInput(\"startDate\");\n if (!isCalendarVisible) {\n showCalendar(startDate);\n } else if (startDate != null) {\n setDateInFocus(startDate);\n }\n }, [\n firstFocusedInput,\n setFocusedInput,\n isCalendarVisible,\n startDate,\n setFirstFocusedInput,\n showCalendar,\n setDateInFocus,\n ]);\n\n const onFocusRight = useCallback(() => {\n if (firstFocusedInput == null) {\n setFirstFocusedInput(\"endDate\");\n }\n setFocusedInput(\"endDate\");\n if (!isCalendarVisible) {\n showCalendar(endDate);\n } else if (endDate != null) {\n setDateInFocus(endDate);\n }\n }, [\n firstFocusedInput,\n setFocusedInput,\n isCalendarVisible,\n endDate,\n setFirstFocusedInput,\n showCalendar,\n setDateInFocus,\n ]);\n\n const onClickDay = useCallback(\n (day: DayData) => {\n if (focusedInput === \"startDate\") {\n if (endDate != null && isAfter(day.date, endDate)) {\n onValueChange?.({\n startDate: day.date,\n endDate: undefined,\n });\n setFocusedInput(\"endDate\");\n endDateInputRef.current?.focus();\n } else {\n onValueChange?.({\n startDate: day.date,\n endDate,\n });\n if (firstFocusedInput === \"startDate\") {\n setFocusedInput(\"endDate\");\n endDateInputRef.current?.focus();\n } else {\n setTimeout(hideCalendar, 50);\n }\n }\n } else if (focusedInput === \"endDate\") {\n if (!startDate) {\n onValueChange?.({\n startDate,\n endDate: day.date,\n });\n setFocusedInput(\"startDate\");\n startDateInputRef.current?.focus();\n } else if (isAfter(startDate, day.date)) {\n onValueChange?.({\n startDate: day.date,\n endDate: undefined,\n });\n setFocusedInput(\"endDate\");\n endDateInputRef.current?.focus();\n } else {\n onValueChange?.({\n startDate,\n endDate: day.date,\n });\n setTimeout(hideCalendar, 50);\n }\n }\n },\n [\n focusedInput,\n onValueChange,\n endDate,\n firstFocusedInput,\n setFocusedInput,\n endDateInputRef,\n hideCalendar,\n startDate,\n startDateInputRef,\n ],\n );\n\n const onClickArrowButton = useCallback(() => {\n setCurrentPanel(\"presets\");\n showCalendar();\n }, [setCurrentPanel, showCalendar]);\n\n const onClickCalendarButton = useCallback(() => {\n if (isCalendarVisible) {\n hideCalendar();\n } else {\n setFocusedInput(\"startDate\");\n setFirstFocusedInput(\"startDate\");\n startDateInputRef.current?.focus();\n setCurrentPanel(\"calendar\");\n showCalendar();\n }\n }, [\n isCalendarVisible,\n hideCalendar,\n setFocusedInput,\n setFirstFocusedInput,\n startDateInputRef,\n setCurrentPanel,\n showCalendar,\n ]);\n\n const onKeyDownHandler = useCallback(\n (ev: React.KeyboardEvent<HTMLDivElement>) => {\n if (ev.key === \"Escape\") {\n hideCalendar();\n }\n },\n [hideCalendar],\n );\n\n return {\n onFocusLeft,\n onFocusRight,\n onClickDay,\n onClickArrowButton,\n onClickCalendarButton,\n onKeyDownHandler,\n };\n};\n","import { Box, Column } from \"@stenajs-webui/core\";\nimport { stenaArrowRight } from \"@stenajs-webui/elements\";\nimport {\n TextInputProps,\n ValueAndOnValueChangeProps,\n} from \"@stenajs-webui/forms\";\nimport {\n ControlledPopover,\n ControlledPopoverProps,\n} from \"@stenajs-webui/tooltip\";\nimport { isAfter } from \"date-fns\";\nimport * as React from \"react\";\nimport { useMemo, useRef } from \"react\";\nimport { defaultPopoverPlacement } from \"../../../config/DefaultPopoverPlacement\";\nimport {\n DualTextInput,\n DualTextInputProps,\n} from \"../../../features/dual-text-input/DualTextInput\";\nimport { CalendarWithMonthSwitcher } from \"../../../features/month-switcher/CalendarWithMonthSwitcher\";\nimport { buildDayStateForSingleMonth } from \"../../../util/calendar/StateModifier\";\nimport { useDateRangeEffects } from \"./hooks/UseDateRangeEffects\";\nimport { useDateRangeHandlers } from \"./hooks/UseDateRangeHandlers\";\nimport { useInputStates } from \"./hooks/UseInputStates\";\nimport { useUserInputHandlers } from \"./hooks/UseUserInputHandlers\";\nimport { DateRangeInputCalendarProps } from \"../../calendar-types/date-range-calendar/DateRangeCalendar\";\nimport { OptionalMinMaxDatesAsString } from \"../../../types/CalendarTypes\";\nimport { DateRange } from \"../../../types/DateRange\";\nimport { defaultMaxDate } from \"../../../config/DefaultMaxDate\";\n\nexport interface DateRangeDualTextInputProps<TData = unknown>\n extends ValueAndOnValueChangeProps<DateRange>,\n OptionalMinMaxDatesAsString,\n Pick<DualTextInputProps, \"widthLeft\" | \"widthRight\" | \"variant\">,\n Pick<ControlledPopoverProps, \"zIndex\" | \"appendTo\"> {\n onEsc?: () => void;\n onEnter?: () => void;\n onBlur?: () => void;\n autoFocus?: boolean;\n calendarProps?: DateRangeInputCalendarProps<TData>;\n disabled?: boolean;\n renderBelowCalendar?: React.ReactNode;\n firstMonthInMonthPicker?: Date;\n numMonthsInMonthPicker?: number;\n}\n\nexport function DateRangeDualTextInput<TData>({\n value,\n onValueChange,\n autoFocus,\n onBlur,\n onEnter,\n onEsc,\n minDate,\n maxDate = defaultMaxDate,\n calendarProps,\n widthLeft = 128,\n widthRight = 128,\n firstMonthInMonthPicker,\n numMonthsInMonthPicker,\n variant,\n disabled,\n zIndex,\n appendTo,\n renderBelowCalendar,\n}: DateRangeDualTextInputProps<TData>) {\n const { startDate, endDate } = value || {};\n\n const startDateInputRef: TextInputProps[\"inputRef\"] = useRef(null);\n const endDateInputRef: TextInputProps[\"inputRef\"] = useRef(null);\n\n const states = useInputStates(startDate, endDate);\n\n const {\n dateInFocus,\n setDateInFocus,\n isCalendarVisible,\n currentPanel,\n setCurrentPanel,\n } = states;\n\n const {\n showCalendar,\n hideCalendar,\n inputLeftChangeHandler,\n inputRightChangeHandler,\n } = useDateRangeHandlers(startDate, endDate, onValueChange, states);\n\n const {\n onKeyDownHandler,\n onFocusRight,\n onFocusLeft,\n onClickDay,\n onClickCalendarButton,\n onClickArrowButton,\n } = useUserInputHandlers(\n startDate,\n endDate,\n onValueChange,\n startDateInputRef,\n endDateInputRef,\n showCalendar,\n hideCalendar,\n states,\n );\n\n useDateRangeEffects(\n startDate,\n endDate,\n setDateInFocus,\n startDateInputRef,\n endDateInputRef,\n );\n\n const startDateIsAfterEnd = useMemo(\n () => startDate && endDate && isAfter(startDate, endDate),\n [startDate, endDate],\n );\n\n const statePerMonth = useMemo(\n () =>\n buildDayStateForSingleMonth(\n calendarProps?.statePerMonth,\n startDate,\n endDate,\n dateInFocus,\n ),\n [calendarProps?.statePerMonth, startDate, endDate, dateInFocus],\n );\n\n return (\n <Box onKeyDown={onKeyDownHandler}>\n <ControlledPopover\n hideArrow\n restoreFocus={false}\n returnFocus={false}\n zIndex={zIndex}\n appendTo={appendTo}\n renderTrigger={(props) => (\n <Box {...props}>\n <DualTextInput\n autoFocusLeft={autoFocus}\n onEsc={onEsc}\n onEnter={onEnter}\n onBlur={onBlur}\n disabled={disabled}\n separatorIcon={stenaArrowRight}\n typeLeft={\"date\"}\n typeRight={\"date\"}\n placeholderLeft={\"Start date\"}\n placeholderRight={\"End date\"}\n onChangeLeft={inputLeftChangeHandler}\n onChangeRight={inputRightChangeHandler}\n onClickArrowDown={onClickArrowButton}\n onClickCalendar={onClickCalendarButton}\n onFocusLeft={onFocusLeft}\n onFocusRight={onFocusRight}\n onClickLeft={onFocusLeft}\n onClickRight={onFocusRight}\n inputRefLeft={startDateInputRef}\n inputRefRight={endDateInputRef}\n variant={startDateIsAfterEnd ? \"error\" : variant}\n widthLeft={widthLeft}\n widthRight={widthRight}\n minLeft={minDate}\n maxLeft={maxDate}\n minRight={minDate}\n maxRight={maxDate}\n />\n </Box>\n )}\n placement={defaultPopoverPlacement}\n onRequestClose={hideCalendar}\n open={isCalendarVisible}\n >\n <Column>\n <CalendarWithMonthSwitcher\n onClickDay={onClickDay}\n dateInFocus={dateInFocus}\n firstMonthInMonthPicker={firstMonthInMonthPicker}\n numMonthsInMonthPicker={numMonthsInMonthPicker}\n setDateInFocus={setDateInFocus}\n currentPanel={currentPanel}\n setCurrentPanel={setCurrentPanel}\n minDate={minDate}\n maxDate={maxDate}\n {...calendarProps}\n statePerMonth={statePerMonth}\n />\n {currentPanel === \"calendar\" && renderBelowCalendar}\n </Column>\n </ControlledPopover>\n </Box>\n );\n}\n","import * as React from \"react\";\nimport {\n FocusEventHandler,\n RefObject,\n useCallback,\n useRef,\n useState,\n} from \"react\";\nimport {\n LabelledTextInput,\n LabelledTextInputProps,\n TextInput,\n} from \"@stenajs-webui/forms\";\nimport {\n InputMask,\n InputMaskPipe,\n InputMaskProvider,\n useMaskedInput,\n} from \"@stenajs-webui/input-mask\";\nimport { TravelCalendarSizeVariant } from \"./TravelCalendar\";\nimport { exhaustSwitchCase } from \"@stenajs-webui/core\";\nimport { Label } from \"@stenajs-webui/elements\";\nimport { DateTextInputVariant } from \"../types\";\n\nexport interface TravelDateTextInputProps\n extends Pick<\n LabelledTextInputProps,\n | \"readOnly\"\n | \"onChange\"\n | \"onValueChange\"\n | \"value\"\n | \"onFocus\"\n | \"onBlur\"\n | \"placeholder\"\n | \"label\"\n | \"borderRadiusVariant\"\n > {\n ref?: RefObject<HTMLInputElement | null>;\n mask: InputMask | InputMaskProvider;\n pipe?: InputMaskPipe;\n guide?: boolean;\n keepCharPositions?: boolean;\n placeholderChar?: string;\n showMask?: boolean;\n calendarSize: TravelCalendarSizeVariant;\n placeholderWhenBlurred: string | undefined;\n valueWhenBlurred: string | undefined;\n variant: DateTextInputVariant;\n autoFocus?: boolean;\n}\n\nexport const TravelDateTextInput: React.FC<TravelDateTextInputProps> = ({\n onChange,\n onValueChange,\n readOnly,\n mask,\n ref,\n pipe,\n value,\n guide,\n keepCharPositions,\n placeholderChar,\n showMask,\n calendarSize,\n onFocus,\n onBlur,\n placeholderWhenBlurred,\n placeholder,\n valueWhenBlurred,\n label,\n variant,\n autoFocus,\n ...inputProps\n}) => {\n const localRef = useRef(null);\n const [isFocused, setIsFocused] = useState(false);\n\n const inputRef = ref ?? localRef;\n\n const { onChange: maskedOnChange } = useMaskedInput(\n inputRef,\n onChange,\n onValueChange,\n mask,\n pipe,\n value,\n guide,\n keepCharPositions,\n placeholderChar,\n showMask,\n isFocused,\n );\n\n const onFocusHandler = useCallback<FocusEventHandler<HTMLInputElement>>(\n (ev) => {\n onFocus?.(ev);\n setIsFocused(true);\n },\n [onFocus],\n );\n\n const onBlurHandler = useCallback<FocusEventHandler<HTMLInputElement>>(\n (ev) => {\n onBlur?.(ev);\n setIsFocused(false);\n },\n [onBlur],\n );\n\n const activePlaceholder = isFocused\n ? placeholder\n : (placeholderWhenBlurred ?? placeholder);\n\n if (variant === \"standard\") {\n return (\n <Label text={label ?? \"\"}>\n <TextInput\n {...inputProps}\n autoFocus={autoFocus}\n readOnly={readOnly}\n inputMode={\"numeric\"}\n aria-live={\"polite\"}\n value={(!isFocused ? valueWhenBlurred : value) ?? \"\"}\n inputRef={inputRef}\n placeholder={activePlaceholder}\n onFocus={onFocusHandler}\n onBlur={onBlurHandler}\n onChange={maskedOnChange}\n width={getWidth(calendarSize)}\n alwaysShowPlaceholder\n />\n </Label>\n );\n } else {\n return (\n <LabelledTextInput\n {...inputProps}\n autoFocus={autoFocus}\n readOnly={readOnly}\n inputMode={\"numeric\"}\n label={label}\n aria-live={\"polite\"}\n value={(!isFocused ? valueWhenBlurred : value) ?? \"\"}\n ref={inputRef}\n placeholder={activePlaceholder}\n onFocus={onFocusHandler}\n onBlur={onBlurHandler}\n onChange={maskedOnChange}\n width={getWidth(calendarSize)}\n size={calendarSize === \"large\" ? \"large\" : \"medium\"}\n />\n );\n }\n};\n\nconst getWidth = (calenderSize: TravelCalendarSizeVariant) => {\n // For cell size = 48px, (48*7)/2 = 168px\n switch (calenderSize) {\n case \"smaller\":\n return \"140px\";\n case \"small\":\n return \"154px\";\n case \"medium\":\n return \"168px\";\n case \"large\":\n return \"196px\";\n default:\n return exhaustSwitchCase(calenderSize, \"168px\");\n }\n};\n","export const yearMask = [/[1-2]/, /\\d/, /\\d/, /\\d/];\nexport const monthMask = [/[0-1]/, /\\d/];\nexport const dayMask = [/[0-3]/, /\\d/];\n\nexport const createInputMaskForDateFormat = (\n dateFormat: string, // For example: yyyy-MM-dd\n): Array<string | RegExp> => {\n const l = splitByNewLetter(dateFormat);\n return l.flatMap(tokenToMask);\n};\n\nconst tokenToMask = (token: string): Array<string | RegExp> => {\n switch (token) {\n case \"yyyy\":\n return yearMask;\n case \"mm\":\n case \"MM\":\n return monthMask;\n case \"dd\":\n case \"DD\":\n return dayMask;\n default:\n return [token];\n }\n};\n\nconst splitByNewLetter = (str: string): Array<string> => {\n if (str.length === 0) return [];\n\n const result: Array<string> = [];\n let currentSegment = str[0];\n\n for (let i = 1; i < str.length; i++) {\n if (str[i] !== str[i - 1]) {\n result.push(currentSegment);\n currentSegment = str[i];\n } else {\n currentSegment += str[i];\n }\n }\n\n result.push(currentSegment);\n return result;\n};\n","// Define the supported locales\n\nimport { SupportedLocaleCode } from \"./LocaleMapper\";\n\nexport const getDateFormatForLocaleCode = (\n localeCode: SupportedLocaleCode,\n): string => {\n const formatter = new Intl.DateTimeFormat(localeCode, { dateStyle: \"short\" });\n const parts = formatter.formatToParts(new Date());\n const formatMap: { [key: string]: string } = {\n year: \"yyyy\",\n month: \"MM\",\n day: \"dd\",\n };\n return parts.map((part) => formatMap[part.type] || part.value).join(\"\");\n};\n","import { parse } from \"date-fns\";\nimport { getDateFormatForLocaleCode } from \"./DateFormatProvider\";\nimport {\n fallbackLocaleCode,\n getLocaleForLocaleCode,\n getSupportedLocaleCode,\n SupportedLocaleCode,\n} from \"./LocaleMapper\";\n\ninterface ParseLocalizedDateStringOptions {\n matchLanguage?: boolean;\n fallbackLocaleCode?: SupportedLocaleCode;\n referenceDate?: Date;\n}\n\nexport const parseLocalizedDateString = (\n dateString: string,\n localeCode: string,\n options?: ParseLocalizedDateStringOptions,\n): Date | undefined => {\n const supportedLocaleCode = getSupportedLocaleCode(\n localeCode,\n options?.matchLanguage ?? false,\n options?.fallbackLocaleCode ?? fallbackLocaleCode,\n );\n\n const locale = getLocaleForLocaleCode(supportedLocaleCode);\n\n if (locale == null) {\n return undefined;\n }\n\n const date = parse(\n dateString,\n getDateFormatForLocaleCode(supportedLocaleCode),\n options?.referenceDate ?? new Date(),\n {\n locale: locale,\n },\n );\n\n if (isNaN(date.getTime())) {\n return undefined;\n }\n\n return date;\n};\n","import { format } from \"date-fns\";\nimport { getDateFormatForLocaleCode } from \"./DateFormatProvider\";\nimport {\n fallbackLocaleCode,\n getLocaleForLocaleCode,\n getSupportedLocaleCode,\n SupportedLocaleCode,\n} from \"./LocaleMapper\";\n\nexport interface FormatLocalizedDateOptions {\n matchLanguage?: boolean;\n fallbackLocaleCode?: SupportedLocaleCode;\n}\n\nexport const formatLocalizedDate = (\n date: Date,\n localeCode: string,\n options?: FormatLocalizedDateOptions,\n): string => {\n const l = getSupportedLocaleCode(\n localeCode,\n options?.matchLanguage ?? false,\n options?.fallbackLocaleCode ?? fallbackLocaleCode,\n );\n return format(date, getDateFormatForLocaleCode(l), {\n locale: getLocaleForLocaleCode(l),\n });\n};\n","import { parseLocalizedDateString } from \"./LocalizedDateParser\";\nimport { formatLocalizedDate } from \"./LocalizedDateFormatter\";\n\nexport const reformatLocalizedDateString = (\n dateString: string,\n locale: string,\n): string | undefined => {\n const d = parseLocalizedDateString(dateString, locale);\n if (d == null) {\n return undefined;\n }\n return formatLocalizedDate(d, locale);\n};\n","import * as React from \"react\";\nimport { RefObject, useMemo } from \"react\";\nimport { Row } from \"@stenajs-webui/core\";\nimport { TravelDateTextInput } from \"./TravelDateTextInput\";\nimport { createInputMaskForDateFormat } from \"../../localize-date-format/InputMaskProvider\";\nimport { getDateFormatForLocaleCode } from \"../../localize-date-format/DateFormatProvider\";\nimport { reformatLocalizedDateString } from \"../../localize-date-format/LocalizedDateReformatter\";\nimport { DateTextInputVariant, TravelDateRangeInputValue } from \"../types\";\nimport { TravelCalendarSizeVariant } from \"./TravelCalendar\";\nimport { SupportedLocaleCode } from \"../../localize-date-format/LocaleMapper\";\nimport { isDeviceSameOrLarger, useDeviceSize } from \"@stenajs-webui/panels\";\n\nexport type TravelDateRangeTextInputField = \"startDate\" | \"endDate\";\n\nexport interface TravelDateRangeTextInputFieldsProps {\n value: TravelDateRangeInputValue | undefined;\n onValueChange:\n | ((value: Partial<TravelDateRangeInputValue>) => void)\n | undefined;\n localeCode: SupportedLocaleCode;\n startDateLabel?: string;\n endDateLabel?: string;\n onFocus?: (field: TravelDateRangeTextInputField) => void;\n onBlur?: () => void;\n startDateRef?: RefObject<HTMLInputElement | null>;\n endDateRef?: RefObject<HTMLInputElement | null>;\n calendarSize: TravelCalendarSizeVariant;\n placeholderWhenBlurredStartDate: string | undefined;\n placeholderWhenBlurredEndDate: string | undefined;\n valueWhenBlurredStartDate: string | undefined;\n valueWhenBlurredEndDate: string | undefined;\n variant: DateTextInputVariant;\n readOnlyOnMobile: boolean;\n autoFocusStartDate?: boolean;\n autoFocusEndDate?: boolean;\n}\n\nexport const TravelDateRangeTextInputFields: React.FC<\n TravelDateRangeTextInputFieldsProps\n> = ({\n value,\n onValueChange,\n localeCode,\n startDateLabel = \"From\",\n endDateLabel = \"To\",\n onFocus,\n onBlur,\n calendarSize,\n startDateRef,\n endDateRef,\n placeholderWhenBlurredStartDate,\n placeholderWhenBlurredEndDate,\n valueWhenBlurredStartDate,\n valueWhenBlurredEndDate,\n variant,\n readOnlyOnMobile,\n autoFocusStartDate,\n autoFocusEndDate,\n}) => {\n const { deviceSize } = useDeviceSize();\n\n const readOnly =\n readOnlyOnMobile && !isDeviceSameOrLarger(deviceSize, \"tablet\");\n\n const { mask, placeholder } = useMemo(() => {\n const dateFormatForLocaleCode = getDateFormatForLocaleCode(localeCode);\n return {\n mask: createInputMaskForDateFormat(dateFormatForLocaleCode),\n placeholder: dateFormatForLocaleCode.toLowerCase(),\n };\n }, [localeCode]);\n\n return (\n <Row>\n <TravelDateTextInput\n mask={mask}\n ref={startDateRef}\n value={value?.startDate}\n onValueChange={(v) => {\n onValueChange?.({ startDate: v });\n }}\n onBlur={(ev) => {\n const startDate = reformatLocalizedDateString(\n ev.target.value,\n localeCode,\n );\n if (startDate && startDate !== value?.startDate) {\n onValueChange?.({ startDate });\n }\n onBlur?.();\n }}\n onFocus={() => onFocus?.(\"startDate\")}\n autoFocus={autoFocusStartDate}\n label={startDateLabel}\n borderRadiusVariant={\"onlyLeft\"}\n placeholder={placeholder}\n placeholderWhenBlurred={placeholderWhenBlurredStartDate}\n valueWhenBlurred={valueWhenBlurredStartDate}\n calendarSize={calendarSize}\n variant={variant}\n readOnly={readOnly}\n />\n <TravelDateTextInput\n mask={mask}\n ref={endDateRef}\n value={value?.endDate}\n onValueChange={(v) => onValueChange?.({ endDate: v })}\n onBlur={(ev) => {\n const endDate = reformatLocalizedDateString(\n ev.target.value,\n localeCode,\n );\n if (endDate && endDate !== value?.endDate) {\n onValueChange?.({ endDate });\n }\n onBlur?.();\n }}\n onFocus={() => onFocus?.(\"endDate\")}\n autoFocus={autoFocusEndDate}\n label={endDateLabel}\n borderRadiusVariant={\"onlyRight\"}\n placeholder={placeholder}\n placeholderWhenBlurred={placeholderWhenBlurredEndDate}\n valueWhenBlurred={valueWhenBlurredEndDate}\n calendarSize={calendarSize}\n variant={variant}\n readOnly={readOnly}\n />\n </Row>\n );\n};\n","import { useEventCallback } from \"@stenajs-webui/core\";\nimport { isAfter, isSameMonth, startOfMonth } from \"date-fns\";\nimport { useCallback, useMemo } from \"react\";\n\n/**\n * The visible month of a travel calendar, which the app owns.\n *\n * The calendar never changes the month itself. Everything that would move it,\n * the month buttons, the month picker, the arrow keys and a new value, asks the\n * app instead, through onVisibleMonthChange.\n *\n * The request is always the first day of the month. The arrow keys and the\n * month picker work with other days of the month, and the app should get the\n * same month in the same form whichever way it was reached.\n *\n * A request for the month that is already visible is not made at all. The\n * check is against the month of the last render, so two requests made before\n * the app has passed a month back, such as two quick clicks while it loads,\n * both reach it, the same way two quick edits reach any controlled input\n * that updates later. The second request is left to the app rather than\n * dropped here, since the app may not have taken the first.\n *\n * The month is kept by year and month, so an app that passes a new Date on\n * every render, such as new Date(), does not rebuild the calendar each time.\n */\nexport const useControlledVisibleMonth = (\n visibleMonthValue: Date,\n onVisibleMonthChange: (visibleMonth: Date) => void,\n today: Date,\n) => {\n const year = visibleMonthValue.getFullYear();\n const month = visibleMonthValue.getMonth();\n\n const visibleMonth = useMemo(() => new Date(year, month, 1), [year, month]);\n\n const setVisibleMonth = useEventCallback((requested: Date) => {\n if (isSameMonth(requested, visibleMonth)) {\n return;\n }\n onVisibleMonthChange(startOfMonth(requested));\n });\n\n /**\n * Shows the month of a date the calendar follows, such as a new value, but\n * never moves back before the current month.\n *\n * A date in the month already shown needs no move at all, and is left\n * alone even when that month is in the past. Otherwise choosing a date in a\n * past month the user has browsed to would jump the calendar to the\n * current month, right after the click.\n */\n const setVisibleMonthClamped = useCallback(\n (requested: Date) => {\n if (isSameMonth(requested, visibleMonth)) {\n return;\n }\n setVisibleMonth(\n isSameMonth(requested, today) || isAfter(requested, today)\n ? requested\n : today,\n );\n },\n [setVisibleMonth, today, visibleMonth],\n );\n\n return { visibleMonth, setVisibleMonth, setVisibleMonthClamped };\n};\n","import { format, isSameYear, Locale } from \"date-fns\";\n\nexport const formatDateDescription = (\n date: Date,\n today: Date,\n locale: Locale,\n) => {\n const year = isSameYear(date, today) ? \"\" : \" y\";\n if (locale.code.startsWith(\"en\")) {\n return format(date, \"eee MMM d\" + year, { locale }).replace(\".\", \"\");\n } else {\n return format(date, \"eee d MMM\" + year, { locale }).replace(\".\", \"\");\n }\n};\n\nexport const formatDateDescriptionLong = (\n date: Date,\n today: Date,\n locale: Locale,\n) => {\n const year = isSameYear(date, today) ? \"\" : \" y\";\n if (locale.code.startsWith(\"en\")) {\n return format(date, \"eeee MMMM d\" + year, { locale });\n } else {\n return format(date, \"eeee d MMMM\" + year, { locale });\n }\n};\n","import { isAfter, isSameDay } from \"date-fns\";\n\ntype DateParser = (value: string) => Date | null | undefined;\n\nfunction isInvalidRange(\n startDateStr?: string,\n endDateStr?: string,\n parse?: DateParser,\n): boolean {\n if (!startDateStr || !endDateStr || !parse) return false;\n\n const start = parse(startDateStr);\n const end = parse(endDateStr);\n\n // If parsing fails, don't flip\n if (\n !start ||\n !end ||\n Number.isNaN(start.getTime()) ||\n Number.isNaN(end.getTime())\n ) {\n return false;\n }\n\n if (isSameDay(start, end)) return false;\n\n return isAfter(start, end);\n}\n\n/**\n * Flip `startDate` and `endDate` string fields of an object,\n * based on parsed `Date` values using `parse`.\n */\nexport function flipStringDateRange<\n T extends { startDate?: string; endDate?: string },\n>(obj: T, parse: DateParser): T {\n const { startDate, endDate } = obj;\n\n if (!isInvalidRange(startDate, endDate, parse)) {\n return obj;\n }\n\n return {\n ...obj,\n startDate: endDate,\n endDate: startDate,\n };\n}\n\n/**\n * If the date range is invalid, it resets startDate or endDate to the same value.\n * based on parsed `Date` values using `parse`.\n */\nexport function resetDateRangeIfInvalid<\n T extends { startDate?: string; endDate?: string },\n>(obj: T, parse: DateParser, master: \"startDate\" | \"endDate\"): T {\n const { startDate, endDate } = obj;\n\n if (!isInvalidRange(startDate, endDate, parse)) {\n return obj;\n }\n\n if (master === \"startDate\") {\n return {\n ...obj,\n startDate,\n endDate: startDate,\n };\n } else {\n return {\n ...obj,\n startDate: endDate,\n endDate,\n };\n }\n}\n","import {\n getLocaleForLocaleCode,\n SupportedLocaleCode,\n} from \"../../localize-date-format/LocaleMapper\";\nimport { useCallback, useId, useMemo, useRef, useState } from \"react\";\nimport { useToday } from \"@stenajs-webui/core\";\nimport { useControlledVisibleMonth } from \"./UseControlledVisibleMonth\";\nimport { getDateFormatForLocaleCode } from \"../../localize-date-format/DateFormatProvider\";\nimport { parseLocalizedDateString } from \"../../localize-date-format/LocalizedDateParser\";\nimport {\n intlFormat,\n isAfter,\n isBefore,\n isSameDay,\n isSameMonth,\n} from \"date-fns\";\nimport { getMonthInYear } from \"../../../util/calendar/CalendarDataFactory\";\nimport { formatLocalizedDate } from \"../../localize-date-format/LocalizedDateFormatter\";\nimport { TravelDateRangeInputValue, VisiblePanel } from \"../types\";\nimport { formatDateDescription } from \"../util/DateDescriptionFormatter\";\nimport { convertFirstCharToUpper } from \"../../../util/caseFormat/CaseFormat\";\nimport { resetDateRangeIfInvalid } from \"../util/DateRangeNormalizer\";\n\nexport const useTravelDateRangeInput = (\n value: TravelDateRangeInputValue | undefined,\n onValueChange: ((value: TravelDateRangeInputValue) => void) | undefined,\n localeCode: SupportedLocaleCode,\n languageLocaleCode: SupportedLocaleCode,\n visibleMonthValue: Date,\n onVisibleMonthChange: (visibleMonth: Date) => void,\n fieldLastInFocus: \"startDate\" | \"endDate\" | undefined,\n setFieldLastInFocus: (field: \"startDate\" | \"endDate\" | undefined) => void,\n moveFocusToField: (field: \"startDate\" | \"endDate\") => void,\n hideCalendar: undefined | (() => void),\n) => {\n const languageLocale = getLocaleForLocaleCode(languageLocaleCode);\n\n const calendarId = useId();\n const today = useToday();\n\n const monthPickerButtonRef = useRef<HTMLButtonElement>(null);\n\n const dateFormat = useMemo(\n () => getDateFormatForLocaleCode(localeCode),\n [localeCode],\n );\n\n const selectedStartDate = useMemo(\n () =>\n value?.startDate?.length === dateFormat.length\n ? parseLocalizedDateString(value.startDate, localeCode)\n : undefined,\n [dateFormat.length, localeCode, value?.startDate],\n );\n\n const selectedEndDate = useMemo(\n () =>\n value?.endDate?.length === dateFormat.length\n ? parseLocalizedDateString(value.endDate, localeCode)\n : undefined,\n [dateFormat.length, localeCode, value?.endDate],\n );\n\n const valueWhenBlurredStartDate = useMemo(\n () =>\n selectedStartDate != null\n ? formatDateDescription(selectedStartDate, today, languageLocale)\n : undefined,\n [languageLocale, selectedStartDate, today],\n );\n\n const valueWhenBlurredEndDate = useMemo(\n () =>\n selectedEndDate != null\n ? formatDateDescription(selectedEndDate, today, languageLocale)\n : undefined,\n [languageLocale, selectedEndDate, today],\n );\n\n const { visibleMonth, setVisibleMonth, setVisibleMonthClamped } =\n useControlledVisibleMonth(visibleMonthValue, onVisibleMonthChange, today);\n\n const visibleMonthData = useMemo(\n () =>\n getMonthInYear(\n visibleMonth.getFullYear(),\n visibleMonth.getMonth(),\n languageLocale,\n ),\n [languageLocale, visibleMonth],\n );\n\n const monthPickerButtonLabel = useMemo(() => {\n return convertFirstCharToUpper(\n intlFormat(\n visibleMonth,\n { month: \"long\", year: \"numeric\" },\n { locale: languageLocale.code },\n ),\n );\n }, [languageLocale, visibleMonth]);\n\n const todayIsInVisibleMonth = useMemo(() => {\n return isSameMonth(today, visibleMonth);\n }, [today, visibleMonth]);\n\n const [hoverDate, setHoverDate] = useState<Date | undefined>();\n\n const [visiblePanel, setVisiblePanel] = useState<VisiblePanel>(\"calendar\");\n\n const onValueChangeByInputs = useCallback<\n (value: TravelDateRangeInputValue) => void\n >(\n (v) => {\n const startDate =\n v?.startDate?.length === dateFormat.length\n ? parseLocalizedDateString(v.startDate, localeCode)\n : undefined;\n\n const endDate =\n v?.endDate?.length === dateFormat.length\n ? parseLocalizedDateString(v.endDate, localeCode)\n : undefined;\n\n if (startDate) {\n setVisibleMonthClamped(startDate);\n } else if (endDate) {\n setVisibleMonthClamped(endDate);\n }\n\n onValueChange?.({\n ...value,\n ...v,\n });\n },\n [\n dateFormat.length,\n localeCode,\n onValueChange,\n setVisibleMonthClamped,\n value,\n ],\n );\n\n const isValidDateRange = useMemo(\n () =>\n selectedStartDate && selectedEndDate\n ? isAfter(selectedEndDate, selectedStartDate) ||\n isSameDay(selectedEndDate, selectedStartDate)\n : false,\n [selectedEndDate, selectedStartDate],\n );\n\n const hoverAnchor = useMemo(() => {\n const s =\n fieldLastInFocus === \"startDate\" ? value?.endDate : value?.startDate;\n return s ? parseLocalizedDateString(s, localeCode) : undefined;\n }, [fieldLastInFocus, localeCode, value?.endDate, value?.startDate]);\n\n const hoverHighlightDirection = useMemo<\"left\" | \"right\" | undefined>(() => {\n if (hoverDate && hoverAnchor) {\n if (fieldLastInFocus === \"endDate\") {\n return \"right\";\n }\n if (fieldLastInFocus === \"startDate\") {\n return \"left\";\n }\n }\n return undefined;\n }, [fieldLastInFocus, hoverAnchor, hoverDate]);\n\n const onClickDate = (date: Date) => {\n const isSameMonthAndYear =\n date.getFullYear() === visibleMonth.getFullYear() &&\n date.getMonth() === visibleMonth.getMonth();\n\n if (!isSameMonthAndYear) {\n // User clicked on a date in a different month. Those should not be clickable.\n return;\n }\n\n const callOnValueChange = (\n dateRange: {\n startDate: string | undefined;\n endDate: string | undefined;\n },\n master: \"startDate\" | \"endDate\",\n ) =>\n onValueChange?.(\n resetDateRangeIfInvalid(\n dateRange,\n (s: string) => parseLocalizedDateString(s, localeCode),\n master,\n ),\n );\n\n if (fieldLastInFocus === \"startDate\") {\n callOnValueChange(\n {\n startDate: formatLocalizedDate(date, localeCode),\n endDate: value?.endDate,\n },\n \"startDate\",\n );\n if (value?.endDate) {\n hideCalendar?.();\n setFieldLastInFocus(undefined);\n setHoverDate(undefined);\n } else {\n moveFocusToField(\"endDate\");\n }\n } else if (fieldLastInFocus === \"endDate\") {\n callOnValueChange(\n {\n startDate: value?.startDate,\n endDate: formatLocalizedDate(date, localeCode),\n },\n \"endDate\",\n );\n hideCalendar?.();\n setFieldLastInFocus(undefined);\n setHoverDate(undefined);\n } else if (selectedStartDate && selectedEndDate == null) {\n if (isBefore(date, selectedStartDate)) {\n onValueChange?.({\n startDate: formatLocalizedDate(date, localeCode),\n endDate: undefined,\n });\n moveFocusToField(\"endDate\");\n } else {\n onValueChange?.({\n startDate: value?.startDate,\n endDate: formatLocalizedDate(date, localeCode),\n });\n hideCalendar?.();\n setFieldLastInFocus(undefined);\n setHoverDate(undefined);\n }\n } else {\n callOnValueChange(\n {\n startDate: formatLocalizedDate(date, localeCode),\n endDate: undefined,\n },\n \"startDate\",\n );\n moveFocusToField(\"endDate\");\n }\n };\n\n return {\n onClickDate,\n onValueChangeByInputs,\n isValidDateRange,\n monthPickerButtonRef,\n calendarId,\n monthPickerButtonLabel,\n visiblePanel,\n setVisiblePanel,\n setVisibleMonth,\n visibleMonthData,\n todayIsInVisibleMonth,\n hoverDate,\n setHoverDate,\n hoverAnchor,\n hoverHighlightDirection,\n selectedStartDate,\n selectedEndDate,\n today,\n visibleMonth,\n valueWhenBlurredStartDate,\n valueWhenBlurredEndDate,\n };\n};\n","import * as React from \"react\";\nimport { Ref } from \"react\";\nimport {\n FlatButton,\n SecondaryButton,\n stenaAngleDown,\n stenaAngleUp,\n stenaArrowLeft,\n stenaArrowRight,\n} from \"@stenajs-webui/elements\";\nimport { Row } from \"@stenajs-webui/core\";\nimport { addMonths, subMonths } from \"date-fns\";\nimport { VisiblePanel } from \"../types\";\nimport { TravelCalendarSizeVariant } from \"./TravelCalendar\";\n\nexport interface MonthHeaderProps {\n monthPickerButtonLabel: string;\n nextMonthButtonAriaLabel: string;\n previousMonthButtonAriaLabel: string;\n visiblePanel: VisiblePanel;\n setVisiblePanel: (panel: VisiblePanel) => void;\n monthPickerButtonRef: Ref<HTMLButtonElement>;\n visibleMonth: Date;\n setVisibleMonth: (date: Date) => void;\n prevMonthDisabled?: (visibleMonth: Date) => boolean;\n nextMonthDisabled?: (visibleMonth: Date) => boolean;\n calendarSize: TravelCalendarSizeVariant;\n previousMonthButtonTestId?: string;\n nextMonthButtonTestId?: string;\n}\n\nexport const MonthHeader: React.FC<MonthHeaderProps> = ({\n previousMonthButtonAriaLabel,\n nextMonthButtonAriaLabel,\n monthPickerButtonLabel,\n visiblePanel,\n setVisiblePanel,\n monthPickerButtonRef,\n setVisibleMonth,\n visibleMonth,\n prevMonthDisabled,\n nextMonthDisabled,\n calendarSize,\n previousMonthButtonTestId,\n nextMonthButtonTestId,\n}) => {\n const size =\n calendarSize === \"smaller\" || calendarSize === \"small\" ? \"medium\" : \"large\";\n\n return (\n <Row alignSelf={\"center\"} justifyContent={\"space-between\"} width={\"100%\"}>\n <FlatButton\n aria-live={\"polite\"}\n label={monthPickerButtonLabel}\n rightIcon={visiblePanel === \"calendar\" ? stenaAngleDown : stenaAngleUp}\n onClick={() =>\n setVisiblePanel(\n visiblePanel === \"calendar\" ? \"month-picker\" : \"calendar\",\n )\n }\n ref={monthPickerButtonRef}\n size={size}\n />\n <Row alignItems={\"center\"} gap={2}>\n <SecondaryButton\n leftIcon={stenaArrowLeft}\n onClick={() => setVisibleMonth(subMonths(visibleMonth, 1))}\n disabled={prevMonthDisabled?.(visibleMonth)}\n aria-label={previousMonthButtonAriaLabel}\n size={size}\n data-testid={previousMonthButtonTestId}\n />\n <SecondaryButton\n leftIcon={stenaArrowRight}\n onClick={() => setVisibleMonth(addMonths(visibleMonth, 1))}\n disabled={nextMonthDisabled?.(visibleMonth)}\n aria-label={nextMonthButtonAriaLabel}\n size={size}\n data-testid={nextMonthButtonTestId}\n />\n </Row>\n </Row>\n );\n};\n","import {\n isAfter,\n isBefore,\n isSameDay,\n isWithinInterval,\n max,\n min,\n} from \"date-fns\";\n\nconst rangeBgColor = \"var(--selection-range-background-color)\";\n\ninterface CellBackgroundColors {\n left: string;\n right: string;\n}\n\nexport const getCellBackgroundColors = (\n date: Date,\n selectedStartDate: Date | undefined,\n selectedEndDate: Date | undefined,\n hoverHighlightDirection: \"left\" | \"right\" | undefined,\n hoverDate: Date | undefined,\n hoverAnchor: Date | undefined,\n dayIsInMonth: boolean,\n isValidDateRange: boolean,\n): CellBackgroundColors => {\n if (!dayIsInMonth) {\n return {\n left: \"transparent\",\n right: \"transparent\",\n };\n }\n\n if (selectedStartDate && selectedEndDate && !isValidDateRange) {\n return {\n left: \"transparent\",\n right: \"transparent\",\n };\n }\n\n if (hoverDate && hoverAnchor && hoverHighlightDirection) {\n // User is hovering over calendar, with a range, show highlight instead of selection.\n return getCellBackgroundHoverRangeHighlight(\n date,\n hoverHighlightDirection,\n hoverDate,\n hoverAnchor,\n );\n }\n\n if (hoverDate && !isValidDateRange) {\n // Only hide background when hovering if there's no valid range selected\n return {\n left: \"transparent\",\n right: \"transparent\",\n };\n }\n\n /**\n * Reaching this point with a hover date means the range is valid, and a\n * valid range is drawn from the selection alone. Hover ranges are drawn by\n * getCellBackgroundHoverRangeHighlight above, so no hover date is passed on.\n */\n return getCellBackgroundHighlight(\n date,\n selectedStartDate,\n selectedEndDate,\n undefined,\n );\n};\n\nexport const getCellBackgroundHighlight = (\n date: Date,\n highlightStartDate: Date | undefined,\n highlightEndDate: Date | undefined,\n hoverDate: Date | undefined,\n): CellBackgroundColors => {\n if (\n highlightStartDate &&\n highlightEndDate &&\n isSameDay(highlightStartDate, highlightEndDate)\n ) {\n return {\n left: \"transparent\",\n right: \"transparent\",\n };\n }\n\n const isInHighlightRange =\n highlightStartDate && highlightEndDate\n ? isAfter(date, highlightStartDate) &&\n isBefore(date, highlightEndDate) &&\n !isSameDay(date, highlightStartDate) &&\n !isSameDay(date, highlightEndDate)\n : false;\n\n if (isInHighlightRange) {\n return {\n left: rangeBgColor,\n right: rangeBgColor,\n };\n }\n\n if (highlightStartDate && highlightEndDate) {\n if (isSameDay(date, highlightStartDate)) {\n return {\n left: \"transparent\",\n right: rangeBgColor,\n };\n }\n\n if (isSameDay(date, highlightEndDate)) {\n return {\n left: rangeBgColor,\n right: \"transparent\",\n };\n }\n\n return {\n left: \"transparent\",\n right: \"transparent\",\n };\n }\n\n if (\n highlightStartDate &&\n hoverDate &&\n isAfter(hoverDate, highlightStartDate)\n ) {\n if (isSameDay(date, highlightStartDate)) {\n return {\n left: \"transparent\",\n right: rangeBgColor,\n };\n }\n\n if (isSameDay(date, hoverDate)) {\n return {\n left: rangeBgColor,\n right: \"transparent\",\n };\n }\n }\n\n return {\n left: \"transparent\",\n right: \"transparent\",\n };\n};\n\nexport const getCellBackgroundHoverRangeHighlight = (\n date: Date,\n hoverHighlightDirection: \"left\" | \"right\",\n hoverDate: Date,\n hoverAnchor: Date,\n): CellBackgroundColors => {\n const flipLeftRight = isAfter(hoverDate, hoverAnchor);\n\n const isInHighlightRange = isWithinInterval(date, {\n start: min([hoverDate, hoverAnchor]),\n end: max([hoverDate, hoverAnchor]),\n });\n\n const dateIsHoverDate = isSameDay(date, hoverDate);\n const dateIsHoverAnchor = isSameDay(date, hoverAnchor);\n\n if (hoverHighlightDirection === \"right\" && isBefore(hoverDate, hoverAnchor)) {\n // Hovering with start date as anchor, hover range is invalid.\n return {\n left: \"transparent\",\n right: \"transparent\",\n };\n }\n\n if (hoverHighlightDirection === \"left\" && isAfter(hoverDate, hoverAnchor)) {\n // Hovering with end date as anchor, hover range is invalid.\n return {\n left: \"transparent\",\n right: \"transparent\",\n };\n }\n\n if (dateIsHoverDate && dateIsHoverAnchor) {\n return {\n left: \"transparent\",\n right: \"transparent\",\n };\n }\n\n if (dateIsHoverDate) {\n return flip(flipLeftRight, {\n left: \"transparent\",\n right: rangeBgColor,\n });\n }\n\n if (dateIsHoverAnchor) {\n return flip(flipLeftRight, {\n left: rangeBgColor,\n right: \"transparent\",\n });\n }\n\n if (isInHighlightRange) {\n return {\n left: rangeBgColor,\n right: rangeBgColor,\n };\n }\n\n return {\n left: \"transparent\",\n right: \"transparent\",\n };\n};\n\nconst flip = <T>(\n flip: boolean,\n { left, right }: { left: T; right: T },\n): { left: T; right: T } => {\n if (flip) {\n return {\n left: right,\n right: left,\n };\n } else {\n return { left, right };\n }\n};\n","import { addDays, addMonths, startOfWeek, subDays, subMonths } from \"date-fns\";\n\nexport const getDateToFocusOn = (\n currentDate: Date,\n key: string,\n): Date | undefined => {\n switch (key) {\n case \"PageUp\":\n return subMonths(currentDate, 1);\n case \"PageDown\":\n return addMonths(currentDate, 1);\n case \"Home\":\n return startOfWeek(currentDate);\n case \"End\":\n return addDays(startOfWeek(currentDate), 6);\n case \"ArrowLeft\":\n return subDays(currentDate, 1);\n case \"ArrowUp\":\n return subDays(currentDate, 7);\n case \"ArrowRight\":\n return addDays(currentDate, 1);\n case \"ArrowDown\":\n return addDays(currentDate, 7);\n default:\n return undefined;\n }\n};\n","import { addHours, format } from \"date-fns\";\nimport { DateFormats } from \"../../../util/date/DateFormats\";\n\nexport const createDayId = (date: Date, calendarId: string) => {\n return format(addHours(date, 12), DateFormats.fullDate) + calendarId;\n};\n","import * as React from \"react\";\nimport { Box, Row } from \"@stenajs-webui/core\";\nimport { TravelCalendarSizeVariant } from \"./TravelCalendar\";\nimport styles from \"./TravelDateCellBackground.module.css\";\nimport cx from \"classnames\";\n\nexport interface TravelDateCellBackgroundProps {\n calendarSize: TravelCalendarSizeVariant;\n bgColorLeft: string;\n bgColorRight: string;\n}\n\nexport const TravelDateCellBackground: React.FC<\n TravelDateCellBackgroundProps\n> = ({ calendarSize, bgColorLeft, bgColorRight }) => {\n return (\n <Row>\n <Box\n className={cx(styles.travelDateCellBackground, styles[calendarSize])}\n background={bgColorLeft}\n />\n <Box\n className={cx(styles.travelDateCellBackground, styles[calendarSize])}\n background={bgColorRight}\n />\n </Row>\n );\n};\n","import * as React from \"react\";\nimport { CSSProperties, KeyboardEventHandler, useCallback } from \"react\";\nimport { Text } from \"@stenajs-webui/core\";\nimport { DayData } from \"../../../util/calendar/CalendarDataFactory\";\nimport styles from \"./TravelDateCell.module.css\";\nimport cx from \"classnames\";\nimport { isAfter, isSameDay, isSameMonth } from \"date-fns\";\nimport { getCellBackgroundColors } from \"../util/CellBgColors\";\nimport { getDateToFocusOn } from \"../util/KeyboardNavigation\";\nimport { createDayId } from \"../util/DayIdGenerator\";\nimport { cssColor } from \"@stenajs-webui/theme\";\nimport { TravelCalendarSizeVariant } from \"./TravelCalendar\";\nimport { TravelDateCellBackground } from \"./TravelDateCellBackground\";\nimport { RenderTravelDateContent, TravelDateContentContext } from \"../types\";\n\nexport interface TravelDateCellProps {\n onClick: (date: Date) => void;\n day: DayData;\n visibleMonth: Date;\n selectedStartDate: Date | undefined;\n selectedEndDate: Date | undefined;\n isValidDateRange: boolean;\n onChangeVisibleMonth: (visibleMonth: Date) => void;\n /** Focuses the date once its month is shown, which the app decides. */\n focusDateWhenShown: (date: Date) => void;\n onStartHover: (date: Date) => void;\n onEndHover: (date: Date) => void;\n /** Current date that the mouse is hovering over. */\n hoverDate: Date | undefined;\n /** The other date to show range highlight between, when user hovers the mouse. */\n hoverAnchor: Date | undefined;\n today: Date;\n /** The one date in the grid that carries the tab stop, if any. */\n focusableDate: Date | undefined;\n calendarId: string;\n isDateDisabled?: (date: Date) => boolean;\n dateTestId?: (date: Date) => string | undefined;\n size: TravelCalendarSizeVariant;\n /**\n * If \"left\", only hovering on earlier dates will create a highlight. If undefined, no range will be highlighted.\n */\n hoverHighlightDirection: \"left\" | \"right\" | undefined;\n renderDateContent?: RenderTravelDateContent;\n}\n\nexport const TravelDateCell: React.FC<TravelDateCellProps> = ({\n onClick,\n visibleMonth,\n onChangeVisibleMonth,\n focusDateWhenShown,\n day,\n isValidDateRange,\n selectedStartDate,\n selectedEndDate,\n onStartHover,\n onEndHover,\n hoverDate,\n hoverAnchor,\n today,\n focusableDate,\n calendarId,\n isDateDisabled,\n size,\n dateTestId,\n hoverHighlightDirection,\n renderDateContent,\n}) => {\n const onKeyDown = useCallback<KeyboardEventHandler<HTMLTableDataCellElement>>(\n async (e) => {\n const nextDate = getDateToFocusOn(day.date, e.key);\n const nextDateDisabled =\n (nextDate && isDateDisabled?.(nextDate)) ?? false;\n\n if (nextDate && !nextDateDisabled) {\n onStartHover(nextDate);\n /*\n * Compared with the visible month, not with this cell's own date. The\n * days of the adjacent months that fill out the grid can hold the\n * focus too, and a move from one of them back into the visible month\n * needs no other month: the date is already there.\n */\n if (isSameMonth(nextDate, visibleMonth)) {\n document.getElementById(createDayId(nextDate, calendarId))?.focus();\n } else {\n focusDateWhenShown(nextDate);\n onChangeVisibleMonth(nextDate);\n }\n }\n\n if (e.key === \"Enter\" || e.code === \"Space\") {\n onClick(day.date);\n }\n },\n [\n calendarId,\n day.date,\n focusDateWhenShown,\n isDateDisabled,\n onChangeVisibleMonth,\n onClick,\n onStartHover,\n visibleMonth,\n ],\n );\n\n const dayIsInMonth = day.month === visibleMonth.getMonth();\n\n const disabled = isDateDisabled?.(day.date) ?? false;\n\n const hoverRightOfAnchor =\n hoverDate && hoverAnchor ? isAfter(hoverDate, hoverAnchor) : false;\n\n /**\n * A hover range is only drawn while a range is being edited, which is what\n * hoverHighlightDirection means. The selection is rendered whenever it is\n * not, so that hovering the calendar does not blank out the selected dates.\n */\n const isShowingHoverRange = Boolean(\n hoverDate && hoverAnchor && hoverHighlightDirection,\n );\n\n const isHoverRangeStart =\n hoverDate && hoverAnchor && hoverHighlightDirection\n ? isSameDay(hoverRightOfAnchor ? hoverAnchor : hoverDate, day.date)\n : false;\n\n const isHoverRangeEnd =\n hoverDate && hoverAnchor && hoverHighlightDirection\n ? isSameDay(hoverRightOfAnchor ? hoverDate : hoverAnchor, day.date)\n : false;\n\n const isSelectionStart =\n selectedStartDate && !isShowingHoverRange\n ? isSameDay(selectedStartDate, day.date)\n : false;\n\n const isSelectionEnd =\n selectedEndDate && !isShowingHoverRange\n ? isSameDay(selectedEndDate, day.date)\n : false;\n\n const isToday = isSameDay(day.date, today);\n\n const bgColors = getCellBackgroundColors(\n day.date,\n selectedStartDate,\n selectedEndDate,\n hoverHighlightDirection,\n hoverDate,\n hoverAnchor,\n dayIsInMonth,\n isValidDateRange,\n );\n\n const isHovered = hoverDate ? isSameDay(hoverDate, day.date) : false;\n\n const isDrawnAsSelectionStart = isSelectionStart || isHoverRangeStart;\n const isDrawnAsSelectionEnd = isSelectionEnd || isHoverRangeEnd;\n\n /**\n * Both halves of the band are filled only between the ends of the range as\n * it is drawn, so this follows a hovered range the same way the band does.\n */\n const isInRange =\n bgColors.left !== \"transparent\" && bgColors.right !== \"transparent\";\n\n const defaultContent = (\n <Text variant={\"bold\"} color={\"var(--travel-calendar-date-content-color)\"}>\n {day.dayOfMonth}\n </Text>\n );\n\n const defaultTodayMarker = isToday ? (\n <div className={styles.todayDot} />\n ) : null;\n\n /**\n * Only the days of the visible month have content. The render function is\n * not called for the others at all, rather than called and thrown away,\n * since it runs for every cell on every hover.\n */\n const content = !dayIsInMonth ? null : renderDateContent ? (\n renderDateContent({\n date: day.date,\n dayOfMonth: day.dayOfMonth,\n size,\n isToday,\n isDisabled: disabled,\n isSelectionStart: isDrawnAsSelectionStart,\n isSelectionEnd: isDrawnAsSelectionEnd,\n isInRange,\n isHovered,\n defaultContent,\n defaultTodayMarker,\n } satisfies TravelDateContentContext)\n ) : (\n <>\n {defaultContent}\n {defaultTodayMarker && (\n <div className={styles.defaultTodayMarkerPosition}>\n {defaultTodayMarker}\n </div>\n )}\n </>\n );\n\n /**\n * The cursor belongs on the cell, since the cell is the whole hit area. The\n * content inside it does not cover the gap that the cell keeps between the\n * rows, and the days of the adjacent months are not interactive at all.\n */\n const cursorClassName = !dayIsInMonth\n ? undefined\n : disabled\n ? styles.disabled\n : styles.clickable;\n\n return (\n <td\n className={cx(styles.travelDateCell, styles[size], cursorClassName)}\n onClick={disabled ? undefined : () => dayIsInMonth && onClick(day.date)}\n onMouseOver={\n disabled ? undefined : () => dayIsInMonth && onStartHover(day.date)\n }\n onMouseOut={\n disabled ? undefined : () => dayIsInMonth && onEndHover(day.date)\n }\n tabIndex={\n disabled\n ? undefined\n : focusableDate && isSameDay(day.date, focusableDate)\n ? 0\n : -1\n }\n id={disabled ? undefined : createDayId(day.date, calendarId)}\n onKeyDown={disabled ? undefined : onKeyDown}\n {...(disabled\n ? undefined\n : { \"aria-selected\": isSelectionStart || isSelectionEnd })}\n aria-current={isToday && dayIsInMonth ? \"date\" : undefined}\n data-testid={dateTestId?.(day.date)}\n >\n <div className={styles.outline} />\n\n <TravelDateCellBackground\n calendarSize={size}\n bgColorLeft={bgColors.left}\n bgColorRight={bgColors.right}\n />\n\n {dayIsInMonth && (\n <div\n className={cx(\n styles.contentWrapper,\n selectedStartDate ? styles.startSelected : undefined,\n selectedEndDate ? styles.endSelected : undefined,\n isHovered ? styles.hover : undefined,\n isDrawnAsSelectionStart && styles.isSelectionStart,\n isDrawnAsSelectionEnd && styles.isSelectionEnd,\n )}\n style={disabled ? disabledContentStyle : undefined}\n >\n {content}\n </div>\n )}\n </td>\n );\n};\n\n/**\n * Set on the element rather than in the stylesheet, so that it wins over the\n * colour of any state, the same way the day number's own colour used to. A\n * disabled date that is still the selected one keeps its grey number on the\n * filled background.\n */\nconst disabledContentStyle = {\n \"--travel-calendar-date-content-color\": cssColor(\"--lhds-color-ui-500\"),\n} as CSSProperties;\n","import * as React from \"react\";\nimport {\n Dispatch,\n SetStateAction,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n} from \"react\";\nimport {\n DayData,\n MonthData,\n WeekData,\n} from \"../../../util/calendar/CalendarDataFactory\";\nimport { Text } from \"@stenajs-webui/core\";\nimport { TravelDateCell } from \"./TravelDateCell\";\nimport { isSameDay, isSameMonth } from \"date-fns\";\nimport styles from \"./TravelCalendar.module.css\";\nimport { RenderTravelDateContent } from \"../types\";\nimport { createDayId } from \"../util/DayIdGenerator\";\n\nexport type TravelCalendarSizeVariant =\n | \"smaller\"\n | \"small\"\n | \"medium\"\n | \"large\";\n\nexport interface TravelCalendarProps {\n visibleMonthData: MonthData;\n onClickDate: (date: Date) => void;\n visibleMonth: Date;\n setVisibleMonth: (visibleMonth: Date) => void;\n isValidDateRange: boolean;\n setHoverDate: Dispatch<SetStateAction<Date | undefined>>;\n selectedStartDate: Date | undefined;\n selectedEndDate: Date | undefined;\n /** The date that the mouse is hovering over. */\n hoverDate: Date | undefined;\n /**\n * The other date to show range highlight between, when the user hovers the mouse.\n * If not set, only hovered date will be highlighted, not range.\n * */\n hoverAnchor: Date | undefined;\n today: Date;\n isDateDisabled?: (date: Date) => boolean;\n /**\n * Renders the content of each date in the calendar, in place of the day\n * number. The cell around it, with the selection, focus and keyboard\n * navigation, stays the calendar's. See RenderTravelDateContent.\n */\n renderDateContent?: RenderTravelDateContent;\n dateTestId?: (date: Date) => string | undefined;\n calendarId: string;\n size?: TravelCalendarSizeVariant;\n multiSelectable: boolean;\n /**\n * If \"left\", only hovering on earlier dates will create a highlight. If undefined, no range will be highlighted.\n */\n hoverHighlightDirection: \"left\" | \"right\" | undefined;\n /**\n * Accessible name of the calendar grid. Set this when there is no visible\n * label next to the calendar, such as a text input or a heading.\n */\n ariaLabel?: string;\n}\n\nexport const TravelCalendar: React.FC<TravelCalendarProps> = ({\n visibleMonthData,\n onClickDate,\n setHoverDate,\n setVisibleMonth,\n visibleMonth,\n isValidDateRange,\n selectedStartDate,\n selectedEndDate,\n hoverDate,\n hoverAnchor,\n today,\n calendarId,\n isDateDisabled,\n renderDateContent,\n size = \"medium\",\n multiSelectable,\n dateTestId,\n hoverHighlightDirection,\n ariaLabel,\n}) => {\n /**\n * A date the arrow keys moved to in another month, waiting for that month to\n * be shown so that it can take the focus.\n *\n * The app owns the visible month, so the date only exists once the app has\n * passed the new month back, which may not be right away: it may wait for\n * data, or keep the month in the URL. So the focus waits for the month to\n * change, rather than for a fixed time.\n *\n * If the month changes to another one instead, the request is dropped, so a\n * later visit to its month does not take the focus by surprise. Nor does it\n * take the focus from anywhere else: if the user has moved on, to the month\n * buttons for example, by the time the month is shown, the focus stays\n * there. It only moves while it is still in the grid, or was lost when its\n * cell went away with the old month.\n */\n const pendingFocusDate = useRef<Date | undefined>(undefined);\n const gridRef = useRef<HTMLTableElement>(null);\n\n const focusDateWhenShown = useCallback((date: Date) => {\n pendingFocusDate.current = date;\n }, []);\n\n useEffect(() => {\n const date = pendingFocusDate.current;\n if (!date) {\n return;\n }\n pendingFocusDate.current = undefined;\n if (!isSameMonth(date, visibleMonth)) {\n return;\n }\n const focused = document.activeElement;\n const focusIsFree =\n focused == null ||\n focused === document.body ||\n Boolean(gridRef.current?.contains(focused));\n if (focusIsFree) {\n document.getElementById(createDayId(date, calendarId))?.focus();\n }\n }, [visibleMonth, calendarId]);\n\n /**\n * One cell in the grid carries the tab stop: the selected date, or today, or\n * the first day of the visible month, whichever of those comes first among\n * the days that are not disabled. A disabled day cannot be focused, so it\n * never takes the stop, and a month of nothing but disabled days has none.\n *\n * This is decided here, where the whole month is known. A cell on its own\n * cannot tell whether some other cell has a better claim.\n */\n const focusableDate = useMemo(() => {\n const daysInVisibleMonth = visibleMonthData.weeks\n .flatMap((week) => week.days)\n .filter((day) => day.month === visibleMonth.getMonth())\n .map((day) => day.date);\n\n const candidates = [selectedStartDate, today, ...daysInVisibleMonth].filter(\n (date): date is Date =>\n date != null &&\n isSameMonth(date, visibleMonth) &&\n !isDateDisabled?.(date),\n );\n\n return candidates[0];\n }, [\n isDateDisabled,\n selectedStartDate,\n today,\n visibleMonth,\n visibleMonthData.weeks,\n ]);\n\n return (\n <table\n ref={gridRef}\n className={styles.travelCalendar}\n role=\"grid\"\n aria-label={ariaLabel}\n {...(multiSelectable ? { \"aria-multiselectable\": true } : undefined)}\n >\n <tbody>\n <tr>\n {visibleMonthData.weeks[0].days.map((day: DayData) => (\n <th key={day.name} abbr={day.fullName}>\n <Text>{day.name}</Text>\n </th>\n ))}\n </tr>\n {visibleMonthData.weeks.map((week: WeekData) => (\n <React.Fragment key={week.weekNumber}>\n <tr key={week.weekNumber}>\n {week.days.map((day) => (\n <TravelDateCell\n size={size}\n onClick={(d) => onClickDate(d)}\n key={day.dateString}\n visibleMonth={visibleMonth}\n onChangeVisibleMonth={setVisibleMonth}\n focusDateWhenShown={focusDateWhenShown}\n isValidDateRange={isValidDateRange}\n day={day}\n onStartHover={(d) => setHoverDate(d)}\n onEndHover={(d) =>\n setHoverDate((p) => (p && isSameDay(p, d) ? undefined : p))\n }\n selectedStartDate={selectedStartDate}\n selectedEndDate={selectedEndDate}\n hoverDate={hoverDate}\n hoverAnchor={hoverAnchor}\n today={today}\n focusableDate={focusableDate}\n calendarId={calendarId}\n isDateDisabled={isDateDisabled}\n renderDateContent={renderDateContent}\n dateTestId={dateTestId}\n hoverHighlightDirection={hoverHighlightDirection}\n />\n ))}\n </tr>\n </React.Fragment>\n ))}\n </tbody>\n </table>\n );\n};\n","import * as React from \"react\";\nimport {\n KeyboardEventHandler,\n ReactNode,\n useCallback,\n useLayoutEffect,\n useRef,\n useState,\n} from \"react\";\nimport {\n Box,\n Heading,\n HeadingVariant,\n useOnClickOutside,\n} from \"@stenajs-webui/core\";\nimport { ValueAndOnValueChangeProps } from \"@stenajs-webui/forms\";\nimport {\n TravelDateRangeTextInputField,\n TravelDateRangeTextInputFields,\n} from \"../../../features/travel-calendar/components/TravelDateRangeTextInputFields\";\nimport { CardBody } from \"@stenajs-webui/elements\";\nimport { MonthPicker } from \"../../../features/month-picker/MonthPicker\";\nimport { useTravelDateRangeInput } from \"../../../features/travel-calendar/hooks/UseTravelDateRangeInput\";\nimport { MonthHeader } from \"../../../features/travel-calendar/components/MonthHeader\";\nimport {\n TravelCalendar,\n TravelCalendarSizeVariant,\n} from \"../../../features/travel-calendar/components/TravelCalendar\";\nimport {\n DateTextInputVariant,\n TravelDateRangeInputValue,\n RenderTravelDateContent,\n} from \"../../../features/travel-calendar/types\";\nimport styles from \"./TravelDateRangeInput.module.css\";\nimport cx from \"classnames\";\nimport { SupportedLocaleCode } from \"../../../features/localize-date-format/LocaleMapper\";\nimport { VisibleMonthState } from \"../../../features/travel-calendar/hooks/UseVisibleMonthState\";\n\nexport interface RenderBelowCalendarArgs {\n hideCalendar: () => void;\n}\n\nexport interface TravelDateRangeInputProps\n extends ValueAndOnValueChangeProps<TravelDateRangeInputValue>,\n VisibleMonthState {\n localeCode?: SupportedLocaleCode;\n languageLocaleCode?: SupportedLocaleCode;\n startDateLabel?: string;\n endDateLabel?: string;\n previousMonthButtonAriaLabel?: string;\n nextMonthButtonAriaLabel?: string;\n heading?: string;\n headingLevel?: HeadingVariant;\n firstMonthInMonthPicker?: Date;\n numMonthsInMonthPicker?: number;\n isDateDisabled?: (date: Date) => boolean;\n /**\n * Renders the content of each date in the calendar, in place of the day\n * number. The cell around it, with the selection, focus and keyboard\n * navigation, stays the calendar's. See RenderTravelDateContent.\n */\n renderDateContent?: RenderTravelDateContent;\n prevMonthDisabled?: (visibleMonth: Date) => boolean;\n nextMonthDisabled?: (visibleMonth: Date) => boolean;\n zIndex?: number;\n zIndexWhenClosed?: number;\n onHideCalendar?: () => void;\n renderBelowCalendar?: (args: RenderBelowCalendarArgs) => ReactNode;\n size?: TravelCalendarSizeVariant;\n dateTestId?: (date: Date) => string | undefined;\n previousMonthButtonTestId?: string;\n nextMonthButtonTestId?: string;\n placeholderWhenBlurredStartDate?: string;\n placeholderWhenBlurredEndDate?: string;\n textInputVariant?: DateTextInputVariant;\n autoFocusStartDate?: boolean;\n autoFocusEndDate?: boolean;\n}\n\nexport const TravelDateRangeInput: React.FC<TravelDateRangeInputProps> = ({\n value,\n onValueChange,\n startDateLabel,\n endDateLabel,\n localeCode = \"sv\",\n languageLocaleCode = localeCode,\n visibleMonth: visibleMonthValue,\n previousMonthButtonAriaLabel = \"Previous month\",\n nextMonthButtonAriaLabel = \"Next month\",\n placeholderWhenBlurredStartDate,\n placeholderWhenBlurredEndDate,\n heading,\n headingLevel,\n numMonthsInMonthPicker = 12,\n isDateDisabled,\n renderDateContent,\n onVisibleMonthChange,\n prevMonthDisabled,\n nextMonthDisabled,\n firstMonthInMonthPicker = new Date(),\n zIndex = 1000,\n zIndexWhenClosed,\n onHideCalendar,\n renderBelowCalendar,\n size = \"medium\",\n dateTestId,\n previousMonthButtonTestId,\n nextMonthButtonTestId,\n textInputVariant = \"standard\",\n autoFocusStartDate,\n autoFocusEndDate,\n}) => {\n const [calendarOpen, setCalendarOpen] = useState(false);\n const [calendarInDom, setCalendarInDom] = useState(false);\n const [boxSize, setBoxSize] = useState<{ height: number; width: number }>({\n // Sane defaults, this will be updated with actual data from DOM.\n width: 336,\n height: 66,\n });\n\n const [fieldLastInFocus, setFieldLastInFocus] = useState<\n \"startDate\" | \"endDate\" | undefined\n >(undefined);\n\n const startDateRef = useRef<HTMLInputElement>(null);\n const endDateRef = useRef<HTMLInputElement>(null);\n\n const moveFocusToField = (field: \"startDate\" | \"endDate\") => {\n if (field === \"startDate\") {\n startDateRef.current?.focus();\n } else if (field === \"endDate\") {\n endDateRef.current?.focus();\n }\n };\n\n const inputFieldsHeight = size === \"large\" ? \"8.8rem\" : \"6.6rem\";\n\n const calendarOpenRef = useRef(false);\n\n const onInputFocus = useCallback((field: TravelDateRangeTextInputField) => {\n setFieldLastInFocus(field);\n calendarOpenRef.current = true;\n setCalendarInDom(true);\n setTimeout(() => {\n setCalendarOpen(true);\n }, 10);\n }, []);\n\n const hideCalendar = useCallback(() => {\n if (!calendarInDom) {\n return;\n }\n\n setCalendarOpen(false);\n calendarOpenRef.current = false;\n onHideCalendar?.();\n\n setTimeout(() => {\n if (!calendarOpenRef.current) {\n setCalendarInDom(false);\n }\n }, 120);\n }, [calendarInDom, onHideCalendar]);\n\n const ref = useRef<HTMLDivElement>(null);\n const sizeSourceRef = useRef<HTMLDivElement>(null);\n\n useOnClickOutside(ref, hideCalendar);\n\n useLayoutEffect(() => {\n const width = sizeSourceRef.current?.offsetWidth;\n const height = sizeSourceRef.current?.offsetHeight;\n if (width != null && height != null) {\n if (boxSize.height !== height || boxSize.width !== width) {\n setBoxSize({ width, height });\n }\n }\n }, [boxSize.height, boxSize.width]);\n\n const inputProps = useTravelDateRangeInput(\n value,\n onValueChange,\n localeCode,\n languageLocaleCode,\n visibleMonthValue,\n onVisibleMonthChange,\n fieldLastInFocus,\n setFieldLastInFocus,\n moveFocusToField,\n hideCalendar,\n );\n\n const {\n visiblePanel,\n visibleMonth,\n onValueChangeByInputs,\n setVisibleMonth,\n setVisiblePanel,\n monthPickerButtonRef,\n } = inputProps;\n\n const onKeyDown = useCallback<KeyboardEventHandler<HTMLDivElement>>(\n (ev) => {\n if (ev.key === \"Escape\") {\n hideCalendar();\n }\n },\n [hideCalendar],\n );\n\n return (\n <Box\n position={\"relative\"}\n className={styles.travelDateRangeInput}\n ref={ref}\n onKeyDown={onKeyDown}\n height={boxSize.height}\n width={boxSize.width}\n >\n <Box\n position={\"absolute\"}\n ref={sizeSourceRef}\n zIndex={calendarInDom ? zIndex : zIndexWhenClosed}\n >\n <TravelDateRangeTextInputFields\n {...inputProps}\n value={value}\n onValueChange={onValueChangeByInputs}\n startDateRef={startDateRef}\n endDateRef={endDateRef}\n localeCode={localeCode}\n startDateLabel={startDateLabel}\n endDateLabel={endDateLabel}\n onFocus={onInputFocus}\n calendarSize={size}\n placeholderWhenBlurredStartDate={placeholderWhenBlurredStartDate}\n placeholderWhenBlurredEndDate={placeholderWhenBlurredEndDate}\n variant={textInputVariant}\n autoFocusStartDate={autoFocusStartDate}\n autoFocusEndDate={autoFocusEndDate}\n /*\n When focusing on the input, the calendar popover appears.\n But the keyboard appears as well and covers the calendar.\n\n readOnly disables input and hides the keyboard on mobile.\n This enables the user to click on input to select it, then click in the calendar.\n\n This is not needed for TravelDate*Calendar, since the calendar is always visible.\n */\n readOnlyOnMobile={true}\n />\n </Box>\n\n {calendarInDom && (\n <Box\n position={\"absolute\"}\n zIndex={zIndex - 1}\n left={\"-2.4rem\"}\n top={heading ? \"-8.0rem\" : \"-2.4rem\"}\n className={cx(styles.overlay, calendarOpen && styles.calendarVisible)}\n >\n <Box\n background={\"white\"}\n shadow={\"popover\"}\n borderRadius={\"var(--swui-border-radius-large)\"}\n >\n <CardBody gap={3}>\n {heading && (\n <Heading variant={\"h2\"} as={headingLevel}>\n {heading}\n </Heading>\n )}\n\n <Box height={inputFieldsHeight} />\n\n <MonthHeader\n {...inputProps}\n previousMonthButtonAriaLabel={previousMonthButtonAriaLabel}\n nextMonthButtonAriaLabel={nextMonthButtonAriaLabel}\n calendarSize={size}\n prevMonthDisabled={prevMonthDisabled}\n nextMonthDisabled={nextMonthDisabled}\n previousMonthButtonTestId={previousMonthButtonTestId}\n nextMonthButtonTestId={nextMonthButtonTestId}\n />\n\n {visiblePanel === \"calendar\" && (\n <TravelCalendar\n {...inputProps}\n size={size}\n multiSelectable={true}\n isDateDisabled={isDateDisabled}\n renderDateContent={renderDateContent}\n dateTestId={dateTestId}\n />\n )}\n\n {visiblePanel === \"month-picker\" && (\n <MonthPicker\n firstMonth={firstMonthInMonthPicker}\n numMonths={numMonthsInMonthPicker}\n value={visibleMonth}\n size={size}\n localeCode={languageLocaleCode}\n onValueChange={(v) => {\n setVisibleMonth(v);\n setVisiblePanel(\"calendar\");\n monthPickerButtonRef.current?.focus();\n }}\n onCancel={() => {\n setVisiblePanel(\"calendar\");\n monthPickerButtonRef.current?.focus();\n }}\n />\n )}\n {renderBelowCalendar?.({ hideCalendar })}\n </CardBody>\n </Box>\n </Box>\n )}\n </Box>\n );\n};\n","import * as React from \"react\";\nimport { useMemo } from \"react\";\nimport { Row } from \"@stenajs-webui/core\";\nimport { TravelDateTextInput } from \"./TravelDateTextInput\";\nimport { createInputMaskForDateFormat } from \"../../localize-date-format/InputMaskProvider\";\nimport { getDateFormatForLocaleCode } from \"../../localize-date-format/DateFormatProvider\";\nimport { reformatLocalizedDateString } from \"../../localize-date-format/LocalizedDateReformatter\";\nimport { TravelCalendarSizeVariant } from \"./TravelCalendar\";\nimport { DateTextInputVariant } from \"../types\";\nimport { SupportedLocaleCode } from \"../../localize-date-format/LocaleMapper\";\nimport { isDeviceSameOrLarger, useDeviceSize } from \"@stenajs-webui/panels\";\n\nexport interface TravelDateTextInputFieldProps {\n value: string | undefined;\n onValueChange: ((value: string) => void) | undefined;\n localeCode: SupportedLocaleCode;\n label?: string;\n onFocus?: () => void;\n autoFocus?: boolean;\n calendarSize: TravelCalendarSizeVariant;\n placeholderWhenBlurred: string | undefined;\n valueWhenBlurred: string | undefined;\n variant: DateTextInputVariant;\n readOnlyOnMobile: boolean;\n}\n\nexport const TravelDateTextInputField: React.FC<\n TravelDateTextInputFieldProps\n> = ({\n value,\n onValueChange,\n label = \"Date\",\n localeCode,\n autoFocus,\n onFocus,\n calendarSize,\n placeholderWhenBlurred,\n valueWhenBlurred,\n variant,\n readOnlyOnMobile,\n}) => {\n const { deviceSize } = useDeviceSize();\n\n const readOnly =\n readOnlyOnMobile && !isDeviceSameOrLarger(deviceSize, \"tablet\");\n\n const { mask, placeholder } = useMemo(() => {\n const dateFormatForLocaleCode = getDateFormatForLocaleCode(localeCode);\n return {\n mask: createInputMaskForDateFormat(dateFormatForLocaleCode),\n placeholder: dateFormatForLocaleCode.toLowerCase(),\n };\n }, [localeCode]);\n\n return (\n <Row>\n <TravelDateTextInput\n mask={mask}\n value={value}\n onValueChange={onValueChange}\n onBlur={(ev) => {\n const date = reformatLocalizedDateString(ev.target.value, localeCode);\n if (date && date !== value) {\n onValueChange?.(date);\n }\n }}\n readOnly={readOnly}\n onFocus={onFocus}\n autoFocus={autoFocus}\n label={label}\n placeholder={placeholder}\n calendarSize={calendarSize}\n placeholderWhenBlurred={placeholderWhenBlurred}\n valueWhenBlurred={valueWhenBlurred}\n variant={variant}\n />\n </Row>\n );\n};\n","import {\n getLocaleForLocaleCode,\n SupportedLocaleCode,\n} from \"../../localize-date-format/LocaleMapper\";\nimport {\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { useToday } from \"@stenajs-webui/core\";\nimport { useControlledVisibleMonth } from \"./UseControlledVisibleMonth\";\nimport { getDateFormatForLocaleCode } from \"../../localize-date-format/DateFormatProvider\";\nimport { parseLocalizedDateString } from \"../../localize-date-format/LocalizedDateParser\";\nimport { intlFormat, isSameMonth } from \"date-fns\";\nimport { getMonthInYear } from \"../../../util/calendar/CalendarDataFactory\";\nimport { formatLocalizedDate } from \"../../localize-date-format/LocalizedDateFormatter\";\nimport { VisiblePanel } from \"../types\";\nimport { formatDateDescription } from \"../util/DateDescriptionFormatter\";\nimport { convertFirstCharToUpper } from \"../../../util/caseFormat/CaseFormat\";\n\nexport const useTravelDateInput = (\n value: string | undefined,\n onValueChange: ((value: string) => void) | undefined,\n localeCode: SupportedLocaleCode,\n languageLocaleCode: SupportedLocaleCode,\n visibleMonthValue: Date,\n onVisibleMonthChange: (visibleMonth: Date) => void,\n onClickDate?: (date: Date) => void,\n) => {\n const languageLocale = getLocaleForLocaleCode(languageLocaleCode);\n\n const calendarId = useId();\n const today = useToday();\n\n const monthPickerButtonRef = useRef<HTMLButtonElement>(null);\n\n const dateFormat = useMemo(\n () => getDateFormatForLocaleCode(localeCode),\n [localeCode],\n );\n\n const selectedDate = useMemo(\n () =>\n value?.length === dateFormat.length\n ? parseLocalizedDateString(value, localeCode)\n : undefined,\n [dateFormat.length, localeCode, value],\n );\n\n const valueWhenBlurred = useMemo(\n () =>\n selectedDate != null\n ? formatDateDescription(selectedDate, today, languageLocale)\n : undefined,\n [languageLocale, selectedDate, today],\n );\n\n const { visibleMonth, setVisibleMonth, setVisibleMonthClamped } =\n useControlledVisibleMonth(visibleMonthValue, onVisibleMonthChange, today);\n\n /**\n * When the value is changed from the outside, the visible month follows the\n * new date, so that a date which is entered somewhere else is not left off\n * screen. Calendars that have a text input of their own already do this via\n * onValueChangeByInputs, but a calendar without one has no other way in.\n *\n * The month is only moved when the selected date actually changes, so\n * browsing months is not interrupted, and it is not moved on mount, which\n * leaves the month the app passed as visibleMonth alone.\n */\n const lastSyncedSelectedTime = useRef(selectedDate?.getTime());\n useEffect(() => {\n if (!selectedDate) {\n return;\n }\n const selectedTime = selectedDate.getTime();\n if (selectedTime === lastSyncedSelectedTime.current) {\n return;\n }\n lastSyncedSelectedTime.current = selectedTime;\n setVisibleMonthClamped(selectedDate);\n }, [selectedDate, setVisibleMonthClamped]);\n\n const visibleMonthData = useMemo(\n () =>\n getMonthInYear(\n visibleMonth.getFullYear(),\n visibleMonth.getMonth(),\n languageLocale,\n ),\n [languageLocale, visibleMonth],\n );\n\n const monthPickerButtonLabel = useMemo(() => {\n return convertFirstCharToUpper(\n intlFormat(\n visibleMonth,\n { month: \"long\", year: \"numeric\" },\n { locale: languageLocale.code },\n ),\n );\n }, [languageLocale, visibleMonth]);\n\n const todayIsInVisibleMonth = useMemo(() => {\n return isSameMonth(today, visibleMonth);\n }, [today, visibleMonth]);\n\n const [hoverDate, setHoverDate] = useState<Date | undefined>();\n\n const [visiblePanel, setVisiblePanel] = useState<VisiblePanel>(\"calendar\");\n\n const onValueChangeByInputs = useCallback<(value: string) => void>(\n (v) => {\n const startDate =\n v?.length === dateFormat.length\n ? parseLocalizedDateString(v, localeCode)\n : undefined;\n\n if (startDate) {\n /*\n * The month is asked for here, as the date is typed. Recorded as\n * followed, so that the effect above does not ask again when the\n * value comes back with this date.\n */\n lastSyncedSelectedTime.current = startDate.getTime();\n setVisibleMonthClamped(startDate);\n }\n\n onValueChange?.(v);\n },\n [dateFormat.length, localeCode, onValueChange, setVisibleMonthClamped],\n );\n\n const onClickDate_ = (date: Date) => {\n onValueChange?.(formatLocalizedDate(date, localeCode));\n onClickDate?.(date);\n };\n\n return {\n onClickDate: onClickDate_,\n onValueChangeByInputs,\n monthPickerButtonRef,\n calendarId,\n monthPickerButtonLabel,\n visiblePanel,\n setVisiblePanel,\n setVisibleMonth,\n visibleMonthData,\n todayIsInVisibleMonth,\n hoverDate,\n hoverAnchor: undefined,\n setHoverDate,\n selectedDate,\n today,\n visibleMonth,\n valueWhenBlurred,\n };\n};\n","import * as React from \"react\";\nimport {\n KeyboardEventHandler,\n ReactNode,\n useCallback,\n useLayoutEffect,\n useRef,\n useState,\n} from \"react\";\nimport {\n Box,\n Heading,\n HeadingVariant,\n useOnClickOutside,\n} from \"@stenajs-webui/core\";\nimport { ValueAndOnValueChangeProps } from \"@stenajs-webui/forms\";\nimport { CardBody } from \"@stenajs-webui/elements\";\nimport { MonthPicker } from \"../../../features/month-picker/MonthPicker\";\nimport { MonthHeader } from \"../../../features/travel-calendar/components/MonthHeader\";\nimport {\n TravelCalendar,\n TravelCalendarSizeVariant,\n} from \"../../../features/travel-calendar/components/TravelCalendar\";\nimport styles from \"./TravelDateInput.module.css\";\nimport cx from \"classnames\";\nimport { TravelDateTextInputField } from \"../../../features/travel-calendar/components/TravelDateTextInputField\";\nimport { useTravelDateInput } from \"../../../features/travel-calendar/hooks/UseTravelDateInput\";\nimport {\n DateTextInputVariant,\n RenderTravelDateContent,\n} from \"../../../features/travel-calendar/types\";\nimport { SupportedLocaleCode } from \"../../../features/localize-date-format/LocaleMapper\";\nimport { VisibleMonthState } from \"../../../features/travel-calendar/hooks/UseVisibleMonthState\";\n\nexport interface RenderBelowSingleDateCalendarArgs {\n hideCalendar: () => void;\n}\n\nexport interface TravelDateInputProps\n extends ValueAndOnValueChangeProps<string>,\n VisibleMonthState {\n localeCode?: SupportedLocaleCode;\n languageLocaleCode?: SupportedLocaleCode;\n label?: string;\n previousMonthButtonAriaLabel?: string;\n nextMonthButtonAriaLabel?: string;\n heading?: string;\n headingLevel?: HeadingVariant;\n firstMonthInMonthPicker?: Date;\n numMonthsInMonthPicker?: number;\n isDateDisabled?: (date: Date) => boolean;\n /**\n * Renders the content of each date in the calendar, in place of the day\n * number. The cell around it, with the selection, focus and keyboard\n * navigation, stays the calendar's. See RenderTravelDateContent.\n */\n renderDateContent?: RenderTravelDateContent;\n prevMonthDisabled?: (visibleMonth: Date) => boolean;\n nextMonthDisabled?: (visibleMonth: Date) => boolean;\n zIndex?: number;\n zIndexWhenClosed?: number;\n onHideCalendar?: () => void;\n renderBelowCalendar?: (args: RenderBelowSingleDateCalendarArgs) => ReactNode;\n size?: TravelCalendarSizeVariant;\n dateTestId?: (date: Date) => string | undefined;\n previousMonthButtonTestId?: string;\n nextMonthButtonTestId?: string;\n placeholderWhenBlurred?: string;\n textInputVariant?: DateTextInputVariant;\n autoFocus?: boolean;\n}\n\nexport const TravelDateInput: React.FC<TravelDateInputProps> = ({\n value,\n onValueChange,\n label,\n localeCode = \"sv\",\n languageLocaleCode = localeCode,\n visibleMonth: visibleMonthValue,\n previousMonthButtonAriaLabel = \"Previous month\",\n nextMonthButtonAriaLabel = \"Next month\",\n placeholderWhenBlurred,\n autoFocus,\n heading,\n headingLevel,\n numMonthsInMonthPicker = 12,\n isDateDisabled,\n renderDateContent,\n onVisibleMonthChange,\n prevMonthDisabled,\n nextMonthDisabled,\n firstMonthInMonthPicker = new Date(),\n zIndex = 1000,\n zIndexWhenClosed,\n onHideCalendar,\n renderBelowCalendar,\n size = \"medium\",\n dateTestId,\n previousMonthButtonTestId,\n nextMonthButtonTestId,\n textInputVariant = \"standard\",\n}) => {\n const [calendarOpen, setCalendarOpen] = useState(false);\n const [calendarInDom, setCalendarInDom] = useState(false);\n const [boxSize, setBoxSize] = useState<{ height: number; width: number }>({\n // Sane defaults, this will be updated with actual data from DOM.\n width: 336,\n height: 66,\n });\n\n const inputFieldsHeight = size === \"large\" ? \"8.8rem\" : \"6.6rem\";\n\n const calendarOpenRef = useRef(false);\n\n const showCalendar = useCallback(() => {\n calendarOpenRef.current = true;\n setCalendarInDom(true);\n setTimeout(() => {\n setCalendarOpen(true);\n }, 10);\n }, []);\n\n const hideCalendar = useCallback(() => {\n if (!calendarInDom) {\n return;\n }\n\n setCalendarOpen(false);\n calendarOpenRef.current = false;\n onHideCalendar?.();\n\n setTimeout(() => {\n if (!calendarOpenRef.current) {\n setCalendarInDom(false);\n }\n }, 120);\n }, [calendarInDom, onHideCalendar]);\n\n const delayedHideCalendar = useCallback(() => {\n setTimeout(() => {\n hideCalendar();\n }, 250);\n }, [hideCalendar]);\n\n const ref = useRef<HTMLDivElement>(null);\n const sizeSourceRef = useRef<HTMLDivElement>(null);\n\n useOnClickOutside(ref, hideCalendar);\n\n useLayoutEffect(() => {\n const width = sizeSourceRef.current?.offsetWidth;\n const height = sizeSourceRef.current?.offsetHeight;\n if (width != null && height != null) {\n if (boxSize.height !== height || boxSize.width !== width) {\n setBoxSize({ width, height });\n }\n }\n }, [boxSize.height, boxSize.width]);\n\n const inputProps = useTravelDateInput(\n value,\n onValueChange,\n localeCode,\n languageLocaleCode,\n visibleMonthValue,\n onVisibleMonthChange,\n delayedHideCalendar,\n );\n\n const {\n visiblePanel,\n visibleMonth,\n onValueChangeByInputs,\n selectedDate,\n setVisibleMonth,\n setVisiblePanel,\n monthPickerButtonRef,\n } = inputProps;\n\n const onKeyDown = useCallback<KeyboardEventHandler<HTMLDivElement>>(\n (ev) => {\n if (ev.key === \"Escape\") {\n hideCalendar();\n }\n },\n [hideCalendar],\n );\n\n return (\n <Box\n position={\"relative\"}\n className={styles.travelDateInput}\n ref={ref}\n onKeyDown={onKeyDown}\n height={boxSize.height}\n width={boxSize.width}\n >\n <Box\n position={\"absolute\"}\n ref={sizeSourceRef}\n zIndex={calendarInDom ? zIndex : zIndexWhenClosed}\n >\n <TravelDateTextInputField\n {...inputProps}\n autoFocus={autoFocus}\n value={value}\n onValueChange={onValueChangeByInputs}\n localeCode={localeCode}\n label={label}\n onFocus={showCalendar}\n calendarSize={size}\n placeholderWhenBlurred={placeholderWhenBlurred}\n variant={textInputVariant}\n readOnlyOnMobile={true}\n />\n </Box>\n\n {calendarInDom && (\n <Box\n position={\"absolute\"}\n zIndex={zIndex - 1}\n left={\"-2.4rem\"}\n top={heading ? \"-8.0rem\" : \"-2.4rem\"}\n className={cx(styles.overlay, calendarOpen && styles.calendarVisible)}\n >\n <Box\n background={\"white\"}\n shadow={\"popover\"}\n borderRadius={\"var(--swui-border-radius-large)\"}\n >\n <CardBody gap={3}>\n {heading && (\n <Heading variant={\"h2\"} as={headingLevel}>\n {heading}\n </Heading>\n )}\n\n <Box height={inputFieldsHeight} />\n\n <MonthHeader\n {...inputProps}\n previousMonthButtonAriaLabel={previousMonthButtonAriaLabel}\n nextMonthButtonAriaLabel={nextMonthButtonAriaLabel}\n calendarSize={size}\n prevMonthDisabled={prevMonthDisabled}\n nextMonthDisabled={nextMonthDisabled}\n previousMonthButtonTestId={previousMonthButtonTestId}\n nextMonthButtonTestId={nextMonthButtonTestId}\n />\n\n {visiblePanel === \"calendar\" && (\n <TravelCalendar\n {...inputProps}\n size={size}\n isValidDateRange={Boolean(selectedDate)}\n selectedStartDate={selectedDate}\n selectedEndDate={selectedDate}\n multiSelectable={false}\n isDateDisabled={isDateDisabled}\n renderDateContent={renderDateContent}\n dateTestId={dateTestId}\n hoverHighlightDirection={undefined}\n />\n )}\n\n {visiblePanel === \"month-picker\" && (\n <MonthPicker\n firstMonth={firstMonthInMonthPicker}\n numMonths={numMonthsInMonthPicker}\n value={visibleMonth}\n size={size}\n localeCode={localeCode}\n onValueChange={(v) => {\n setVisibleMonth(v);\n setVisiblePanel(\"calendar\");\n monthPickerButtonRef.current?.focus();\n }}\n onCancel={() => {\n setVisiblePanel(\"calendar\");\n monthPickerButtonRef.current?.focus();\n }}\n />\n )}\n {renderBelowCalendar?.({ hideCalendar })}\n </CardBody>\n </Box>\n </Box>\n )}\n </Box>\n );\n};\n","import * as React from \"react\";\nimport { SupportedLocaleCode } from \"../../localize-date-format/LocaleMapper\";\nimport { MonthPicker } from \"../../month-picker/MonthPicker\";\nimport { useTravelDateInput } from \"../hooks/UseTravelDateInput\";\nimport { MonthHeader } from \"./MonthHeader\";\nimport { TravelCalendar, TravelCalendarSizeVariant } from \"./TravelCalendar\";\nimport { RenderTravelDateContent } from \"../types\";\n\nexport interface TravelDateCalendarBodyProps {\n /** The calendar state, from useTravelDateInput. */\n inputProps: ReturnType<typeof useTravelDateInput>;\n languageLocaleCode: SupportedLocaleCode;\n previousMonthButtonAriaLabel: string;\n nextMonthButtonAriaLabel: string;\n firstMonthInMonthPicker: Date;\n numMonthsInMonthPicker: number;\n isDateDisabled?: (date: Date) => boolean;\n /**\n * Renders the content of each date in the calendar, in place of the day\n * number. The cell around it, with the selection, focus and keyboard\n * navigation, stays the calendar's. See RenderTravelDateContent.\n */\n renderDateContent?: RenderTravelDateContent;\n prevMonthDisabled?: (visibleMonth: Date) => boolean;\n nextMonthDisabled?: (visibleMonth: Date) => boolean;\n size: TravelCalendarSizeVariant;\n dateTestId?: (date: Date) => string | undefined;\n previousMonthButtonTestId?: string;\n nextMonthButtonTestId?: string;\n calendarAriaLabel?: string;\n}\n\n/**\n * The month header, and either the calendar or the month picker.\n *\n * TravelDateCalendar and TravelDateCalendarPanel differ only in what they\n * render above this, so this is where the shared wiring lives. It returns a\n * fragment, which means the parts stay items of the parent layout.\n */\nexport const TravelDateCalendarBody: React.FC<TravelDateCalendarBodyProps> = ({\n inputProps,\n languageLocaleCode,\n previousMonthButtonAriaLabel,\n nextMonthButtonAriaLabel,\n firstMonthInMonthPicker,\n numMonthsInMonthPicker,\n isDateDisabled,\n renderDateContent,\n prevMonthDisabled,\n nextMonthDisabled,\n size,\n dateTestId,\n previousMonthButtonTestId,\n nextMonthButtonTestId,\n calendarAriaLabel,\n}) => {\n const {\n visiblePanel,\n visibleMonth,\n setVisibleMonth,\n setVisiblePanel,\n monthPickerButtonRef,\n selectedDate,\n } = inputProps;\n\n return (\n <>\n <MonthHeader\n {...inputProps}\n previousMonthButtonAriaLabel={previousMonthButtonAriaLabel}\n nextMonthButtonAriaLabel={nextMonthButtonAriaLabel}\n calendarSize={size}\n prevMonthDisabled={prevMonthDisabled}\n nextMonthDisabled={nextMonthDisabled}\n previousMonthButtonTestId={previousMonthButtonTestId}\n nextMonthButtonTestId={nextMonthButtonTestId}\n />\n\n {visiblePanel === \"calendar\" && (\n <TravelCalendar\n {...inputProps}\n size={size}\n selectedStartDate={selectedDate}\n selectedEndDate={selectedDate}\n isValidDateRange={Boolean(selectedDate)}\n isDateDisabled={isDateDisabled}\n renderDateContent={renderDateContent}\n multiSelectable={false}\n dateTestId={dateTestId}\n hoverHighlightDirection={undefined}\n ariaLabel={calendarAriaLabel}\n />\n )}\n\n {visiblePanel === \"month-picker\" && (\n <MonthPicker\n firstMonth={firstMonthInMonthPicker}\n numMonths={numMonthsInMonthPicker}\n value={visibleMonth}\n localeCode={languageLocaleCode}\n size={size}\n onValueChange={(v) => {\n setVisibleMonth(v);\n setVisiblePanel(\"calendar\");\n monthPickerButtonRef.current?.focus();\n }}\n onCancel={() => {\n setVisiblePanel(\"calendar\");\n monthPickerButtonRef.current?.focus();\n }}\n />\n )}\n </>\n );\n};\n","import * as React from \"react\";\nimport { useMemo } from \"react\";\nimport { Column, Heading, HeadingVariant } from \"@stenajs-webui/core\";\nimport { ValueAndOnValueChangeProps } from \"@stenajs-webui/forms\";\nimport { TravelCalendarSizeVariant } from \"../../../features/travel-calendar/components/TravelCalendar\";\nimport { TravelDateCalendarBody } from \"../../../features/travel-calendar/components/TravelDateCalendarBody\";\nimport { useTravelDateInput } from \"../../../features/travel-calendar/hooks/UseTravelDateInput\";\nimport { TravelDateTextInputField } from \"../../../features/travel-calendar/components/TravelDateTextInputField\";\nimport {\n DateTextInputVariant,\n RenderTravelDateContent,\n} from \"../../../features/travel-calendar/types\";\nimport { SupportedLocaleCode } from \"../../../features/localize-date-format/LocaleMapper\";\nimport { VisibleMonthState } from \"../../../features/travel-calendar/hooks/UseVisibleMonthState\";\n\nexport interface TravelDateCalendarProps\n extends ValueAndOnValueChangeProps<string>,\n VisibleMonthState {\n localeCode?: SupportedLocaleCode;\n languageLocaleCode?: SupportedLocaleCode;\n label?: string;\n previousMonthButtonAriaLabel?: string;\n nextMonthButtonAriaLabel?: string;\n heading?: string;\n headingLevel?: HeadingVariant;\n firstMonthInMonthPicker?: Date;\n numMonthsInMonthPicker?: number;\n isDateDisabled?: (date: Date) => boolean;\n /**\n * Renders the content of each date in the calendar, in place of the day\n * number. The cell around it, with the selection, focus and keyboard\n * navigation, stays the calendar's. See RenderTravelDateContent.\n */\n renderDateContent?: RenderTravelDateContent;\n prevMonthDisabled?: (visibleMonth: Date) => boolean;\n nextMonthDisabled?: (visibleMonth: Date) => boolean;\n size?: TravelCalendarSizeVariant;\n dateTestId?: (date: Date) => string | undefined;\n previousMonthButtonTestId?: string;\n nextMonthButtonTestId?: string;\n placeholderWhenBlurred?: string;\n textInputVariant?: DateTextInputVariant;\n autoFocus?: boolean;\n}\n\nexport const TravelDateCalendar: React.FC<TravelDateCalendarProps> = ({\n value,\n onValueChange,\n label,\n localeCode = \"sv\",\n languageLocaleCode = localeCode,\n visibleMonth: visibleMonthValue,\n previousMonthButtonAriaLabel = \"Previous month\",\n nextMonthButtonAriaLabel = \"Next month\",\n placeholderWhenBlurred,\n heading,\n headingLevel,\n numMonthsInMonthPicker = 12,\n isDateDisabled,\n renderDateContent,\n onVisibleMonthChange,\n prevMonthDisabled,\n nextMonthDisabled,\n firstMonthInMonthPicker,\n dateTestId,\n size = \"medium\",\n previousMonthButtonTestId,\n nextMonthButtonTestId,\n textInputVariant = \"standard\",\n autoFocus,\n}) => {\n const inputProps = useTravelDateInput(\n value,\n onValueChange,\n localeCode,\n languageLocaleCode,\n visibleMonthValue,\n onVisibleMonthChange,\n );\n\n const { onValueChangeByInputs } = inputProps;\n\n /**\n * A default of new Date() in the destructuring above would be a new date on\n * every render, which the month picker uses as a memo dependency.\n */\n const firstMonth = useMemo(\n () => firstMonthInMonthPicker ?? new Date(),\n [firstMonthInMonthPicker],\n );\n\n return (\n <Column gap={3}>\n {heading && (\n <Heading variant={\"h2\"} as={headingLevel}>\n {heading}\n </Heading>\n )}\n <TravelDateTextInputField\n {...inputProps}\n value={value}\n onValueChange={onValueChangeByInputs}\n localeCode={localeCode}\n label={label}\n calendarSize={size}\n placeholderWhenBlurred={placeholderWhenBlurred}\n variant={textInputVariant}\n readOnlyOnMobile={false}\n autoFocus={autoFocus}\n />\n\n <TravelDateCalendarBody\n inputProps={inputProps}\n languageLocaleCode={languageLocaleCode}\n previousMonthButtonAriaLabel={previousMonthButtonAriaLabel}\n nextMonthButtonAriaLabel={nextMonthButtonAriaLabel}\n firstMonthInMonthPicker={firstMonth}\n numMonthsInMonthPicker={numMonthsInMonthPicker}\n isDateDisabled={isDateDisabled}\n renderDateContent={renderDateContent}\n prevMonthDisabled={prevMonthDisabled}\n nextMonthDisabled={nextMonthDisabled}\n size={size}\n dateTestId={dateTestId}\n previousMonthButtonTestId={previousMonthButtonTestId}\n nextMonthButtonTestId={nextMonthButtonTestId}\n />\n </Column>\n );\n};\n","import * as React from \"react\";\nimport { useMemo } from \"react\";\nimport { ValueAndOnValueChangeProps } from \"@stenajs-webui/forms\";\nimport { TravelCalendarSizeVariant } from \"../../../features/travel-calendar/components/TravelCalendar\";\nimport { TravelDateCalendarBody } from \"../../../features/travel-calendar/components/TravelDateCalendarBody\";\nimport { useTravelDateInput } from \"../../../features/travel-calendar/hooks/UseTravelDateInput\";\nimport { SupportedLocaleCode } from \"../../../features/localize-date-format/LocaleMapper\";\nimport { Column } from \"@stenajs-webui/core\";\nimport { RenderTravelDateContent } from \"../../../features/travel-calendar/types\";\nimport { VisibleMonthState } from \"../../../features/travel-calendar/hooks/UseVisibleMonthState\";\n\nexport interface TravelDateCalendarPanelProps\n extends ValueAndOnValueChangeProps<string>,\n VisibleMonthState {\n localeCode?: SupportedLocaleCode;\n languageLocaleCode?: SupportedLocaleCode;\n previousMonthButtonAriaLabel?: string;\n nextMonthButtonAriaLabel?: string;\n firstMonthInMonthPicker?: Date;\n numMonthsInMonthPicker?: number;\n isDateDisabled?: (date: Date) => boolean;\n /**\n * Renders the content of each date in the calendar, in place of the day\n * number. The cell around it, with the selection, focus and keyboard\n * navigation, stays the calendar's. See RenderTravelDateContent.\n */\n renderDateContent?: RenderTravelDateContent;\n prevMonthDisabled?: (visibleMonth: Date) => boolean;\n nextMonthDisabled?: (visibleMonth: Date) => boolean;\n size?: TravelCalendarSizeVariant;\n dateTestId?: (date: Date) => string | undefined;\n previousMonthButtonTestId?: string;\n nextMonthButtonTestId?: string;\n /**\n * Accessible name of the calendar grid.\n *\n * The panel has no label of its own, so set this to whatever the date is\n * for, unless there is a visible label next to it that already says so.\n */\n calendarAriaLabel?: string;\n}\n\n/**\n * A calendar for picking a single travel date, without a text input.\n *\n * This is TravelDateCalendar without the label, text input and heading, for\n * cases where the date is entered somewhere else. The visible month follows\n * the value, so a date set from the outside is scrolled into view.\n */\nexport const TravelDateCalendarPanel: React.FC<\n TravelDateCalendarPanelProps\n> = ({\n value,\n onValueChange,\n localeCode = \"sv\",\n languageLocaleCode = localeCode,\n visibleMonth: visibleMonthValue,\n previousMonthButtonAriaLabel = \"Previous month\",\n nextMonthButtonAriaLabel = \"Next month\",\n numMonthsInMonthPicker = 12,\n isDateDisabled,\n renderDateContent,\n onVisibleMonthChange,\n prevMonthDisabled,\n nextMonthDisabled,\n firstMonthInMonthPicker,\n dateTestId,\n size = \"medium\",\n previousMonthButtonTestId,\n nextMonthButtonTestId,\n calendarAriaLabel,\n}) => {\n const inputProps = useTravelDateInput(\n value,\n onValueChange,\n localeCode,\n languageLocaleCode,\n visibleMonthValue,\n onVisibleMonthChange,\n );\n\n /**\n * A default of new Date() in the destructuring above would be a new date on\n * every render, which the month picker uses as a memo dependency.\n */\n const firstMonth = useMemo(\n () => firstMonthInMonthPicker ?? new Date(),\n [firstMonthInMonthPicker],\n );\n\n return (\n <Column gap={3}>\n <TravelDateCalendarBody\n inputProps={inputProps}\n languageLocaleCode={languageLocaleCode}\n previousMonthButtonAriaLabel={previousMonthButtonAriaLabel}\n nextMonthButtonAriaLabel={nextMonthButtonAriaLabel}\n firstMonthInMonthPicker={firstMonth}\n numMonthsInMonthPicker={numMonthsInMonthPicker}\n isDateDisabled={isDateDisabled}\n renderDateContent={renderDateContent}\n prevMonthDisabled={prevMonthDisabled}\n nextMonthDisabled={nextMonthDisabled}\n size={size}\n dateTestId={dateTestId}\n previousMonthButtonTestId={previousMonthButtonTestId}\n nextMonthButtonTestId={nextMonthButtonTestId}\n calendarAriaLabel={calendarAriaLabel}\n />\n </Column>\n );\n};\n","import * as React from \"react\";\nimport { useCallback, useRef, useState } from \"react\";\nimport { Column, Heading, HeadingVariant } from \"@stenajs-webui/core\";\nimport { ValueAndOnValueChangeProps } from \"@stenajs-webui/forms\";\nimport {\n TravelDateRangeTextInputField,\n TravelDateRangeTextInputFields,\n} from \"../../../features/travel-calendar/components/TravelDateRangeTextInputFields\";\nimport { MonthPicker } from \"../../../features/month-picker/MonthPicker\";\nimport { useTravelDateRangeInput } from \"../../../features/travel-calendar/hooks/UseTravelDateRangeInput\";\nimport { MonthHeader } from \"../../../features/travel-calendar/components/MonthHeader\";\nimport {\n TravelCalendar,\n TravelCalendarSizeVariant,\n} from \"../../../features/travel-calendar/components/TravelCalendar\";\nimport {\n DateTextInputVariant,\n TravelDateRangeInputValue,\n RenderTravelDateContent,\n} from \"../../../features/travel-calendar/types\";\nimport { SupportedLocaleCode } from \"../../../features/localize-date-format/LocaleMapper\";\nimport { VisibleMonthState } from \"../../../features/travel-calendar/hooks/UseVisibleMonthState\";\n\nexport interface TravelDateRangeCalendarProps\n extends ValueAndOnValueChangeProps<TravelDateRangeInputValue>,\n VisibleMonthState {\n localeCode?: SupportedLocaleCode;\n languageLocaleCode?: SupportedLocaleCode;\n startDateLabel?: string;\n endDateLabel?: string;\n previousMonthButtonAriaLabel?: string;\n nextMonthButtonAriaLabel?: string;\n heading?: string;\n headingLevel?: HeadingVariant;\n firstMonthInMonthPicker?: Date;\n numMonthsInMonthPicker?: number;\n isDateDisabled?: (date: Date) => boolean;\n /**\n * Renders the content of each date in the calendar, in place of the day\n * number. The cell around it, with the selection, focus and keyboard\n * navigation, stays the calendar's. See RenderTravelDateContent.\n */\n renderDateContent?: RenderTravelDateContent;\n prevMonthDisabled?: (visibleMonth: Date) => boolean;\n nextMonthDisabled?: (visibleMonth: Date) => boolean;\n size?: TravelCalendarSizeVariant;\n dateTestId?: (date: Date) => string | undefined;\n previousMonthButtonTestId?: string;\n nextMonthButtonTestId?: string;\n placeholderWhenBlurredStartDate?: string;\n placeholderWhenBlurredEndDate?: string;\n textInputVariant?: DateTextInputVariant;\n autoFocusStartDate?: boolean;\n autoFocusEndDate?: boolean;\n}\n\nexport const TravelDateRangeCalendar: React.FC<\n TravelDateRangeCalendarProps\n> = ({\n value,\n onValueChange,\n startDateLabel,\n endDateLabel,\n localeCode = \"sv\",\n languageLocaleCode = localeCode,\n visibleMonth: visibleMonthValue,\n previousMonthButtonAriaLabel = \"Previous month\",\n nextMonthButtonAriaLabel = \"Next month\",\n heading,\n headingLevel,\n numMonthsInMonthPicker = 12,\n isDateDisabled,\n renderDateContent,\n onVisibleMonthChange,\n prevMonthDisabled,\n nextMonthDisabled,\n firstMonthInMonthPicker = new Date(),\n size = \"medium\",\n dateTestId,\n previousMonthButtonTestId,\n nextMonthButtonTestId,\n placeholderWhenBlurredStartDate,\n placeholderWhenBlurredEndDate,\n textInputVariant = \"standard\",\n autoFocusStartDate,\n autoFocusEndDate,\n}) => {\n const [fieldLastInFocus, setFieldLastInFocus] = useState<\n \"startDate\" | \"endDate\" | undefined\n >(undefined);\n\n const startDateRef = useRef<HTMLInputElement>(null);\n const endDateRef = useRef<HTMLInputElement>(null);\n\n const moveFocusToField = useCallback((field: \"startDate\" | \"endDate\") => {\n if (field === \"startDate\") {\n startDateRef.current?.focus();\n } else if (field === \"endDate\") {\n endDateRef.current?.focus();\n }\n }, []);\n\n const inputProps = useTravelDateRangeInput(\n value,\n onValueChange,\n localeCode,\n languageLocaleCode,\n visibleMonthValue,\n onVisibleMonthChange,\n fieldLastInFocus,\n setFieldLastInFocus,\n moveFocusToField,\n undefined,\n );\n\n const onInputFocus = useCallback((field: TravelDateRangeTextInputField) => {\n setFieldLastInFocus(field);\n }, []);\n\n const {\n visiblePanel,\n visibleMonth,\n onValueChangeByInputs,\n setVisibleMonth,\n setVisiblePanel,\n monthPickerButtonRef,\n } = inputProps;\n\n return (\n <Column gap={3}>\n {heading && (\n <Heading variant={\"h2\"} as={headingLevel}>\n {heading}\n </Heading>\n )}\n <TravelDateRangeTextInputFields\n {...inputProps}\n value={value}\n onValueChange={onValueChangeByInputs}\n startDateRef={startDateRef}\n endDateRef={endDateRef}\n localeCode={localeCode}\n startDateLabel={startDateLabel}\n endDateLabel={endDateLabel}\n onFocus={onInputFocus}\n calendarSize={size}\n placeholderWhenBlurredStartDate={placeholderWhenBlurredStartDate}\n placeholderWhenBlurredEndDate={placeholderWhenBlurredEndDate}\n variant={textInputVariant}\n autoFocusStartDate={autoFocusStartDate}\n autoFocusEndDate={autoFocusEndDate}\n /*\n When focusing on the input, the calendar popover appears.\n But the keyboard appears as well and covers the calendar.\n\n readOnly disables input and hides the keyboard on mobile.\n This enables the user to click on input to select it, then click in the calendar.\n\n This is not needed for TravelDate*Calendar, since the calendar is always visible.\n */\n readOnlyOnMobile={false}\n />\n\n <MonthHeader\n {...inputProps}\n previousMonthButtonAriaLabel={previousMonthButtonAriaLabel}\n nextMonthButtonAriaLabel={nextMonthButtonAriaLabel}\n calendarSize={size}\n prevMonthDisabled={prevMonthDisabled}\n nextMonthDisabled={nextMonthDisabled}\n previousMonthButtonTestId={previousMonthButtonTestId}\n nextMonthButtonTestId={nextMonthButtonTestId}\n />\n\n {visiblePanel === \"calendar\" && (\n <TravelCalendar\n {...inputProps}\n size={size}\n multiSelectable={true}\n isDateDisabled={isDateDisabled}\n renderDateContent={renderDateContent}\n dateTestId={dateTestId}\n />\n )}\n\n {visiblePanel === \"month-picker\" && (\n <MonthPicker\n firstMonth={firstMonthInMonthPicker}\n numMonths={numMonthsInMonthPicker}\n value={visibleMonth}\n size={size}\n localeCode={languageLocaleCode}\n onValueChange={(v) => {\n setVisibleMonth(v);\n setVisiblePanel(\"calendar\");\n monthPickerButtonRef.current?.focus();\n }}\n onCancel={() => {\n setVisiblePanel(\"calendar\");\n monthPickerButtonRef.current?.focus();\n }}\n />\n )}\n </Column>\n );\n};\n","import { useCallback } from \"react\";\nimport { isBefore, isSameDay, isSameMonth } from \"date-fns\";\nimport { useToday } from \"@stenajs-webui/core\";\n\nexport const useDisabledBeforeToday = () => {\n const today = useToday();\n\n return useCallback<(date: Date) => boolean>(\n (date) => !isSameDay(date, today) && isBefore(date, today),\n [today],\n );\n};\n\nexport const usePrevMonthDisabledBeforeToday = () => {\n const today = useToday();\n\n return useCallback(\n (visibleMonth: Date) =>\n isSameMonth(today, visibleMonth) || isBefore(visibleMonth, today),\n [today],\n );\n};\n","import { startOfMonth } from \"date-fns\";\nimport { useState } from \"react\";\n\n/**\n * The visible month of a travel calendar, which the app keeps. All five\n * travel calendars take these two props, and useVisibleMonthState returns\n * them, ready to spread onto one.\n */\nexport interface VisibleMonthState {\n /**\n * The month the calendar shows. Only its year and month are read, so any\n * day of the month will do. The calendar never changes it by itself; see\n * onVisibleMonthChange.\n *\n * It is not taken from the value. To open on the month of the value, pass\n * that month; useVisibleMonthState shows how.\n */\n visibleMonth: Date;\n /**\n * Called when the calendar should show another month: from the month\n * buttons, the month picker, the arrow keys, or a date in another month\n * that the calendar follows. The single date calendars follow their value,\n * typed or set from outside. The range calendars only follow a date typed\n * into one of their fields.\n *\n * It gets the first day of that month, and the calendar moves once\n * visibleMonth is set to it. It is not called for the month already shown.\n *\n * When it follows a date, it never asks for a month before the current\n * one: a date in the past asks for the current month, unless it is in the\n * month already shown. The month buttons and the arrow keys are not\n * limited that way. To keep the user out of past months, set\n * prevMonthDisabled and isDateDisabled, for example with\n * usePrevMonthDisabledBeforeToday() and useDisabledBeforeToday(). The\n * month picker starts at firstMonthInMonthPicker, the current month by\n * default.\n *\n * useVisibleMonthState() keeps this state, for when nothing else needs it.\n */\n onVisibleMonthChange: (visibleMonth: Date) => void;\n}\n\n/**\n * Keeps the visible month of a travel calendar, for when nothing else needs to\n * know it.\n *\n * The travel calendars do not keep their visible month themselves; the app\n * passes it in as visibleMonth and changes it in onVisibleMonthChange. This is\n * that state, returned as those two props, so it can be spread onto the\n * calendar. Keep the state elsewhere instead when something else depends on\n * the month, such as data loaded for it.\n *\n * It starts at the current month, not at the month of a value. Before the\n * month was controlled, a calendar without initialMonthInFocus opened on the\n * month of its value. To keep that, start from the value's date, with a\n * function, the way useState takes one:\n *\n * const visibleMonthState = useVisibleMonthState(() =>\n * value ? parseLocalizedDateString(value, localeCode) : undefined,\n * );\n *\n * The function only runs on the first render, so the value is not parsed\n * again on every render after it, and the check for a missing value keeps\n * it type safe for an optional value. parseLocalizedDateString returns\n * undefined for an incomplete value as well, and undefined falls back to\n * the current month.\n *\n * The value of a range calendar is an object of two strings, so parse its\n * start date instead:\n *\n * const visibleMonthState = useVisibleMonthState(() =>\n * value?.startDate\n * ? parseLocalizedDateString(value.startDate, localeCode)\n * : undefined,\n * );\n *\n * A calendar that had initialMonthInFocus passes that month instead:\n * useVisibleMonthState(initialMonthInFocus).\n *\n * @param initialMonth The month to show first, or a function that returns it,\n * called once. Defaults to the current month, also when it is or returns\n * undefined.\n *\n * @example\n * const visibleMonthState = useVisibleMonthState();\n *\n * <TravelDateInput\n * value={value}\n * onValueChange={setValue}\n * {...visibleMonthState}\n * />\n */\nexport const useVisibleMonthState = (\n initialMonth?: Date | (() => Date | undefined),\n): VisibleMonthState => {\n const [visibleMonth, setVisibleMonth] = useState(() => {\n const month =\n typeof initialMonth === \"function\" ? initialMonth() : initialMonth;\n return startOfMonth(month ?? new Date());\n });\n\n return { visibleMonth, onVisibleMonthChange: setVisibleMonth };\n};\n"],"names":["DateFormats","buildDayStateForDateRange","statePerMonth","start","end","isAfter","eachDayOfInterval","result","date","isFirstInRange","isSameDay","isLastInRange","addDayStateHighlights","state","buildDayStateForSingleMonth","dateInFocus","buildDayStateForRange","startOfMonth","endOfMonth","startLimit","endLimit","max","subDays","min","addDays","setDayStateValue","values","monthString","format","weekNumber","getISOWeek","dayInMonth","getDate","setDayStateValueFunction","setter","calendarState","highlights","month","dayState","addDayStateHighlightsOnSingleDay","addWeekStateHighlights","week","day","weekState","newHighlights","newWeekState","addWeekRangeHighlights","startDate","endDate","last","useHighlightToday","enabled","useMemo","convertFirstCharToUpper","value","Month","WeekDay","getMonthsInYear","year","startMonth","numMonths","locale","months","i","getMonthInYear","yearToUse","monthToUse","firstDayOfMonth","getWeeksForMonth","forceSixWeeks","firstDayOfFirstWeek","startOfWeek","weeks","getWeekForDate","addWeeks","firstDayOfWeek","isLastWeekOfMonth","getMonth","getWeek","getYear","getDaysForWeekForDate","createDay","dayOfWeek","getISODay","addHours","d","calculateOverflowingMonth","dayHasHighlight","defaultHighlights","highlight","dayHighlightSelect","highlightsOrBoolean","returnValues","fallbackValue","defaultWrapperStyleProvider","selectedBackground","todayBackground","rangeBackground","borderColor","_","defaultTextPropsProvider","selectedColor","disabledColor","inOtherMonthColor","rangeTextColor","isOtherMonth","defaultCalendarTheme","extranetCalendarTheme","WeekDayCell","onClickWeekDay","theme","content","jsx","Box","Text","Clickable","ev","CalendarDay","userData","onClickDay","ExtraDayContent","showDatesInOtherMonths","WrapperTd","styled","InnerWrapperDiv","CellWrapperDiv","disabled","isDisabled","jsxs","Fragment","WeekNumberCell","onClickWeek","background","backgroundColor","prefix","isDateInMinMaxRange","isBefore","DisabledDayWrapper","DayComponent","minDate","maxDate","props","activeDayState","CalendarMonth","dayComponent","statePerWeek","userDataPerWeek","onClickMonth","renderWeekNumber","renderWeekDay","headerRightContent","extraDayContent","showWeekNumber","Row","FlatButton","stenaAngleDown","CalendarPanel","monthRows","userDataPerMonth","minDateObj","parse","maxDateObj","cx","styles","monthRow","rowIndex","Spacing","Calendar","initialDate","getInitialDate","getMonthRows","enGB","now","monthsPerRow","chunk","getDomIdForMonth","position","monthPickerId","getDomIdForKeyboardKey","key","currentPosition","numColumnsPerRow","next","movePositionByKey","id","row","column","locales","enUS","enIE","deAT","nlBE","nl","de","nb","sv","da","lv","lt","it","et","fi","cs","es","fr","pl","fallbackLocaleCode","fallbackLocaleCodeForFormatting","getSupportedLocaleCode","localeCode","matchLanguage","fallback","languageCode","getSupportedLocaleCodeMatchingLanguage","getLocaleForLocaleCode","lang","localeCodes","l","getDefaultLocaleForFormatting","getLocaleCodeForLocale","MonthPickerCell","onClick","selected","autoFocus","size","label","abbr","ref","useRef","domId","tabIndex","useEffect","onKeyDown","useCallback","nextDomId","PrimaryButton","createMonths","firstMonth","currentYear","currentRow","currentColumn","currentMonth","input","addMonths","MonthPicker","onValueChange","onCancel","useId","today","useToday","clampedNumMonths","inited","setInited","useState","getNumColumns","lastMonth","Column","getWidth","yearIndex","rows","React","Heading","r","columns","isSameMonth","exhaustSwitchCase","createStandardDateRangePresets","PresetPicker","onClickPreset","pageIndex","setPageIndex","pages","currentPage","stenaAngleLeft","stenaAngleRight","Space","preset","CalendarWithMonthYearPickers","setDateInFocus","currentPanel","setCurrentPanel","renderMonthPicker","firstMonthInMonthPicker","numMonthsInMonthPicker","onChangeSelectedMonth","selectedMonth","useSelectedMonthStepperLogic","nextMonth","nextYear","addYears","prevMonth","subMonths","prevYear","subYears","WithMonthSwitcherBelow","children","Indent","SecondaryButton","stenaAngleLeftDouble","stenaArrowLeft","stenaArrowRight","stenaAngleRightDouble","noop","CalendarWithMonthSwitcher","monthSwitcherPlacement","onSelectPreset","calendarProps","fallbackIfNoPlacement","dateRangeToStrings","dateRange","stringsToDateRange","isDateRangeInvalid","toggleDatesIfEndIsEarlierThanStart","toggleDateStringsIfEndIsEarlierThanStart","useDateRangeOnClickDayHandler","focusedInput","setFocusedInput","useInternalPanelState","onChangePanel","_setCurrentPanel","useDateRangeSelection","initialDateInFocus","statePerMonthWithSelection","DateRangeCalendar","dateRangeSelectionProps","useDateRangeCalendarState","setStartDate","setEndDate","useSingleDateSelection","onChange","statePerMonthWithSelectedDate","SingleDateCalendar","singleDateSelectionProps","useMultiDateSelection","isSelected","v","stateSum","MultiDateCalendar","selectionProps","useSingleWeekSelection","getWeekDataFromWeekString","getWeekStringFromWeekData","weekData","parts","firstDateOfWeek","setWeek","SingleWeekCalendar","singleWeekSelectionProps","defaultPopoverPlacement","useDateInput","onClose","openOnMount","showingCalendar","setShowingCalendar","showCalendar","hideCalendar","onSelectDate","defaultMaxDate","DateInput","displayFormat","placeholder","calendarTheme","variant","width","portalTarget","zIndex","ControlledPopover","TextInput","TextInputButton","stenaCalendar","useDateRangeInput","startDateInputRef","endDateInputRef","showCalendarStartDate","showCalendarEndDate","startDateIsAfterEnd","DateRangeInput","placeholderStartDate","placeholderEndDate","Icon","stenaArrowWideRight","cssColor","DateTextInput","closeOnCalendarSelectDate","dateFormat","disableCalender","hideCalenderIcon","open","setOpen","toggleCalendar","onValueChangeHandler","onCalendarSelectDate","inValidInput","dateIsValid","isValid","invalid","popoverProps","formatHours","hours","h","formatMinutes","minutes","m","formatTimeString","time","validUserInput","arr","timeNumber","TimeTextInput","showPlaceholder","useIcon","valid","setValid","timeFormat","onBlur","formattedResult","onChangeHandler","validInput","stenaClock","DualTextInput","autoFocusLeft","autoFocusRight","onEsc","onEnter","onValueChangeLeft","onValueChangeRight","separatorIcon","placeholderLeft","placeholderRight","typeLeft","typeRight","onChangeLeft","onChangeRight","valueLeft","valueRight","minLeft","maxLeft","minRight","maxRight","onClickLeft","onClickRight","onClickCalendar","onClickArrowDown","onBlurLeft","onBlurRight","onFocusLeft","onFocusRight","inputRefLeft","inputRefRight","variantLeft","variantRight","showPresets","widthLeft","widthRight","focusCounter","tryTriggerOnBlur","debounce","focusLeftHandler","focusRightHandler","blurLeftHandler","blurRightHandler","TextInputBox","SeparatorLine","transformTimeStringToNumber","isValidTimeString","getHoursAndMinutesFromTimeString","p","parseIntElseUndefined","transformTimeInDateToTimeString","TimePickerCell","item","columnRef","canScrollRef","targetScroll","padStart","TimePickerColumn","items","selectedItem","range","TimePicker","hour","setHour","minute","setMinute","onClickHour","onClickMinutes","useDateRangeEffects","dateInputRef","useDateRangeHandlers","showCalendarInternal","hideCalendarInternal","setFirstFocusedInput","localTime","setLocalTime","localDate","setLocalDate","onChangeDate","incomingDate","newDate","onChangeTime","newTime","inputLeftChangeHandler","inputRightChangeHandler","useInputStates","isCalendarVisible","useBoolean","isTimePickerVisible","showTimePicker","hideTimePicker","firstFocusedInput","useUserInputHandlers","onClickArrowButton","onClickCalendarButton","onKeyDownHandler","DateTimeInput","appendTo","timeInputRef","states","dateToHighlight","hideAll","timeValue","delayedIsCalendarVisible","useDelayedFalse","delayedIsTimePickerVisible","YearPickerCell","YearPicker","initialLastYear","lastYear","setLastYear","yearRows","startYear","prev","calculateLastYearInFocus","yearRow","yearDiff","remaining","yearsToAdd","yearsToSubtract","DateRangeDualTextInput","renderBelowCalendar","TravelDateTextInput","readOnly","mask","pipe","guide","keepCharPositions","placeholderChar","showMask","calendarSize","onFocus","placeholderWhenBlurred","valueWhenBlurred","inputProps","localRef","isFocused","setIsFocused","inputRef","maskedOnChange","useMaskedInput","onFocusHandler","onBlurHandler","activePlaceholder","Label","LabelledTextInput","calenderSize","yearMask","monthMask","dayMask","createInputMaskForDateFormat","splitByNewLetter","tokenToMask","token","str","currentSegment","getDateFormatForLocaleCode","formatMap","part","parseLocalizedDateString","dateString","options","supportedLocaleCode","formatLocalizedDate","reformatLocalizedDateString","TravelDateRangeTextInputFields","startDateLabel","endDateLabel","startDateRef","endDateRef","placeholderWhenBlurredStartDate","placeholderWhenBlurredEndDate","valueWhenBlurredStartDate","valueWhenBlurredEndDate","readOnlyOnMobile","autoFocusStartDate","autoFocusEndDate","deviceSize","useDeviceSize","isDeviceSameOrLarger","dateFormatForLocaleCode","useControlledVisibleMonth","visibleMonthValue","onVisibleMonthChange","visibleMonth","setVisibleMonth","useEventCallback","requested","setVisibleMonthClamped","formatDateDescription","isSameYear","isInvalidRange","startDateStr","endDateStr","resetDateRangeIfInvalid","obj","master","useTravelDateRangeInput","languageLocaleCode","fieldLastInFocus","setFieldLastInFocus","moveFocusToField","languageLocale","calendarId","monthPickerButtonRef","selectedStartDate","selectedEndDate","visibleMonthData","monthPickerButtonLabel","intlFormat","todayIsInVisibleMonth","hoverDate","setHoverDate","visiblePanel","setVisiblePanel","onValueChangeByInputs","isValidDateRange","hoverAnchor","s","hoverHighlightDirection","callOnValueChange","MonthHeader","previousMonthButtonAriaLabel","nextMonthButtonAriaLabel","prevMonthDisabled","nextMonthDisabled","previousMonthButtonTestId","nextMonthButtonTestId","stenaAngleUp","rangeBgColor","getCellBackgroundColors","dayIsInMonth","getCellBackgroundHoverRangeHighlight","getCellBackgroundHighlight","highlightStartDate","highlightEndDate","flipLeftRight","isInHighlightRange","isWithinInterval","dateIsHoverDate","dateIsHoverAnchor","flip","left","right","getDateToFocusOn","currentDate","createDayId","TravelDateCellBackground","bgColorLeft","bgColorRight","TravelDateCell","onChangeVisibleMonth","focusDateWhenShown","onStartHover","onEndHover","focusableDate","isDateDisabled","dateTestId","renderDateContent","e","nextDate","nextDateDisabled","hoverRightOfAnchor","isShowingHoverRange","isHoverRangeStart","isHoverRangeEnd","isSelectionStart","isSelectionEnd","isToday","bgColors","isHovered","isDrawnAsSelectionStart","isDrawnAsSelectionEnd","isInRange","defaultContent","defaultTodayMarker","cursorClassName","disabledContentStyle","TravelCalendar","onClickDate","multiSelectable","ariaLabel","pendingFocusDate","gridRef","focused","daysInVisibleMonth","TravelDateRangeInput","heading","headingLevel","zIndexWhenClosed","onHideCalendar","textInputVariant","calendarOpen","setCalendarOpen","calendarInDom","setCalendarInDom","boxSize","setBoxSize","field","inputFieldsHeight","calendarOpenRef","onInputFocus","sizeSourceRef","useOnClickOutside","useLayoutEffect","height","CardBody","TravelDateTextInputField","useTravelDateInput","selectedDate","lastSyncedSelectedTime","selectedTime","TravelDateInput","delayedHideCalendar","TravelDateCalendarBody","calendarAriaLabel","TravelDateCalendar","TravelDateCalendarPanel","TravelDateRangeCalendar","useDisabledBeforeToday","usePrevMonthDisabledBeforeToday","useVisibleMonthState","initialMonth"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/util/date/DateFormats.ts","../src/util/calendar/StateModifier.ts","../src/features/today-state/UseHighlightToday.ts","../src/util/caseFormat/CaseFormat.ts","../src/util/calendar/CalendarDataFactory.ts","../src/util/calendar/StateHelper.ts","../src/components/calendar/CalendarTheme.tsx","../src/components/calendar/renderers/WeekDayCell.tsx","../src/components/calendar/renderers/CalendarDay.tsx","../src/components/calendar/renderers/WeekNumberCell.tsx","../src/util/date/DateMinMaxValidator.ts","../src/components/calendar/DisabledDayWrapper.tsx","../src/components/calendar/CalendarMonth.tsx","../src/components/calendar/Calendar.tsx","../src/features/month-picker/MonthPickerKeyboardNavigation.ts","../src/features/localize-date-format/LocaleMapper.ts","../src/features/month-picker/MonthPickerCell.tsx","../src/features/month-picker/MonthPickerDataFactory.ts","../src/features/month-picker/MonthPicker.tsx","../src/features/preset-picker/PresetFactory.ts","../src/features/preset-picker/PresetPicker.tsx","../src/features/calendar-with-month-year-pickers/CalendarWithMonthYearPickers.tsx","../src/features/month-switcher/hooks/UseSelectedMonthStepperLogic.ts","../src/features/month-switcher/MonthSwitcherBelow.tsx","../src/features/month-switcher/CalendarWithMonthSwitcher.tsx","../src/util/date-range/DateRangeTransformer.ts","../src/util/date-range/DateRangeValidator.ts","../src/features/date-range/hooks/UseDateRangeOnClickDayHandler.ts","../src/features/internal-panel-state/UseInternalPanelState.tsx","../src/components/calendar-types/date-range-calendar/hooks/UseDateRangeSelection.ts","../src/components/calendar-types/date-range-calendar/DateRangeCalendar.tsx","../src/components/calendar-types/date-range-calendar/hooks/UseDateRangeCalendarState.ts","../src/components/calendar-types/single-date-calendar/UseSingleDateSelection.ts","../src/components/calendar-types/single-date-calendar/SingleDateCalendar.tsx","../src/components/calendar-types/multi-date-calendar/UseMultiDateSelection.ts","../src/components/calendar-types/multi-date-calendar/MultiDateCalendar.tsx","../src/components/calendar-types/single-week-calendar/UseSingleWeekSelection.ts","../src/components/calendar-types/single-week-calendar/SingleWeekCalendar.tsx","../src/config/DefaultPopoverPlacement.ts","../src/components/input-types/date-input/UseDateInput.tsx","../src/config/DefaultMaxDate.ts","../src/components/input-types/date-input/DateInput.tsx","../src/components/input-types/date-range-input/hooks/UseDateRangeInput.tsx","../src/components/input-types/date-range-input/DateRangeInput.tsx","../src/components/input-types/date-text-input/DateTextInput.tsx","../src/util/time/TimeStringFormatValidator.ts","../src/components/input-types/time-text-input/TimeTextInput.tsx","../src/features/dual-text-input/DualTextInput.tsx","../src/util/time/TimeTransformer.ts","../src/features/time-picker/TimePickerCell.tsx","../src/features/time-picker/TimePickerColumn.tsx","../src/features/time-picker/TimePicker.tsx","../src/components/input-types/date-time-input/hooks/UseDateRangeEffects.ts","../src/components/input-types/date-time-input/hooks/UseDateRangeHandlers.ts","../src/components/input-types/date-time-input/hooks/UseInputStates.ts","../src/components/input-types/date-time-input/hooks/UseUserInputHandlers.ts","../src/components/input-types/date-time-input/DateTimeInput.tsx","../src/features/year-picker/YearPickerCell.tsx","../src/features/year-picker/YearPicker.tsx","../src/components/input-types/date-range-dual-text-input/hooks/UseDateRangeEffects.ts","../src/components/input-types/date-range-dual-text-input/hooks/UseDateRangeHandlers.ts","../src/components/input-types/date-range-dual-text-input/hooks/UseInputStates.ts","../src/components/input-types/date-range-dual-text-input/hooks/UseUserInputHandlers.ts","../src/components/input-types/date-range-dual-text-input/DateRangeDualTextInput.tsx","../src/features/travel-calendar/components/TravelDateTextInput.tsx","../src/features/localize-date-format/InputMaskProvider.ts","../src/features/localize-date-format/DateFormatProvider.ts","../src/features/localize-date-format/LocalizedDateParser.ts","../src/features/localize-date-format/LocalizedDateFormatter.ts","../src/features/localize-date-format/LocalizedDateReformatter.ts","../src/features/travel-calendar/components/TravelDateRangeTextInputFields.tsx","../src/features/travel-calendar/hooks/UseControlledVisibleMonth.ts","../src/features/travel-calendar/util/DateDescriptionFormatter.ts","../src/features/travel-calendar/util/DateRangeNormalizer.ts","../src/features/travel-calendar/hooks/UseTravelDateRangeInput.ts","../src/features/travel-calendar/components/MonthHeader.tsx","../src/features/travel-calendar/util/CellBgColors.ts","../src/features/travel-calendar/util/KeyboardNavigation.tsx","../src/features/travel-calendar/util/DayIdGenerator.ts","../src/features/travel-calendar/components/TravelDateCellBackground.tsx","../src/features/travel-calendar/components/TravelDateCell.tsx","../src/features/travel-calendar/components/TravelCalendar.tsx","../src/components/input-types/travel-date-range-input/TravelDateRangeInput.tsx","../src/features/travel-calendar/components/TravelDateTextInputField.tsx","../src/features/travel-calendar/hooks/UseTravelDateInput.ts","../src/components/input-types/travel-date-input/TravelDateInput.tsx","../src/features/travel-calendar/components/TravelDateCalendarBody.tsx","../src/components/calendar-types/travel-date-calendar/TravelDateCalendar.tsx","../src/components/calendar-types/travel-date-calendar-panel/TravelDateCalendarPanel.tsx","../src/components/calendar-types/travel-date-range-calendar/TravelDateRangeCalendar.tsx","../src/features/travel-calendar/hooks/DisabledDateHooks.ts","../src/features/travel-calendar/hooks/UseVisibleMonthState.ts"],"sourcesContent":["export const DateFormats = {\n yearAndMonth: \"yyyy-MM\",\n fullDate: \"yyyy-MM-dd\",\n fullMonthName: \"LLLL\",\n fullDateAndTime: \"yyyy-MM-dd HH:mm\",\n fullDateAndTimeSystem: \"yyyy-MM-ddTHH:MM\",\n weekDayName: \"EEEE\", // Tuesday\n weekDayNameShort: \"EEE\", // Tue\n dateAndMonth: \"d MMM\", // 2 Jan\n monthAndDate: \"MMM do\", // Jan 2nd\n};\n","import {\n addDays,\n eachDayOfInterval,\n endOfMonth,\n format,\n getDate,\n getISOWeek,\n isAfter,\n isSameDay,\n max,\n min,\n startOfMonth,\n subDays,\n} from \"date-fns\";\nimport { last } from \"lodash-es\";\nimport {\n CalendarState,\n CalendarUserData,\n DayState,\n DayStateHighlight,\n StateForWeek,\n} from \"../../types/CalendarTypes\";\nimport { DateFormats } from \"../date/DateFormats\";\nimport { WeekData } from \"./CalendarDataFactory\";\n\nexport const buildDayStateForDateRange = (\n statePerMonth: CalendarUserData<DayState> = {},\n start?: Date,\n end?: Date,\n): CalendarUserData<DayState> | undefined => {\n if (start && end && isAfter(end, start)) {\n return eachDayOfInterval({ start, end }).reduce(\n (result: CalendarUserData<DayState>, date: Date) => {\n const isFirstInRange = isSameDay(date, start);\n const isLastInRange = isSameDay(date, end);\n const highlights = isFirstInRange\n ? [\"selected\", \"selectedStart\", \"range\"]\n : isLastInRange\n ? [\"selected\", \"selectedEnd\", \"range\"]\n : [\"range\"];\n return addDayStateHighlights(result, date, highlights);\n },\n statePerMonth,\n );\n }\n\n let state = statePerMonth;\n\n if (start) {\n state = addDayStateHighlights(state, start, [\"selected\", \"singleSelected\"]);\n }\n\n if (end) {\n state = addDayStateHighlights(state, end, [\"selected\", \"singleSelected\"]);\n }\n\n return state;\n};\n\nexport const buildDayStateForSingleMonth = (\n statePerMonth: CalendarUserData<DayState> = {},\n start: Date | undefined,\n end: Date | undefined,\n dateInFocus: Date,\n): CalendarUserData<DayState> | undefined =>\n buildDayStateForRange(\n statePerMonth,\n start,\n end,\n startOfMonth(dateInFocus),\n endOfMonth(dateInFocus),\n );\n\nexport const buildDayStateForRange = (\n statePerMonth: CalendarUserData<DayState> = {},\n start: Date | undefined,\n end: Date | undefined,\n startLimit: Date,\n endLimit: Date,\n): CalendarUserData<DayState> | undefined => {\n if (start && end) {\n return buildDayStateForDateRange(\n statePerMonth,\n max([start, subDays(startLimit, 1)]),\n min([end, addDays(endLimit, 1)]),\n );\n } else {\n return buildDayStateForDateRange(statePerMonth, start, end);\n }\n};\n\nexport const setDayStateValue = (\n state: CalendarUserData<DayState> | undefined,\n date: Date,\n values: Partial<DayState>,\n): CalendarUserData<DayState> => {\n const monthString = format(date, DateFormats.yearAndMonth);\n const weekNumber = getISOWeek(date);\n const dayInMonth = getDate(date);\n return {\n ...state,\n [monthString]: {\n ...(state && state[monthString]),\n [weekNumber]: {\n ...(state && state[monthString] && state[monthString][weekNumber]),\n [dayInMonth]: {\n ...(state &&\n state[monthString] &&\n state[monthString][weekNumber] &&\n state[monthString][weekNumber][dayInMonth]),\n ...values,\n },\n },\n },\n };\n};\n\nexport const setDayStateValueFunction = (\n state: CalendarUserData<DayState> | undefined,\n date: Date,\n setter: (dayState: DayState | undefined) => Partial<DayState>,\n): CalendarUserData<DayState> => {\n const monthString = format(date, DateFormats.yearAndMonth);\n const weekNumber = getISOWeek(date);\n const dayInMonth = getDate(date);\n return {\n ...state,\n [monthString]: {\n ...(state && state[monthString]),\n [weekNumber]: {\n ...(state && state[monthString] && state[monthString][weekNumber]),\n [dayInMonth]: {\n ...(state &&\n state[monthString] &&\n state[monthString][weekNumber] &&\n state[monthString][weekNumber][dayInMonth]),\n ...setter(\n state &&\n state[monthString] &&\n state[monthString][weekNumber] &&\n state[monthString][weekNumber][dayInMonth],\n ),\n },\n },\n },\n };\n};\n\nexport const addDayStateHighlights = (\n calendarState: CalendarState | undefined,\n date: Date,\n highlights: Array<DayStateHighlight>,\n): CalendarUserData<DayState> => {\n const month = date.getMonth() + 1;\n const monthString = `${date.getFullYear()}-${month < 10 ? \"0\" : \"\"}${month}`;\n const weekNumber = getISOWeek(date);\n const dayInMonth = getDate(date);\n const dayState: DayState | undefined =\n calendarState &&\n calendarState[monthString] &&\n calendarState[monthString][weekNumber] &&\n calendarState[monthString][weekNumber][dayInMonth];\n\n return {\n ...calendarState,\n [monthString]: {\n ...(calendarState && calendarState[monthString]),\n [weekNumber]: {\n ...(calendarState &&\n calendarState[monthString] &&\n calendarState[monthString][weekNumber]),\n [dayInMonth]: addDayStateHighlightsOnSingleDay(dayState, highlights),\n },\n },\n };\n};\n\nexport const addDayStateHighlightsOnSingleDay = (\n dayState: DayState | undefined,\n highlights: Array<DayStateHighlight>,\n): DayState => {\n return {\n ...dayState,\n highlights: [...(dayState?.highlights ?? []), ...highlights],\n };\n};\n\nexport const addWeekStateHighlights = (\n calendarState: CalendarState | undefined,\n week: WeekData,\n highlights: Array<DayStateHighlight>,\n): CalendarUserData<DayState> => {\n const date = week.days[0].date;\n const month = date.getMonth() + 1;\n const monthString = `${date.getFullYear()}-${month < 10 ? \"0\" : \"\"}${month}`;\n const weekNumber = week.weekNumber;\n\n let state = calendarState;\n week.days.forEach((day) => {\n state = addDayStateHighlights(state, day.date, highlights);\n });\n\n const weekState =\n state && state[monthString] ? state[monthString][weekNumber] : undefined;\n\n const newHighlights: Array<DayStateHighlight> =\n weekState && weekState.highlights\n ? [...weekState.highlights, ...highlights]\n : highlights;\n\n const newWeekState: StateForWeek = {\n ...weekState,\n highlights: newHighlights,\n };\n\n return {\n ...state,\n [monthString]: {\n ...(calendarState && calendarState[monthString]),\n [weekNumber]: newWeekState,\n },\n };\n};\n\nexport const addWeekRangeHighlights = (\n calendarState: CalendarState | undefined,\n week: WeekData,\n): CalendarUserData<DayState> => {\n if (!week.days.length) {\n return { ...calendarState };\n }\n const startDate = week.days[0].date;\n const endDate = last(week.days)?.date;\n return {\n ...buildDayStateForDateRange(calendarState, startDate, endDate),\n };\n};\n","import { useMemo } from \"react\";\nimport { CalendarState } from \"../../types/CalendarTypes\";\nimport { addDayStateHighlights } from \"../../util/calendar/StateModifier\";\n\nexport const useHighlightToday = (\n enabled: boolean | undefined,\n statePerMonth: CalendarState | undefined,\n) => {\n return useMemo(() => {\n return enabled\n ? addDayStateHighlights(statePerMonth, new Date(), [\"today\"])\n : statePerMonth;\n }, [enabled, statePerMonth]);\n};\n","export const convertFirstCharToUpper = (value: string): string => {\n if (value.length === 0) {\n return value;\n }\n\n if (value.length === 1) {\n return value.toUpperCase();\n }\n\n return value.charAt(0).toUpperCase() + value.slice(1);\n};\n","import {\n addDays,\n addHours,\n addWeeks,\n eachDayOfInterval,\n endOfMonth,\n format,\n getDate,\n getISODay,\n getMonth,\n getWeek,\n getYear,\n isSameDay,\n Locale,\n startOfMonth,\n startOfWeek,\n} from \"date-fns\";\nimport { DateFormats } from \"../date/DateFormats\";\nimport { convertFirstCharToUpper } from \"../caseFormat/CaseFormat\";\n\nexport enum Month {\n JANUARY = 0,\n FEBRUARY,\n MARCH,\n APRIL,\n MAY,\n JUNE,\n JULY,\n AUGUST,\n SEPTEMBER,\n OCTOBER,\n NOVEMBER,\n DECEMBER,\n}\n\nexport enum WeekDay {\n SUNDAY = 0,\n MONDAY,\n TUESDAY,\n WEDNESDAY,\n THURSDAY,\n FRIDAY,\n SATURDAY,\n}\n\nexport interface DayData {\n name: string;\n fullName: string;\n date: Date; // YYYY-MM\n dateString: string; // YYYY-MM\n weekNumber: number;\n year: number; // 2018\n month: number; // 0-11\n dayOfMonth: number; // 1-31\n dayOfWeek: number; // 1-7\n isFirstDayOfWeek: boolean;\n isLastDayOfWeek: boolean;\n isFirstDayOfMonth: boolean;\n isLastDayOfMonth: boolean;\n}\n\nexport interface WeekData {\n weekNumber: number;\n startMonth: number;\n startYear: number;\n endMonth: number;\n endYear: number;\n isLastWeekOfMonth: boolean;\n days: Array<DayData>;\n}\n\nexport interface MonthData {\n monthString: string;\n name: string;\n year: number;\n monthInYear: number;\n weeks: Array<WeekData>;\n}\n\nexport const getMonthsInYear = (\n year: number,\n startMonth: number,\n numMonths: number,\n locale: Locale,\n): Array<MonthData> => {\n const months = [];\n for (let i = 0; i < numMonths; i++) {\n months.push(getMonthInYear(year, startMonth + i, locale));\n }\n return months;\n};\n\nexport const getMonthInYear = (\n year: number,\n month: number,\n locale: Locale,\n): MonthData => {\n if (isNaN(year) || isNaN(month)) {\n throw new Error(\"getMonthInYear() received NaN.\");\n }\n const yearToUse = year + Math.floor(month / 12);\n const monthToUse = month % 12;\n const firstDayOfMonth = new Date(yearToUse, monthToUse, 1);\n return {\n monthString: format(firstDayOfMonth, DateFormats.yearAndMonth),\n name: convertFirstCharToUpper(\n format(firstDayOfMonth, DateFormats.fullMonthName, { locale }),\n ),\n year: yearToUse,\n monthInYear: monthToUse,\n weeks: getWeeksForMonth(yearToUse, monthToUse, locale),\n };\n};\n\nexport const getWeeksForMonth = (\n year: number,\n month: number,\n locale: Locale,\n forceSixWeeks: boolean = true,\n): Array<WeekData> => {\n const firstDayOfMonth = new Date(year, month, 1);\n const firstDayOfFirstWeek = startOfWeek(firstDayOfMonth, { locale });\n\n const weeks = [];\n\n for (let i = 0; i < 6; i++) {\n const week = getWeekForDate(addWeeks(firstDayOfFirstWeek, i), locale);\n if (i > 0 && week.startMonth !== month && !forceSixWeeks) {\n return weeks;\n }\n weeks.push(week);\n }\n return weeks;\n};\n\nexport const getWeekForDate = (\n firstDayOfWeek: Date,\n locale: Locale,\n): WeekData => {\n const isLastWeekOfMonth =\n getMonth(addDays(firstDayOfWeek, 7)) !== getMonth(firstDayOfWeek);\n return {\n weekNumber: getWeek(firstDayOfWeek, { locale }),\n startMonth: getMonth(firstDayOfWeek),\n startYear: getYear(firstDayOfWeek),\n endMonth: getMonth(addDays(firstDayOfWeek, 6)),\n endYear: getYear(addDays(firstDayOfWeek, 6)),\n days: getDaysForWeekForDate(firstDayOfWeek, locale),\n isLastWeekOfMonth,\n };\n};\n\nexport const createDay = (date: Date, locale: Locale): DayData => {\n const dayOfWeek = getISODay(date);\n return {\n date,\n name: format(date, \"EEE\", locale ? { locale } : undefined),\n fullName: format(date, \"EEEE\", locale ? { locale } : undefined),\n dateString: format(addHours(date, 12), DateFormats.fullDate),\n weekNumber: getWeek(date, { locale }),\n year: getYear(date),\n month: getMonth(date),\n dayOfMonth: getDate(date),\n dayOfWeek,\n isFirstDayOfWeek: dayOfWeek === 1,\n isLastDayOfWeek: dayOfWeek === 7,\n isFirstDayOfMonth: isSameDay(startOfMonth(date), date),\n isLastDayOfMonth: isSameDay(endOfMonth(date), date),\n };\n};\n\nexport const getDaysForWeekForDate = (\n firstDayOfWeek: Date,\n locale: Locale,\n): Array<DayData> => {\n return eachDayOfInterval({\n start: firstDayOfWeek,\n end: addDays(firstDayOfWeek, 6),\n }).map((d) => createDay(d, locale));\n};\n\nexport const calculateOverflowingMonth = (\n year: number,\n month: number,\n): { year: number; month: number } => {\n if (month > Month.DECEMBER) {\n return { year: year + Math.floor(month / 12), month: month % 12 };\n }\n if (month < Month.JANUARY) {\n return { year: year + Math.floor(month / 12), month: 12 + (month % 12) };\n }\n return { year, month };\n};\n","import { DayState, DayStateHighlight } from \"../../types/CalendarTypes\";\n\nexport const dayHasHighlight = (\n dayState: DayState | undefined,\n defaultHighlights: Array<DayStateHighlight> | undefined,\n highlight: string,\n): boolean => {\n if (defaultHighlights && defaultHighlights.indexOf(highlight) >= 0) {\n return true;\n }\n if (\n dayState &&\n dayState.highlights &&\n dayState.highlights.indexOf(highlight) >= 0\n ) {\n return true;\n }\n return false;\n};\n\nexport const dayHighlightSelect = <T>(\n dayState: DayState | undefined,\n defaultHighlights: Array<DayStateHighlight> | undefined,\n highlightsOrBoolean: Array<string | boolean>,\n returnValues: Array<T>,\n fallbackValue?: T,\n): T | undefined => {\n if (highlightsOrBoolean.length !== returnValues.length) {\n throw new Error(\n \"Select highlight failed, number of values do not equal number of highlights.\",\n );\n }\n if (highlightsOrBoolean.length === 0) {\n return fallbackValue;\n }\n for (let i = 0; i < highlightsOrBoolean.length; i++) {\n if (typeof highlightsOrBoolean[i] === \"boolean\" && highlightsOrBoolean[i]) {\n return returnValues[i];\n }\n if (\n typeof highlightsOrBoolean[i] === \"string\" &&\n dayHasHighlight(\n dayState,\n defaultHighlights,\n highlightsOrBoolean[i] as string,\n )\n ) {\n return returnValues[i];\n }\n }\n return fallbackValue;\n};\n","import { IconDefinition } from \"@fortawesome/fontawesome-svg-core\";\nimport { TextProps } from \"@stenajs-webui/core\";\nimport { CSSProperties } from \"react\";\nimport { DayState, DayStateHighlight } from \"../../types/CalendarTypes\";\n\nimport {\n DayData,\n MonthData,\n WeekData,\n} from \"../../util/calendar/CalendarDataFactory\";\nimport { dayHighlightSelect } from \"../../util/calendar/StateHelper\";\n\nexport interface CalendarTheme<TUserData = unknown> {\n width: string;\n height: string;\n WeekNumber: WeekNumberTheme;\n WeekDay: WeekDayTheme;\n CalendarDay: CalendarDayTheme<TUserData>;\n CalendarMonth: CalendarMonthTheme;\n}\n\nexport interface WeekNumberTheme {\n backgroundColor: string;\n textColor?: string;\n clickableTextColor?: string;\n}\n\nexport interface CalendarMonthTheme {\n headerTextColor?: string;\n cellSpacing?: string;\n headerLeftIcon?: IconDefinition;\n headerRightIcon?: IconDefinition;\n}\n\nexport interface WeekDayTheme {\n textColor?: string;\n clickableTextColor?: string;\n}\n\nexport type CalendarStyleProvider<TUserData, TResult> = (\n defaultHighlights: Array<DayStateHighlight> | undefined,\n dayState: DayState | undefined,\n day: DayData,\n week: WeekData,\n month: MonthData,\n userData?: TUserData,\n) => TResult;\n\nexport type CalendarWrapperStyleProvider<TUserData> = CalendarStyleProvider<\n TUserData,\n CSSProperties | undefined\n>;\n\ntype TextPropsProvider<TUserData> = CalendarStyleProvider<\n TUserData,\n TextProps | undefined\n>;\n\nexport interface CalendarDayTheme<TUserData> {\n tdStyle?: CalendarWrapperStyleProvider<TUserData>;\n innerWrapperStyle?: CalendarWrapperStyleProvider<TUserData>;\n cellWrapperStyle?: CalendarWrapperStyleProvider<TUserData>;\n textProps?: TextPropsProvider<TUserData>;\n}\n\nexport interface CalendarDefaultWrapperColors {\n selectedBackground: string;\n rangeBackground: string;\n todayBackground: string;\n borderColor?: string;\n borderRadius?: string;\n rangeBorderRadius?: string;\n}\n\nexport const defaultWrapperStyleProvider =\n ({\n selectedBackground,\n todayBackground,\n rangeBackground,\n borderColor = \"transparent\",\n }: CalendarDefaultWrapperColors): CalendarWrapperStyleProvider<unknown> =>\n (defaultHighlights, dayState, day, _, month) => {\n const backgroundColor = dayHighlightSelect(\n dayState,\n defaultHighlights,\n [\"selected\", \"range\", \"today\", day.month === month.monthInYear],\n [selectedBackground, rangeBackground, todayBackground, \"#fff\"],\n \"transparent\",\n );\n\n return {\n backgroundColor,\n borderWidth: \"1px\",\n borderStyle: \"solid\",\n borderColor: dayHighlightSelect(\n dayState,\n defaultHighlights,\n [\"selectedStart\", \"selectedEnd\", \"singleSelected\", \"range\", \"today\"],\n [\n \"var(--swui-calendar-wrapper-range-background)\",\n \"var(--swui-calendar-wrapper-range-background)\",\n \"var(--swui-calendar-wrapper-range-background)\",\n \"var(--swui-calendar-wrapper-range-border)\",\n \"var(--lhds-color-ui-500)\",\n ],\n borderColor,\n ),\n borderTopLeftRadius: dayHighlightSelect(\n dayState,\n defaultHighlights,\n [\"selectedStart\", \"singleSelected\", \"today\"],\n [\n \"var(--swui-calendar-day-border-radius)\",\n \"var(--swui-calendar-day-border-radius)\",\n \"var(--swui-calendar-day-border-radius)\",\n ],\n \"unset\",\n ),\n borderBottomLeftRadius: dayHighlightSelect(\n dayState,\n defaultHighlights,\n [\"selectedStart\", \"singleSelected\", \"today\"],\n [\n \"var(--swui-calendar-day-border-radius)\",\n \"var(--swui-calendar-day-border-radius)\",\n \"var(--swui-calendar-day-border-radius)\",\n ],\n \"unset\",\n ),\n borderTopRightRadius: dayHighlightSelect(\n dayState,\n defaultHighlights,\n [\"selectedEnd\", \"singleSelected\", \"today\"],\n [\n \"var(--swui-calendar-day-border-radius)\",\n \"var(--swui-calendar-day-border-radius)\",\n \"var(--swui-calendar-day-border-radius)\",\n ],\n \"unset\",\n ),\n borderBottomRightRadius: dayHighlightSelect(\n dayState,\n defaultHighlights,\n [\"selectedEnd\", \"singleSelected\", \"today\"],\n [\n \"var(--swui-calendar-day-border-radius)\",\n \"var(--swui-calendar-day-border-radius)\",\n \"var(--swui-calendar-day-border-radius)\",\n ],\n \"unset\",\n ),\n boxSizing: \"border-box\",\n };\n };\n\ninterface DefaultTextColors {\n disabledColor: string;\n inOtherMonthColor: string;\n selectedColor: string;\n rangeTextColor?: string;\n}\n\nexport const defaultTextPropsProvider = ({\n selectedColor,\n disabledColor,\n inOtherMonthColor,\n rangeTextColor,\n}: DefaultTextColors): TextPropsProvider<unknown> => {\n return (defaultHighlights, dayState, day, _, month) => {\n const isOtherMonth = day.month !== month.monthInYear;\n const color = dayHighlightSelect(\n dayState,\n defaultHighlights,\n [isOtherMonth, \"selected\", \"range\", \"enabled\", \"disabled\"],\n [\n inOtherMonthColor,\n selectedColor,\n rangeTextColor,\n undefined,\n disabledColor,\n ],\n );\n return {\n color,\n };\n };\n};\n\nexport const defaultCalendarTheme: CalendarTheme = {\n width: \"var(--swui-calendar-day-width)\",\n height: \"var(--swui-calendar-day-height)\",\n WeekNumber: {\n backgroundColor: \"var(--swui-calendar-week-number-bg-color)\",\n textColor: \"var(--swui-calendar-week-number-text-color)\",\n clickableTextColor: \"var(--swui-calendar-week-number-clickable-text-color)\",\n },\n WeekDay: {\n textColor: \"var(--swui-calendar-week-day-text-color)\",\n clickableTextColor: \"var(--swui-calendar-week-day-clickable-text-color)\",\n },\n CalendarDay: {\n tdStyle: defaultWrapperStyleProvider({\n selectedBackground: \"var(--swui-calendar-wrapper-selected-background)\",\n rangeBackground: \"var(--swui-calendar-wrapper-range-background)\",\n todayBackground: \"var(--swui-calendar-wrapper-today-background)\",\n }),\n textProps: defaultTextPropsProvider({\n selectedColor: \"var(--swui-calendar-text-selected-color)\",\n disabledColor: \"var(--swui-calendar-text-disabled-color)\",\n inOtherMonthColor: \"var(--swui-calendar-text-in-other-month-color)\",\n }),\n },\n CalendarMonth: {\n headerTextColor: \"var(--swui-calendar-week-day-text-color)\",\n },\n};\n\nexport const extranetCalendarTheme: CalendarTheme = {\n ...defaultCalendarTheme,\n width: \"37px\",\n height: \"37px\",\n};\n","import { Box, Clickable, Text } from \"@stenajs-webui/core\";\nimport * as React from \"react\";\nimport { OnClickWeekDay } from \"../../../types/CalendarTypes\";\nimport { DayData } from \"../../../util/calendar/CalendarDataFactory\";\nimport { CalendarTheme } from \"../CalendarTheme\";\n\nexport interface WeekDayCellProps {\n onClickWeekDay?: OnClickWeekDay;\n day: DayData;\n theme: CalendarTheme;\n}\n\nexport const WeekDayCell = ({\n onClickWeekDay,\n day,\n theme,\n}: WeekDayCellProps) => {\n const content = (\n <Box\n width={theme.width}\n height={theme.height}\n justifyContent={\"center\"}\n alignItems={\"center\"}\n >\n <Text\n size={\"small\"}\n color={\n onClickWeekDay\n ? theme.WeekDay.clickableTextColor\n : theme.WeekDay.textColor\n }\n >\n {day.name}\n </Text>\n </Box>\n );\n\n if (onClickWeekDay) {\n return (\n <Clickable\n borderRadius={\"var(--swui-calendar-day-border-radius)\"}\n onClick={(ev) => onClickWeekDay(day.dayOfWeek, ev)}\n disableFocusHighlight={!onClickWeekDay}\n >\n {content}\n </Clickable>\n );\n }\n\n return content;\n};\n","import styled from \"@emotion/styled\";\nimport { Box, Text } from \"@stenajs-webui/core\";\nimport * as React from \"react\";\nimport {\n CalendarDayProps,\n DayState,\n DayStateHighlight,\n} from \"../../../types/CalendarTypes\";\nimport { dayHighlightSelect } from \"../../../util/calendar/StateHelper\";\n\nexport const CalendarDay = function CalendarDay<T>({\n day,\n week,\n month,\n dayState,\n userData,\n onClickDay,\n theme,\n extraDayContent: ExtraDayContent,\n defaultHighlights,\n showDatesInOtherMonths,\n}: CalendarDayProps<T>) {\n const content = (\n <Box\n width={\"100%\"}\n height={\"100%\"}\n justifyContent={\"center\"}\n alignItems={\"center\"}\n >\n <Text\n {...(theme.CalendarDay.textProps &&\n theme.CalendarDay.textProps(\n defaultHighlights,\n dayState,\n day,\n week,\n month,\n userData,\n ))}\n >\n {day.dayOfMonth}\n </Text>\n </Box>\n );\n\n const WrapperTd = styled.td({\n ...(theme.CalendarDay.tdStyle &&\n theme.CalendarDay.tdStyle(\n defaultHighlights,\n dayState,\n day,\n week,\n month,\n userData,\n )),\n });\n\n const InnerWrapperDiv = styled.div({\n ...(theme.CalendarDay.innerWrapperStyle &&\n theme.CalendarDay.innerWrapperStyle(\n defaultHighlights,\n dayState,\n day,\n week,\n month,\n userData,\n )),\n width: \"100%\",\n height: \"100%\",\n });\n\n const CellWrapperDiv = styled.div({\n ...(theme.CalendarDay.cellWrapperStyle &&\n theme.CalendarDay.cellWrapperStyle(\n defaultHighlights,\n dayState,\n day,\n week,\n month,\n userData,\n )),\n width: \"100%\",\n height: \"100%\",\n position: \"relative\",\n });\n\n const disabled = isDisabled(defaultHighlights, dayState);\n\n return (\n <WrapperTd\n onClick={disabled ? undefined : (ev) => onClickDay?.(day, userData, ev)}\n >\n <InnerWrapperDiv>\n <CellWrapperDiv>\n {(day.month === month.monthInYear || showDatesInOtherMonths) && (\n <>\n {ExtraDayContent && (\n <ExtraDayContent\n week={week}\n month={month}\n day={day}\n dayState={dayState}\n theme={theme}\n userData={userData}\n />\n )}\n {content}\n </>\n )}\n </CellWrapperDiv>\n </InnerWrapperDiv>\n </WrapperTd>\n );\n};\n\nconst isDisabled = (\n defaultHighlights: Array<DayStateHighlight> | undefined,\n dayState: DayState | undefined,\n): boolean =>\n !!dayHighlightSelect<boolean>(\n dayState,\n defaultHighlights,\n [\"enabled\", \"disabled\"],\n [false, true],\n false,\n );\n","import { Box, Clickable, Text } from \"@stenajs-webui/core\";\nimport * as React from \"react\";\nimport { ReactNode } from \"react\";\nimport { OnClickWeek } from \"../../../types/CalendarTypes\";\nimport { WeekData } from \"../../../util/calendar/CalendarDataFactory\";\nimport { CalendarTheme } from \"../CalendarTheme\";\n\nexport interface WeekNumberCellProps {\n week: WeekData;\n onClickWeek?: OnClickWeek;\n theme: CalendarTheme;\n background?: ReactNode;\n prefix?: string;\n backgroundColor?: string;\n}\n\nexport const WeekNumberCell: React.FC<WeekNumberCellProps> = ({\n onClickWeek,\n theme,\n week,\n background,\n backgroundColor,\n prefix,\n}) => {\n const content = (\n <Box\n width={theme.width}\n height={theme.height}\n justifyContent={\"center\"}\n alignItems={\"center\"}\n >\n {background && <Box position={\"absolute\"}>{background}</Box>}\n <Box position={\"absolute\"}>\n <Text\n color={\n onClickWeek\n ? theme.WeekNumber.clickableTextColor\n : theme.WeekNumber.textColor\n }\n >\n {prefix}\n {week.weekNumber}\n </Text>\n </Box>\n </Box>\n );\n return (\n <Box\n background={backgroundColor || theme.WeekNumber.backgroundColor}\n position={\"relative\"}\n >\n {onClickWeek ? (\n <Clickable\n borderRadius={\"var(--swui-calendar-day-border-radius)\"}\n onClick={(ev) => onClickWeek(week, ev)}\n disableFocusHighlight={!onClickWeek}\n >\n {content}\n </Clickable>\n ) : (\n content\n )}\n </Box>\n );\n};\n","import { isAfter, isBefore, isSameDay } from \"date-fns\";\n\nexport const isDateInMinMaxRange = (\n date: Date,\n min: Date | undefined,\n max: Date | undefined,\n): boolean => {\n if (min && isBefore(date, min)) {\n return isSameDay(date, min);\n }\n if (max && isAfter(date, max)) {\n return isSameDay(date, max);\n }\n return true;\n};\n","import * as React from \"react\";\nimport { useMemo } from \"react\";\nimport {\n CalendarDayProps,\n OptionalMinMaxDates,\n} from \"../../types/CalendarTypes\";\nimport { addDayStateHighlightsOnSingleDay } from \"../../util/calendar/StateModifier\";\nimport { isDateInMinMaxRange } from \"../../util/date/DateMinMaxValidator\";\n\ninterface DisabledDayWrapperProps<T>\n extends CalendarDayProps<T>, OptionalMinMaxDates {\n dayComponent: React.ComponentType<CalendarDayProps<T>>;\n}\n\nexport const DisabledDayWrapper = function DisabledDayWrapper<T>({\n dayComponent: DayComponent,\n minDate,\n maxDate,\n dayState,\n day,\n ...props\n}: DisabledDayWrapperProps<T>) {\n const activeDayState = useMemo(\n () =>\n !isDateInMinMaxRange(day.date, minDate, maxDate)\n ? addDayStateHighlightsOnSingleDay(dayState, [\"disabled\"])\n : dayState,\n [day.date, dayState, maxDate, minDate],\n );\n\n return <DayComponent day={day} {...props} dayState={activeDayState} />;\n};\n","import { Box, Row, Text } from \"@stenajs-webui/core\";\nimport * as React from \"react\";\nimport { ReactNode } from \"react\";\nimport {\n CalendarDayProps,\n CalendarOnClicks,\n CalendarUserMonthData,\n DayState,\n DayStateHighlight,\n ExtraDayContentProps,\n OptionalMinMaxDates,\n Renderers,\n} from \"../../types/CalendarTypes\";\nimport {\n DayData,\n MonthData,\n WeekData,\n} from \"../../util/calendar/CalendarDataFactory\";\nimport { CalendarTheme, defaultCalendarTheme } from \"./CalendarTheme\";\nimport { WeekDayCell } from \"./renderers/WeekDayCell\";\nimport { CalendarDay } from \"./renderers/CalendarDay\";\nimport { FlatButton, stenaAngleDown } from \"@stenajs-webui/elements\";\nimport { WeekNumberCell } from \"./renderers/WeekNumberCell\";\nimport { DisabledDayWrapper } from \"./DisabledDayWrapper\";\n\nexport interface CalendarMonthProps<T>\n extends CalendarOnClicks<T>, Renderers, OptionalMinMaxDates {\n month: MonthData;\n dayComponent?: React.ComponentType<CalendarDayProps<T>>;\n userDataPerWeek?: CalendarUserMonthData<T>;\n statePerWeek?: CalendarUserMonthData<DayState>;\n theme?: CalendarTheme;\n headerRightContent?: ReactNode;\n extraDayContent?: React.ComponentType<ExtraDayContentProps<T>>;\n defaultHighlights?: Array<DayStateHighlight>;\n showWeekNumber: boolean;\n}\n\nexport function CalendarMonth<T>({\n month,\n dayComponent = CalendarDay,\n statePerWeek,\n userDataPerWeek,\n minDate,\n maxDate,\n onClickDay,\n onClickWeek,\n onClickWeekDay,\n onClickMonth,\n renderWeekNumber,\n renderWeekDay,\n headerRightContent,\n theme = defaultCalendarTheme,\n extraDayContent,\n defaultHighlights,\n showWeekNumber,\n}: CalendarMonthProps<T>) {\n return (\n <>\n <Box alignItems={\"stretch\"}>\n <Row\n justifyContent={headerRightContent ? \"space-between\" : \"center\"}\n alignItems={\"center\"}\n >\n <Row justifyContent={\"center\"} alignItems={\"center\"}>\n {onClickMonth ? (\n <FlatButton\n onClick={() => onClickMonth(month)}\n label={month.name + \" \" + String(month.year)}\n rightIcon={stenaAngleDown}\n />\n ) : (\n <Text whiteSpace={\"nowrap\"}>\n {month.name} {month.year}\n </Text>\n )}\n </Row>\n\n {headerRightContent && (\n <Box alignItems={\"center\"}>{headerRightContent}</Box>\n )}\n </Row>\n\n <table>\n <tbody>\n <tr>\n {showWeekNumber && (\n <td>\n <Box width={theme.width} height={theme.height} />\n </td>\n )}\n {month.weeks[0].days.map((day: DayData) => (\n <td key={day.name}>\n {renderWeekDay ? (\n renderWeekDay(day.name, theme, onClickWeekDay)\n ) : (\n <WeekDayCell\n day={day}\n onClickWeekDay={onClickWeekDay}\n theme={theme}\n />\n )}\n </td>\n ))}\n </tr>\n {month.weeks.map((week: WeekData) => (\n <tr key={week.weekNumber}>\n {showWeekNumber && (\n <td>\n {renderWeekNumber ? (\n renderWeekNumber(week, theme, onClickWeek)\n ) : (\n <WeekNumberCell\n week={week}\n onClickWeek={onClickWeek}\n theme={theme}\n />\n )}\n </td>\n )}\n {week.days.map((day) => (\n <DisabledDayWrapper\n dayComponent={dayComponent}\n key={day.dateString}\n day={day}\n week={week}\n month={month}\n dayState={\n statePerWeek &&\n statePerWeek[week.weekNumber] &&\n statePerWeek[week.weekNumber][day.dayOfMonth]\n }\n userData={\n userDataPerWeek &&\n userDataPerWeek[week.weekNumber] &&\n userDataPerWeek[week.weekNumber][day.dayOfMonth]\n }\n onClickDay={onClickDay}\n theme={theme}\n extraDayContent={extraDayContent}\n defaultHighlights={defaultHighlights}\n minDate={minDate}\n maxDate={maxDate}\n />\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </Box>\n </>\n );\n}\n","import { Row, Spacing } from \"@stenajs-webui/core\";\nimport { getMonth, getYear, Locale, parse } from \"date-fns\";\nimport { enGB } from \"date-fns/locale\";\nimport { chunk } from \"lodash-es\";\nimport * as React from \"react\";\nimport { useMemo } from \"react\";\nimport { useHighlightToday } from \"../../features/today-state/UseHighlightToday\";\nimport {\n CalendarOnClicks,\n CalendarProps,\n CalendarUserData,\n DayState,\n Renderers,\n} from \"../../types/CalendarTypes\";\nimport {\n calculateOverflowingMonth,\n getMonthInYear,\n getMonthsInYear,\n MonthData,\n} from \"../../util/calendar/CalendarDataFactory\";\nimport cx from \"classnames\";\nimport styles from \"./Calendar.module.css\";\n\nimport { CalendarMonth } from \"./CalendarMonth\";\nimport { CalendarTheme, defaultCalendarTheme } from \"./CalendarTheme\";\nimport { CalendarDay } from \"./renderers/CalendarDay\";\n\ninterface CalendarPanelProps<T>\n extends CalendarProps<T>, CalendarOnClicks<T>, Renderers {\n year: number;\n month: number;\n monthRows: Array<Array<MonthData>>;\n userDataPerMonth?: CalendarUserData<T>;\n statePerMonth?: CalendarUserData<DayState>;\n width?: string;\n height?: string;\n theme?: CalendarTheme;\n}\n\nfunction CalendarPanel<T>({\n monthRows,\n dayComponent = CalendarDay,\n userDataPerMonth,\n statePerMonth,\n minDate,\n maxDate,\n onClickDay,\n onClickWeekDay,\n onClickWeek,\n onClickMonth,\n renderWeekDay,\n renderWeekNumber,\n headerRightContent,\n extraDayContent,\n defaultHighlights,\n showWeekNumber,\n theme = defaultCalendarTheme,\n}: CalendarPanelProps<T>) {\n const minDateObj = useMemo(\n () => (minDate ? parse(minDate, \"yyyy-MM-dd\", new Date()) : undefined),\n [minDate],\n );\n\n const maxDateObj = useMemo(\n () => (maxDate ? parse(maxDate, \"yyyy-MM-dd\", new Date()) : undefined),\n [maxDate],\n );\n\n return (\n <div\n className={cx(\n styles.calendar,\n showWeekNumber && styles.weekNumberVisible,\n )}\n >\n {monthRows.map((monthRow, rowIndex) => (\n <Spacing key={rowIndex}>\n <Row gap={2}>\n {monthRow.map((month) => (\n <CalendarMonth<T>\n key={month.name}\n month={month}\n dayComponent={dayComponent}\n userDataPerWeek={\n userDataPerMonth && userDataPerMonth[month.monthString]\n }\n statePerWeek={statePerMonth && statePerMonth[month.monthString]}\n onClickDay={onClickDay}\n onClickWeekDay={onClickWeekDay}\n onClickWeek={onClickWeek}\n onClickMonth={onClickMonth}\n theme={theme}\n renderWeekNumber={renderWeekNumber}\n renderWeekDay={renderWeekDay}\n headerRightContent={headerRightContent}\n extraDayContent={extraDayContent}\n defaultHighlights={defaultHighlights}\n minDate={minDateObj}\n maxDate={maxDateObj}\n showWeekNumber={showWeekNumber ?? false}\n />\n ))}\n </Row>\n </Spacing>\n ))}\n </div>\n );\n}\n\nexport function Calendar<T>(props: CalendarProps<T>) {\n const initialDate = getInitialDate(props.year, props.month, props.date);\n const { year, month } = calculateOverflowingMonth(\n initialDate.year,\n initialDate.month,\n );\n const monthRows = getMonthRows(\n year,\n month,\n props.locale ?? enGB,\n props.numMonths,\n props.monthsPerRow,\n );\n\n const statePerMonth = useHighlightToday(\n props.highlightToday,\n props.statePerMonth,\n );\n\n return (\n <CalendarPanel<T>\n year={year}\n month={month}\n monthRows={monthRows}\n {...props}\n statePerMonth={statePerMonth}\n />\n );\n}\n\nconst getInitialDate = (year?: number, month?: number, date?: Date) => {\n if (month && year) {\n return {\n month,\n year,\n };\n }\n if (date) {\n return {\n month: getMonth(date),\n year: getYear(date),\n };\n }\n const now = new Date();\n return {\n month: getMonth(now),\n year: getYear(now),\n };\n};\n\nconst getMonthRows = (\n year: number,\n month: number,\n locale: Locale,\n numMonths?: number,\n monthsPerRow?: number,\n): Array<Array<MonthData>> => {\n if (numMonths == null) {\n return [[getMonthInYear(year, month, locale)]];\n }\n if (monthsPerRow == null) {\n return [getMonthsInYear(year, month, numMonths, locale)];\n }\n return chunk(getMonthsInYear(year, month, numMonths, locale), monthsPerRow);\n};\n","import { Position } from \"./Position\";\n\nexport const getDomIdForMonth = (\n position: Position,\n monthPickerId: string,\n): string => {\n return `${position.row}-${position.column}-${monthPickerId}`;\n};\n\nexport const getDomIdForKeyboardKey = (\n key: string,\n currentPosition: Position,\n monthPickerId: string,\n numColumnsPerRow: number,\n): string | undefined => {\n let next = currentPosition;\n for (let i = 0; i < numColumnsPerRow; i++) {\n next = movePositionByKey(next, key, numColumnsPerRow);\n const id = getDomIdForMonth(next, monthPickerId);\n if (document.getElementById(id)) {\n return id;\n }\n }\n return undefined;\n};\n\nexport const movePositionByKey = (\n currentPosition: Position,\n key: string,\n numColumnsPerRow: number,\n): Position => {\n let row = currentPosition.row;\n let column = currentPosition.column;\n if (key === \"ArrowLeft\") {\n column--;\n } else if (key === \"ArrowUp\") {\n row--;\n } else if (key === \"ArrowRight\") {\n column++;\n } else if (key === \"ArrowDown\") {\n row++;\n }\n\n if (column < 0) {\n column = numColumnsPerRow - 1;\n row--;\n }\n if (column > numColumnsPerRow - 1) {\n column = 0;\n row++;\n }\n\n return {\n column,\n row,\n };\n};\n","import { Locale } from \"date-fns\";\nimport {\n da,\n de,\n deAT,\n enGB,\n enIE,\n enUS,\n es,\n cs,\n it,\n fi,\n fr,\n lv,\n nb,\n nl,\n et,\n nlBE,\n pl,\n lt,\n sv,\n} from \"date-fns/locale\";\n\ntype LocalesMap = {\n [key: string]: Locale;\n};\n\nexport type SupportedLocaleCode =\n | \"en\"\n | \"en-US\"\n | \"en-GB\"\n | \"en-IE\"\n | \"de-AT\"\n | \"nl-BE\"\n | \"nl-NL\"\n | \"de-DE\"\n | \"nb-NO\"\n | \"sv-SE\"\n | \"da-DK\"\n | \"lv-LV\"\n | \"lt-LT\"\n | \"it-IT\"\n | \"et-EE\"\n | \"fi-FI\"\n | \"cs-CZ\"\n | \"es-ES\"\n | \"fr-FR\"\n | \"pl-PL\"\n | \"nl\"\n | \"de\"\n | \"nb\"\n | \"sv\"\n | \"da\"\n | \"lv\"\n | \"lt\"\n | \"it\"\n | \"et\"\n | \"fi\"\n | \"cs\"\n | \"es\"\n | \"fr\"\n | \"pl\";\n\nconst locales: LocalesMap = {\n en: enGB,\n \"en-US\": enUS,\n \"en-GB\": enGB,\n \"en-IE\": enIE,\n \"de-AT\": deAT,\n \"nl-BE\": nlBE,\n \"nl-NL\": nl,\n \"de-DE\": de,\n \"nb-NO\": nb,\n \"sv-SE\": sv,\n \"da-DK\": da,\n \"lv-LV\": lv,\n \"lt-LT\": lt,\n \"it-IT\": it,\n \"et-EE\": et,\n \"fi-FI\": fi,\n \"cs-CZ\": cs,\n \"es-ES\": es,\n \"fr-FR\": fr,\n \"pl-PL\": pl,\n nl,\n de,\n nb,\n sv,\n da,\n lv,\n lt,\n it,\n et,\n fi,\n cs,\n es,\n fr,\n pl,\n};\n\nexport const fallbackLocaleCode: SupportedLocaleCode = \"en-GB\";\nexport const fallbackLocaleCodeForFormatting: SupportedLocaleCode = \"sv\";\n\nexport const getSupportedLocaleCode = (\n localeCode: string,\n matchLanguage: boolean,\n fallback: SupportedLocaleCode,\n): SupportedLocaleCode => {\n if (locales[localeCode]) {\n return localeCode as SupportedLocaleCode;\n }\n if (matchLanguage) {\n const languageCode = getSupportedLocaleCodeMatchingLanguage(localeCode);\n if (languageCode) {\n return languageCode;\n }\n }\n return fallback;\n};\n\nexport const getLocaleForLocaleCode = (\n localeCode: SupportedLocaleCode,\n): Locale => {\n return locales[localeCode];\n};\n\nexport const getSupportedLocaleCodeMatchingLanguage = (\n localeCode: string,\n): SupportedLocaleCode | undefined => {\n const [lang] = localeCode.split(\"-\");\n const localeCodes = Object.keys(locales);\n for (const l of localeCodes) {\n if (l.startsWith(lang)) {\n return l as SupportedLocaleCode;\n }\n }\n return undefined;\n};\n\nexport const getDefaultLocaleForFormatting = (): Locale => {\n return locales[\"sv\"];\n};\n\n/**\n * This is only used by old calendar components, to pass localeCode to updated components.\n * All updated calendar components just take localeCode, for example \"en-GB\", since that is what the browser provides,\n * and is not library dependent.\n */\nexport const getLocaleCodeForLocale = (\n locale: Locale,\n): SupportedLocaleCode | undefined => {\n const localeCodes = Object.keys(locales);\n for (const localeCode of localeCodes) {\n if (locales[localeCode].code === locale.code) {\n return localeCode as SupportedLocaleCode;\n }\n }\n return undefined;\n};\n","import * as React from \"react\";\nimport {\n KeyboardEventHandler,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n} from \"react\";\nimport { Row } from \"@stenajs-webui/core\";\nimport { FlatButton, PrimaryButton } from \"@stenajs-webui/elements\";\nimport { format } from \"date-fns\";\nimport {\n getDomIdForKeyboardKey,\n getDomIdForMonth,\n} from \"./MonthPickerKeyboardNavigation\";\nimport { Position } from \"./Position\";\nimport { MonthPickerSizeVariant } from \"./MonthPicker\";\nimport {\n getLocaleForLocaleCode,\n SupportedLocaleCode,\n} from \"../localize-date-format/LocaleMapper\";\nimport { convertFirstCharToUpper } from \"../../util/caseFormat/CaseFormat\";\n\ninterface MonthPickerCellProps {\n month: Date;\n onClick: () => void;\n selected: boolean;\n localeCode: SupportedLocaleCode;\n autoFocus: boolean;\n monthPickerId: string;\n firstAvailableMonth: Date;\n lastAvailableMonth: Date;\n position: Position;\n size: MonthPickerSizeVariant;\n}\n\nexport const MonthPickerCell: React.FC<MonthPickerCellProps> = ({\n month,\n onClick,\n selected,\n localeCode,\n autoFocus,\n monthPickerId,\n position,\n size,\n}) => {\n const locale = useMemo(\n () => getLocaleForLocaleCode(localeCode) ?? getLocaleForLocaleCode(\"en-GB\"),\n [localeCode],\n );\n\n const label = useMemo(\n () => convertFirstCharToUpper(format(month, \"LLL\", { locale })),\n [locale, month],\n );\n\n const abbr = useMemo(\n () => format(month, \"LLLL\", { locale }),\n [locale, month],\n );\n\n const ref = useRef<HTMLButtonElement>(null);\n\n const domId = getDomIdForMonth(position, monthPickerId);\n const tabIndex = selected ? 0 : -1;\n\n useEffect(() => {\n ref.current?.focus();\n }, []);\n\n const onKeyDown = useCallback<KeyboardEventHandler<HTMLDivElement>>(\n (ev) => {\n const nextDomId = getDomIdForKeyboardKey(\n ev.key,\n position,\n monthPickerId,\n 4,\n );\n if (nextDomId) {\n document.getElementById(nextDomId)?.focus();\n }\n },\n [monthPickerId, position],\n );\n\n return (\n <Row justifyContent={\"center\"} onKeyDown={onKeyDown}>\n {selected ? (\n <PrimaryButton\n id={domId}\n aria-label={abbr}\n label={label}\n onClick={onClick}\n aria-selected={true}\n autoFocus={autoFocus}\n ref={ref}\n size={size === \"large\" ? \"large\" : \"medium\"}\n tabIndex={tabIndex}\n />\n ) : (\n <FlatButton\n id={domId}\n label={label}\n aria-label={abbr}\n onClick={onClick}\n size={size === \"large\" ? \"large\" : \"medium\"}\n tabIndex={tabIndex}\n />\n )}\n </Row>\n );\n};\n","import { addMonths } from \"date-fns\";\nimport { Position } from \"./Position\";\n\nexport interface MonthInput {\n yearOrder: Array<number>;\n years: Record<number, YearInput>;\n rows: Array<RowInput>;\n lastMonthRow: number;\n lastMonthColumn: number;\n}\n\nexport interface YearInput {\n year: number;\n rows: Array<number>;\n}\n\nexport interface RowInput {\n rowIndex: number;\n columns: Array<Columns>;\n}\n\nexport interface Columns {\n position: Position;\n month: Date;\n}\n\nexport const createMonths = (\n firstMonth: Date,\n numMonths: number,\n numColumnsPerRow: number,\n): MonthInput => {\n let currentYear = firstMonth.getFullYear();\n let currentRow = 0;\n let currentColumn = 0;\n let currentMonth = firstMonth;\n\n const input: MonthInput = {\n yearOrder: [],\n rows: [],\n years: {},\n lastMonthColumn: -1,\n lastMonthRow: -1,\n };\n\n for (let i = 0; i < numMonths; i++) {\n if (input.years[currentYear] == null) {\n input.yearOrder.push(currentYear);\n input.years[currentYear] = { year: currentYear, rows: [] };\n }\n\n input.rows[currentRow] = input.rows[currentRow] ?? {\n columns: [],\n rowIndex: currentRow,\n };\n\n input.rows[currentRow].columns[currentColumn] = {\n position: {\n column: currentColumn,\n row: currentRow,\n },\n month: currentMonth,\n };\n\n if (i === numMonths - 1) {\n // Last one, add it and exit\n input.years[currentYear].rows.push(currentRow);\n break;\n }\n\n currentMonth = addMonths(currentMonth, 1);\n\n if (currentMonth.getFullYear() !== currentYear) {\n input.years[currentYear].rows.push(currentRow);\n currentYear++;\n currentColumn = 0;\n currentRow++;\n } else {\n currentColumn++;\n if (currentColumn > numColumnsPerRow - 1) {\n input.years[currentYear].rows.push(currentRow);\n currentColumn = 0;\n currentRow++;\n }\n }\n }\n\n input.lastMonthColumn = currentColumn;\n input.lastMonthRow = currentRow;\n\n return input;\n};\n","import * as React from \"react\";\nimport {\n KeyboardEventHandler,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useState,\n} from \"react\";\nimport { ValueAndOnValueChangeProps } from \"@stenajs-webui/forms\";\nimport {\n Column,\n exhaustSwitchCase,\n Heading,\n useToday,\n} from \"@stenajs-webui/core\";\nimport { MonthPickerCell } from \"./MonthPickerCell\";\nimport { addMonths, isSameMonth } from \"date-fns\";\nimport { createMonths } from \"./MonthPickerDataFactory\";\nimport { SupportedLocaleCode } from \"../localize-date-format/LocaleMapper\";\n\nexport type MonthPickerSizeVariant = \"smaller\" | \"small\" | \"medium\" | \"large\";\n\nexport interface MonthPickerProps extends ValueAndOnValueChangeProps<Date> {\n localeCode: SupportedLocaleCode;\n firstMonth: Date;\n numMonths: number;\n onCancel?: () => void;\n size?: MonthPickerSizeVariant;\n}\n\nexport const MonthPicker: React.FC<MonthPickerProps> = ({\n value,\n onValueChange,\n firstMonth,\n localeCode,\n numMonths,\n onCancel,\n size = \"medium\",\n}) => {\n const monthPickerId = useId();\n const today = useToday();\n\n const clampedNumMonths = numMonths > 0 ? numMonths : 12;\n\n const [inited, setInited] = useState(false);\n\n const input = createMonths(firstMonth, clampedNumMonths, getNumColumns(size));\n\n const lastMonth = useMemo(() => {\n return addMonths(firstMonth, clampedNumMonths);\n }, [clampedNumMonths, firstMonth]);\n\n useEffect(() => {\n setInited(true);\n }, []);\n\n const onKeyDown = useCallback<KeyboardEventHandler>(\n (ev) => {\n if (ev.key === \"Escape\") {\n onCancel?.();\n ev.preventDefault();\n ev.stopPropagation();\n }\n },\n [onCancel],\n );\n\n return (\n <Column gap={1} maxWidth={getWidth(size)} onKeyDown={onKeyDown}>\n {input.yearOrder.map((year, yearIndex) => {\n const { rows } = input.years[year];\n return (\n <React.Fragment key={year}>\n {(yearIndex !== 0 || year !== today.getFullYear()) && (\n <Heading variant={\"h4\"}>{year}</Heading>\n )}\n <table style={{ borderSpacing: \"0 8px\" }}>\n <tbody>\n {rows.map((r) => {\n const { columns } = input.rows[r];\n return (\n <tr key={r}>\n {columns.map(({ month, position }) => (\n <td key={month.getMonth()}>\n <MonthPickerCell\n month={month}\n firstAvailableMonth={firstMonth}\n lastAvailableMonth={lastMonth}\n localeCode={localeCode}\n selected={value ? isSameMonth(value, month) : false}\n autoFocus={inited}\n onClick={() => onValueChange?.(month)}\n monthPickerId={monthPickerId}\n position={position}\n size={size}\n />\n </td>\n ))}\n </tr>\n );\n })}\n </tbody>\n </table>\n </React.Fragment>\n );\n })}\n </Column>\n );\n};\n\nconst getWidth = (size: MonthPickerSizeVariant) => {\n // For cell size = 48px, 48*7 = 336px\n switch (size) {\n case \"smaller\":\n return \"280px\";\n case \"small\":\n return \"308px\";\n case \"medium\":\n return \"336px\";\n case \"large\":\n return \"448px\";\n default:\n return exhaustSwitchCase(size, \"336px\");\n }\n};\n\nconst getNumColumns = (size: MonthPickerSizeVariant): number => {\n switch (size) {\n case \"smaller\":\n case \"small\":\n return 3;\n case \"medium\":\n case \"large\":\n return 4;\n default:\n return exhaustSwitchCase(size, 4);\n }\n};\n","import { PresetPage } from \"./CalendarPreset\";\nimport { addDays, subDays } from \"date-fns\";\n\nexport const createStandardDateRangePresets = (\n now: Date,\n): Array<PresetPage> => [\n {\n label: \"Past\",\n presets: [\n { label: \"Last 3 days\", startDate: now, endDate: subDays(now, 2) },\n { label: \"Last 7 days\", startDate: now, endDate: subDays(now, 6) },\n { label: \"Last 30 days\", startDate: now, endDate: subDays(now, 29) },\n { label: \"Last 45 days\", startDate: now, endDate: subDays(now, 44) },\n ],\n },\n {\n label: \"Future\",\n presets: [\n { label: \"Next 3 days\", startDate: now, endDate: addDays(now, 2) },\n { label: \"Next 7 days\", startDate: now, endDate: addDays(now, 6) },\n { label: \"Next 30 days\", startDate: now, endDate: addDays(now, 29) },\n { label: \"Next 45 days\", startDate: now, endDate: addDays(now, 44) },\n ],\n },\n];\n","import * as React from \"react\";\nimport { useMemo, useState } from \"react\";\nimport { createStandardDateRangePresets } from \"./PresetFactory\";\nimport { Column, Row, Space, Text } from \"@stenajs-webui/core\";\nimport {\n FlatButton,\n PrimaryButton,\n stenaAngleLeft,\n stenaAngleRight,\n} from \"@stenajs-webui/elements\";\nimport { CalendarPreset } from \"./CalendarPreset\";\n\nexport interface PresetPickerProps {\n onClickPreset: (preset: CalendarPreset) => void;\n}\n\nexport const PresetPicker: React.FC<PresetPickerProps> = ({\n onClickPreset,\n}) => {\n const [pageIndex, setPageIndex] = useState(0);\n const pages = useMemo(() => createStandardDateRangePresets(new Date()), []);\n\n const currentPage = pages[pageIndex] ?? pages[0];\n\n return (\n <Column>\n <Row\n justifyContent={\"space-between\"}\n alignItems={\"center\"}\n width={\"200px\"}\n >\n <FlatButton\n size={\"small\"}\n leftIcon={stenaAngleLeft}\n disabled={pageIndex === 0}\n onClick={() => setPageIndex(pageIndex - 1)}\n />\n <Text>{currentPage.label}</Text>\n <FlatButton\n size={\"small\"}\n leftIcon={stenaAngleRight}\n disabled={pageIndex === pages.length - 1}\n onClick={() => setPageIndex(pageIndex + 1)}\n />\n </Row>\n <Space />\n <Column alignItems={\"center\"}>\n {currentPage.presets.map((preset) => (\n <React.Fragment key={preset.label}>\n <PrimaryButton\n label={preset.label}\n onClick={() => onClickPreset(preset)}\n />\n <Space />\n </React.Fragment>\n ))}\n </Column>\n </Column>\n );\n};\n","import { Box, useToday } from \"@stenajs-webui/core\";\nimport { PrimaryButton } from \"@stenajs-webui/elements\";\nimport * as React from \"react\";\nimport { ReactNode, useCallback, useMemo } from \"react\";\nimport { Calendar } from \"../../components/calendar/Calendar\";\nimport {\n CalendarProps,\n RenderMonthPickerArgs,\n} from \"../../types/CalendarTypes\";\nimport { MonthPicker } from \"../month-picker/MonthPicker\";\nimport { CalendarPreset } from \"../preset-picker/CalendarPreset\";\nimport { PresetPicker } from \"../preset-picker/PresetPicker\";\nimport { CalendarPanelType } from \"./CalendarPanelType\";\nimport {\n getLocaleCodeForLocale,\n SupportedLocaleCode,\n} from \"../localize-date-format/LocaleMapper\";\n\ninterface CalendarWithMonthYearPickersProps<T> extends Omit<\n CalendarProps<T>,\n \"date\" | \"year\" | \"month\"\n> {\n dateInFocus: Date;\n firstMonthInMonthPicker?: Date;\n numMonthsInMonthPicker?: number;\n setDateInFocus: (dateInFocus: Date) => void;\n currentPanel: CalendarPanelType;\n setCurrentPanel: (currentPanel: CalendarPanelType) => void;\n onSelectPreset: (preset: CalendarPreset) => void;\n renderMonthPicker?: (args: RenderMonthPickerArgs) => ReactNode;\n}\n\nexport const CalendarWithMonthYearPickers =\n function CalendarWithMonthYearPickers<T>({\n locale,\n dateInFocus,\n setDateInFocus,\n currentPanel,\n setCurrentPanel,\n renderMonthPicker,\n firstMonthInMonthPicker,\n numMonthsInMonthPicker,\n ...props\n }: CalendarWithMonthYearPickersProps<T>) {\n const localeCode = useMemo<SupportedLocaleCode>(\n () =>\n locale == null ? \"en-GB\" : (getLocaleCodeForLocale(locale) ?? \"en-GB\"),\n [locale],\n );\n const today = useToday();\n\n const onChangeSelectedMonth = useCallback(\n (selectedMonth: Date) => {\n if (setDateInFocus) {\n setDateInFocus(selectedMonth);\n }\n setCurrentPanel(\"calendar\");\n },\n [setDateInFocus, setCurrentPanel],\n );\n\n const onClickMonth = useCallback(() => {\n setCurrentPanel(\"month\");\n }, [setCurrentPanel]);\n\n switch (currentPanel) {\n case \"calendar\":\n return (\n <Calendar<T>\n {...props}\n date={dateInFocus}\n onClickMonth={onClickMonth}\n locale={locale}\n />\n );\n case \"month\":\n return renderMonthPicker ? (\n renderMonthPicker({\n value: dateInFocus,\n onValueChange: onChangeSelectedMonth,\n locale: locale,\n firstMonth: firstMonthInMonthPicker ?? today,\n numMonths: numMonthsInMonthPicker ?? 24,\n dateInFocus,\n })\n ) : (\n <MonthPicker\n value={dateInFocus}\n onValueChange={onChangeSelectedMonth}\n localeCode={localeCode}\n firstMonth={firstMonthInMonthPicker ?? today}\n numMonths={numMonthsInMonthPicker ?? 24}\n />\n );\n case \"presets\":\n return <PresetPicker onClickPreset={() => {}} />;\n\n default:\n return (\n <Box>\n <PrimaryButton\n label={\"Show calendar\"}\n onClick={() => setCurrentPanel(\"calendar\")}\n />\n </Box>\n );\n }\n };\n","import { addMonths, addYears, subMonths, subYears } from \"date-fns\";\nimport { useCallback } from \"react\";\n\nexport const useSelectedMonthStepperLogic = (\n dateInFocus: Date,\n setDateInFocus?: (dateInFocus: Date) => void,\n monthsPerRow?: number,\n numMonths?: number,\n) => {\n const nextMonth = useCallback(() => {\n const d = addMonths(dateInFocus, monthsPerRow ?? numMonths ?? 1);\n setDateInFocus?.(d);\n }, [setDateInFocus, dateInFocus, monthsPerRow, numMonths]);\n\n const nextYear = useCallback(() => {\n const d = addYears(dateInFocus, 1);\n setDateInFocus?.(d);\n }, [setDateInFocus, dateInFocus]);\n\n const prevMonth = useCallback(() => {\n const d = subMonths(dateInFocus, monthsPerRow ?? numMonths ?? 1);\n setDateInFocus?.(d);\n }, [setDateInFocus, dateInFocus, monthsPerRow, numMonths]);\n\n const prevYear = useCallback(() => {\n const d = subYears(dateInFocus, 1);\n setDateInFocus?.(d);\n }, [setDateInFocus, dateInFocus]);\n\n return {\n nextMonth,\n prevMonth,\n nextYear,\n prevYear,\n };\n};\n","import { Indent, Row, Space } from \"@stenajs-webui/core\";\nimport {\n SecondaryButton,\n stenaAngleLeftDouble,\n stenaAngleRightDouble,\n stenaArrowLeft,\n stenaArrowRight,\n} from \"@stenajs-webui/elements\";\nimport * as React from \"react\";\nimport { ReactNode } from \"react\";\nimport { CalendarTheme } from \"../../components/calendar/CalendarTheme\";\n\nexport interface WithMonthSwitcherBelowProps {\n theme: CalendarTheme;\n nextMonth: () => void;\n prevMonth: () => void;\n nextYear: () => void;\n prevYear: () => void;\n children?: ReactNode;\n}\n\nexport const WithMonthSwitcherBelow: React.FC<WithMonthSwitcherBelowProps> = ({\n children,\n prevMonth,\n nextMonth,\n prevYear,\n nextYear,\n}) => (\n <div>\n {children}\n <Indent>\n <Row gap={1}>\n <SecondaryButton onClick={prevYear} leftIcon={stenaAngleLeftDouble} />\n <SecondaryButton onClick={prevMonth} leftIcon={stenaArrowLeft} />\n <Indent num={2} />\n <SecondaryButton onClick={nextMonth} leftIcon={stenaArrowRight} />\n <SecondaryButton onClick={nextYear} leftIcon={stenaAngleRightDouble} />\n </Row>\n </Indent>\n <Space />\n </div>\n);\n","import { Column, Row } from \"@stenajs-webui/core\";\nimport {\n SecondaryButton,\n stenaArrowLeft,\n stenaArrowRight,\n} from \"@stenajs-webui/elements\";\nimport * as React from \"react\";\nimport { Calendar } from \"../../components/calendar/Calendar\";\nimport { defaultCalendarTheme } from \"../../components/calendar/CalendarTheme\";\nimport {\n CalendarProps,\n RenderMonthPickerArgs,\n} from \"../../types/CalendarTypes\";\nimport { CalendarPanelType } from \"../calendar-with-month-year-pickers/CalendarPanelType\";\nimport { CalendarWithMonthYearPickers } from \"../calendar-with-month-year-pickers/CalendarWithMonthYearPickers\";\nimport { CalendarPreset } from \"../preset-picker/CalendarPreset\";\nimport { useSelectedMonthStepperLogic } from \"./hooks/UseSelectedMonthStepperLogic\";\nimport { WithMonthSwitcherBelow } from \"./MonthSwitcherBelow\";\nimport { ReactNode } from \"react\";\n\nexport type MonthSwitcherPlacement = \"header\" | \"below\";\n\nexport interface CalendarWithMonthSwitcherProps<T> extends CalendarProps<T> {\n monthSwitcherPlacement?: MonthSwitcherPlacement;\n dateInFocus: Date;\n setDateInFocus: (dateInFocus: Date) => void;\n currentPanel: CalendarPanelType;\n setCurrentPanel: (currentPanel: CalendarPanelType) => void;\n onSelectPreset?: (preset: CalendarPreset) => void;\n renderMonthPicker?: (args: RenderMonthPickerArgs) => ReactNode;\n firstMonthInMonthPicker?: Date;\n numMonthsInMonthPicker?: number;\n}\n\nconst noop = () => {};\n\nexport function CalendarWithMonthSwitcher<T>({\n monthSwitcherPlacement,\n theme = defaultCalendarTheme,\n dateInFocus,\n setDateInFocus,\n currentPanel,\n setCurrentPanel,\n onSelectPreset = noop,\n renderMonthPicker,\n firstMonthInMonthPicker,\n numMonthsInMonthPicker,\n ...calendarProps\n}: CalendarWithMonthSwitcherProps<T>) {\n const { nextMonth, prevMonth, nextYear, prevYear } =\n useSelectedMonthStepperLogic(\n dateInFocus,\n setDateInFocus,\n calendarProps.monthsPerRow,\n calendarProps.numMonths,\n );\n\n const placement = fallbackIfNoPlacement(\n monthSwitcherPlacement,\n calendarProps.numMonths,\n );\n\n switch (placement) {\n case \"below\": {\n return (\n <WithMonthSwitcherBelow\n theme={theme}\n nextMonth={nextMonth}\n prevMonth={prevMonth}\n nextYear={nextYear}\n prevYear={prevYear}\n >\n <Calendar<T> {...calendarProps} theme={theme} date={dateInFocus} />\n </WithMonthSwitcherBelow>\n );\n }\n case \"header\": {\n return (\n <Column>\n <CalendarWithMonthYearPickers<T>\n {...calendarProps}\n theme={theme}\n renderMonthPicker={renderMonthPicker}\n dateInFocus={dateInFocus}\n setDateInFocus={setDateInFocus}\n currentPanel={currentPanel}\n setCurrentPanel={setCurrentPanel}\n onSelectPreset={onSelectPreset}\n firstMonthInMonthPicker={firstMonthInMonthPicker}\n numMonthsInMonthPicker={numMonthsInMonthPicker}\n headerRightContent={\n <Row alignItems={\"center\"} gap={1}>\n <SecondaryButton\n onClick={prevMonth}\n leftIcon={stenaArrowLeft}\n />\n <SecondaryButton\n onClick={nextMonth}\n leftIcon={stenaArrowRight}\n />\n </Row>\n }\n />\n </Column>\n );\n }\n default: {\n return (\n <Calendar<T> {...calendarProps} theme={theme} date={dateInFocus} />\n );\n }\n }\n}\n\nconst fallbackIfNoPlacement = (\n monthSwitcherPlacement: MonthSwitcherPlacement | undefined,\n numMonths: number | undefined,\n): MonthSwitcherPlacement => {\n return monthSwitcherPlacement || (numMonths || 1) > 1 ? \"below\" : \"header\";\n};\n","import { DateRange, DateStringRange } from \"../../types/DateRange\";\nimport { format, parse } from \"date-fns\";\n\nexport const dateRangeToStrings = (dateRange: DateRange): DateStringRange => ({\n startDate: dateRange.startDate\n ? format(dateRange.startDate, \"yyyy-MM-dd\")\n : undefined,\n endDate: dateRange.endDate\n ? format(dateRange.endDate, \"yyyy-MM-dd\")\n : undefined,\n});\n\nexport const stringsToDateRange = ({\n startDate,\n endDate,\n}: DateStringRange): DateRange => {\n const now = new Date();\n return {\n startDate: startDate ? parse(startDate, \"yyyy-MM-dd\", now) : undefined,\n endDate: endDate ? parse(endDate, \"yyyy-MM-dd\", now) : undefined,\n };\n};\n","import { isAfter, isSameDay } from \"date-fns\";\nimport { DateRange, DateStringRange } from \"../../types/DateRange\";\nimport { dateRangeToStrings, stringsToDateRange } from \"./DateRangeTransformer\";\n\nexport const isDateRangeInvalid = ({\n startDate,\n endDate,\n}: DateRange): boolean =>\n Boolean(\n startDate &&\n endDate &&\n !isSameDay(startDate, endDate) &&\n isAfter(startDate, endDate),\n );\n\nexport const toggleDatesIfEndIsEarlierThanStart = (\n dateRange: DateRange,\n): DateRange => {\n if (isDateRangeInvalid(dateRange)) {\n return {\n startDate: dateRange.endDate,\n endDate: dateRange.startDate,\n };\n }\n return dateRange;\n};\n\nexport const toggleDateStringsIfEndIsEarlierThanStart = (\n dateRange: DateStringRange,\n): DateStringRange => {\n if (dateRange.startDate && dateRange.endDate) {\n return dateRangeToStrings(\n toggleDatesIfEndIsEarlierThanStart(stringsToDateRange(dateRange)),\n );\n }\n return dateRange;\n};\n","import { useCallback } from \"react\";\nimport { DateRangeFocusedInput } from \"../../../components/calendar-types/date-range-calendar/DateRangeCalendar\";\nimport { OnClickDay } from \"../../../types/CalendarTypes\";\nimport { DayData } from \"../../../util/calendar/CalendarDataFactory\";\nimport {\n isDateRangeInvalid,\n toggleDatesIfEndIsEarlierThanStart,\n} from \"../../../util/date-range/DateRangeValidator\";\nimport { DateRange } from \"../../../types/DateRange\";\n\nexport const useDateRangeOnClickDayHandler = <T>(\n value: DateRange | undefined,\n onValueChange: ((dateRange: DateRange) => void) | undefined,\n focusedInput: DateRangeFocusedInput,\n setFocusedInput: (focusedInput: DateRangeFocusedInput) => void,\n): OnClickDay<T> => {\n return useCallback(\n (day: DayData) => {\n const dateRange = {\n startDate: focusedInput === \"startDate\" ? day.date : value?.startDate,\n endDate: focusedInput === \"endDate\" ? day.date : value?.endDate,\n };\n\n if (!isDateRangeInvalid(dateRange)) {\n setFocusedInput(focusedInput === \"startDate\" ? \"endDate\" : \"startDate\");\n }\n onValueChange?.(toggleDatesIfEndIsEarlierThanStart(dateRange));\n },\n [\n focusedInput,\n onValueChange,\n setFocusedInput,\n value?.endDate,\n value?.startDate,\n ],\n );\n};\n","import { CalendarPanelType } from \"../calendar-with-month-year-pickers/CalendarPanelType\";\nimport { useCallback, useState } from \"react\";\n\nexport type OnChangePanel = (panel: CalendarPanelType) => void;\n\nexport interface UseInternalPanelStateProps {\n onChangePanel?: OnChangePanel;\n}\n\nexport const useInternalPanelState = (\n onChangePanel: OnChangePanel | undefined,\n) => {\n const [currentPanel, _setCurrentPanel] =\n useState<CalendarPanelType>(\"calendar\");\n\n const setCurrentPanel = useCallback(\n (currentPanel: CalendarPanelType) => {\n _setCurrentPanel(currentPanel);\n onChangePanel?.(currentPanel);\n },\n [onChangePanel],\n );\n\n return {\n currentPanel,\n setCurrentPanel,\n };\n};\n","import { useMemo, useState } from \"react\";\nimport { useDateRangeOnClickDayHandler } from \"../../../../features/date-range/hooks/UseDateRangeOnClickDayHandler\";\nimport { DateRangeCalendarProps } from \"../DateRangeCalendar\";\nimport { CalendarWithMonthSwitcherProps } from \"../../../../features/month-switcher/CalendarWithMonthSwitcher\";\nimport { buildDayStateForDateRange } from \"../../../../util/calendar/StateModifier\";\nimport { useInternalPanelState } from \"../../../../features/internal-panel-state/UseInternalPanelState\";\n\nexport const useDateRangeSelection = <T>({\n focusedInput,\n value,\n onValueChange,\n setFocusedInput,\n statePerMonth,\n onChangePanel,\n initialDateInFocus,\n}: DateRangeCalendarProps<T>): CalendarWithMonthSwitcherProps<T> => {\n const { currentPanel, setCurrentPanel } =\n useInternalPanelState(onChangePanel);\n const [dateInFocus, setDateInFocus] = useState(\n () => initialDateInFocus ?? new Date(),\n );\n\n const onClickDay = useDateRangeOnClickDayHandler(\n value,\n onValueChange,\n focusedInput,\n setFocusedInput,\n );\n\n const statePerMonthWithSelection = useMemo(\n () =>\n buildDayStateForDateRange(\n statePerMonth,\n value?.startDate,\n value?.endDate,\n ),\n [statePerMonth, value?.endDate, value?.startDate],\n );\n\n return {\n onClickDay,\n statePerMonth: statePerMonthWithSelection,\n currentPanel,\n setCurrentPanel,\n setDateInFocus,\n dateInFocus,\n };\n};\n","import * as React from \"react\";\nimport { CalendarWithMonthSwitcher } from \"../../../features/month-switcher/CalendarWithMonthSwitcher\";\nimport { useDateRangeSelection } from \"./hooks/UseDateRangeSelection\";\nimport { InternalPanelAndFocusStateProps } from \"../../../types/InternalPanelAndFocusStateProps\";\nimport { ValueAndOnValueChangeProps } from \"@stenajs-webui/forms\";\nimport { DateRange } from \"../../../types/DateRange\";\n\nexport type DateRangeFocusedInput = \"startDate\" | \"endDate\" | undefined;\n\nexport interface DateRangeCalendarProps<T>\n extends\n InternalPanelAndFocusStateProps<T>,\n ValueAndOnValueChangeProps<DateRange> {\n focusedInput?: DateRangeFocusedInput;\n setFocusedInput: (focusedInput: DateRangeFocusedInput) => void;\n initialDateInFocus?: Date;\n}\n\nexport function DateRangeCalendar<T>(props: DateRangeCalendarProps<T>) {\n const dateRangeSelectionProps = useDateRangeSelection(props);\n return (\n <CalendarWithMonthSwitcher<T> {...props} {...dateRangeSelectionProps} />\n );\n}\n\nexport type DateRangeInputCalendarProps<T> = Omit<\n DateRangeCalendarProps<T>,\n | \"startDateInFocus\"\n | \"value\"\n | \"onValueChange\"\n | \"focusedInput\"\n | \"setFocusedInput\"\n | \"theme\"\n | \"currentPanel\"\n | \"setCurrentPanel\"\n>;\n","import { useState } from \"react\";\nimport { DateRangeFocusedInput } from \"../DateRangeCalendar\";\n\nexport const useDateRangeCalendarState = () => {\n const [startDate, setStartDate] = useState<Date | undefined>();\n const [endDate, setEndDate] = useState<Date | undefined>();\n const [focusedInput, setFocusedInput] =\n useState<DateRangeFocusedInput>(\"startDate\");\n return {\n startDate,\n setStartDate,\n endDate,\n setEndDate,\n focusedInput,\n setFocusedInput,\n };\n};\n","import { useCallback, useMemo, useState } from \"react\";\nimport { OnClickDay } from \"../../../types/CalendarTypes\";\nimport { addDayStateHighlights } from \"../../../util/calendar/StateModifier\";\nimport { SingleDateCalendarProps } from \"./SingleDateCalendar\";\nimport { CalendarWithMonthSwitcherProps } from \"../../../features/month-switcher/CalendarWithMonthSwitcher\";\nimport { useInternalPanelState } from \"../../../features/internal-panel-state/UseInternalPanelState\";\n\nexport const useSingleDateSelection = <T>({\n onChange,\n value,\n statePerMonth,\n onChangePanel,\n}: SingleDateCalendarProps<T>): CalendarWithMonthSwitcherProps<T> => {\n const { currentPanel, setCurrentPanel } =\n useInternalPanelState(onChangePanel);\n\n const [dateInFocus, setDateInFocus] = useState(() => value ?? new Date());\n\n const onClickDay: OnClickDay<T> = useCallback(\n (day) => {\n if (onChange) {\n onChange(day.date);\n }\n },\n [onChange],\n );\n\n const statePerMonthWithSelectedDate = useMemo(\n () =>\n value\n ? addDayStateHighlights(statePerMonth, value, [\n \"selected\",\n \"singleSelected\",\n ])\n : statePerMonth,\n [statePerMonth, value],\n );\n\n return {\n onClickDay,\n statePerMonth: statePerMonthWithSelectedDate,\n date: value,\n currentPanel,\n setCurrentPanel,\n dateInFocus,\n setDateInFocus,\n };\n};\n","import * as React from \"react\";\nimport { CalendarWithMonthSwitcher } from \"../../../features/month-switcher/CalendarWithMonthSwitcher\";\n\nimport { useSingleDateSelection } from \"./UseSingleDateSelection\";\nimport { InternalPanelAndFocusStateProps } from \"../../../types/InternalPanelAndFocusStateProps\";\n\nexport interface SingleDateCalendarProps<\n T,\n> extends InternalPanelAndFocusStateProps<T> {\n value: Date | undefined;\n onChange: (value: Date | undefined) => void;\n}\n\nexport function SingleDateCalendar<T>(props: SingleDateCalendarProps<T>) {\n const singleDateSelectionProps = useSingleDateSelection(props);\n return (\n <CalendarWithMonthSwitcher<T> {...props} {...singleDateSelectionProps} />\n );\n}\n","import { isSameDay } from \"date-fns\";\nimport { useCallback, useMemo, useState } from \"react\";\nimport { OnClickDay } from \"../../../types/CalendarTypes\";\nimport { addDayStateHighlights } from \"../../../util/calendar/StateModifier\";\nimport { MultiDateCalendarProps } from \"./MultiDateCalendar\";\nimport { CalendarWithMonthSwitcherProps } from \"../../../features/month-switcher/CalendarWithMonthSwitcher\";\nimport { useInternalPanelState } from \"../../../features/internal-panel-state/UseInternalPanelState\";\n\nexport const useMultiDateSelection = <T>({\n onChange,\n value,\n statePerMonth,\n onChangePanel,\n initialDateInFocus,\n}: MultiDateCalendarProps<T>): CalendarWithMonthSwitcherProps<T> => {\n const { currentPanel, setCurrentPanel } =\n useInternalPanelState(onChangePanel);\n const [dateInFocus, setDateInFocus] = useState(\n initialDateInFocus ?? new Date(),\n );\n\n const onClickDay: OnClickDay<T> = useCallback(\n (day) => {\n if (!onChange) {\n return;\n }\n const isSelected = value && value.find((d) => isSameDay(d, day.date));\n if (value && isSelected) {\n onChange(value.filter((v) => !isSameDay(v, day.date)));\n } else {\n onChange([...(value || []), day.date]);\n }\n },\n [onChange, value],\n );\n const statePerMonthWithSelectedDate = useMemo(() => {\n if (!value) {\n return statePerMonth;\n }\n return value.reduce(\n (stateSum, date) => addDayStateHighlights(stateSum, date, [\"selected\"]),\n statePerMonth,\n );\n }, [statePerMonth, value]);\n\n return {\n onClickDay,\n statePerMonth: statePerMonthWithSelectedDate,\n currentPanel,\n setCurrentPanel,\n dateInFocus,\n setDateInFocus,\n };\n};\n","import * as React from \"react\";\nimport { CalendarWithMonthSwitcher } from \"../../../features/month-switcher/CalendarWithMonthSwitcher\";\nimport { useMultiDateSelection } from \"./UseMultiDateSelection\";\nimport { UseInternalPanelStateProps } from \"../../../features/internal-panel-state/UseInternalPanelState\";\nimport { InternalPanelAndFocusStateProps } from \"../../../types/InternalPanelAndFocusStateProps\";\n\nexport interface MultiDateCalendarProps<T>\n extends InternalPanelAndFocusStateProps<T>, UseInternalPanelStateProps {\n initialDateInFocus?: Date;\n value?: Array<Date>;\n onChange?: (value: Array<Date>) => void;\n}\n\nexport function MultiDateCalendar<T>(props: MultiDateCalendarProps<T>) {\n const selectionProps = useMultiDateSelection(props);\n return <CalendarWithMonthSwitcher<T> {...props} {...selectionProps} />;\n}\n","import { Locale, setWeek, startOfWeek } from \"date-fns\";\nimport { enGB } from \"date-fns/locale\";\nimport { useCallback, useMemo, useState } from \"react\";\nimport { useInternalPanelState } from \"../../../features/internal-panel-state/UseInternalPanelState\";\nimport { CalendarWithMonthSwitcherProps } from \"../../../features/month-switcher/CalendarWithMonthSwitcher\";\nimport { OnClickDay, OnClickWeek } from \"../../../types/CalendarTypes\";\nimport {\n getWeekForDate,\n WeekData,\n} from \"../../../util/calendar/CalendarDataFactory\";\nimport { addWeekRangeHighlights } from \"../../../util/calendar/StateModifier\";\nimport { SingleWeekCalendarProps } from \"./SingleWeekCalendar\";\n\nexport const useSingleWeekSelection = <T>({\n onChange,\n value,\n statePerMonth,\n onChangePanel,\n locale = enGB,\n}: SingleWeekCalendarProps<T>): CalendarWithMonthSwitcherProps<T> => {\n const [dateInFocus, setDateInFocus] = useState(() => {\n const week = getWeekDataFromWeekString(value, locale);\n if (!week) {\n return new Date();\n }\n return week.days[0].date;\n });\n const { currentPanel, setCurrentPanel } =\n useInternalPanelState(onChangePanel);\n\n const onClickDay = useCallback<OnClickDay<T>>(\n (day) => {\n if (onChange) {\n onChange(getWeekStringFromWeekData(getWeekForDate(day.date, locale)));\n }\n },\n [locale, onChange],\n );\n const onClickWeek = useCallback<OnClickWeek>(\n (week) => {\n if (onChange) {\n onChange(getWeekStringFromWeekData(week));\n }\n },\n [onChange],\n );\n\n const statePerMonthWithSelection = useMemo(() => {\n const weekData = getWeekDataFromWeekString(value, locale);\n return weekData\n ? addWeekRangeHighlights(statePerMonth, weekData)\n : statePerMonth;\n }, [value, locale, statePerMonth]);\n\n const date = useMemo(() => {\n const week = getWeekDataFromWeekString(value, locale);\n if (!week) {\n return new Date();\n }\n return week.days[0].date;\n }, [locale, value]);\n\n return {\n statePerMonth: statePerMonthWithSelection,\n date,\n dateInFocus,\n setDateInFocus,\n onClickDay,\n onClickWeek,\n currentPanel,\n setCurrentPanel,\n };\n};\n\nconst getWeekStringFromWeekData = (\n week: WeekData | undefined,\n): string | undefined => {\n if (!week) {\n return undefined;\n }\n return `${week.endYear}-${week.weekNumber}`;\n};\n\nconst getWeekDataFromWeekString = (\n week: string | undefined,\n locale: Locale,\n): WeekData | undefined => {\n if (!week) {\n return undefined;\n }\n const parts = week.split(\"-\");\n const weekNumber = parseInt(parts[1], 10);\n const year = parseInt(parts[0], 10);\n const date = new Date();\n date.setFullYear(year);\n const firstDateOfWeek = startOfWeek(setWeek(date, weekNumber), { locale });\n return getWeekForDate(firstDateOfWeek, locale);\n};\n","import * as React from \"react\";\nimport { CalendarWithMonthSwitcher } from \"../../../features/month-switcher/CalendarWithMonthSwitcher\";\nimport { useSingleWeekSelection } from \"./UseSingleWeekSelection\";\nimport { InternalPanelAndFocusStateProps } from \"../../../types/InternalPanelAndFocusStateProps\";\n\nexport type SingleWeekValue = string;\n\nexport interface SingleWeekCalendarProps<\n T,\n> extends InternalPanelAndFocusStateProps<T> {\n value: SingleWeekValue | undefined;\n onChange: (value: SingleWeekValue | undefined) => void;\n}\n\nexport function SingleWeekCalendar<T>(props: SingleWeekCalendarProps<T>) {\n const singleWeekSelectionProps = useSingleWeekSelection(props);\n return (\n <CalendarWithMonthSwitcher<T> {...props} {...singleWeekSelectionProps} />\n );\n}\n","export const defaultPopoverPlacement = \"bottom\";\n","import { useCallback, useState } from \"react\";\n\nexport const useDateInput = (\n onChange?: (date: Date | undefined) => void,\n onClose?: () => void,\n openOnMount?: boolean,\n) => {\n const [showingCalendar, setShowingCalendar] = useState(openOnMount || false);\n\n const showCalendar = useCallback(() => {\n setShowingCalendar(true);\n return true;\n }, [setShowingCalendar]);\n\n const hideCalendar = useCallback(() => {\n setShowingCalendar(false);\n if (onClose) {\n onClose();\n }\n }, [setShowingCalendar, onClose]);\n\n const onSelectDate = useCallback(\n (date: Date | undefined) => {\n if (onChange) {\n onChange(date);\n }\n setTimeout(hideCalendar, 150);\n },\n [onChange, hideCalendar],\n );\n\n return {\n showCalendar,\n hideCalendar,\n showingCalendar,\n onSelectDate,\n };\n};\n","export const defaultMaxDate = \"2999-12-31\";\n","import { Box } from \"@stenajs-webui/core\";\nimport { stenaCalendar, TextInputButton } from \"@stenajs-webui/elements\";\nimport { TextInput, TextInputProps } from \"@stenajs-webui/forms\";\nimport { ControlledPopover } from \"@stenajs-webui/tooltip\";\nimport { format } from \"date-fns\";\nimport * as React from \"react\";\nimport { defaultPopoverPlacement } from \"../../../config/DefaultPopoverPlacement\";\nimport { DateFormats } from \"../../../util/date/DateFormats\";\nimport { SingleDateCalendar } from \"../../calendar-types/single-date-calendar/SingleDateCalendar\";\nimport {\n CalendarTheme,\n defaultCalendarTheme,\n} from \"../../calendar/CalendarTheme\";\nimport { DateTextInputCalendarProps } from \"../date-text-input/DateTextInput\";\nimport { useDateInput } from \"./UseDateInput\";\nimport { OptionalMinMaxDatesAsString } from \"../../../types/CalendarTypes\";\nimport { defaultMaxDate } from \"../../../config/DefaultMaxDate\";\n\nexport interface DateInputProps<\n T = unknown,\n> extends OptionalMinMaxDatesAsString {\n /** The current value */\n value?: Date;\n /** onChange handler for when the user selects a date. */\n onChange?: (date: Date | undefined) => void;\n /** Variant of the input field. */\n variant?: TextInputProps[\"variant\"];\n /** If true, calendar will be open when component mounts. */\n openOnMount?: boolean;\n /** Is invoked when user closes the calendar popup. */\n onClose?: () => void;\n /**\n * The date format in the input field. See date-fns docs.\n * @default YYYY-MM-dd\n */\n displayFormat?: string;\n /**\n * Placeholder when no date has been selected.\n * @default Enter date\n */\n placeholder?: string;\n /**\n * Portal target, HTML element. If not set, window.body is used.\n */\n portalTarget?: HTMLElement;\n zIndex?: number;\n width?: string;\n /**\n * The calendar theme to use.\n */\n calendarTheme?: CalendarTheme;\n /** Props to be passed to Calendar, see SingleDateCalendar. */\n calendarProps?: DateTextInputCalendarProps<T>;\n /**\n * Disables the TextInput, Calendar and Popover.\n */\n disabled?: boolean;\n}\n\nexport const DateInput: React.FC<DateInputProps> = ({\n displayFormat = DateFormats.fullDate,\n placeholder = \"Enter date\",\n value,\n calendarTheme = defaultCalendarTheme,\n calendarProps,\n openOnMount,\n onClose,\n onChange,\n variant,\n width,\n minDate,\n maxDate = defaultMaxDate,\n disabled,\n portalTarget,\n zIndex,\n}) => {\n const { hideCalendar, showingCalendar, onSelectDate, showCalendar } =\n useDateInput(onChange, onClose, openOnMount);\n\n return (\n <Box width={width}>\n <ControlledPopover\n hideArrow\n restoreFocus={false}\n returnFocus={false}\n open={showingCalendar}\n onRequestClose={hideCalendar}\n appendTo={portalTarget}\n zIndex={zIndex}\n renderTrigger={(props) => (\n <Box {...props}>\n <TextInput\n type={\"date\"}\n onFocus={showCalendar}\n buttonRight={\n <TextInputButton onClick={showCalendar} icon={stenaCalendar} />\n }\n value={value ? format(value, displayFormat) : \"\"}\n placeholder={placeholder}\n size={9}\n disabled={disabled}\n autoFocus={openOnMount}\n variant={variant}\n min={minDate}\n max={maxDate}\n />\n </Box>\n )}\n placement={defaultPopoverPlacement}\n >\n <SingleDateCalendar\n {...calendarProps}\n onChange={onSelectDate}\n value={value}\n theme={calendarTheme}\n minDate={minDate}\n maxDate={maxDate}\n />\n </ControlledPopover>\n </Box>\n );\n};\n","import { useCallback, useMemo, useRef, useState } from \"react\";\nimport { DateRangeFocusedInput } from \"../../../calendar-types/date-range-calendar/DateRangeCalendar\";\nimport { DayData } from \"../../../../util/calendar/CalendarDataFactory\";\nimport { isAfter } from \"date-fns\";\nimport { DateRange } from \"../../../../types/DateRange\";\n\nexport const useDateRangeInput = (\n value: DateRange | undefined,\n onValueChange: ((dateRange: DateRange) => void) | undefined,\n) => {\n const startDateInputRef = useRef<HTMLInputElement>(null);\n const endDateInputRef = useRef<HTMLInputElement>(null);\n\n const [showingCalendar, setShowingCalendar] = useState(false);\n const [focusedInput, setFocusedInput] = useState<\n DateRangeFocusedInput | undefined\n >(undefined);\n\n const showCalendarStartDate = useCallback(() => {\n setFocusedInput(\"startDate\");\n setShowingCalendar(true);\n return true;\n }, [setFocusedInput, setShowingCalendar]);\n\n const showCalendarEndDate = useCallback(() => {\n setFocusedInput(\"endDate\");\n setShowingCalendar(true);\n return true;\n }, [setFocusedInput, setShowingCalendar]);\n\n const hideCalendar = useCallback(() => {\n setShowingCalendar(false);\n }, [setShowingCalendar]);\n\n const onClickDay = useCallback(\n (day: DayData) => {\n if (focusedInput === \"startDate\") {\n onValueChange?.({\n startDate: day.date,\n endDate: value?.endDate,\n });\n if (!value?.endDate) {\n setFocusedInput(\"endDate\");\n endDateInputRef.current?.focus();\n } else {\n setTimeout(hideCalendar, 150);\n }\n } else if (focusedInput === \"endDate\") {\n onValueChange?.({\n startDate: value?.startDate,\n endDate: day.date,\n });\n if (!value?.startDate) {\n setFocusedInput(\"startDate\");\n startDateInputRef.current?.focus();\n } else {\n setTimeout(hideCalendar, 150);\n }\n }\n },\n [focusedInput, onValueChange, setFocusedInput, hideCalendar, value],\n );\n\n const startDateIsAfterEnd = useMemo(\n () =>\n value?.startDate &&\n value?.endDate &&\n isAfter(value.startDate, value.endDate),\n [value?.startDate, value?.endDate],\n );\n\n return {\n showingCalendar,\n hideCalendar,\n showCalendarEndDate,\n showCalendarStartDate,\n focusedInput,\n setFocusedInput,\n startDateInputRef,\n endDateInputRef,\n onClickDay,\n startDateIsAfterEnd,\n };\n};\n","import { Row, Space } from \"@stenajs-webui/core\";\nimport { TextInput, ValueAndOnValueChangeProps } from \"@stenajs-webui/forms\";\nimport { format } from \"date-fns\";\nimport * as React from \"react\";\nimport { useMemo, useState } from \"react\";\nimport { cssColor } from \"@stenajs-webui/theme\";\nimport { defaultPopoverPlacement } from \"../../../config/DefaultPopoverPlacement\";\nimport { DateFormats } from \"../../../util/date/DateFormats\";\nimport { DateRangeInputCalendarProps } from \"../../calendar-types/date-range-calendar/DateRangeCalendar\";\nimport {\n CalendarTheme,\n defaultCalendarTheme,\n} from \"../../calendar/CalendarTheme\";\nimport { useDateRangeInput } from \"./hooks/UseDateRangeInput\";\nimport {\n Icon,\n stenaArrowWideRight,\n stenaCalendar,\n} from \"@stenajs-webui/elements\";\nimport { CalendarWithMonthSwitcher } from \"../../../features/month-switcher/CalendarWithMonthSwitcher\";\nimport { CalendarPanelType } from \"../../../features/calendar-with-month-year-pickers/CalendarPanelType\";\nimport { ControlledPopover } from \"@stenajs-webui/tooltip\";\nimport { buildDayStateForDateRange } from \"../../../util/calendar/StateModifier\";\nimport { OptionalMinMaxDatesAsString } from \"../../../types/CalendarTypes\";\nimport { DateRange } from \"../../../types/DateRange\";\nimport { defaultMaxDate } from \"../../../config/DefaultMaxDate\";\n\nexport interface DateRangeInputProps<T>\n extends OptionalMinMaxDatesAsString, ValueAndOnValueChangeProps<DateRange> {\n /**\n * The date format in the input field. See date-fns docs.\n * @default YYYY-MM-dd\n */\n displayFormat?: string;\n\n /**\n * Placeholder for start date field when no date has been selected.\n * @default Start date\n */\n placeholderStartDate?: string;\n\n /**\n * Placeholder for end date field when no date has been selected.\n * @default End date\n */\n placeholderEndDate?: string;\n\n /**\n * Width of the input element.\n * * @default 125px\n */\n width?: string;\n\n /**\n * The calendar theme to use.\n */\n calendarTheme?: CalendarTheme;\n\n /** Props to be passed to DateRangeCalendar, see DateRangeCalendar. */\n calendarProps?: DateRangeInputCalendarProps<T>;\n\n /**\n * Disables the Popover and both TextInputs.\n */\n disabled?: boolean;\n\n /**\n * Portal target, HTML element. If not set, window.body is used.\n */\n portalTarget?: HTMLElement;\n zIndex?: number;\n}\n\n/**\n * @deprecated Please use DateRangeDualTextInput instead.\n */\nexport function DateRangeInput<T>({\n displayFormat = DateFormats.fullDate,\n placeholderStartDate = \"Start date\",\n placeholderEndDate = \"End date\",\n value,\n onValueChange,\n width,\n calendarTheme = defaultCalendarTheme,\n calendarProps,\n minDate,\n maxDate = defaultMaxDate,\n disabled,\n portalTarget,\n zIndex,\n}: DateRangeInputProps<T>): React.ReactElement<DateRangeInputProps<T>> {\n const [currentPanel, setCurrentPanel] =\n useState<CalendarPanelType>(\"calendar\");\n\n const {\n hideCalendar,\n showCalendarEndDate,\n showCalendarStartDate,\n showingCalendar,\n focusedInput,\n startDateInputRef,\n endDateInputRef,\n onClickDay,\n startDateIsAfterEnd,\n } = useDateRangeInput(value, onValueChange);\n\n const [dateInFocus, setDateInFocus] = useState(\n () => (focusedInput && value?.[focusedInput]) ?? new Date(),\n );\n const statePerMonth = useMemo(\n () =>\n buildDayStateForDateRange(undefined, value?.startDate, value?.endDate),\n [value],\n );\n\n return (\n <ControlledPopover\n hideArrow\n restoreFocus={false}\n returnFocus={false}\n appendTo={portalTarget}\n zIndex={zIndex}\n renderTrigger={(props) => (\n <Row alignItems={\"center\"} {...props}>\n <TextInput\n iconLeft={stenaCalendar}\n onFocus={showCalendarStartDate}\n value={\n value?.startDate ? format(value.startDate, displayFormat) : \"\"\n }\n placeholder={placeholderStartDate}\n width={width}\n disabled={disabled}\n inputRef={startDateInputRef}\n size={9}\n variant={startDateIsAfterEnd ? \"error\" : undefined}\n />\n <Space />\n <Icon\n icon={stenaArrowWideRight}\n color={cssColor(\"--lhds-color-ui-500\")}\n size={14}\n />\n <Space />\n <TextInput\n iconLeft={stenaCalendar}\n onFocus={showCalendarEndDate}\n value={value?.endDate ? format(value.endDate, displayFormat) : \"\"}\n placeholder={placeholderEndDate}\n width={width}\n disabled={disabled}\n inputRef={endDateInputRef}\n size={9}\n variant={startDateIsAfterEnd ? \"error\" : undefined}\n />\n </Row>\n )}\n open={showingCalendar}\n placement={defaultPopoverPlacement}\n onRequestClose={hideCalendar}\n >\n <CalendarWithMonthSwitcher\n {...calendarProps}\n dateInFocus={dateInFocus}\n setDateInFocus={setDateInFocus}\n statePerMonth={statePerMonth}\n theme={calendarTheme}\n onClickDay={onClickDay}\n currentPanel={currentPanel}\n setCurrentPanel={setCurrentPanel}\n minDate={minDate}\n maxDate={maxDate}\n />\n </ControlledPopover>\n );\n}\n","import { Box, Omit, Row } from \"@stenajs-webui/core\";\nimport { FlatButton, stenaCalendar } from \"@stenajs-webui/elements\";\nimport { TextInput, TextInputProps } from \"@stenajs-webui/forms\";\nimport { ControlledPopover } from \"@stenajs-webui/tooltip\";\nimport { format, isValid, parse } from \"date-fns\";\nimport * as React from \"react\";\nimport { RefObject, useCallback, useState } from \"react\";\nimport { defaultPopoverPlacement } from \"../../../config/DefaultPopoverPlacement\";\nimport { DateFormats } from \"../../../util/date/DateFormats\";\nimport {\n SingleDateCalendar,\n SingleDateCalendarProps,\n} from \"../../calendar-types/single-date-calendar/SingleDateCalendar\";\nimport {\n CalendarTheme,\n defaultCalendarTheme,\n} from \"../../calendar/CalendarTheme\";\nimport { OptionalMinMaxDatesAsString } from \"../../../types/CalendarTypes\";\nimport { defaultMaxDate } from \"../../../config/DefaultMaxDate\";\n\nexport type DateTextInputCalendarProps<T> = Omit<\n SingleDateCalendarProps<T>,\n \"value\" | \"onChange\" | \"theme\"\n>;\n\nexport interface DateTextInputProps<T>\n extends\n Omit<TextInputProps, \"onChange\" | \"theme\" | \"min\" | \"max\">,\n OptionalMinMaxDatesAsString {\n /** Props to be passed to Calendar, see SingleDateCalendar. */\n calendarProps?: DateTextInputCalendarProps<T>;\n /** Close calendar when date is selected, @default true */\n closeOnCalendarSelectDate?: boolean;\n /** Valid date format, @default YYYY-MM-DD */\n dateFormat?: string;\n /** Make the icon not clickable, @default false */\n disableCalender?: boolean;\n /** Show or hide the calender icon, @default false */\n hideCalenderIcon?: boolean;\n /** Placeholder for the input, @default YYYY-MM-DD */\n placeholder?: string;\n /** The date text input theme to use. */\n calendarTheme?: CalendarTheme;\n /**\n * Portal target for the popover, HTML element. If not set, window.body is used.\n */\n portalTarget?: HTMLElement;\n zIndex?: number;\n}\n\nexport const DateTextInput: React.FC<DateTextInputProps<unknown>> = ({\n calendarProps,\n closeOnCalendarSelectDate = true,\n dateFormat = DateFormats.fullDate,\n disableCalender = false,\n onValueChange,\n placeholder = \"yyyy-mm-dd\",\n value,\n width = \"130px\",\n calendarTheme = defaultCalendarTheme,\n hideCalenderIcon = false,\n minDate,\n maxDate = defaultMaxDate,\n variant,\n portalTarget,\n zIndex,\n ...props\n}) => {\n const [open, setOpen] = useState(false);\n\n const toggleCalendar = useCallback(() => {\n setOpen(!open);\n }, [setOpen, open]);\n\n const hideCalendar = useCallback(() => {\n setOpen(false);\n }, [setOpen]);\n\n const onValueChangeHandler = useCallback(\n (value: string) => {\n if (onValueChange) {\n onValueChange(value);\n }\n },\n [onValueChange],\n );\n\n const onCalendarSelectDate = useCallback(\n (date: Date | undefined) => {\n if (date) {\n onValueChangeHandler(format(date, dateFormat));\n if (closeOnCalendarSelectDate) {\n setTimeout(() => setOpen(!open), 200);\n }\n }\n },\n [\n onValueChangeHandler,\n dateFormat,\n closeOnCalendarSelectDate,\n setOpen,\n open,\n ],\n );\n\n const inValidInput = !!value && !/^[-/\\\\.0-9]+$/.test(value);\n\n const dateIsValid = !!value && isValid(parse(value, dateFormat, new Date()));\n\n const userInputCorrectLength = !!value && value.length >= dateFormat.length;\n\n const invalid: boolean =\n (userInputCorrectLength && !dateIsValid) || inValidInput;\n\n return (\n <Box width={width}>\n <ControlledPopover\n appendTo={portalTarget}\n zIndex={zIndex}\n renderTrigger={({ ref, ...popoverProps }) => (\n <TextInput\n {...props}\n variant={invalid ? \"error\" : variant}\n disableContentPaddingRight\n contentRight={\n !hideCalenderIcon ? (\n <Row alignItems={\"center\"} indent={0.5}>\n <FlatButton\n size={\"small\"}\n disabled={props.disabled || disableCalender}\n leftIcon={stenaCalendar}\n onClick={toggleCalendar}\n />\n </Row>\n ) : undefined\n }\n onValueChange={onValueChangeHandler}\n placeholder={placeholder}\n value={value || \"\"}\n min={minDate}\n max={maxDate}\n size={10}\n inputRef={ref as RefObject<HTMLInputElement>}\n {...popoverProps}\n />\n )}\n hideArrow\n open={open}\n placement={defaultPopoverPlacement}\n onRequestClose={hideCalendar}\n >\n <SingleDateCalendar\n {...calendarProps}\n onChange={onCalendarSelectDate}\n value={\n value && dateIsValid\n ? parse(value, dateFormat, new Date())\n : undefined\n }\n minDate={minDate}\n maxDate={maxDate}\n theme={calendarTheme}\n />\n </ControlledPopover>\n </Box>\n );\n};\n","export interface FormatTimeStringResult {\n time: string;\n success: boolean;\n}\n\nexport const formatHours = (hours: string): string => {\n if (hours === \"\") {\n return \"00\";\n }\n\n const h = parseInt(hours, 10);\n\n if (isNaN(h)) {\n throw new Error(\"Hours is not a number\");\n }\n\n if (h < 0 || h > 23) {\n throw new Error(\"Hours is an invalid number\");\n }\n\n switch (hours.length) {\n case 1:\n return `0${h}`;\n case 2:\n return hours;\n default:\n throw new Error(\"Invalid hour string\");\n }\n};\n\nexport const formatMinutes = (minutes: string): string => {\n if (minutes === \"\") {\n return \"00\";\n }\n\n const m = parseInt(minutes, 10);\n\n if (isNaN(m)) {\n throw new Error(\"Minutes is not a number\");\n }\n\n if (m < 0 || m > 59) {\n throw new Error(\"Minutes is an invalid number\");\n }\n\n switch (minutes.length) {\n case 1:\n return `0${m}`;\n case 2:\n return minutes;\n default:\n throw new Error(\"Invalid minute string\");\n }\n};\n\nexport const formatTimeString = (time: string): FormatTimeStringResult => {\n if (!validUserInput(time)) {\n return { time, success: false };\n }\n\n const arr = time && time.split(/-|:|,|;|[/]|[.]| /); // consider all these chars as user input separator\n if (arr && arr.length === 2) {\n try {\n const hours = formatHours(arr[0]);\n const minutes = formatMinutes(arr[1]);\n return { time: `${hours}:${minutes}`, success: true };\n } catch {\n return { time, success: false };\n }\n } else if (arr && arr.length === 1) {\n let hours = 0;\n let minutes = 0;\n switch (time.length) {\n case 1:\n return { time: `0${time}:00`, success: true };\n case 2: {\n const timeNumber = parseInt(arr[0], 10);\n if (timeNumber >= 0 && timeNumber < 24) {\n return { time: `${time}:00`, success: true };\n } else if (timeNumber >= 24 && timeNumber < 59) {\n return { time: `00:${time}`, success: true };\n }\n return { time, success: false };\n }\n case 3:\n minutes = parseInt(time.substring(1, 3), 10);\n if (minutes >= 0 && minutes <= 59) {\n return {\n time: `0${time.substring(0, 1)}:${time.substring(1, 3)}`,\n success: true,\n };\n }\n return { time, success: false };\n case 4:\n hours = parseInt(time.substring(0, 2), 10);\n minutes = parseInt(time.substring(2, 4), 10);\n if (hours < 0 || hours > 23) {\n return { time, success: false };\n }\n if (minutes < 0 || minutes > 59) {\n return { time, success: false };\n }\n return {\n time: `${time.substring(0, 2)}:${time.substring(2, 4)}`,\n success: true,\n };\n default:\n return { time, success: false };\n }\n }\n\n return { time, success: false };\n};\n\nexport const validUserInput = (input: string | undefined): boolean => {\n if (input) {\n return /^[-:.,/; 0-9]+$/.test(input);\n }\n\n return true;\n};\n","import { Omit } from \"@stenajs-webui/core\";\nimport { TextInput, TextInputProps } from \"@stenajs-webui/forms\";\nimport * as React from \"react\";\nimport { ChangeEventHandler, useCallback, useState } from \"react\";\nimport {\n formatTimeString,\n validUserInput,\n} from \"../../../util/time/TimeStringFormatValidator\";\n\nimport { stenaClock } from \"@stenajs-webui/elements\";\n\nexport interface TimeTextInputProps extends Omit<TextInputProps, \"onChange\"> {\n /** Show placeholder when true */\n showPlaceholder?: boolean;\n /** Show icon when true */\n useIcon?: boolean;\n /** Variant of the input field. */\n variant?: TextInputProps[\"variant\"];\n}\n\n/**\n * @deprecated\n */\nexport const TimeTextInput: React.FC<TimeTextInputProps> = ({\n onValueChange,\n showPlaceholder = true,\n useIcon = true,\n value,\n width = \"85px\",\n variant,\n ...props\n}) => {\n const [valid, setValid] = useState(() => validUserInput(value));\n\n const timeFormat = \"hh:mm\";\n\n const onBlur = useCallback(() => {\n if (value) {\n const formattedResult = formatTimeString(value);\n setValid(formattedResult.success);\n if (formattedResult.success) {\n if (onValueChange) {\n onValueChange(formattedResult.time);\n }\n }\n }\n }, [value, onValueChange, setValid]);\n\n const onChangeHandler = useCallback<ChangeEventHandler<HTMLInputElement>>(\n (ev) => {\n const time = ev.target.value;\n const validInput = validUserInput(time);\n\n setValid(validInput && time.length <= timeFormat.length);\n\n if (onValueChange) {\n onValueChange(time);\n }\n },\n [onValueChange, setValid],\n );\n\n return (\n <TextInput\n {...props}\n type={\"time\"}\n variant={!valid ? \"error\" : variant}\n iconLeft={useIcon ? stenaClock : undefined}\n value={value}\n placeholder={showPlaceholder ? timeFormat : undefined}\n onChange={onChangeHandler}\n onBlur={onBlur}\n width={width}\n />\n );\n};\n","import { IconDefinition } from \"@fortawesome/fontawesome-svg-core\";\nimport {\n Box,\n BoxProps,\n ButtonElementProps,\n Indent,\n Row,\n SeparatorLine,\n} from \"@stenajs-webui/core\";\nimport {\n FlatButton,\n Icon,\n stenaCalendar,\n stenaAngleDown,\n} from \"@stenajs-webui/elements\";\nimport {\n TextInput,\n TextInputBox,\n TextInputBoxProps,\n TextInputProps,\n} from \"@stenajs-webui/forms\";\nimport { debounce } from \"lodash-es\";\nimport * as React from \"react\";\nimport { FocusEventHandler, useCallback, useMemo, useRef } from \"react\";\nimport { cssColor } from \"@stenajs-webui/theme\";\n\nexport interface DualTextInputProps {\n onEsc?: TextInputProps[\"onEsc\"];\n onEnter?: TextInputProps[\"onEnter\"];\n widthLeft?: BoxProps[\"width\"];\n widthRight?: BoxProps[\"width\"];\n valueLeft?: TextInputProps[\"value\"];\n valueRight?: TextInputProps[\"value\"];\n minLeft?: string;\n maxLeft?: string;\n minRight?: string;\n maxRight?: string;\n typeLeft?: TextInputProps[\"type\"];\n typeRight?: TextInputProps[\"type\"];\n separatorIcon?: IconDefinition;\n placeholderLeft?: TextInputProps[\"placeholder\"];\n placeholderRight?: TextInputProps[\"placeholder\"];\n onValueChangeLeft?: TextInputProps[\"onValueChange\"];\n onValueChangeRight?: TextInputProps[\"onValueChange\"];\n onChangeLeft?: TextInputProps[\"onChange\"];\n onChangeRight?: TextInputProps[\"onChange\"];\n onClickLeft?: TextInputProps[\"onClick\"];\n onClickRight?: TextInputProps[\"onClick\"];\n onClickCalendar?: ButtonElementProps[\"onClick\"];\n onClickArrowDown?: ButtonElementProps[\"onClick\"];\n onFocusLeft?: TextInputProps[\"onFocus\"];\n onFocusRight?: TextInputProps[\"onFocus\"];\n onBlur?: () => void;\n onBlurLeft?: TextInputProps[\"onBlur\"];\n onBlurRight?: TextInputProps[\"onBlur\"];\n inputRefLeft?: TextInputProps[\"inputRef\"];\n inputRefRight?: TextInputProps[\"inputRef\"];\n variantLeft?: TextInputProps[\"variant\"];\n variantRight?: TextInputProps[\"variant\"];\n variant?: TextInputBoxProps[\"variant\"];\n showPresets?: false;\n autoFocusLeft?: boolean;\n autoFocusRight?: boolean;\n disabled?: boolean;\n}\n\nexport const DualTextInput: React.FC<DualTextInputProps> = ({\n autoFocusLeft,\n autoFocusRight,\n onEsc,\n onEnter,\n onValueChangeLeft,\n onValueChangeRight,\n separatorIcon,\n placeholderLeft,\n placeholderRight,\n typeLeft,\n typeRight,\n onChangeLeft,\n onChangeRight,\n valueLeft,\n valueRight,\n minLeft,\n maxLeft,\n minRight,\n maxRight,\n onClickLeft,\n onClickRight,\n onClickCalendar,\n onClickArrowDown,\n onBlurLeft,\n onBlurRight,\n onFocusLeft,\n onFocusRight,\n inputRefLeft,\n inputRefRight,\n variant,\n variantLeft,\n variantRight,\n onBlur,\n showPresets,\n widthLeft,\n widthRight,\n disabled,\n}) => {\n const focusCounter = useRef(0);\n\n const tryTriggerOnBlur = useMemo(\n () =>\n debounce((focusCounter: number) => {\n if (focusCounter === 0) {\n onBlur?.();\n }\n }, 10),\n [onBlur],\n );\n\n const focusLeftHandler = useCallback<FocusEventHandler<HTMLInputElement>>(\n (ev) => {\n focusCounter.current++;\n tryTriggerOnBlur(focusCounter.current);\n if (onFocusLeft) {\n onFocusLeft(ev);\n }\n },\n [onFocusLeft, focusCounter, tryTriggerOnBlur],\n );\n\n const focusRightHandler = useCallback<FocusEventHandler<HTMLInputElement>>(\n (ev) => {\n focusCounter.current++;\n tryTriggerOnBlur(focusCounter.current);\n if (onFocusRight) {\n onFocusRight(ev);\n }\n },\n [onFocusRight, focusCounter, tryTriggerOnBlur],\n );\n\n const blurLeftHandler = useCallback<FocusEventHandler<HTMLInputElement>>(\n (ev) => {\n focusCounter.current--;\n tryTriggerOnBlur(focusCounter.current);\n if (onBlurLeft) {\n onBlurLeft(ev);\n }\n },\n [onBlurLeft, focusCounter, tryTriggerOnBlur],\n );\n\n const blurRightHandler = useCallback<FocusEventHandler<HTMLInputElement>>(\n (ev) => {\n focusCounter.current--;\n tryTriggerOnBlur(focusCounter.current);\n if (onBlurRight) {\n onBlurRight(ev);\n }\n },\n [onBlurRight, focusCounter, tryTriggerOnBlur],\n );\n\n return (\n <Box>\n <TextInputBox\n disableContentPaddingRight\n disabled={disabled}\n variant={variant}\n contentRight={\n <Row alignItems={\"center\"}>\n <Indent num={0.5}>\n <FlatButton\n leftIcon={stenaCalendar}\n onClick={onClickCalendar}\n disabled={disabled}\n size={\"small\"}\n />\n </Indent>\n\n {showPresets ? (\n <>\n <Row height={\"22px\"}>\n <SeparatorLine vertical />\n </Row>\n\n <Indent num={0.5}>\n <FlatButton\n leftIcon={stenaAngleDown}\n onClick={onClickArrowDown}\n disabled={disabled}\n size={\"small\"}\n />\n </Indent>\n </>\n ) : null}\n </Row>\n }\n >\n <Box width={widthLeft}>\n <TextInput\n onEsc={onEsc}\n onEnter={onEnter}\n onClick={onClickLeft}\n disabled={disabled}\n hideBorder\n placeholder={placeholderLeft}\n value={valueLeft}\n onValueChange={onValueChangeLeft}\n onChange={onChangeLeft}\n onBlur={blurLeftHandler}\n onFocus={focusLeftHandler}\n inputRef={inputRefLeft}\n variant={variantLeft}\n type={typeLeft}\n autoFocus={autoFocusLeft}\n min={minLeft}\n max={maxLeft}\n />\n </Box>\n <Row indent={0.5} alignItems={\"center\"} justifyContent={\"center\"}>\n <Icon\n icon={separatorIcon}\n size={12}\n color={cssColor(\"--lhds-color-ui-500\")}\n />\n </Row>\n <Box width={widthRight}>\n <TextInput\n onEsc={onEsc}\n onEnter={onEnter}\n onClick={onClickRight}\n disabled={disabled}\n hideBorder\n placeholder={placeholderRight}\n value={valueRight}\n onValueChange={onValueChangeRight}\n onChange={onChangeRight}\n onBlur={blurRightHandler}\n onFocus={focusRightHandler}\n inputRef={inputRefRight}\n variant={variantRight}\n type={typeRight}\n autoFocus={autoFocusRight}\n min={minRight}\n max={maxRight}\n />\n </Box>\n </TextInputBox>\n </Box>\n );\n};\n","import { parseIntElseUndefined } from \"@stenajs-webui/core\";\nimport { formatHours, formatMinutes } from \"./TimeStringFormatValidator\";\n\nexport const transformNumberTimeToString = (\n time: number | undefined | null,\n): string | undefined => {\n if (time == null) {\n return undefined;\n }\n const timeStr = time.toString();\n if (timeStr.length === 3) {\n return `${timeStr.substr(0, 1)}:${timeStr.substr(1, 2)}`;\n }\n if (timeStr.length === 4) {\n return `${timeStr.substr(0, 2)}:${timeStr.substr(2, 2)}`;\n }\n if (timeStr.length === 2) {\n return `0:${timeStr}`;\n }\n if (timeStr.length === 1) {\n return `0:0${timeStr}`;\n }\n throw new Error(\"Invalid time number.\");\n};\n\nexport const transformTimeStringToNumber = (\n time: string | undefined | null,\n): number | null => {\n if (time == null) {\n throw new Error(\"Time is not set.\");\n }\n if (time === \"\") {\n throw new Error(\"Time is empty.\");\n }\n const parts = time.split(\":\");\n if (parts.length !== 2) {\n throw new Error(\"Invalid time.\");\n }\n\n if (parts[1].length !== 2) {\n throw new Error(\"Invalid time.\");\n }\n\n if (parts[0].length < 1 || parts[0].length > 2) {\n throw new Error(\"Invalid time.\");\n }\n\n const hours = parseInt(parts[0], 10);\n const minutes = parseInt(parts[1], 10);\n\n if (isNaN(hours)) {\n throw new Error(\"Invalid time.\");\n }\n if (isNaN(minutes)) {\n throw new Error(\"Invalid time.\");\n }\n if (hours < 0 || hours > 23) {\n throw new Error(\"Invalid time.\");\n }\n if (minutes < 0 || minutes > 59) {\n throw new Error(\"Invalid time.\");\n }\n return hours * 100 + minutes;\n};\n\nexport const isValidTimeString = (time: string | undefined): boolean => {\n try {\n transformTimeStringToNumber(time);\n return true;\n } catch {\n return false;\n }\n};\n\nexport const getHoursAndMinutesFromTimeString = (\n value: string | undefined,\n): {\n hour: number | undefined;\n minute: number | undefined;\n} => {\n if (value && isValidTimeString(value)) {\n const p = value.split(\":\");\n return {\n hour: parseIntElseUndefined(p[0]),\n minute: parseIntElseUndefined(p[1]),\n };\n }\n return {\n hour: undefined,\n minute: undefined,\n };\n};\n\nexport const transformTimeInDateToTimeString = (date: Date): string =>\n `${formatHours(String(date.getHours()))}:${formatMinutes(\n String(date.getMinutes()),\n )}`;\n","import { Row } from \"@stenajs-webui/core\";\nimport { FlatButton, PrimaryButton } from \"@stenajs-webui/elements\";\nimport * as React from \"react\";\nimport { RefObject, useEffect, useRef } from \"react\";\nimport { padStart } from \"lodash-es\";\n\nexport interface TimePickerCellProps {\n item: number;\n selected?: boolean;\n onClick: (label: number) => void;\n columnRef: RefObject<HTMLDivElement | null>;\n canScrollRef: RefObject<boolean>;\n}\n\nexport const TimePickerCell: React.FC<TimePickerCellProps> = ({\n onClick,\n item,\n selected,\n columnRef,\n canScrollRef,\n}) => {\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(\n function scrollToSelectedItem() {\n if (\n selected &&\n columnRef.current &&\n ref.current &&\n canScrollRef.current\n ) {\n const targetScroll = ref.current.scrollHeight * Math.max(item - 2, 0);\n columnRef.current.scrollTo(0, targetScroll);\n canScrollRef.current = false;\n }\n },\n [columnRef, item, selected, canScrollRef],\n );\n\n return (\n <Row\n width={\"64px\"}\n justifyContent={\"center\"}\n spacing={0.5}\n indent={0.5}\n ref={ref}\n >\n {selected ? (\n <PrimaryButton\n label={padStart(String(item), 2, \"0\")}\n onClick={() => onClick && onClick(item)}\n />\n ) : (\n <FlatButton\n label={String(item).padStart(2, \"0\")}\n onClick={() => onClick && onClick(item)}\n />\n )}\n </Row>\n );\n};\n","import { Column } from \"@stenajs-webui/core\";\nimport * as React from \"react\";\nimport { MutableRefObject, useRef } from \"react\";\nimport styles from \"./TimePicker.module.css\";\nimport { TimePickerCell } from \"./TimePickerCell\";\n\ninterface Props {\n items: Array<number>;\n onClick: (item: number) => void;\n selectedItem: number | undefined;\n canScrollRef: MutableRefObject<boolean>;\n}\n\nexport const TimePickerColumn: React.FC<Props> = ({\n onClick,\n items,\n selectedItem,\n canScrollRef,\n}) => {\n const columnRef = useRef<HTMLDivElement>(null);\n\n return (\n <Column className={styles.timePickerColumn} ref={columnRef}>\n {items.map((item) => (\n <TimePickerCell\n key={item}\n item={item}\n onClick={onClick}\n selected={item === selectedItem}\n columnRef={columnRef}\n canScrollRef={canScrollRef}\n />\n ))}\n </Column>\n );\n};\n","import { Indent, Row } from \"@stenajs-webui/core\";\nimport { ValueAndOnValueChangeProps } from \"@stenajs-webui/forms\";\nimport { range } from \"lodash-es\";\nimport * as React from \"react\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport {\n formatHours,\n formatMinutes,\n} from \"../../util/time/TimeStringFormatValidator\";\nimport { getHoursAndMinutesFromTimeString } from \"../../util/time/TimeTransformer\";\nimport styles from \"./TimePicker.module.css\";\nimport { TimePickerColumn } from \"./TimePickerColumn\";\n\nexport interface TimePickerProps extends ValueAndOnValueChangeProps<string> {}\n\nconst hours = range(0, 24);\nconst minutes = range(0, 60);\n\nexport const TimePicker: React.FC<TimePickerProps> = ({\n value,\n onValueChange,\n}) => {\n const canScrollRef = useRef(true);\n const [hour, setHour] = useState<number | undefined>(undefined);\n const [minute, setMinute] = useState<number | undefined>(undefined);\n\n useEffect(() => {\n if (value) {\n const { minute, hour } = getHoursAndMinutesFromTimeString(value);\n setHour(hour);\n setMinute(minute);\n }\n }, [value]);\n\n const onClickHour = useCallback(\n (h: number) => {\n setHour(h);\n onValueChange?.(\n `${formatHours(String(h ?? 0))}:${formatMinutes(String(minute ?? 0))}`,\n );\n },\n [minute, onValueChange],\n );\n\n const onClickMinutes = useCallback(\n (m: number) => {\n setMinute(m);\n onValueChange?.(\n `${formatHours(String(hour ?? 0))}:${formatMinutes(String(m ?? 0))}`,\n );\n },\n [hour, onValueChange],\n );\n\n return (\n <Row className={styles.timePicker}>\n <TimePickerColumn\n items={hours}\n onClick={onClickHour}\n selectedItem={hour}\n canScrollRef={canScrollRef}\n />\n <Indent />\n <TimePickerColumn\n items={minutes}\n onClick={onClickMinutes}\n selectedItem={minute}\n canScrollRef={canScrollRef}\n />\n </Row>\n );\n};\n","import { RefObject, useEffect } from \"react\";\n\nexport const useDateRangeEffects = (\n date: Date | undefined | null,\n setDateInFocus: (date: Date) => void,\n dateInputRef: RefObject<HTMLInputElement | null>,\n) => {\n useEffect(\n function moveFocusedDateWhenDateChanges() {\n if (date) {\n setDateInFocus(date);\n }\n },\n [date, setDateInFocus],\n );\n\n useEffect(\n function updateDateFieldWhenValueChanges() {\n if (dateInputRef.current) {\n if (date) {\n dateInputRef.current.valueAsDate = new Date(\n Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()),\n );\n } else {\n dateInputRef.current.valueAsDate = null;\n }\n }\n },\n [date, dateInputRef],\n );\n};\n","import { ChangeEvent, RefObject, useCallback } from \"react\";\nimport { getHoursAndMinutesFromTimeString } from \"../../../../util/time/TimeTransformer\";\nimport { DateTimeInputProps } from \"../DateTimeInput\";\nimport { UseInputStatesResult } from \"./UseInputStates\";\n\nexport const useDateRangeHandlers = (\n date: Date | undefined | null,\n onValueChange: DateTimeInputProps[\"onValueChange\"],\n {\n setDateInFocus,\n showCalendarInternal,\n hideCalendarInternal,\n setFirstFocusedInput,\n setCurrentPanel,\n localTime,\n setLocalTime,\n localDate,\n setLocalDate,\n }: UseInputStatesResult,\n dateInputRef: RefObject<HTMLInputElement | null>,\n) => {\n const onChangeDate = useCallback(\n (incomingDate: Date | null) => {\n if (!incomingDate) {\n return;\n }\n const newDate = new Date(incomingDate);\n\n if (date) {\n // Full date is available\n\n newDate.setHours(date.getHours());\n newDate.setMinutes(date.getMinutes());\n\n onValueChange?.(newDate);\n setLocalDate(undefined);\n } else if (localTime) {\n // Only time has been selected\n const { minute, hour } = getHoursAndMinutesFromTimeString(localTime);\n\n newDate.setHours(hour ?? 0);\n newDate.setMinutes(minute ?? 0);\n\n onValueChange?.(newDate);\n setLocalDate(undefined);\n } else {\n // Nothing has been selected\n setLocalDate(newDate);\n }\n setDateInFocus(newDate);\n if (dateInputRef.current) {\n dateInputRef.current.valueAsDate = new Date(\n Date.UTC(\n newDate.getFullYear(),\n newDate.getMonth(),\n newDate.getDate(),\n ),\n );\n }\n },\n [\n date,\n dateInputRef,\n localTime,\n onValueChange,\n setDateInFocus,\n setLocalDate,\n ],\n );\n\n const onChangeTime = useCallback(\n (time: string) => {\n if (!time) {\n return;\n }\n\n if (date) {\n // Full date is available\n const newTime = getHoursAndMinutesFromTimeString(time);\n const newDate = new Date(date);\n\n newDate.setHours(newTime.hour || 0);\n newDate.setMinutes(newTime.minute || 0);\n\n onValueChange?.(newDate);\n setLocalTime(undefined);\n } else if (localDate) {\n // Only date has already been selected\n const newTime = getHoursAndMinutesFromTimeString(time);\n const newDate = new Date(localDate);\n\n newDate.setHours(newTime.hour || 0);\n newDate.setMinutes(newTime.minute || 0);\n\n onValueChange?.(newDate);\n setLocalTime(undefined);\n } else {\n // Nothing has been selected\n setLocalTime(time);\n }\n },\n [onValueChange, date, localDate, setLocalTime],\n );\n\n const inputLeftChangeHandler = useCallback(\n (ev: ChangeEvent<HTMLInputElement>) => {\n if (ev.target.value[0] !== \"0\") {\n onChangeDate(ev.target.valueAsDate);\n }\n },\n [onChangeDate],\n );\n\n const inputRightChangeHandler = useCallback(\n (ev: ChangeEvent<HTMLInputElement>) => onChangeTime(ev.target.value),\n [onChangeTime],\n );\n\n const showCalendar = useCallback(() => {\n if (date) {\n setDateInFocus(date);\n } else {\n setDateInFocus(new Date());\n }\n setCurrentPanel(\"calendar\");\n showCalendarInternal();\n }, [date, setCurrentPanel, showCalendarInternal, setDateInFocus]);\n\n const hideCalendar = useCallback(() => {\n setFirstFocusedInput(undefined);\n hideCalendarInternal();\n }, [setFirstFocusedInput, hideCalendarInternal]);\n\n return {\n inputLeftChangeHandler,\n inputRightChangeHandler,\n hideCalendar,\n showCalendar,\n onChangeTime,\n onChangeDate,\n };\n};\n","import { useBoolean } from \"@stenajs-webui/core\";\nimport { useState } from \"react\";\nimport { DateRangeFocusedInput } from \"../../../calendar-types/date-range-calendar/DateRangeCalendar\";\nimport { CalendarPanelType } from \"../../../../features/calendar-with-month-year-pickers/CalendarPanelType\";\n\nexport type UseInputStatesResult = ReturnType<typeof useInputStates>;\n\nexport const useInputStates = (date: Date | undefined | null) => {\n const [localDate, setLocalDate] = useState<Date | undefined>(undefined);\n const [localTime, setLocalTime] = useState<string | undefined>(undefined);\n\n const [isCalendarVisible, showCalendarInternal, hideCalendarInternal] =\n useBoolean(false);\n\n const [isTimePickerVisible, showTimePicker, hideTimePicker] =\n useBoolean(false);\n\n const [firstFocusedInput, setFirstFocusedInput] = useState<\n DateRangeFocusedInput | undefined\n >(undefined);\n\n const [dateInFocus, setDateInFocus] = useState<Date>(\n () => date ?? new Date(),\n );\n\n const [currentPanel, setCurrentPanel] =\n useState<CalendarPanelType>(\"calendar\");\n\n return {\n isCalendarVisible,\n showCalendarInternal,\n hideCalendarInternal,\n firstFocusedInput,\n setFirstFocusedInput,\n dateInFocus,\n setDateInFocus,\n currentPanel,\n setCurrentPanel,\n isTimePickerVisible,\n showTimePicker,\n hideTimePicker,\n localDate,\n setLocalDate,\n localTime,\n setLocalTime,\n };\n};\n","import * as React from \"react\";\nimport { RefObject, useCallback } from \"react\";\nimport { DayData } from \"../../../../util/calendar/CalendarDataFactory\";\nimport { UseInputStatesResult } from \"./UseInputStates\";\n\nexport const useUserInputHandlers = (\n onChangeDate: (incomingDate: Date | null) => void,\n dateInputRef: RefObject<HTMLInputElement | null>,\n showCalendar: () => void,\n hideCalendar: () => void,\n {\n isCalendarVisible,\n setCurrentPanel,\n showTimePicker,\n hideTimePicker,\n }: UseInputStatesResult,\n) => {\n const onFocusLeft = useCallback(() => {\n if (!isCalendarVisible) {\n showCalendar();\n }\n setCurrentPanel(\"calendar\");\n hideTimePicker();\n }, [hideTimePicker, isCalendarVisible, setCurrentPanel, showCalendar]);\n\n const onFocusRight = useCallback(() => {\n hideCalendar();\n showTimePicker();\n }, [hideCalendar, showTimePicker]);\n\n const onClickDay = useCallback(\n (day: DayData) => {\n onChangeDate(day.date);\n hideCalendar();\n showTimePicker();\n },\n [onChangeDate, hideCalendar, showTimePicker],\n );\n\n const onClickArrowButton = useCallback(() => {\n setCurrentPanel(\"presets\");\n showCalendar();\n }, [setCurrentPanel, showCalendar]);\n\n const onClickCalendarButton = useCallback(() => {\n if (isCalendarVisible) {\n hideCalendar();\n } else {\n dateInputRef.current?.focus();\n setCurrentPanel(\"calendar\");\n showCalendar();\n }\n }, [\n isCalendarVisible,\n hideCalendar,\n dateInputRef,\n setCurrentPanel,\n showCalendar,\n ]);\n\n const onKeyDownHandler = useCallback(\n (ev: React.KeyboardEvent<HTMLDivElement>) => {\n if (ev.key === \"Escape\") {\n hideCalendar();\n }\n },\n [hideCalendar],\n );\n\n return {\n onFocusLeft,\n onFocusRight,\n onClickDay,\n onClickArrowButton,\n onClickCalendarButton,\n onKeyDownHandler,\n };\n};\n","import { Box, Column, Row, Space, useDelayedFalse } from \"@stenajs-webui/core\";\nimport { PrimaryButton, stenaClock } from \"@stenajs-webui/elements\";\nimport {\n TextInputProps,\n ValueAndOnValueChangeProps,\n} from \"@stenajs-webui/forms\";\nimport {\n ControlledPopover,\n ControlledPopoverProps,\n} from \"@stenajs-webui/tooltip\";\nimport * as React from \"react\";\nimport { useCallback, useMemo, useRef } from \"react\";\nimport { defaultPopoverPlacement } from \"../../../config/DefaultPopoverPlacement\";\nimport {\n DualTextInput,\n DualTextInputProps,\n} from \"../../../features/dual-text-input/DualTextInput\";\nimport { CalendarWithMonthSwitcher } from \"../../../features/month-switcher/CalendarWithMonthSwitcher\";\nimport { TimePicker } from \"../../../features/time-picker/TimePicker\";\nimport { addDayStateHighlights } from \"../../../util/calendar/StateModifier\";\nimport { transformTimeInDateToTimeString } from \"../../../util/time/TimeTransformer\";\nimport { useDateRangeEffects } from \"./hooks/UseDateRangeEffects\";\nimport { useDateRangeHandlers } from \"./hooks/UseDateRangeHandlers\";\nimport { useInputStates } from \"./hooks/UseInputStates\";\nimport { useUserInputHandlers } from \"./hooks/UseUserInputHandlers\";\nimport { OptionalMinMaxDatesAsString } from \"../../../types/CalendarTypes\";\nimport { defaultMaxDate } from \"../../../config/DefaultMaxDate\";\n\nexport interface DateTimeInputProps\n extends\n ValueAndOnValueChangeProps<Date | null>,\n OptionalMinMaxDatesAsString,\n Pick<DualTextInputProps, \"widthLeft\" | \"widthRight\" | \"variant\">,\n Pick<ControlledPopoverProps, \"zIndex\" | \"appendTo\"> {\n onEsc?: () => void;\n onEnter?: () => void;\n onBlur?: () => void;\n autoFocus?: boolean;\n disabled?: boolean;\n}\n\nexport const DateTimeInput: React.FC<DateTimeInputProps> = ({\n value,\n onValueChange,\n onEnter,\n onEsc,\n onBlur,\n autoFocus,\n minDate,\n widthLeft = 128,\n widthRight = 80,\n maxDate = defaultMaxDate,\n variant,\n disabled,\n zIndex,\n appendTo,\n}) => {\n const dateInputRef: TextInputProps[\"inputRef\"] = useRef(null);\n const timeInputRef: TextInputProps[\"inputRef\"] = useRef(null);\n\n const states = useInputStates(value);\n\n const {\n setCurrentPanel,\n currentPanel,\n isCalendarVisible,\n dateInFocus,\n setDateInFocus,\n isTimePickerVisible,\n hideTimePicker,\n localTime,\n localDate,\n } = states;\n\n const {\n showCalendar,\n hideCalendar,\n inputLeftChangeHandler,\n inputRightChangeHandler,\n onChangeTime,\n onChangeDate,\n } = useDateRangeHandlers(value, onValueChange, states, dateInputRef);\n\n const {\n onKeyDownHandler,\n onFocusRight,\n onFocusLeft,\n onClickDay,\n onClickCalendarButton,\n onClickArrowButton,\n } = useUserInputHandlers(\n onChangeDate,\n dateInputRef,\n showCalendar,\n hideCalendar,\n states,\n );\n\n useDateRangeEffects(value, setDateInFocus, dateInputRef);\n\n const statePerMonth = useMemo(() => {\n const dateToHighlight = value || localDate;\n if (!dateToHighlight) {\n return {};\n }\n return addDayStateHighlights(undefined, dateToHighlight, [\n \"singleSelected\",\n \"selected\",\n ]);\n }, [localDate, value]);\n\n const hideAll = useCallback(() => {\n hideCalendar();\n hideTimePicker();\n }, [hideCalendar, hideTimePicker]);\n\n const timeValue = useMemo<string | undefined>(\n () => (value ? transformTimeInDateToTimeString(value) : localTime),\n [value, localTime],\n );\n\n const delayedIsCalendarVisible = useDelayedFalse(isCalendarVisible, 300);\n const delayedIsTimePickerVisible = useDelayedFalse(isTimePickerVisible, 300);\n\n return (\n <Box onKeyDown={onKeyDownHandler}>\n <ControlledPopover\n hideArrow\n restoreFocus={false}\n returnFocus={false}\n zIndex={zIndex}\n appendTo={appendTo}\n renderTrigger={(props) => (\n <Box {...props}>\n <DualTextInput\n autoFocusLeft={autoFocus}\n onEsc={onEsc}\n onEnter={onEnter}\n onBlur={onBlur}\n disabled={disabled}\n separatorIcon={stenaClock}\n typeLeft={\"date\"}\n typeRight={\"time\"}\n placeholderLeft={\"yyyy-mm-dd\"}\n placeholderRight={\"hh:mm\"}\n onChangeLeft={inputLeftChangeHandler}\n onChangeRight={inputRightChangeHandler}\n onClickArrowDown={onClickArrowButton}\n onClickCalendar={onClickCalendarButton}\n onFocusLeft={onFocusLeft}\n onFocusRight={onFocusRight}\n onClickLeft={onFocusLeft}\n onClickRight={onFocusRight}\n inputRefLeft={dateInputRef}\n inputRefRight={timeInputRef}\n valueRight={timeValue ?? \"\"}\n widthLeft={widthLeft}\n widthRight={widthRight}\n minLeft={minDate}\n maxLeft={maxDate}\n variant={variant}\n />\n </Box>\n )}\n placement={defaultPopoverPlacement}\n open={isCalendarVisible || isTimePickerVisible}\n onRequestClose={hideAll}\n >\n {(delayedIsCalendarVisible || delayedIsTimePickerVisible) && (\n <Column>\n {delayedIsCalendarVisible ? (\n <CalendarWithMonthSwitcher\n statePerMonth={statePerMonth}\n onClickDay={onClickDay}\n dateInFocus={dateInFocus}\n setDateInFocus={setDateInFocus}\n currentPanel={currentPanel}\n setCurrentPanel={setCurrentPanel}\n minDate={minDate}\n maxDate={maxDate}\n />\n ) : delayedIsTimePickerVisible ? (\n <Column>\n <Column overflow={\"hidden\"} height={\"250px\"}>\n <TimePicker\n value={timeValue ?? \"\"}\n onValueChange={onChangeTime}\n />\n </Column>\n <Space />\n <Row justifyContent={\"flex-end\"}>\n <PrimaryButton label={\"Done\"} onClick={hideTimePicker} />\n </Row>\n </Column>\n ) : null}\n </Column>\n )}\n </ControlledPopover>\n </Box>\n );\n};\n","import * as React from \"react\";\nimport { Row } from \"@stenajs-webui/core\";\nimport { FlatButton, PrimaryButton } from \"@stenajs-webui/elements\";\nimport { ValueAndOnValueChangeProps } from \"@stenajs-webui/forms\";\n\ninterface Props extends ValueAndOnValueChangeProps<number> {\n year: number;\n}\n\nexport const YearPickerCell: React.FC<Props> = ({\n value,\n onValueChange,\n year,\n}) => {\n const label = String(year);\n return (\n <Row justifyContent={\"center\"}>\n {value === year ? (\n <PrimaryButton label={label} onClick={() => onValueChange?.(year)} />\n ) : (\n <FlatButton label={label} onClick={() => onValueChange?.(year)} />\n )}\n </Row>\n );\n};\n","import * as React from \"react\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport { ValueAndOnValueChangeProps } from \"@stenajs-webui/forms\";\nimport { Column, Row } from \"@stenajs-webui/core\";\nimport { YearPickerCell } from \"./YearPickerCell\";\nimport {\n FlatButton,\n stenaArrowLeft,\n stenaArrowRight,\n} from \"@stenajs-webui/elements\";\nimport { chunk, range } from \"lodash-es\";\n\nexport interface YearPickerProps extends ValueAndOnValueChangeProps<number> {\n initialLastYear?: number;\n}\n\nexport const YearPicker: React.FC<YearPickerProps> = ({\n value,\n onValueChange,\n initialLastYear,\n}) => {\n const [lastYear, setLastYear] = useState(() => {\n if (value) {\n return value + 4;\n }\n return initialLastYear ?? new Date().getFullYear() + 4;\n });\n\n const yearRows = useMemo(() => {\n const startYear = lastYear - 11;\n return chunk(range(startYear, lastYear + 1), 3);\n }, [lastYear]);\n\n useEffect(() => {\n setLastYear((prev) => calculateLastYearInFocus(value, prev));\n }, [value]);\n\n return (\n <Row>\n <Column justifyContent={\"center\"}>\n <FlatButton\n leftIcon={stenaArrowLeft}\n onClick={() => setLastYear(lastYear - 3)}\n />\n </Column>\n <Column gap={1}>\n {yearRows.map((yearRow) => (\n <Row key={yearRow[0]} gap={1}>\n {yearRow.map((year) => (\n <YearPickerCell\n key={year}\n year={year}\n onValueChange={onValueChange}\n value={value}\n />\n ))}\n </Row>\n ))}\n </Column>\n <Column justifyContent={\"center\"}>\n <FlatButton\n leftIcon={stenaArrowRight}\n onClick={() => setLastYear(lastYear + 3)}\n />\n </Column>\n </Row>\n );\n};\n\nconst calculateLastYearInFocus = (\n value: number | undefined,\n lastYear: number,\n): number => {\n if (value == null) {\n return lastYear;\n }\n if (value > lastYear) {\n const yearDiff = value - lastYear;\n const remaining = yearDiff % 3;\n const yearsToAdd = yearDiff - remaining + 3;\n return lastYear + yearsToAdd;\n }\n const startYear = lastYear - 11;\n if (value < startYear) {\n const yearDiff = startYear - value;\n const remaining = yearDiff % 3;\n const yearsToSubtract = yearDiff - remaining + 3;\n return lastYear - yearsToSubtract;\n }\n\n return lastYear;\n};\n","import { RefObject, useEffect } from \"react\";\n\nexport const useDateRangeEffects = (\n startDate: Date | undefined,\n endDate: Date | undefined,\n setDateInFocus: (date: Date) => void,\n startDateInputRef: RefObject<HTMLInputElement | null>,\n endDateInputRef: RefObject<HTMLInputElement | null>,\n) => {\n useEffect(\n function moveFocusedDateWhenStartDateChanges() {\n if (startDate) {\n setDateInFocus(startDate);\n }\n },\n [startDate, setDateInFocus],\n );\n\n useEffect(\n function moveFocusedDateWhenEndDateChanges() {\n if (endDate) {\n setDateInFocus(endDate);\n }\n },\n [endDate, setDateInFocus],\n );\n\n useEffect(\n function updateStartDateFieldWhenValueChanges() {\n if (startDateInputRef.current) {\n if (startDate) {\n startDateInputRef.current.valueAsDate = new Date(\n Date.UTC(\n startDate.getFullYear(),\n startDate.getMonth(),\n startDate.getDate(),\n ),\n );\n } else {\n startDateInputRef.current.valueAsDate = null;\n }\n }\n },\n [startDate, startDateInputRef],\n );\n\n useEffect(\n function updateEndDateFieldWhenValueChanges() {\n if (endDateInputRef.current) {\n if (endDate) {\n endDateInputRef.current.valueAsDate = new Date(\n Date.UTC(\n endDate.getFullYear(),\n endDate.getMonth(),\n endDate.getDate(),\n ),\n );\n } else {\n endDateInputRef.current.valueAsDate = null;\n }\n }\n },\n [endDate, endDateInputRef],\n );\n};\n","import { ChangeEvent, useCallback } from \"react\";\nimport { DateRangeDualTextInputProps } from \"../DateRangeDualTextInput\";\nimport { UseInputStatesResult } from \"./UseInputStates\";\n\nexport const useDateRangeHandlers = (\n startDate: Date | undefined,\n endDate: Date | undefined,\n onValueChange: DateRangeDualTextInputProps[\"onValueChange\"],\n {\n setDateInFocus,\n showCalendarInternal,\n hideCalendarInternal,\n setFirstFocusedInput,\n setCurrentPanel,\n }: UseInputStatesResult,\n) => {\n const inputLeftChangeHandler = useCallback(\n (ev: ChangeEvent<HTMLInputElement>) => {\n if (ev.target.value[0] !== \"0\") {\n onValueChange?.({\n startDate: ev.target.valueAsDate ?? undefined,\n endDate,\n });\n }\n },\n [onValueChange, endDate],\n );\n\n const inputRightChangeHandler = useCallback(\n (ev: ChangeEvent<HTMLInputElement>) => {\n if (ev.target.value[0] !== \"0\") {\n onValueChange?.({\n startDate,\n endDate: ev.target.valueAsDate ?? undefined,\n });\n }\n },\n [onValueChange, startDate],\n );\n\n const showCalendar = useCallback(\n (dateInFocus?: Date) => {\n if (dateInFocus != null) {\n setDateInFocus(dateInFocus);\n } else if (startDate) {\n setDateInFocus(startDate);\n } else if (endDate) {\n setDateInFocus(endDate);\n } else {\n setDateInFocus(new Date());\n }\n setCurrentPanel(\"calendar\");\n showCalendarInternal();\n },\n [startDate, endDate, setCurrentPanel, showCalendarInternal, setDateInFocus],\n );\n\n const hideCalendar = useCallback(() => {\n setFirstFocusedInput(undefined);\n hideCalendarInternal();\n }, [setFirstFocusedInput, hideCalendarInternal]);\n\n return {\n inputLeftChangeHandler,\n inputRightChangeHandler,\n hideCalendar,\n setDateInFocus,\n setCurrentPanel,\n showCalendar,\n };\n};\n","import { useBoolean } from \"@stenajs-webui/core\";\nimport { useState } from \"react\";\nimport { DateRangeFocusedInput } from \"../../../calendar-types/date-range-calendar/DateRangeCalendar\";\nimport { CalendarPanelType } from \"../../../../features/calendar-with-month-year-pickers/CalendarPanelType\";\n\nexport type UseInputStatesResult = ReturnType<typeof useInputStates>;\n\nexport const useInputStates = (\n startDate: Date | undefined,\n endDate: Date | undefined,\n) => {\n const [isCalendarVisible, showCalendarInternal, hideCalendarInternal] =\n useBoolean(false);\n\n const [firstFocusedInput, setFirstFocusedInput] = useState<\n DateRangeFocusedInput | undefined\n >(undefined);\n\n const [focusedInput, setFocusedInput] =\n useState<DateRangeFocusedInput>(\"startDate\");\n\n const [dateInFocus, setDateInFocus] = useState<Date>(() => {\n const fromValue =\n focusedInput === \"startDate\"\n ? startDate\n : focusedInput === \"endDate\"\n ? endDate\n : undefined;\n\n return fromValue ?? new Date();\n });\n\n const [currentPanel, setCurrentPanel] =\n useState<CalendarPanelType>(\"calendar\");\n\n return {\n isCalendarVisible,\n showCalendarInternal,\n hideCalendarInternal,\n firstFocusedInput,\n setFirstFocusedInput,\n focusedInput,\n setFocusedInput,\n dateInFocus,\n setDateInFocus,\n currentPanel,\n setCurrentPanel,\n };\n};\n","import { isAfter } from \"date-fns\";\nimport * as React from \"react\";\nimport { RefObject, useCallback } from \"react\";\nimport { DayData } from \"../../../../util/calendar/CalendarDataFactory\";\nimport { DateRangeDualTextInputProps } from \"../DateRangeDualTextInput\";\nimport { UseInputStatesResult } from \"./UseInputStates\";\n\nexport const useUserInputHandlers = (\n startDate: Date | undefined,\n endDate: Date | undefined,\n onValueChange: DateRangeDualTextInputProps[\"onValueChange\"],\n startDateInputRef: RefObject<HTMLInputElement | null>,\n endDateInputRef: RefObject<HTMLInputElement | null>,\n showCalendar: (dateInFocus?: Date) => void,\n hideCalendar: () => void,\n {\n firstFocusedInput,\n setFirstFocusedInput,\n isCalendarVisible,\n setFocusedInput,\n focusedInput,\n setCurrentPanel,\n setDateInFocus,\n }: UseInputStatesResult,\n) => {\n const onFocusLeft = useCallback(() => {\n if (firstFocusedInput == null) {\n setFirstFocusedInput(\"startDate\");\n }\n setFocusedInput(\"startDate\");\n if (!isCalendarVisible) {\n showCalendar(startDate);\n } else if (startDate != null) {\n setDateInFocus(startDate);\n }\n }, [\n firstFocusedInput,\n setFocusedInput,\n isCalendarVisible,\n startDate,\n setFirstFocusedInput,\n showCalendar,\n setDateInFocus,\n ]);\n\n const onFocusRight = useCallback(() => {\n if (firstFocusedInput == null) {\n setFirstFocusedInput(\"endDate\");\n }\n setFocusedInput(\"endDate\");\n if (!isCalendarVisible) {\n showCalendar(endDate);\n } else if (endDate != null) {\n setDateInFocus(endDate);\n }\n }, [\n firstFocusedInput,\n setFocusedInput,\n isCalendarVisible,\n endDate,\n setFirstFocusedInput,\n showCalendar,\n setDateInFocus,\n ]);\n\n const onClickDay = useCallback(\n (day: DayData) => {\n if (focusedInput === \"startDate\") {\n if (endDate != null && isAfter(day.date, endDate)) {\n onValueChange?.({\n startDate: day.date,\n endDate: undefined,\n });\n setFocusedInput(\"endDate\");\n endDateInputRef.current?.focus();\n } else {\n onValueChange?.({\n startDate: day.date,\n endDate,\n });\n if (firstFocusedInput === \"startDate\") {\n setFocusedInput(\"endDate\");\n endDateInputRef.current?.focus();\n } else {\n setTimeout(hideCalendar, 50);\n }\n }\n } else if (focusedInput === \"endDate\") {\n if (!startDate) {\n onValueChange?.({\n startDate,\n endDate: day.date,\n });\n setFocusedInput(\"startDate\");\n startDateInputRef.current?.focus();\n } else if (isAfter(startDate, day.date)) {\n onValueChange?.({\n startDate: day.date,\n endDate: undefined,\n });\n setFocusedInput(\"endDate\");\n endDateInputRef.current?.focus();\n } else {\n onValueChange?.({\n startDate,\n endDate: day.date,\n });\n setTimeout(hideCalendar, 50);\n }\n }\n },\n [\n focusedInput,\n onValueChange,\n endDate,\n firstFocusedInput,\n setFocusedInput,\n endDateInputRef,\n hideCalendar,\n startDate,\n startDateInputRef,\n ],\n );\n\n const onClickArrowButton = useCallback(() => {\n setCurrentPanel(\"presets\");\n showCalendar();\n }, [setCurrentPanel, showCalendar]);\n\n const onClickCalendarButton = useCallback(() => {\n if (isCalendarVisible) {\n hideCalendar();\n } else {\n setFocusedInput(\"startDate\");\n setFirstFocusedInput(\"startDate\");\n startDateInputRef.current?.focus();\n setCurrentPanel(\"calendar\");\n showCalendar();\n }\n }, [\n isCalendarVisible,\n hideCalendar,\n setFocusedInput,\n setFirstFocusedInput,\n startDateInputRef,\n setCurrentPanel,\n showCalendar,\n ]);\n\n const onKeyDownHandler = useCallback(\n (ev: React.KeyboardEvent<HTMLDivElement>) => {\n if (ev.key === \"Escape\") {\n hideCalendar();\n }\n },\n [hideCalendar],\n );\n\n return {\n onFocusLeft,\n onFocusRight,\n onClickDay,\n onClickArrowButton,\n onClickCalendarButton,\n onKeyDownHandler,\n };\n};\n","import { Box, Column } from \"@stenajs-webui/core\";\nimport { stenaArrowRight } from \"@stenajs-webui/elements\";\nimport {\n TextInputProps,\n ValueAndOnValueChangeProps,\n} from \"@stenajs-webui/forms\";\nimport {\n ControlledPopover,\n ControlledPopoverProps,\n} from \"@stenajs-webui/tooltip\";\nimport { isAfter } from \"date-fns\";\nimport * as React from \"react\";\nimport { useMemo, useRef } from \"react\";\nimport { defaultPopoverPlacement } from \"../../../config/DefaultPopoverPlacement\";\nimport {\n DualTextInput,\n DualTextInputProps,\n} from \"../../../features/dual-text-input/DualTextInput\";\nimport { CalendarWithMonthSwitcher } from \"../../../features/month-switcher/CalendarWithMonthSwitcher\";\nimport { buildDayStateForSingleMonth } from \"../../../util/calendar/StateModifier\";\nimport { useDateRangeEffects } from \"./hooks/UseDateRangeEffects\";\nimport { useDateRangeHandlers } from \"./hooks/UseDateRangeHandlers\";\nimport { useInputStates } from \"./hooks/UseInputStates\";\nimport { useUserInputHandlers } from \"./hooks/UseUserInputHandlers\";\nimport { DateRangeInputCalendarProps } from \"../../calendar-types/date-range-calendar/DateRangeCalendar\";\nimport { OptionalMinMaxDatesAsString } from \"../../../types/CalendarTypes\";\nimport { DateRange } from \"../../../types/DateRange\";\nimport { defaultMaxDate } from \"../../../config/DefaultMaxDate\";\n\nexport interface DateRangeDualTextInputProps<TData = unknown>\n extends\n ValueAndOnValueChangeProps<DateRange>,\n OptionalMinMaxDatesAsString,\n Pick<DualTextInputProps, \"widthLeft\" | \"widthRight\" | \"variant\">,\n Pick<ControlledPopoverProps, \"zIndex\" | \"appendTo\"> {\n onEsc?: () => void;\n onEnter?: () => void;\n onBlur?: () => void;\n autoFocus?: boolean;\n calendarProps?: DateRangeInputCalendarProps<TData>;\n disabled?: boolean;\n renderBelowCalendar?: React.ReactNode;\n firstMonthInMonthPicker?: Date;\n numMonthsInMonthPicker?: number;\n}\n\nexport function DateRangeDualTextInput<TData>({\n value,\n onValueChange,\n autoFocus,\n onBlur,\n onEnter,\n onEsc,\n minDate,\n maxDate = defaultMaxDate,\n calendarProps,\n widthLeft = 128,\n widthRight = 128,\n firstMonthInMonthPicker,\n numMonthsInMonthPicker,\n variant,\n disabled,\n zIndex,\n appendTo,\n renderBelowCalendar,\n}: DateRangeDualTextInputProps<TData>) {\n const { startDate, endDate } = value || {};\n\n const startDateInputRef: TextInputProps[\"inputRef\"] = useRef(null);\n const endDateInputRef: TextInputProps[\"inputRef\"] = useRef(null);\n\n const states = useInputStates(startDate, endDate);\n\n const {\n dateInFocus,\n setDateInFocus,\n isCalendarVisible,\n currentPanel,\n setCurrentPanel,\n } = states;\n\n const {\n showCalendar,\n hideCalendar,\n inputLeftChangeHandler,\n inputRightChangeHandler,\n } = useDateRangeHandlers(startDate, endDate, onValueChange, states);\n\n const {\n onKeyDownHandler,\n onFocusRight,\n onFocusLeft,\n onClickDay,\n onClickCalendarButton,\n onClickArrowButton,\n } = useUserInputHandlers(\n startDate,\n endDate,\n onValueChange,\n startDateInputRef,\n endDateInputRef,\n showCalendar,\n hideCalendar,\n states,\n );\n\n useDateRangeEffects(\n startDate,\n endDate,\n setDateInFocus,\n startDateInputRef,\n endDateInputRef,\n );\n\n const startDateIsAfterEnd = useMemo(\n () => startDate && endDate && isAfter(startDate, endDate),\n [startDate, endDate],\n );\n\n const statePerMonth = useMemo(\n () =>\n buildDayStateForSingleMonth(\n calendarProps?.statePerMonth,\n startDate,\n endDate,\n dateInFocus,\n ),\n [calendarProps?.statePerMonth, startDate, endDate, dateInFocus],\n );\n\n return (\n <Box onKeyDown={onKeyDownHandler}>\n <ControlledPopover\n hideArrow\n restoreFocus={false}\n returnFocus={false}\n zIndex={zIndex}\n appendTo={appendTo}\n renderTrigger={(props) => (\n <Box {...props}>\n <DualTextInput\n autoFocusLeft={autoFocus}\n onEsc={onEsc}\n onEnter={onEnter}\n onBlur={onBlur}\n disabled={disabled}\n separatorIcon={stenaArrowRight}\n typeLeft={\"date\"}\n typeRight={\"date\"}\n placeholderLeft={\"Start date\"}\n placeholderRight={\"End date\"}\n onChangeLeft={inputLeftChangeHandler}\n onChangeRight={inputRightChangeHandler}\n onClickArrowDown={onClickArrowButton}\n onClickCalendar={onClickCalendarButton}\n onFocusLeft={onFocusLeft}\n onFocusRight={onFocusRight}\n onClickLeft={onFocusLeft}\n onClickRight={onFocusRight}\n inputRefLeft={startDateInputRef}\n inputRefRight={endDateInputRef}\n variant={startDateIsAfterEnd ? \"error\" : variant}\n widthLeft={widthLeft}\n widthRight={widthRight}\n minLeft={minDate}\n maxLeft={maxDate}\n minRight={minDate}\n maxRight={maxDate}\n />\n </Box>\n )}\n placement={defaultPopoverPlacement}\n onRequestClose={hideCalendar}\n open={isCalendarVisible}\n >\n <Column>\n <CalendarWithMonthSwitcher\n onClickDay={onClickDay}\n dateInFocus={dateInFocus}\n firstMonthInMonthPicker={firstMonthInMonthPicker}\n numMonthsInMonthPicker={numMonthsInMonthPicker}\n setDateInFocus={setDateInFocus}\n currentPanel={currentPanel}\n setCurrentPanel={setCurrentPanel}\n minDate={minDate}\n maxDate={maxDate}\n {...calendarProps}\n statePerMonth={statePerMonth}\n />\n {currentPanel === \"calendar\" && renderBelowCalendar}\n </Column>\n </ControlledPopover>\n </Box>\n );\n}\n","import * as React from \"react\";\nimport {\n FocusEventHandler,\n RefObject,\n useCallback,\n useRef,\n useState,\n} from \"react\";\nimport {\n LabelledTextInput,\n LabelledTextInputProps,\n TextInput,\n} from \"@stenajs-webui/forms\";\nimport {\n InputMask,\n InputMaskPipe,\n InputMaskProvider,\n useMaskedInput,\n} from \"@stenajs-webui/input-mask\";\nimport { TravelCalendarSizeVariant } from \"./TravelCalendar\";\nimport { exhaustSwitchCase } from \"@stenajs-webui/core\";\nimport { Label } from \"@stenajs-webui/elements\";\nimport { DateTextInputVariant } from \"../types\";\n\nexport interface TravelDateTextInputProps extends Pick<\n LabelledTextInputProps,\n | \"readOnly\"\n | \"onChange\"\n | \"onValueChange\"\n | \"value\"\n | \"onFocus\"\n | \"onBlur\"\n | \"placeholder\"\n | \"label\"\n | \"borderRadiusVariant\"\n> {\n ref?: RefObject<HTMLInputElement | null>;\n mask: InputMask | InputMaskProvider;\n pipe?: InputMaskPipe;\n guide?: boolean;\n keepCharPositions?: boolean;\n placeholderChar?: string;\n showMask?: boolean;\n calendarSize: TravelCalendarSizeVariant;\n placeholderWhenBlurred: string | undefined;\n valueWhenBlurred: string | undefined;\n variant: DateTextInputVariant;\n autoFocus?: boolean;\n}\n\nexport const TravelDateTextInput: React.FC<TravelDateTextInputProps> = ({\n onChange,\n onValueChange,\n readOnly,\n mask,\n ref,\n pipe,\n value,\n guide,\n keepCharPositions,\n placeholderChar,\n showMask,\n calendarSize,\n onFocus,\n onBlur,\n placeholderWhenBlurred,\n placeholder,\n valueWhenBlurred,\n label,\n variant,\n autoFocus,\n ...inputProps\n}) => {\n const localRef = useRef(null);\n const [isFocused, setIsFocused] = useState(false);\n\n const inputRef = ref ?? localRef;\n\n const { onChange: maskedOnChange } = useMaskedInput(\n inputRef,\n onChange,\n onValueChange,\n mask,\n pipe,\n value,\n guide,\n keepCharPositions,\n placeholderChar,\n showMask,\n isFocused,\n );\n\n const onFocusHandler = useCallback<FocusEventHandler<HTMLInputElement>>(\n (ev) => {\n onFocus?.(ev);\n setIsFocused(true);\n },\n [onFocus],\n );\n\n const onBlurHandler = useCallback<FocusEventHandler<HTMLInputElement>>(\n (ev) => {\n onBlur?.(ev);\n setIsFocused(false);\n },\n [onBlur],\n );\n\n const activePlaceholder = isFocused\n ? placeholder\n : (placeholderWhenBlurred ?? placeholder);\n\n if (variant === \"standard\") {\n return (\n <Label text={label ?? \"\"}>\n <TextInput\n {...inputProps}\n autoFocus={autoFocus}\n readOnly={readOnly}\n inputMode={\"numeric\"}\n aria-live={\"polite\"}\n value={(!isFocused ? valueWhenBlurred : value) ?? \"\"}\n inputRef={inputRef}\n placeholder={activePlaceholder}\n onFocus={onFocusHandler}\n onBlur={onBlurHandler}\n onChange={maskedOnChange}\n width={getWidth(calendarSize)}\n alwaysShowPlaceholder\n />\n </Label>\n );\n } else {\n return (\n <LabelledTextInput\n {...inputProps}\n autoFocus={autoFocus}\n readOnly={readOnly}\n inputMode={\"numeric\"}\n label={label}\n aria-live={\"polite\"}\n value={(!isFocused ? valueWhenBlurred : value) ?? \"\"}\n ref={inputRef}\n placeholder={activePlaceholder}\n onFocus={onFocusHandler}\n onBlur={onBlurHandler}\n onChange={maskedOnChange}\n width={getWidth(calendarSize)}\n size={calendarSize === \"large\" ? \"large\" : \"medium\"}\n />\n );\n }\n};\n\nconst getWidth = (calenderSize: TravelCalendarSizeVariant) => {\n // For cell size = 48px, (48*7)/2 = 168px\n switch (calenderSize) {\n case \"smaller\":\n return \"140px\";\n case \"small\":\n return \"154px\";\n case \"medium\":\n return \"168px\";\n case \"large\":\n return \"196px\";\n default:\n return exhaustSwitchCase(calenderSize, \"168px\");\n }\n};\n","export const yearMask = [/[1-2]/, /\\d/, /\\d/, /\\d/];\nexport const monthMask = [/[0-1]/, /\\d/];\nexport const dayMask = [/[0-3]/, /\\d/];\n\nexport const createInputMaskForDateFormat = (\n dateFormat: string, // For example: yyyy-MM-dd\n): Array<string | RegExp> => {\n const l = splitByNewLetter(dateFormat);\n return l.flatMap(tokenToMask);\n};\n\nconst tokenToMask = (token: string): Array<string | RegExp> => {\n switch (token) {\n case \"yyyy\":\n return yearMask;\n case \"mm\":\n case \"MM\":\n return monthMask;\n case \"dd\":\n case \"DD\":\n return dayMask;\n default:\n return [token];\n }\n};\n\nconst splitByNewLetter = (str: string): Array<string> => {\n if (str.length === 0) return [];\n\n const result: Array<string> = [];\n let currentSegment = str[0];\n\n for (let i = 1; i < str.length; i++) {\n if (str[i] !== str[i - 1]) {\n result.push(currentSegment);\n currentSegment = str[i];\n } else {\n currentSegment += str[i];\n }\n }\n\n result.push(currentSegment);\n return result;\n};\n","// Define the supported locales\n\nimport { SupportedLocaleCode } from \"./LocaleMapper\";\n\nexport const getDateFormatForLocaleCode = (\n localeCode: SupportedLocaleCode,\n): string => {\n const formatter = new Intl.DateTimeFormat(localeCode, { dateStyle: \"short\" });\n const parts = formatter.formatToParts(new Date());\n const formatMap: { [key: string]: string } = {\n year: \"yyyy\",\n month: \"MM\",\n day: \"dd\",\n };\n return parts.map((part) => formatMap[part.type] || part.value).join(\"\");\n};\n","import { parse } from \"date-fns\";\nimport { getDateFormatForLocaleCode } from \"./DateFormatProvider\";\nimport {\n fallbackLocaleCode,\n getLocaleForLocaleCode,\n getSupportedLocaleCode,\n SupportedLocaleCode,\n} from \"./LocaleMapper\";\n\ninterface ParseLocalizedDateStringOptions {\n matchLanguage?: boolean;\n fallbackLocaleCode?: SupportedLocaleCode;\n referenceDate?: Date;\n}\n\nexport const parseLocalizedDateString = (\n dateString: string,\n localeCode: string,\n options?: ParseLocalizedDateStringOptions,\n): Date | undefined => {\n const supportedLocaleCode = getSupportedLocaleCode(\n localeCode,\n options?.matchLanguage ?? false,\n options?.fallbackLocaleCode ?? fallbackLocaleCode,\n );\n\n const locale = getLocaleForLocaleCode(supportedLocaleCode);\n\n if (locale == null) {\n return undefined;\n }\n\n const date = parse(\n dateString,\n getDateFormatForLocaleCode(supportedLocaleCode),\n options?.referenceDate ?? new Date(),\n {\n locale: locale,\n },\n );\n\n if (isNaN(date.getTime())) {\n return undefined;\n }\n\n return date;\n};\n","import { format } from \"date-fns\";\nimport { getDateFormatForLocaleCode } from \"./DateFormatProvider\";\nimport {\n fallbackLocaleCode,\n getLocaleForLocaleCode,\n getSupportedLocaleCode,\n SupportedLocaleCode,\n} from \"./LocaleMapper\";\n\nexport interface FormatLocalizedDateOptions {\n matchLanguage?: boolean;\n fallbackLocaleCode?: SupportedLocaleCode;\n}\n\nexport const formatLocalizedDate = (\n date: Date,\n localeCode: string,\n options?: FormatLocalizedDateOptions,\n): string => {\n const l = getSupportedLocaleCode(\n localeCode,\n options?.matchLanguage ?? false,\n options?.fallbackLocaleCode ?? fallbackLocaleCode,\n );\n return format(date, getDateFormatForLocaleCode(l), {\n locale: getLocaleForLocaleCode(l),\n });\n};\n","import { parseLocalizedDateString } from \"./LocalizedDateParser\";\nimport { formatLocalizedDate } from \"./LocalizedDateFormatter\";\n\nexport const reformatLocalizedDateString = (\n dateString: string,\n locale: string,\n): string | undefined => {\n const d = parseLocalizedDateString(dateString, locale);\n if (d == null) {\n return undefined;\n }\n return formatLocalizedDate(d, locale);\n};\n","import * as React from \"react\";\nimport { RefObject, useMemo } from \"react\";\nimport { Row } from \"@stenajs-webui/core\";\nimport { TravelDateTextInput } from \"./TravelDateTextInput\";\nimport { createInputMaskForDateFormat } from \"../../localize-date-format/InputMaskProvider\";\nimport { getDateFormatForLocaleCode } from \"../../localize-date-format/DateFormatProvider\";\nimport { reformatLocalizedDateString } from \"../../localize-date-format/LocalizedDateReformatter\";\nimport { DateTextInputVariant, TravelDateRangeInputValue } from \"../types\";\nimport { TravelCalendarSizeVariant } from \"./TravelCalendar\";\nimport { SupportedLocaleCode } from \"../../localize-date-format/LocaleMapper\";\nimport { isDeviceSameOrLarger, useDeviceSize } from \"@stenajs-webui/panels\";\n\nexport type TravelDateRangeTextInputField = \"startDate\" | \"endDate\";\n\nexport interface TravelDateRangeTextInputFieldsProps {\n value: TravelDateRangeInputValue | undefined;\n onValueChange:\n | ((value: Partial<TravelDateRangeInputValue>) => void)\n | undefined;\n localeCode: SupportedLocaleCode;\n startDateLabel?: string;\n endDateLabel?: string;\n onFocus?: (field: TravelDateRangeTextInputField) => void;\n onBlur?: () => void;\n startDateRef?: RefObject<HTMLInputElement | null>;\n endDateRef?: RefObject<HTMLInputElement | null>;\n calendarSize: TravelCalendarSizeVariant;\n placeholderWhenBlurredStartDate: string | undefined;\n placeholderWhenBlurredEndDate: string | undefined;\n valueWhenBlurredStartDate: string | undefined;\n valueWhenBlurredEndDate: string | undefined;\n variant: DateTextInputVariant;\n readOnlyOnMobile: boolean;\n autoFocusStartDate?: boolean;\n autoFocusEndDate?: boolean;\n}\n\nexport const TravelDateRangeTextInputFields: React.FC<\n TravelDateRangeTextInputFieldsProps\n> = ({\n value,\n onValueChange,\n localeCode,\n startDateLabel = \"From\",\n endDateLabel = \"To\",\n onFocus,\n onBlur,\n calendarSize,\n startDateRef,\n endDateRef,\n placeholderWhenBlurredStartDate,\n placeholderWhenBlurredEndDate,\n valueWhenBlurredStartDate,\n valueWhenBlurredEndDate,\n variant,\n readOnlyOnMobile,\n autoFocusStartDate,\n autoFocusEndDate,\n}) => {\n const { deviceSize } = useDeviceSize();\n\n const readOnly =\n readOnlyOnMobile && !isDeviceSameOrLarger(deviceSize, \"tablet\");\n\n const { mask, placeholder } = useMemo(() => {\n const dateFormatForLocaleCode = getDateFormatForLocaleCode(localeCode);\n return {\n mask: createInputMaskForDateFormat(dateFormatForLocaleCode),\n placeholder: dateFormatForLocaleCode.toLowerCase(),\n };\n }, [localeCode]);\n\n return (\n <Row>\n <TravelDateTextInput\n mask={mask}\n ref={startDateRef}\n value={value?.startDate}\n onValueChange={(v) => {\n onValueChange?.({ startDate: v });\n }}\n onBlur={(ev) => {\n const startDate = reformatLocalizedDateString(\n ev.target.value,\n localeCode,\n );\n if (startDate && startDate !== value?.startDate) {\n onValueChange?.({ startDate });\n }\n onBlur?.();\n }}\n onFocus={() => onFocus?.(\"startDate\")}\n autoFocus={autoFocusStartDate}\n label={startDateLabel}\n borderRadiusVariant={\"onlyLeft\"}\n placeholder={placeholder}\n placeholderWhenBlurred={placeholderWhenBlurredStartDate}\n valueWhenBlurred={valueWhenBlurredStartDate}\n calendarSize={calendarSize}\n variant={variant}\n readOnly={readOnly}\n />\n <TravelDateTextInput\n mask={mask}\n ref={endDateRef}\n value={value?.endDate}\n onValueChange={(v) => onValueChange?.({ endDate: v })}\n onBlur={(ev) => {\n const endDate = reformatLocalizedDateString(\n ev.target.value,\n localeCode,\n );\n if (endDate && endDate !== value?.endDate) {\n onValueChange?.({ endDate });\n }\n onBlur?.();\n }}\n onFocus={() => onFocus?.(\"endDate\")}\n autoFocus={autoFocusEndDate}\n label={endDateLabel}\n borderRadiusVariant={\"onlyRight\"}\n placeholder={placeholder}\n placeholderWhenBlurred={placeholderWhenBlurredEndDate}\n valueWhenBlurred={valueWhenBlurredEndDate}\n calendarSize={calendarSize}\n variant={variant}\n readOnly={readOnly}\n />\n </Row>\n );\n};\n","import { useEventCallback } from \"@stenajs-webui/core\";\nimport { isAfter, isSameMonth, startOfMonth } from \"date-fns\";\nimport { useCallback, useMemo } from \"react\";\n\n/**\n * The visible month of a travel calendar, which the app owns.\n *\n * The calendar never changes the month itself. Everything that would move it,\n * the month buttons, the month picker, the arrow keys and a new value, asks the\n * app instead, through onVisibleMonthChange.\n *\n * The request is always the first day of the month. The arrow keys and the\n * month picker work with other days of the month, and the app should get the\n * same month in the same form whichever way it was reached.\n *\n * A request for the month that is already visible is not made at all. The\n * check is against the month of the last render, so two requests made before\n * the app has passed a month back, such as two quick clicks while it loads,\n * both reach it, the same way two quick edits reach any controlled input\n * that updates later. The second request is left to the app rather than\n * dropped here, since the app may not have taken the first.\n *\n * The month is kept by year and month, so an app that passes a new Date on\n * every render, such as new Date(), does not rebuild the calendar each time.\n */\nexport const useControlledVisibleMonth = (\n visibleMonthValue: Date,\n onVisibleMonthChange: (visibleMonth: Date) => void,\n today: Date,\n) => {\n const year = visibleMonthValue.getFullYear();\n const month = visibleMonthValue.getMonth();\n\n const visibleMonth = useMemo(() => new Date(year, month, 1), [year, month]);\n\n const setVisibleMonth = useEventCallback((requested: Date) => {\n if (isSameMonth(requested, visibleMonth)) {\n return;\n }\n onVisibleMonthChange(startOfMonth(requested));\n });\n\n /**\n * Shows the month of a date the calendar follows, such as a new value, but\n * never moves back before the current month.\n *\n * A date in the month already shown needs no move at all, and is left\n * alone even when that month is in the past. Otherwise choosing a date in a\n * past month the user has browsed to would jump the calendar to the\n * current month, right after the click.\n */\n const setVisibleMonthClamped = useCallback(\n (requested: Date) => {\n if (isSameMonth(requested, visibleMonth)) {\n return;\n }\n setVisibleMonth(\n isSameMonth(requested, today) || isAfter(requested, today)\n ? requested\n : today,\n );\n },\n [setVisibleMonth, today, visibleMonth],\n );\n\n return { visibleMonth, setVisibleMonth, setVisibleMonthClamped };\n};\n","import { format, isSameYear, Locale } from \"date-fns\";\n\nexport const formatDateDescription = (\n date: Date,\n today: Date,\n locale: Locale,\n) => {\n const year = isSameYear(date, today) ? \"\" : \" y\";\n if (locale.code.startsWith(\"en\")) {\n return format(date, \"eee MMM d\" + year, { locale }).replace(\".\", \"\");\n } else {\n return format(date, \"eee d MMM\" + year, { locale }).replace(\".\", \"\");\n }\n};\n\nexport const formatDateDescriptionLong = (\n date: Date,\n today: Date,\n locale: Locale,\n) => {\n const year = isSameYear(date, today) ? \"\" : \" y\";\n if (locale.code.startsWith(\"en\")) {\n return format(date, \"eeee MMMM d\" + year, { locale });\n } else {\n return format(date, \"eeee d MMMM\" + year, { locale });\n }\n};\n","import { isAfter, isSameDay } from \"date-fns\";\n\ntype DateParser = (value: string) => Date | null | undefined;\n\nfunction isInvalidRange(\n startDateStr?: string,\n endDateStr?: string,\n parse?: DateParser,\n): boolean {\n if (!startDateStr || !endDateStr || !parse) return false;\n\n const start = parse(startDateStr);\n const end = parse(endDateStr);\n\n // If parsing fails, don't flip\n if (\n !start ||\n !end ||\n Number.isNaN(start.getTime()) ||\n Number.isNaN(end.getTime())\n ) {\n return false;\n }\n\n if (isSameDay(start, end)) return false;\n\n return isAfter(start, end);\n}\n\n/**\n * Flip `startDate` and `endDate` string fields of an object,\n * based on parsed `Date` values using `parse`.\n */\nexport function flipStringDateRange<\n T extends { startDate?: string; endDate?: string },\n>(obj: T, parse: DateParser): T {\n const { startDate, endDate } = obj;\n\n if (!isInvalidRange(startDate, endDate, parse)) {\n return obj;\n }\n\n return {\n ...obj,\n startDate: endDate,\n endDate: startDate,\n };\n}\n\n/**\n * If the date range is invalid, it resets startDate or endDate to the same value.\n * based on parsed `Date` values using `parse`.\n */\nexport function resetDateRangeIfInvalid<\n T extends { startDate?: string; endDate?: string },\n>(obj: T, parse: DateParser, master: \"startDate\" | \"endDate\"): T {\n const { startDate, endDate } = obj;\n\n if (!isInvalidRange(startDate, endDate, parse)) {\n return obj;\n }\n\n if (master === \"startDate\") {\n return {\n ...obj,\n startDate,\n endDate: startDate,\n };\n } else {\n return {\n ...obj,\n startDate: endDate,\n endDate,\n };\n }\n}\n","import {\n getLocaleForLocaleCode,\n SupportedLocaleCode,\n} from \"../../localize-date-format/LocaleMapper\";\nimport { useCallback, useId, useMemo, useRef, useState } from \"react\";\nimport { useToday } from \"@stenajs-webui/core\";\nimport { useControlledVisibleMonth } from \"./UseControlledVisibleMonth\";\nimport { getDateFormatForLocaleCode } from \"../../localize-date-format/DateFormatProvider\";\nimport { parseLocalizedDateString } from \"../../localize-date-format/LocalizedDateParser\";\nimport {\n intlFormat,\n isAfter,\n isBefore,\n isSameDay,\n isSameMonth,\n} from \"date-fns\";\nimport { getMonthInYear } from \"../../../util/calendar/CalendarDataFactory\";\nimport { formatLocalizedDate } from \"../../localize-date-format/LocalizedDateFormatter\";\nimport { TravelDateRangeInputValue, VisiblePanel } from \"../types\";\nimport { formatDateDescription } from \"../util/DateDescriptionFormatter\";\nimport { convertFirstCharToUpper } from \"../../../util/caseFormat/CaseFormat\";\nimport { resetDateRangeIfInvalid } from \"../util/DateRangeNormalizer\";\n\nexport const useTravelDateRangeInput = (\n value: TravelDateRangeInputValue | undefined,\n onValueChange: ((value: TravelDateRangeInputValue) => void) | undefined,\n localeCode: SupportedLocaleCode,\n languageLocaleCode: SupportedLocaleCode,\n visibleMonthValue: Date,\n onVisibleMonthChange: (visibleMonth: Date) => void,\n fieldLastInFocus: \"startDate\" | \"endDate\" | undefined,\n setFieldLastInFocus: (field: \"startDate\" | \"endDate\" | undefined) => void,\n moveFocusToField: (field: \"startDate\" | \"endDate\") => void,\n hideCalendar: undefined | (() => void),\n) => {\n const languageLocale = getLocaleForLocaleCode(languageLocaleCode);\n\n const calendarId = useId();\n const today = useToday();\n\n const monthPickerButtonRef = useRef<HTMLButtonElement>(null);\n\n const dateFormat = useMemo(\n () => getDateFormatForLocaleCode(localeCode),\n [localeCode],\n );\n\n const selectedStartDate = useMemo(\n () =>\n value?.startDate?.length === dateFormat.length\n ? parseLocalizedDateString(value.startDate, localeCode)\n : undefined,\n [dateFormat.length, localeCode, value?.startDate],\n );\n\n const selectedEndDate = useMemo(\n () =>\n value?.endDate?.length === dateFormat.length\n ? parseLocalizedDateString(value.endDate, localeCode)\n : undefined,\n [dateFormat.length, localeCode, value?.endDate],\n );\n\n const valueWhenBlurredStartDate = useMemo(\n () =>\n selectedStartDate != null\n ? formatDateDescription(selectedStartDate, today, languageLocale)\n : undefined,\n [languageLocale, selectedStartDate, today],\n );\n\n const valueWhenBlurredEndDate = useMemo(\n () =>\n selectedEndDate != null\n ? formatDateDescription(selectedEndDate, today, languageLocale)\n : undefined,\n [languageLocale, selectedEndDate, today],\n );\n\n const { visibleMonth, setVisibleMonth, setVisibleMonthClamped } =\n useControlledVisibleMonth(visibleMonthValue, onVisibleMonthChange, today);\n\n const visibleMonthData = useMemo(\n () =>\n getMonthInYear(\n visibleMonth.getFullYear(),\n visibleMonth.getMonth(),\n languageLocale,\n ),\n [languageLocale, visibleMonth],\n );\n\n const monthPickerButtonLabel = useMemo(() => {\n return convertFirstCharToUpper(\n intlFormat(\n visibleMonth,\n { month: \"long\", year: \"numeric\" },\n { locale: languageLocale.code },\n ),\n );\n }, [languageLocale, visibleMonth]);\n\n const todayIsInVisibleMonth = useMemo(() => {\n return isSameMonth(today, visibleMonth);\n }, [today, visibleMonth]);\n\n const [hoverDate, setHoverDate] = useState<Date | undefined>();\n\n const [visiblePanel, setVisiblePanel] = useState<VisiblePanel>(\"calendar\");\n\n const onValueChangeByInputs = useCallback<\n (value: TravelDateRangeInputValue) => void\n >(\n (v) => {\n const startDate =\n v?.startDate?.length === dateFormat.length\n ? parseLocalizedDateString(v.startDate, localeCode)\n : undefined;\n\n const endDate =\n v?.endDate?.length === dateFormat.length\n ? parseLocalizedDateString(v.endDate, localeCode)\n : undefined;\n\n if (startDate) {\n setVisibleMonthClamped(startDate);\n } else if (endDate) {\n setVisibleMonthClamped(endDate);\n }\n\n onValueChange?.({\n ...value,\n ...v,\n });\n },\n [\n dateFormat.length,\n localeCode,\n onValueChange,\n setVisibleMonthClamped,\n value,\n ],\n );\n\n const isValidDateRange = useMemo(\n () =>\n selectedStartDate && selectedEndDate\n ? isAfter(selectedEndDate, selectedStartDate) ||\n isSameDay(selectedEndDate, selectedStartDate)\n : false,\n [selectedEndDate, selectedStartDate],\n );\n\n const hoverAnchor = useMemo(() => {\n const s =\n fieldLastInFocus === \"startDate\" ? value?.endDate : value?.startDate;\n return s ? parseLocalizedDateString(s, localeCode) : undefined;\n }, [fieldLastInFocus, localeCode, value?.endDate, value?.startDate]);\n\n const hoverHighlightDirection = useMemo<\"left\" | \"right\" | undefined>(() => {\n if (hoverDate && hoverAnchor) {\n if (fieldLastInFocus === \"endDate\") {\n return \"right\";\n }\n if (fieldLastInFocus === \"startDate\") {\n return \"left\";\n }\n }\n return undefined;\n }, [fieldLastInFocus, hoverAnchor, hoverDate]);\n\n const onClickDate = (date: Date) => {\n const isSameMonthAndYear =\n date.getFullYear() === visibleMonth.getFullYear() &&\n date.getMonth() === visibleMonth.getMonth();\n\n if (!isSameMonthAndYear) {\n // User clicked on a date in a different month. Those should not be clickable.\n return;\n }\n\n const callOnValueChange = (\n dateRange: {\n startDate: string | undefined;\n endDate: string | undefined;\n },\n master: \"startDate\" | \"endDate\",\n ) =>\n onValueChange?.(\n resetDateRangeIfInvalid(\n dateRange,\n (s: string) => parseLocalizedDateString(s, localeCode),\n master,\n ),\n );\n\n if (fieldLastInFocus === \"startDate\") {\n callOnValueChange(\n {\n startDate: formatLocalizedDate(date, localeCode),\n endDate: value?.endDate,\n },\n \"startDate\",\n );\n if (value?.endDate) {\n hideCalendar?.();\n setFieldLastInFocus(undefined);\n setHoverDate(undefined);\n } else {\n moveFocusToField(\"endDate\");\n }\n } else if (fieldLastInFocus === \"endDate\") {\n callOnValueChange(\n {\n startDate: value?.startDate,\n endDate: formatLocalizedDate(date, localeCode),\n },\n \"endDate\",\n );\n hideCalendar?.();\n setFieldLastInFocus(undefined);\n setHoverDate(undefined);\n } else if (selectedStartDate && selectedEndDate == null) {\n if (isBefore(date, selectedStartDate)) {\n onValueChange?.({\n startDate: formatLocalizedDate(date, localeCode),\n endDate: undefined,\n });\n moveFocusToField(\"endDate\");\n } else {\n onValueChange?.({\n startDate: value?.startDate,\n endDate: formatLocalizedDate(date, localeCode),\n });\n hideCalendar?.();\n setFieldLastInFocus(undefined);\n setHoverDate(undefined);\n }\n } else {\n callOnValueChange(\n {\n startDate: formatLocalizedDate(date, localeCode),\n endDate: undefined,\n },\n \"startDate\",\n );\n moveFocusToField(\"endDate\");\n }\n };\n\n return {\n onClickDate,\n onValueChangeByInputs,\n isValidDateRange,\n monthPickerButtonRef,\n calendarId,\n monthPickerButtonLabel,\n visiblePanel,\n setVisiblePanel,\n setVisibleMonth,\n visibleMonthData,\n todayIsInVisibleMonth,\n hoverDate,\n setHoverDate,\n hoverAnchor,\n hoverHighlightDirection,\n selectedStartDate,\n selectedEndDate,\n today,\n visibleMonth,\n valueWhenBlurredStartDate,\n valueWhenBlurredEndDate,\n };\n};\n","import * as React from \"react\";\nimport { Ref } from \"react\";\nimport {\n FlatButton,\n SecondaryButton,\n stenaAngleDown,\n stenaAngleUp,\n stenaArrowLeft,\n stenaArrowRight,\n} from \"@stenajs-webui/elements\";\nimport { Row } from \"@stenajs-webui/core\";\nimport { addMonths, subMonths } from \"date-fns\";\nimport { VisiblePanel } from \"../types\";\nimport { TravelCalendarSizeVariant } from \"./TravelCalendar\";\n\nexport interface MonthHeaderProps {\n monthPickerButtonLabel: string;\n nextMonthButtonAriaLabel: string;\n previousMonthButtonAriaLabel: string;\n visiblePanel: VisiblePanel;\n setVisiblePanel: (panel: VisiblePanel) => void;\n monthPickerButtonRef: Ref<HTMLButtonElement>;\n visibleMonth: Date;\n setVisibleMonth: (date: Date) => void;\n prevMonthDisabled?: (visibleMonth: Date) => boolean;\n nextMonthDisabled?: (visibleMonth: Date) => boolean;\n calendarSize: TravelCalendarSizeVariant;\n previousMonthButtonTestId?: string;\n nextMonthButtonTestId?: string;\n}\n\nexport const MonthHeader: React.FC<MonthHeaderProps> = ({\n previousMonthButtonAriaLabel,\n nextMonthButtonAriaLabel,\n monthPickerButtonLabel,\n visiblePanel,\n setVisiblePanel,\n monthPickerButtonRef,\n setVisibleMonth,\n visibleMonth,\n prevMonthDisabled,\n nextMonthDisabled,\n calendarSize,\n previousMonthButtonTestId,\n nextMonthButtonTestId,\n}) => {\n const size =\n calendarSize === \"smaller\" || calendarSize === \"small\" ? \"medium\" : \"large\";\n\n return (\n <Row alignSelf={\"center\"} justifyContent={\"space-between\"} width={\"100%\"}>\n <FlatButton\n aria-live={\"polite\"}\n label={monthPickerButtonLabel}\n rightIcon={visiblePanel === \"calendar\" ? stenaAngleDown : stenaAngleUp}\n onClick={() =>\n setVisiblePanel(\n visiblePanel === \"calendar\" ? \"month-picker\" : \"calendar\",\n )\n }\n ref={monthPickerButtonRef}\n size={size}\n />\n <Row alignItems={\"center\"} gap={2}>\n <SecondaryButton\n leftIcon={stenaArrowLeft}\n onClick={() => setVisibleMonth(subMonths(visibleMonth, 1))}\n disabled={prevMonthDisabled?.(visibleMonth)}\n aria-label={previousMonthButtonAriaLabel}\n size={size}\n data-testid={previousMonthButtonTestId}\n />\n <SecondaryButton\n leftIcon={stenaArrowRight}\n onClick={() => setVisibleMonth(addMonths(visibleMonth, 1))}\n disabled={nextMonthDisabled?.(visibleMonth)}\n aria-label={nextMonthButtonAriaLabel}\n size={size}\n data-testid={nextMonthButtonTestId}\n />\n </Row>\n </Row>\n );\n};\n","import {\n isAfter,\n isBefore,\n isSameDay,\n isWithinInterval,\n max,\n min,\n} from \"date-fns\";\n\nconst rangeBgColor = \"var(--selection-range-background-color)\";\n\ninterface CellBackgroundColors {\n left: string;\n right: string;\n}\n\nexport const getCellBackgroundColors = (\n date: Date,\n selectedStartDate: Date | undefined,\n selectedEndDate: Date | undefined,\n hoverHighlightDirection: \"left\" | \"right\" | undefined,\n hoverDate: Date | undefined,\n hoverAnchor: Date | undefined,\n dayIsInMonth: boolean,\n isValidDateRange: boolean,\n): CellBackgroundColors => {\n if (!dayIsInMonth) {\n return {\n left: \"transparent\",\n right: \"transparent\",\n };\n }\n\n if (selectedStartDate && selectedEndDate && !isValidDateRange) {\n return {\n left: \"transparent\",\n right: \"transparent\",\n };\n }\n\n if (hoverDate && hoverAnchor && hoverHighlightDirection) {\n // User is hovering over calendar, with a range, show highlight instead of selection.\n return getCellBackgroundHoverRangeHighlight(\n date,\n hoverHighlightDirection,\n hoverDate,\n hoverAnchor,\n );\n }\n\n if (hoverDate && !isValidDateRange) {\n // Only hide background when hovering if there's no valid range selected\n return {\n left: \"transparent\",\n right: \"transparent\",\n };\n }\n\n /**\n * Reaching this point with a hover date means the range is valid, and a\n * valid range is drawn from the selection alone. Hover ranges are drawn by\n * getCellBackgroundHoverRangeHighlight above, so no hover date is passed on.\n */\n return getCellBackgroundHighlight(\n date,\n selectedStartDate,\n selectedEndDate,\n undefined,\n );\n};\n\nexport const getCellBackgroundHighlight = (\n date: Date,\n highlightStartDate: Date | undefined,\n highlightEndDate: Date | undefined,\n hoverDate: Date | undefined,\n): CellBackgroundColors => {\n if (\n highlightStartDate &&\n highlightEndDate &&\n isSameDay(highlightStartDate, highlightEndDate)\n ) {\n return {\n left: \"transparent\",\n right: \"transparent\",\n };\n }\n\n const isInHighlightRange =\n highlightStartDate && highlightEndDate\n ? isAfter(date, highlightStartDate) &&\n isBefore(date, highlightEndDate) &&\n !isSameDay(date, highlightStartDate) &&\n !isSameDay(date, highlightEndDate)\n : false;\n\n if (isInHighlightRange) {\n return {\n left: rangeBgColor,\n right: rangeBgColor,\n };\n }\n\n if (highlightStartDate && highlightEndDate) {\n if (isSameDay(date, highlightStartDate)) {\n return {\n left: \"transparent\",\n right: rangeBgColor,\n };\n }\n\n if (isSameDay(date, highlightEndDate)) {\n return {\n left: rangeBgColor,\n right: \"transparent\",\n };\n }\n\n return {\n left: \"transparent\",\n right: \"transparent\",\n };\n }\n\n if (\n highlightStartDate &&\n hoverDate &&\n isAfter(hoverDate, highlightStartDate)\n ) {\n if (isSameDay(date, highlightStartDate)) {\n return {\n left: \"transparent\",\n right: rangeBgColor,\n };\n }\n\n if (isSameDay(date, hoverDate)) {\n return {\n left: rangeBgColor,\n right: \"transparent\",\n };\n }\n }\n\n return {\n left: \"transparent\",\n right: \"transparent\",\n };\n};\n\nexport const getCellBackgroundHoverRangeHighlight = (\n date: Date,\n hoverHighlightDirection: \"left\" | \"right\",\n hoverDate: Date,\n hoverAnchor: Date,\n): CellBackgroundColors => {\n const flipLeftRight = isAfter(hoverDate, hoverAnchor);\n\n const isInHighlightRange = isWithinInterval(date, {\n start: min([hoverDate, hoverAnchor]),\n end: max([hoverDate, hoverAnchor]),\n });\n\n const dateIsHoverDate = isSameDay(date, hoverDate);\n const dateIsHoverAnchor = isSameDay(date, hoverAnchor);\n\n if (hoverHighlightDirection === \"right\" && isBefore(hoverDate, hoverAnchor)) {\n // Hovering with start date as anchor, hover range is invalid.\n return {\n left: \"transparent\",\n right: \"transparent\",\n };\n }\n\n if (hoverHighlightDirection === \"left\" && isAfter(hoverDate, hoverAnchor)) {\n // Hovering with end date as anchor, hover range is invalid.\n return {\n left: \"transparent\",\n right: \"transparent\",\n };\n }\n\n if (dateIsHoverDate && dateIsHoverAnchor) {\n return {\n left: \"transparent\",\n right: \"transparent\",\n };\n }\n\n if (dateIsHoverDate) {\n return flip(flipLeftRight, {\n left: \"transparent\",\n right: rangeBgColor,\n });\n }\n\n if (dateIsHoverAnchor) {\n return flip(flipLeftRight, {\n left: rangeBgColor,\n right: \"transparent\",\n });\n }\n\n if (isInHighlightRange) {\n return {\n left: rangeBgColor,\n right: rangeBgColor,\n };\n }\n\n return {\n left: \"transparent\",\n right: \"transparent\",\n };\n};\n\nconst flip = <T>(\n flip: boolean,\n { left, right }: { left: T; right: T },\n): { left: T; right: T } => {\n if (flip) {\n return {\n left: right,\n right: left,\n };\n } else {\n return { left, right };\n }\n};\n","import { addDays, addMonths, startOfWeek, subDays, subMonths } from \"date-fns\";\n\nexport const getDateToFocusOn = (\n currentDate: Date,\n key: string,\n): Date | undefined => {\n switch (key) {\n case \"PageUp\":\n return subMonths(currentDate, 1);\n case \"PageDown\":\n return addMonths(currentDate, 1);\n case \"Home\":\n return startOfWeek(currentDate);\n case \"End\":\n return addDays(startOfWeek(currentDate), 6);\n case \"ArrowLeft\":\n return subDays(currentDate, 1);\n case \"ArrowUp\":\n return subDays(currentDate, 7);\n case \"ArrowRight\":\n return addDays(currentDate, 1);\n case \"ArrowDown\":\n return addDays(currentDate, 7);\n default:\n return undefined;\n }\n};\n","import { addHours, format } from \"date-fns\";\nimport { DateFormats } from \"../../../util/date/DateFormats\";\n\nexport const createDayId = (date: Date, calendarId: string) => {\n return format(addHours(date, 12), DateFormats.fullDate) + calendarId;\n};\n","import * as React from \"react\";\nimport { Box, Row } from \"@stenajs-webui/core\";\nimport { TravelCalendarSizeVariant } from \"./TravelCalendar\";\nimport styles from \"./TravelDateCellBackground.module.css\";\nimport cx from \"classnames\";\n\nexport interface TravelDateCellBackgroundProps {\n calendarSize: TravelCalendarSizeVariant;\n bgColorLeft: string;\n bgColorRight: string;\n}\n\nexport const TravelDateCellBackground: React.FC<\n TravelDateCellBackgroundProps\n> = ({ calendarSize, bgColorLeft, bgColorRight }) => {\n return (\n <Row>\n <Box\n className={cx(styles.travelDateCellBackground, styles[calendarSize])}\n background={bgColorLeft}\n />\n <Box\n className={cx(styles.travelDateCellBackground, styles[calendarSize])}\n background={bgColorRight}\n />\n </Row>\n );\n};\n","import * as React from \"react\";\nimport { CSSProperties, KeyboardEventHandler, useCallback } from \"react\";\nimport { Text } from \"@stenajs-webui/core\";\nimport { DayData } from \"../../../util/calendar/CalendarDataFactory\";\nimport styles from \"./TravelDateCell.module.css\";\nimport cx from \"classnames\";\nimport { isAfter, isSameDay, isSameMonth } from \"date-fns\";\nimport { getCellBackgroundColors } from \"../util/CellBgColors\";\nimport { getDateToFocusOn } from \"../util/KeyboardNavigation\";\nimport { createDayId } from \"../util/DayIdGenerator\";\nimport { cssColor } from \"@stenajs-webui/theme\";\nimport { TravelCalendarSizeVariant } from \"./TravelCalendar\";\nimport { TravelDateCellBackground } from \"./TravelDateCellBackground\";\nimport { RenderTravelDateContent, TravelDateContentContext } from \"../types\";\n\nexport interface TravelDateCellProps {\n onClick: (date: Date) => void;\n day: DayData;\n visibleMonth: Date;\n selectedStartDate: Date | undefined;\n selectedEndDate: Date | undefined;\n isValidDateRange: boolean;\n onChangeVisibleMonth: (visibleMonth: Date) => void;\n /** Focuses the date once its month is shown, which the app decides. */\n focusDateWhenShown: (date: Date) => void;\n onStartHover: (date: Date) => void;\n onEndHover: (date: Date) => void;\n /** Current date that the mouse is hovering over. */\n hoverDate: Date | undefined;\n /** The other date to show range highlight between, when user hovers the mouse. */\n hoverAnchor: Date | undefined;\n today: Date;\n /** The one date in the grid that carries the tab stop, if any. */\n focusableDate: Date | undefined;\n calendarId: string;\n isDateDisabled?: (date: Date) => boolean;\n dateTestId?: (date: Date) => string | undefined;\n size: TravelCalendarSizeVariant;\n /**\n * If \"left\", only hovering on earlier dates will create a highlight. If undefined, no range will be highlighted.\n */\n hoverHighlightDirection: \"left\" | \"right\" | undefined;\n renderDateContent?: RenderTravelDateContent;\n}\n\nexport const TravelDateCell: React.FC<TravelDateCellProps> = ({\n onClick,\n visibleMonth,\n onChangeVisibleMonth,\n focusDateWhenShown,\n day,\n isValidDateRange,\n selectedStartDate,\n selectedEndDate,\n onStartHover,\n onEndHover,\n hoverDate,\n hoverAnchor,\n today,\n focusableDate,\n calendarId,\n isDateDisabled,\n size,\n dateTestId,\n hoverHighlightDirection,\n renderDateContent,\n}) => {\n const onKeyDown = useCallback<KeyboardEventHandler<HTMLTableDataCellElement>>(\n async (e) => {\n const nextDate = getDateToFocusOn(day.date, e.key);\n const nextDateDisabled =\n (nextDate && isDateDisabled?.(nextDate)) ?? false;\n\n if (nextDate && !nextDateDisabled) {\n onStartHover(nextDate);\n /*\n * Compared with the visible month, not with this cell's own date. The\n * days of the adjacent months that fill out the grid can hold the\n * focus too, and a move from one of them back into the visible month\n * needs no other month: the date is already there.\n */\n if (isSameMonth(nextDate, visibleMonth)) {\n document.getElementById(createDayId(nextDate, calendarId))?.focus();\n } else {\n focusDateWhenShown(nextDate);\n onChangeVisibleMonth(nextDate);\n }\n }\n\n if (e.key === \"Enter\" || e.code === \"Space\") {\n onClick(day.date);\n }\n },\n [\n calendarId,\n day.date,\n focusDateWhenShown,\n isDateDisabled,\n onChangeVisibleMonth,\n onClick,\n onStartHover,\n visibleMonth,\n ],\n );\n\n const dayIsInMonth = day.month === visibleMonth.getMonth();\n\n const disabled = isDateDisabled?.(day.date) ?? false;\n\n const hoverRightOfAnchor =\n hoverDate && hoverAnchor ? isAfter(hoverDate, hoverAnchor) : false;\n\n /**\n * A hover range is only drawn while a range is being edited, which is what\n * hoverHighlightDirection means. The selection is rendered whenever it is\n * not, so that hovering the calendar does not blank out the selected dates.\n */\n const isShowingHoverRange = Boolean(\n hoverDate && hoverAnchor && hoverHighlightDirection,\n );\n\n const isHoverRangeStart =\n hoverDate && hoverAnchor && hoverHighlightDirection\n ? isSameDay(hoverRightOfAnchor ? hoverAnchor : hoverDate, day.date)\n : false;\n\n const isHoverRangeEnd =\n hoverDate && hoverAnchor && hoverHighlightDirection\n ? isSameDay(hoverRightOfAnchor ? hoverDate : hoverAnchor, day.date)\n : false;\n\n const isSelectionStart =\n selectedStartDate && !isShowingHoverRange\n ? isSameDay(selectedStartDate, day.date)\n : false;\n\n const isSelectionEnd =\n selectedEndDate && !isShowingHoverRange\n ? isSameDay(selectedEndDate, day.date)\n : false;\n\n const isToday = isSameDay(day.date, today);\n\n const bgColors = getCellBackgroundColors(\n day.date,\n selectedStartDate,\n selectedEndDate,\n hoverHighlightDirection,\n hoverDate,\n hoverAnchor,\n dayIsInMonth,\n isValidDateRange,\n );\n\n const isHovered = hoverDate ? isSameDay(hoverDate, day.date) : false;\n\n const isDrawnAsSelectionStart = isSelectionStart || isHoverRangeStart;\n const isDrawnAsSelectionEnd = isSelectionEnd || isHoverRangeEnd;\n\n /**\n * Both halves of the band are filled only between the ends of the range as\n * it is drawn, so this follows a hovered range the same way the band does.\n */\n const isInRange =\n bgColors.left !== \"transparent\" && bgColors.right !== \"transparent\";\n\n const defaultContent = (\n <Text variant={\"bold\"} color={\"var(--travel-calendar-date-content-color)\"}>\n {day.dayOfMonth}\n </Text>\n );\n\n const defaultTodayMarker = isToday ? (\n <div className={styles.todayDot} />\n ) : null;\n\n /**\n * Only the days of the visible month have content. The render function is\n * not called for the others at all, rather than called and thrown away,\n * since it runs for every cell on every hover.\n */\n const content = !dayIsInMonth ? null : renderDateContent ? (\n renderDateContent({\n date: day.date,\n dayOfMonth: day.dayOfMonth,\n size,\n isToday,\n isDisabled: disabled,\n isSelectionStart: isDrawnAsSelectionStart,\n isSelectionEnd: isDrawnAsSelectionEnd,\n isInRange,\n isHovered,\n defaultContent,\n defaultTodayMarker,\n } satisfies TravelDateContentContext)\n ) : (\n <>\n {defaultContent}\n {defaultTodayMarker && (\n <div className={styles.defaultTodayMarkerPosition}>\n {defaultTodayMarker}\n </div>\n )}\n </>\n );\n\n /**\n * The cursor belongs on the cell, since the cell is the whole hit area. The\n * content inside it does not cover the gap that the cell keeps between the\n * rows, and the days of the adjacent months are not interactive at all.\n */\n const cursorClassName = !dayIsInMonth\n ? undefined\n : disabled\n ? styles.disabled\n : styles.clickable;\n\n return (\n <td\n className={cx(styles.travelDateCell, styles[size], cursorClassName)}\n onClick={disabled ? undefined : () => dayIsInMonth && onClick(day.date)}\n onMouseOver={\n disabled ? undefined : () => dayIsInMonth && onStartHover(day.date)\n }\n onMouseOut={\n disabled ? undefined : () => dayIsInMonth && onEndHover(day.date)\n }\n tabIndex={\n disabled\n ? undefined\n : focusableDate && isSameDay(day.date, focusableDate)\n ? 0\n : -1\n }\n id={disabled ? undefined : createDayId(day.date, calendarId)}\n onKeyDown={disabled ? undefined : onKeyDown}\n {...(disabled\n ? undefined\n : { \"aria-selected\": isSelectionStart || isSelectionEnd })}\n aria-current={isToday && dayIsInMonth ? \"date\" : undefined}\n data-testid={dateTestId?.(day.date)}\n >\n <div className={styles.outline} />\n\n <TravelDateCellBackground\n calendarSize={size}\n bgColorLeft={bgColors.left}\n bgColorRight={bgColors.right}\n />\n\n {dayIsInMonth && (\n <div\n className={cx(\n styles.contentWrapper,\n selectedStartDate ? styles.startSelected : undefined,\n selectedEndDate ? styles.endSelected : undefined,\n isHovered ? styles.hover : undefined,\n isDrawnAsSelectionStart && styles.isSelectionStart,\n isDrawnAsSelectionEnd && styles.isSelectionEnd,\n )}\n style={disabled ? disabledContentStyle : undefined}\n >\n {content}\n </div>\n )}\n </td>\n );\n};\n\n/**\n * Set on the element rather than in the stylesheet, so that it wins over the\n * colour of any state, the same way the day number's own colour used to. A\n * disabled date that is still the selected one keeps its grey number on the\n * filled background.\n */\nconst disabledContentStyle = {\n \"--travel-calendar-date-content-color\": cssColor(\"--lhds-color-ui-500\"),\n} as CSSProperties;\n","import * as React from \"react\";\nimport {\n Dispatch,\n SetStateAction,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n} from \"react\";\nimport {\n DayData,\n MonthData,\n WeekData,\n} from \"../../../util/calendar/CalendarDataFactory\";\nimport { Text } from \"@stenajs-webui/core\";\nimport { TravelDateCell } from \"./TravelDateCell\";\nimport { isSameDay, isSameMonth } from \"date-fns\";\nimport styles from \"./TravelCalendar.module.css\";\nimport { RenderTravelDateContent } from \"../types\";\nimport { createDayId } from \"../util/DayIdGenerator\";\n\nexport type TravelCalendarSizeVariant =\n | \"smaller\"\n | \"small\"\n | \"medium\"\n | \"large\";\n\nexport interface TravelCalendarProps {\n visibleMonthData: MonthData;\n onClickDate: (date: Date) => void;\n visibleMonth: Date;\n setVisibleMonth: (visibleMonth: Date) => void;\n isValidDateRange: boolean;\n setHoverDate: Dispatch<SetStateAction<Date | undefined>>;\n selectedStartDate: Date | undefined;\n selectedEndDate: Date | undefined;\n /** The date that the mouse is hovering over. */\n hoverDate: Date | undefined;\n /**\n * The other date to show range highlight between, when the user hovers the mouse.\n * If not set, only hovered date will be highlighted, not range.\n * */\n hoverAnchor: Date | undefined;\n today: Date;\n isDateDisabled?: (date: Date) => boolean;\n /**\n * Renders the content of each date in the calendar, in place of the day\n * number. The cell around it, with the selection, focus and keyboard\n * navigation, stays the calendar's. See RenderTravelDateContent.\n */\n renderDateContent?: RenderTravelDateContent;\n dateTestId?: (date: Date) => string | undefined;\n calendarId: string;\n size?: TravelCalendarSizeVariant;\n multiSelectable: boolean;\n /**\n * If \"left\", only hovering on earlier dates will create a highlight. If undefined, no range will be highlighted.\n */\n hoverHighlightDirection: \"left\" | \"right\" | undefined;\n /**\n * Accessible name of the calendar grid. Set this when there is no visible\n * label next to the calendar, such as a text input or a heading.\n */\n ariaLabel?: string;\n}\n\nexport const TravelCalendar: React.FC<TravelCalendarProps> = ({\n visibleMonthData,\n onClickDate,\n setHoverDate,\n setVisibleMonth,\n visibleMonth,\n isValidDateRange,\n selectedStartDate,\n selectedEndDate,\n hoverDate,\n hoverAnchor,\n today,\n calendarId,\n isDateDisabled,\n renderDateContent,\n size = \"medium\",\n multiSelectable,\n dateTestId,\n hoverHighlightDirection,\n ariaLabel,\n}) => {\n /**\n * A date the arrow keys moved to in another month, waiting for that month to\n * be shown so that it can take the focus.\n *\n * The app owns the visible month, so the date only exists once the app has\n * passed the new month back, which may not be right away: it may wait for\n * data, or keep the month in the URL. So the focus waits for the month to\n * change, rather than for a fixed time.\n *\n * If the month changes to another one instead, the request is dropped, so a\n * later visit to its month does not take the focus by surprise. Nor does it\n * take the focus from anywhere else: if the user has moved on, to the month\n * buttons for example, by the time the month is shown, the focus stays\n * there. It only moves while it is still in the grid, or was lost when its\n * cell went away with the old month.\n */\n const pendingFocusDate = useRef<Date | undefined>(undefined);\n const gridRef = useRef<HTMLTableElement>(null);\n\n const focusDateWhenShown = useCallback((date: Date) => {\n pendingFocusDate.current = date;\n }, []);\n\n useEffect(() => {\n const date = pendingFocusDate.current;\n if (!date) {\n return;\n }\n pendingFocusDate.current = undefined;\n if (!isSameMonth(date, visibleMonth)) {\n return;\n }\n const focused = document.activeElement;\n const focusIsFree =\n focused == null ||\n focused === document.body ||\n Boolean(gridRef.current?.contains(focused));\n if (focusIsFree) {\n document.getElementById(createDayId(date, calendarId))?.focus();\n }\n }, [visibleMonth, calendarId]);\n\n /**\n * One cell in the grid carries the tab stop: the selected date, or today, or\n * the first day of the visible month, whichever of those comes first among\n * the days that are not disabled. A disabled day cannot be focused, so it\n * never takes the stop, and a month of nothing but disabled days has none.\n *\n * This is decided here, where the whole month is known. A cell on its own\n * cannot tell whether some other cell has a better claim.\n */\n const focusableDate = useMemo(() => {\n const daysInVisibleMonth = visibleMonthData.weeks\n .flatMap((week) => week.days)\n .filter((day) => day.month === visibleMonth.getMonth())\n .map((day) => day.date);\n\n const candidates = [selectedStartDate, today, ...daysInVisibleMonth].filter(\n (date): date is Date =>\n date != null &&\n isSameMonth(date, visibleMonth) &&\n !isDateDisabled?.(date),\n );\n\n return candidates[0];\n }, [\n isDateDisabled,\n selectedStartDate,\n today,\n visibleMonth,\n visibleMonthData.weeks,\n ]);\n\n return (\n <table\n ref={gridRef}\n className={styles.travelCalendar}\n role=\"grid\"\n aria-label={ariaLabel}\n {...(multiSelectable ? { \"aria-multiselectable\": true } : undefined)}\n >\n <tbody>\n <tr>\n {visibleMonthData.weeks[0].days.map((day: DayData) => (\n <th key={day.name} abbr={day.fullName}>\n <Text>{day.name}</Text>\n </th>\n ))}\n </tr>\n {visibleMonthData.weeks.map((week: WeekData) => (\n <React.Fragment key={week.weekNumber}>\n <tr key={week.weekNumber}>\n {week.days.map((day) => (\n <TravelDateCell\n size={size}\n onClick={(d) => onClickDate(d)}\n key={day.dateString}\n visibleMonth={visibleMonth}\n onChangeVisibleMonth={setVisibleMonth}\n focusDateWhenShown={focusDateWhenShown}\n isValidDateRange={isValidDateRange}\n day={day}\n onStartHover={(d) => setHoverDate(d)}\n onEndHover={(d) =>\n setHoverDate((p) => (p && isSameDay(p, d) ? undefined : p))\n }\n selectedStartDate={selectedStartDate}\n selectedEndDate={selectedEndDate}\n hoverDate={hoverDate}\n hoverAnchor={hoverAnchor}\n today={today}\n focusableDate={focusableDate}\n calendarId={calendarId}\n isDateDisabled={isDateDisabled}\n renderDateContent={renderDateContent}\n dateTestId={dateTestId}\n hoverHighlightDirection={hoverHighlightDirection}\n />\n ))}\n </tr>\n </React.Fragment>\n ))}\n </tbody>\n </table>\n );\n};\n","import * as React from \"react\";\nimport {\n KeyboardEventHandler,\n ReactNode,\n useCallback,\n useLayoutEffect,\n useRef,\n useState,\n} from \"react\";\nimport {\n Box,\n Heading,\n HeadingVariant,\n useOnClickOutside,\n} from \"@stenajs-webui/core\";\nimport { ValueAndOnValueChangeProps } from \"@stenajs-webui/forms\";\nimport {\n TravelDateRangeTextInputField,\n TravelDateRangeTextInputFields,\n} from \"../../../features/travel-calendar/components/TravelDateRangeTextInputFields\";\nimport { CardBody } from \"@stenajs-webui/elements\";\nimport { MonthPicker } from \"../../../features/month-picker/MonthPicker\";\nimport { useTravelDateRangeInput } from \"../../../features/travel-calendar/hooks/UseTravelDateRangeInput\";\nimport { MonthHeader } from \"../../../features/travel-calendar/components/MonthHeader\";\nimport {\n TravelCalendar,\n TravelCalendarSizeVariant,\n} from \"../../../features/travel-calendar/components/TravelCalendar\";\nimport {\n DateTextInputVariant,\n TravelDateRangeInputValue,\n RenderTravelDateContent,\n} from \"../../../features/travel-calendar/types\";\nimport styles from \"./TravelDateRangeInput.module.css\";\nimport cx from \"classnames\";\nimport { SupportedLocaleCode } from \"../../../features/localize-date-format/LocaleMapper\";\nimport { VisibleMonthState } from \"../../../features/travel-calendar/hooks/UseVisibleMonthState\";\n\nexport interface RenderBelowCalendarArgs {\n hideCalendar: () => void;\n}\n\nexport interface TravelDateRangeInputProps\n extends\n ValueAndOnValueChangeProps<TravelDateRangeInputValue>,\n VisibleMonthState {\n localeCode?: SupportedLocaleCode;\n languageLocaleCode?: SupportedLocaleCode;\n startDateLabel?: string;\n endDateLabel?: string;\n previousMonthButtonAriaLabel?: string;\n nextMonthButtonAriaLabel?: string;\n heading?: string;\n headingLevel?: HeadingVariant;\n firstMonthInMonthPicker?: Date;\n numMonthsInMonthPicker?: number;\n isDateDisabled?: (date: Date) => boolean;\n /**\n * Renders the content of each date in the calendar, in place of the day\n * number. The cell around it, with the selection, focus and keyboard\n * navigation, stays the calendar's. See RenderTravelDateContent.\n */\n renderDateContent?: RenderTravelDateContent;\n prevMonthDisabled?: (visibleMonth: Date) => boolean;\n nextMonthDisabled?: (visibleMonth: Date) => boolean;\n zIndex?: number;\n zIndexWhenClosed?: number;\n onHideCalendar?: () => void;\n renderBelowCalendar?: (args: RenderBelowCalendarArgs) => ReactNode;\n size?: TravelCalendarSizeVariant;\n dateTestId?: (date: Date) => string | undefined;\n previousMonthButtonTestId?: string;\n nextMonthButtonTestId?: string;\n placeholderWhenBlurredStartDate?: string;\n placeholderWhenBlurredEndDate?: string;\n textInputVariant?: DateTextInputVariant;\n autoFocusStartDate?: boolean;\n autoFocusEndDate?: boolean;\n}\n\nexport const TravelDateRangeInput: React.FC<TravelDateRangeInputProps> = ({\n value,\n onValueChange,\n startDateLabel,\n endDateLabel,\n localeCode = \"sv\",\n languageLocaleCode = localeCode,\n visibleMonth: visibleMonthValue,\n previousMonthButtonAriaLabel = \"Previous month\",\n nextMonthButtonAriaLabel = \"Next month\",\n placeholderWhenBlurredStartDate,\n placeholderWhenBlurredEndDate,\n heading,\n headingLevel,\n numMonthsInMonthPicker = 12,\n isDateDisabled,\n renderDateContent,\n onVisibleMonthChange,\n prevMonthDisabled,\n nextMonthDisabled,\n firstMonthInMonthPicker = new Date(),\n zIndex = 1000,\n zIndexWhenClosed,\n onHideCalendar,\n renderBelowCalendar,\n size = \"medium\",\n dateTestId,\n previousMonthButtonTestId,\n nextMonthButtonTestId,\n textInputVariant = \"standard\",\n autoFocusStartDate,\n autoFocusEndDate,\n}) => {\n const [calendarOpen, setCalendarOpen] = useState(false);\n const [calendarInDom, setCalendarInDom] = useState(false);\n const [boxSize, setBoxSize] = useState<{ height: number; width: number }>({\n // Sane defaults, this will be updated with actual data from DOM.\n width: 336,\n height: 66,\n });\n\n const [fieldLastInFocus, setFieldLastInFocus] = useState<\n \"startDate\" | \"endDate\" | undefined\n >(undefined);\n\n const startDateRef = useRef<HTMLInputElement>(null);\n const endDateRef = useRef<HTMLInputElement>(null);\n\n const moveFocusToField = (field: \"startDate\" | \"endDate\") => {\n if (field === \"startDate\") {\n startDateRef.current?.focus();\n } else if (field === \"endDate\") {\n endDateRef.current?.focus();\n }\n };\n\n const inputFieldsHeight = size === \"large\" ? \"8.8rem\" : \"6.6rem\";\n\n const calendarOpenRef = useRef(false);\n\n const onInputFocus = useCallback((field: TravelDateRangeTextInputField) => {\n setFieldLastInFocus(field);\n calendarOpenRef.current = true;\n setCalendarInDom(true);\n setTimeout(() => {\n setCalendarOpen(true);\n }, 10);\n }, []);\n\n const hideCalendar = useCallback(() => {\n if (!calendarInDom) {\n return;\n }\n\n setCalendarOpen(false);\n calendarOpenRef.current = false;\n onHideCalendar?.();\n\n setTimeout(() => {\n if (!calendarOpenRef.current) {\n setCalendarInDom(false);\n }\n }, 120);\n }, [calendarInDom, onHideCalendar]);\n\n const ref = useRef<HTMLDivElement>(null);\n const sizeSourceRef = useRef<HTMLDivElement>(null);\n\n useOnClickOutside(ref, hideCalendar);\n\n useLayoutEffect(() => {\n const width = sizeSourceRef.current?.offsetWidth;\n const height = sizeSourceRef.current?.offsetHeight;\n if (width != null && height != null) {\n if (boxSize.height !== height || boxSize.width !== width) {\n setBoxSize({ width, height });\n }\n }\n }, [boxSize.height, boxSize.width]);\n\n const inputProps = useTravelDateRangeInput(\n value,\n onValueChange,\n localeCode,\n languageLocaleCode,\n visibleMonthValue,\n onVisibleMonthChange,\n fieldLastInFocus,\n setFieldLastInFocus,\n moveFocusToField,\n hideCalendar,\n );\n\n const {\n visiblePanel,\n visibleMonth,\n onValueChangeByInputs,\n setVisibleMonth,\n setVisiblePanel,\n monthPickerButtonRef,\n } = inputProps;\n\n const onKeyDown = useCallback<KeyboardEventHandler<HTMLDivElement>>(\n (ev) => {\n if (ev.key === \"Escape\") {\n hideCalendar();\n }\n },\n [hideCalendar],\n );\n\n return (\n <Box\n position={\"relative\"}\n className={styles.travelDateRangeInput}\n ref={ref}\n onKeyDown={onKeyDown}\n height={boxSize.height}\n width={boxSize.width}\n >\n <Box\n position={\"absolute\"}\n ref={sizeSourceRef}\n zIndex={calendarInDom ? zIndex : zIndexWhenClosed}\n >\n <TravelDateRangeTextInputFields\n {...inputProps}\n value={value}\n onValueChange={onValueChangeByInputs}\n startDateRef={startDateRef}\n endDateRef={endDateRef}\n localeCode={localeCode}\n startDateLabel={startDateLabel}\n endDateLabel={endDateLabel}\n onFocus={onInputFocus}\n calendarSize={size}\n placeholderWhenBlurredStartDate={placeholderWhenBlurredStartDate}\n placeholderWhenBlurredEndDate={placeholderWhenBlurredEndDate}\n variant={textInputVariant}\n autoFocusStartDate={autoFocusStartDate}\n autoFocusEndDate={autoFocusEndDate}\n /*\n When focusing on the input, the calendar popover appears.\n But the keyboard appears as well and covers the calendar.\n\n readOnly disables input and hides the keyboard on mobile.\n This enables the user to click on input to select it, then click in the calendar.\n\n This is not needed for TravelDate*Calendar, since the calendar is always visible.\n */\n readOnlyOnMobile={true}\n />\n </Box>\n\n {calendarInDom && (\n <Box\n position={\"absolute\"}\n zIndex={zIndex - 1}\n left={\"-2.4rem\"}\n top={heading ? \"-8.0rem\" : \"-2.4rem\"}\n className={cx(styles.overlay, calendarOpen && styles.calendarVisible)}\n >\n <Box\n background={\"white\"}\n shadow={\"popover\"}\n borderRadius={\"var(--swui-border-radius-large)\"}\n >\n <CardBody gap={3}>\n {heading && (\n <Heading variant={\"h2\"} as={headingLevel}>\n {heading}\n </Heading>\n )}\n\n <Box height={inputFieldsHeight} />\n\n <MonthHeader\n {...inputProps}\n previousMonthButtonAriaLabel={previousMonthButtonAriaLabel}\n nextMonthButtonAriaLabel={nextMonthButtonAriaLabel}\n calendarSize={size}\n prevMonthDisabled={prevMonthDisabled}\n nextMonthDisabled={nextMonthDisabled}\n previousMonthButtonTestId={previousMonthButtonTestId}\n nextMonthButtonTestId={nextMonthButtonTestId}\n />\n\n {visiblePanel === \"calendar\" && (\n <TravelCalendar\n {...inputProps}\n size={size}\n multiSelectable={true}\n isDateDisabled={isDateDisabled}\n renderDateContent={renderDateContent}\n dateTestId={dateTestId}\n />\n )}\n\n {visiblePanel === \"month-picker\" && (\n <MonthPicker\n firstMonth={firstMonthInMonthPicker}\n numMonths={numMonthsInMonthPicker}\n value={visibleMonth}\n size={size}\n localeCode={languageLocaleCode}\n onValueChange={(v) => {\n setVisibleMonth(v);\n setVisiblePanel(\"calendar\");\n monthPickerButtonRef.current?.focus();\n }}\n onCancel={() => {\n setVisiblePanel(\"calendar\");\n monthPickerButtonRef.current?.focus();\n }}\n />\n )}\n {renderBelowCalendar?.({ hideCalendar })}\n </CardBody>\n </Box>\n </Box>\n )}\n </Box>\n );\n};\n","import * as React from \"react\";\nimport { useMemo } from \"react\";\nimport { Row } from \"@stenajs-webui/core\";\nimport { TravelDateTextInput } from \"./TravelDateTextInput\";\nimport { createInputMaskForDateFormat } from \"../../localize-date-format/InputMaskProvider\";\nimport { getDateFormatForLocaleCode } from \"../../localize-date-format/DateFormatProvider\";\nimport { reformatLocalizedDateString } from \"../../localize-date-format/LocalizedDateReformatter\";\nimport { TravelCalendarSizeVariant } from \"./TravelCalendar\";\nimport { DateTextInputVariant } from \"../types\";\nimport { SupportedLocaleCode } from \"../../localize-date-format/LocaleMapper\";\nimport { isDeviceSameOrLarger, useDeviceSize } from \"@stenajs-webui/panels\";\n\nexport interface TravelDateTextInputFieldProps {\n value: string | undefined;\n onValueChange: ((value: string) => void) | undefined;\n localeCode: SupportedLocaleCode;\n label?: string;\n onFocus?: () => void;\n autoFocus?: boolean;\n calendarSize: TravelCalendarSizeVariant;\n placeholderWhenBlurred: string | undefined;\n valueWhenBlurred: string | undefined;\n variant: DateTextInputVariant;\n readOnlyOnMobile: boolean;\n}\n\nexport const TravelDateTextInputField: React.FC<\n TravelDateTextInputFieldProps\n> = ({\n value,\n onValueChange,\n label = \"Date\",\n localeCode,\n autoFocus,\n onFocus,\n calendarSize,\n placeholderWhenBlurred,\n valueWhenBlurred,\n variant,\n readOnlyOnMobile,\n}) => {\n const { deviceSize } = useDeviceSize();\n\n const readOnly =\n readOnlyOnMobile && !isDeviceSameOrLarger(deviceSize, \"tablet\");\n\n const { mask, placeholder } = useMemo(() => {\n const dateFormatForLocaleCode = getDateFormatForLocaleCode(localeCode);\n return {\n mask: createInputMaskForDateFormat(dateFormatForLocaleCode),\n placeholder: dateFormatForLocaleCode.toLowerCase(),\n };\n }, [localeCode]);\n\n return (\n <Row>\n <TravelDateTextInput\n mask={mask}\n value={value}\n onValueChange={onValueChange}\n onBlur={(ev) => {\n const date = reformatLocalizedDateString(ev.target.value, localeCode);\n if (date && date !== value) {\n onValueChange?.(date);\n }\n }}\n readOnly={readOnly}\n onFocus={onFocus}\n autoFocus={autoFocus}\n label={label}\n placeholder={placeholder}\n calendarSize={calendarSize}\n placeholderWhenBlurred={placeholderWhenBlurred}\n valueWhenBlurred={valueWhenBlurred}\n variant={variant}\n />\n </Row>\n );\n};\n","import {\n getLocaleForLocaleCode,\n SupportedLocaleCode,\n} from \"../../localize-date-format/LocaleMapper\";\nimport {\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { useToday } from \"@stenajs-webui/core\";\nimport { useControlledVisibleMonth } from \"./UseControlledVisibleMonth\";\nimport { getDateFormatForLocaleCode } from \"../../localize-date-format/DateFormatProvider\";\nimport { parseLocalizedDateString } from \"../../localize-date-format/LocalizedDateParser\";\nimport { intlFormat, isSameMonth } from \"date-fns\";\nimport { getMonthInYear } from \"../../../util/calendar/CalendarDataFactory\";\nimport { formatLocalizedDate } from \"../../localize-date-format/LocalizedDateFormatter\";\nimport { VisiblePanel } from \"../types\";\nimport { formatDateDescription } from \"../util/DateDescriptionFormatter\";\nimport { convertFirstCharToUpper } from \"../../../util/caseFormat/CaseFormat\";\n\nexport const useTravelDateInput = (\n value: string | undefined,\n onValueChange: ((value: string) => void) | undefined,\n localeCode: SupportedLocaleCode,\n languageLocaleCode: SupportedLocaleCode,\n visibleMonthValue: Date,\n onVisibleMonthChange: (visibleMonth: Date) => void,\n onClickDate?: (date: Date) => void,\n) => {\n const languageLocale = getLocaleForLocaleCode(languageLocaleCode);\n\n const calendarId = useId();\n const today = useToday();\n\n const monthPickerButtonRef = useRef<HTMLButtonElement>(null);\n\n const dateFormat = useMemo(\n () => getDateFormatForLocaleCode(localeCode),\n [localeCode],\n );\n\n const selectedDate = useMemo(\n () =>\n value?.length === dateFormat.length\n ? parseLocalizedDateString(value, localeCode)\n : undefined,\n [dateFormat.length, localeCode, value],\n );\n\n const valueWhenBlurred = useMemo(\n () =>\n selectedDate != null\n ? formatDateDescription(selectedDate, today, languageLocale)\n : undefined,\n [languageLocale, selectedDate, today],\n );\n\n const { visibleMonth, setVisibleMonth, setVisibleMonthClamped } =\n useControlledVisibleMonth(visibleMonthValue, onVisibleMonthChange, today);\n\n /**\n * When the value is changed from the outside, the visible month follows the\n * new date, so that a date which is entered somewhere else is not left off\n * screen. Calendars that have a text input of their own already do this via\n * onValueChangeByInputs, but a calendar without one has no other way in.\n *\n * The month is only moved when the selected date actually changes, so\n * browsing months is not interrupted, and it is not moved on mount, which\n * leaves the month the app passed as visibleMonth alone.\n */\n const lastSyncedSelectedTime = useRef(selectedDate?.getTime());\n useEffect(() => {\n if (!selectedDate) {\n return;\n }\n const selectedTime = selectedDate.getTime();\n if (selectedTime === lastSyncedSelectedTime.current) {\n return;\n }\n lastSyncedSelectedTime.current = selectedTime;\n setVisibleMonthClamped(selectedDate);\n }, [selectedDate, setVisibleMonthClamped]);\n\n const visibleMonthData = useMemo(\n () =>\n getMonthInYear(\n visibleMonth.getFullYear(),\n visibleMonth.getMonth(),\n languageLocale,\n ),\n [languageLocale, visibleMonth],\n );\n\n const monthPickerButtonLabel = useMemo(() => {\n return convertFirstCharToUpper(\n intlFormat(\n visibleMonth,\n { month: \"long\", year: \"numeric\" },\n { locale: languageLocale.code },\n ),\n );\n }, [languageLocale, visibleMonth]);\n\n const todayIsInVisibleMonth = useMemo(() => {\n return isSameMonth(today, visibleMonth);\n }, [today, visibleMonth]);\n\n const [hoverDate, setHoverDate] = useState<Date | undefined>();\n\n const [visiblePanel, setVisiblePanel] = useState<VisiblePanel>(\"calendar\");\n\n const onValueChangeByInputs = useCallback<(value: string) => void>(\n (v) => {\n const startDate =\n v?.length === dateFormat.length\n ? parseLocalizedDateString(v, localeCode)\n : undefined;\n\n if (startDate) {\n /*\n * The month is asked for here, as the date is typed. Recorded as\n * followed, so that the effect above does not ask again when the\n * value comes back with this date.\n */\n lastSyncedSelectedTime.current = startDate.getTime();\n setVisibleMonthClamped(startDate);\n }\n\n onValueChange?.(v);\n },\n [dateFormat.length, localeCode, onValueChange, setVisibleMonthClamped],\n );\n\n const onClickDate_ = (date: Date) => {\n onValueChange?.(formatLocalizedDate(date, localeCode));\n onClickDate?.(date);\n };\n\n return {\n onClickDate: onClickDate_,\n onValueChangeByInputs,\n monthPickerButtonRef,\n calendarId,\n monthPickerButtonLabel,\n visiblePanel,\n setVisiblePanel,\n setVisibleMonth,\n visibleMonthData,\n todayIsInVisibleMonth,\n hoverDate,\n hoverAnchor: undefined,\n setHoverDate,\n selectedDate,\n today,\n visibleMonth,\n valueWhenBlurred,\n };\n};\n","import * as React from \"react\";\nimport {\n KeyboardEventHandler,\n ReactNode,\n useCallback,\n useLayoutEffect,\n useRef,\n useState,\n} from \"react\";\nimport {\n Box,\n Heading,\n HeadingVariant,\n useOnClickOutside,\n} from \"@stenajs-webui/core\";\nimport { ValueAndOnValueChangeProps } from \"@stenajs-webui/forms\";\nimport { CardBody } from \"@stenajs-webui/elements\";\nimport { MonthPicker } from \"../../../features/month-picker/MonthPicker\";\nimport { MonthHeader } from \"../../../features/travel-calendar/components/MonthHeader\";\nimport {\n TravelCalendar,\n TravelCalendarSizeVariant,\n} from \"../../../features/travel-calendar/components/TravelCalendar\";\nimport styles from \"./TravelDateInput.module.css\";\nimport cx from \"classnames\";\nimport { TravelDateTextInputField } from \"../../../features/travel-calendar/components/TravelDateTextInputField\";\nimport { useTravelDateInput } from \"../../../features/travel-calendar/hooks/UseTravelDateInput\";\nimport {\n DateTextInputVariant,\n RenderTravelDateContent,\n} from \"../../../features/travel-calendar/types\";\nimport { SupportedLocaleCode } from \"../../../features/localize-date-format/LocaleMapper\";\nimport { VisibleMonthState } from \"../../../features/travel-calendar/hooks/UseVisibleMonthState\";\n\nexport interface RenderBelowSingleDateCalendarArgs {\n hideCalendar: () => void;\n}\n\nexport interface TravelDateInputProps\n extends ValueAndOnValueChangeProps<string>, VisibleMonthState {\n localeCode?: SupportedLocaleCode;\n languageLocaleCode?: SupportedLocaleCode;\n label?: string;\n previousMonthButtonAriaLabel?: string;\n nextMonthButtonAriaLabel?: string;\n heading?: string;\n headingLevel?: HeadingVariant;\n firstMonthInMonthPicker?: Date;\n numMonthsInMonthPicker?: number;\n isDateDisabled?: (date: Date) => boolean;\n /**\n * Renders the content of each date in the calendar, in place of the day\n * number. The cell around it, with the selection, focus and keyboard\n * navigation, stays the calendar's. See RenderTravelDateContent.\n */\n renderDateContent?: RenderTravelDateContent;\n prevMonthDisabled?: (visibleMonth: Date) => boolean;\n nextMonthDisabled?: (visibleMonth: Date) => boolean;\n zIndex?: number;\n zIndexWhenClosed?: number;\n onHideCalendar?: () => void;\n renderBelowCalendar?: (args: RenderBelowSingleDateCalendarArgs) => ReactNode;\n size?: TravelCalendarSizeVariant;\n dateTestId?: (date: Date) => string | undefined;\n previousMonthButtonTestId?: string;\n nextMonthButtonTestId?: string;\n placeholderWhenBlurred?: string;\n textInputVariant?: DateTextInputVariant;\n autoFocus?: boolean;\n}\n\nexport const TravelDateInput: React.FC<TravelDateInputProps> = ({\n value,\n onValueChange,\n label,\n localeCode = \"sv\",\n languageLocaleCode = localeCode,\n visibleMonth: visibleMonthValue,\n previousMonthButtonAriaLabel = \"Previous month\",\n nextMonthButtonAriaLabel = \"Next month\",\n placeholderWhenBlurred,\n autoFocus,\n heading,\n headingLevel,\n numMonthsInMonthPicker = 12,\n isDateDisabled,\n renderDateContent,\n onVisibleMonthChange,\n prevMonthDisabled,\n nextMonthDisabled,\n firstMonthInMonthPicker = new Date(),\n zIndex = 1000,\n zIndexWhenClosed,\n onHideCalendar,\n renderBelowCalendar,\n size = \"medium\",\n dateTestId,\n previousMonthButtonTestId,\n nextMonthButtonTestId,\n textInputVariant = \"standard\",\n}) => {\n const [calendarOpen, setCalendarOpen] = useState(false);\n const [calendarInDom, setCalendarInDom] = useState(false);\n const [boxSize, setBoxSize] = useState<{ height: number; width: number }>({\n // Sane defaults, this will be updated with actual data from DOM.\n width: 336,\n height: 66,\n });\n\n const inputFieldsHeight = size === \"large\" ? \"8.8rem\" : \"6.6rem\";\n\n const calendarOpenRef = useRef(false);\n\n const showCalendar = useCallback(() => {\n calendarOpenRef.current = true;\n setCalendarInDom(true);\n setTimeout(() => {\n setCalendarOpen(true);\n }, 10);\n }, []);\n\n const hideCalendar = useCallback(() => {\n if (!calendarInDom) {\n return;\n }\n\n setCalendarOpen(false);\n calendarOpenRef.current = false;\n onHideCalendar?.();\n\n setTimeout(() => {\n if (!calendarOpenRef.current) {\n setCalendarInDom(false);\n }\n }, 120);\n }, [calendarInDom, onHideCalendar]);\n\n const delayedHideCalendar = useCallback(() => {\n setTimeout(() => {\n hideCalendar();\n }, 250);\n }, [hideCalendar]);\n\n const ref = useRef<HTMLDivElement>(null);\n const sizeSourceRef = useRef<HTMLDivElement>(null);\n\n useOnClickOutside(ref, hideCalendar);\n\n useLayoutEffect(() => {\n const width = sizeSourceRef.current?.offsetWidth;\n const height = sizeSourceRef.current?.offsetHeight;\n if (width != null && height != null) {\n if (boxSize.height !== height || boxSize.width !== width) {\n setBoxSize({ width, height });\n }\n }\n }, [boxSize.height, boxSize.width]);\n\n const inputProps = useTravelDateInput(\n value,\n onValueChange,\n localeCode,\n languageLocaleCode,\n visibleMonthValue,\n onVisibleMonthChange,\n delayedHideCalendar,\n );\n\n const {\n visiblePanel,\n visibleMonth,\n onValueChangeByInputs,\n selectedDate,\n setVisibleMonth,\n setVisiblePanel,\n monthPickerButtonRef,\n } = inputProps;\n\n const onKeyDown = useCallback<KeyboardEventHandler<HTMLDivElement>>(\n (ev) => {\n if (ev.key === \"Escape\") {\n hideCalendar();\n }\n },\n [hideCalendar],\n );\n\n return (\n <Box\n position={\"relative\"}\n className={styles.travelDateInput}\n ref={ref}\n onKeyDown={onKeyDown}\n height={boxSize.height}\n width={boxSize.width}\n >\n <Box\n position={\"absolute\"}\n ref={sizeSourceRef}\n zIndex={calendarInDom ? zIndex : zIndexWhenClosed}\n >\n <TravelDateTextInputField\n {...inputProps}\n autoFocus={autoFocus}\n value={value}\n onValueChange={onValueChangeByInputs}\n localeCode={localeCode}\n label={label}\n onFocus={showCalendar}\n calendarSize={size}\n placeholderWhenBlurred={placeholderWhenBlurred}\n variant={textInputVariant}\n readOnlyOnMobile={true}\n />\n </Box>\n\n {calendarInDom && (\n <Box\n position={\"absolute\"}\n zIndex={zIndex - 1}\n left={\"-2.4rem\"}\n top={heading ? \"-8.0rem\" : \"-2.4rem\"}\n className={cx(styles.overlay, calendarOpen && styles.calendarVisible)}\n >\n <Box\n background={\"white\"}\n shadow={\"popover\"}\n borderRadius={\"var(--swui-border-radius-large)\"}\n >\n <CardBody gap={3}>\n {heading && (\n <Heading variant={\"h2\"} as={headingLevel}>\n {heading}\n </Heading>\n )}\n\n <Box height={inputFieldsHeight} />\n\n <MonthHeader\n {...inputProps}\n previousMonthButtonAriaLabel={previousMonthButtonAriaLabel}\n nextMonthButtonAriaLabel={nextMonthButtonAriaLabel}\n calendarSize={size}\n prevMonthDisabled={prevMonthDisabled}\n nextMonthDisabled={nextMonthDisabled}\n previousMonthButtonTestId={previousMonthButtonTestId}\n nextMonthButtonTestId={nextMonthButtonTestId}\n />\n\n {visiblePanel === \"calendar\" && (\n <TravelCalendar\n {...inputProps}\n size={size}\n isValidDateRange={Boolean(selectedDate)}\n selectedStartDate={selectedDate}\n selectedEndDate={selectedDate}\n multiSelectable={false}\n isDateDisabled={isDateDisabled}\n renderDateContent={renderDateContent}\n dateTestId={dateTestId}\n hoverHighlightDirection={undefined}\n />\n )}\n\n {visiblePanel === \"month-picker\" && (\n <MonthPicker\n firstMonth={firstMonthInMonthPicker}\n numMonths={numMonthsInMonthPicker}\n value={visibleMonth}\n size={size}\n localeCode={localeCode}\n onValueChange={(v) => {\n setVisibleMonth(v);\n setVisiblePanel(\"calendar\");\n monthPickerButtonRef.current?.focus();\n }}\n onCancel={() => {\n setVisiblePanel(\"calendar\");\n monthPickerButtonRef.current?.focus();\n }}\n />\n )}\n {renderBelowCalendar?.({ hideCalendar })}\n </CardBody>\n </Box>\n </Box>\n )}\n </Box>\n );\n};\n","import * as React from \"react\";\nimport { SupportedLocaleCode } from \"../../localize-date-format/LocaleMapper\";\nimport { MonthPicker } from \"../../month-picker/MonthPicker\";\nimport { useTravelDateInput } from \"../hooks/UseTravelDateInput\";\nimport { MonthHeader } from \"./MonthHeader\";\nimport { TravelCalendar, TravelCalendarSizeVariant } from \"./TravelCalendar\";\nimport { RenderTravelDateContent } from \"../types\";\n\nexport interface TravelDateCalendarBodyProps {\n /** The calendar state, from useTravelDateInput. */\n inputProps: ReturnType<typeof useTravelDateInput>;\n languageLocaleCode: SupportedLocaleCode;\n previousMonthButtonAriaLabel: string;\n nextMonthButtonAriaLabel: string;\n firstMonthInMonthPicker: Date;\n numMonthsInMonthPicker: number;\n isDateDisabled?: (date: Date) => boolean;\n /**\n * Renders the content of each date in the calendar, in place of the day\n * number. The cell around it, with the selection, focus and keyboard\n * navigation, stays the calendar's. See RenderTravelDateContent.\n */\n renderDateContent?: RenderTravelDateContent;\n prevMonthDisabled?: (visibleMonth: Date) => boolean;\n nextMonthDisabled?: (visibleMonth: Date) => boolean;\n size: TravelCalendarSizeVariant;\n dateTestId?: (date: Date) => string | undefined;\n previousMonthButtonTestId?: string;\n nextMonthButtonTestId?: string;\n calendarAriaLabel?: string;\n}\n\n/**\n * The month header, and either the calendar or the month picker.\n *\n * TravelDateCalendar and TravelDateCalendarPanel differ only in what they\n * render above this, so this is where the shared wiring lives. It returns a\n * fragment, which means the parts stay items of the parent layout.\n */\nexport const TravelDateCalendarBody: React.FC<TravelDateCalendarBodyProps> = ({\n inputProps,\n languageLocaleCode,\n previousMonthButtonAriaLabel,\n nextMonthButtonAriaLabel,\n firstMonthInMonthPicker,\n numMonthsInMonthPicker,\n isDateDisabled,\n renderDateContent,\n prevMonthDisabled,\n nextMonthDisabled,\n size,\n dateTestId,\n previousMonthButtonTestId,\n nextMonthButtonTestId,\n calendarAriaLabel,\n}) => {\n const {\n visiblePanel,\n visibleMonth,\n setVisibleMonth,\n setVisiblePanel,\n monthPickerButtonRef,\n selectedDate,\n } = inputProps;\n\n return (\n <>\n <MonthHeader\n {...inputProps}\n previousMonthButtonAriaLabel={previousMonthButtonAriaLabel}\n nextMonthButtonAriaLabel={nextMonthButtonAriaLabel}\n calendarSize={size}\n prevMonthDisabled={prevMonthDisabled}\n nextMonthDisabled={nextMonthDisabled}\n previousMonthButtonTestId={previousMonthButtonTestId}\n nextMonthButtonTestId={nextMonthButtonTestId}\n />\n\n {visiblePanel === \"calendar\" && (\n <TravelCalendar\n {...inputProps}\n size={size}\n selectedStartDate={selectedDate}\n selectedEndDate={selectedDate}\n isValidDateRange={Boolean(selectedDate)}\n isDateDisabled={isDateDisabled}\n renderDateContent={renderDateContent}\n multiSelectable={false}\n dateTestId={dateTestId}\n hoverHighlightDirection={undefined}\n ariaLabel={calendarAriaLabel}\n />\n )}\n\n {visiblePanel === \"month-picker\" && (\n <MonthPicker\n firstMonth={firstMonthInMonthPicker}\n numMonths={numMonthsInMonthPicker}\n value={visibleMonth}\n localeCode={languageLocaleCode}\n size={size}\n onValueChange={(v) => {\n setVisibleMonth(v);\n setVisiblePanel(\"calendar\");\n monthPickerButtonRef.current?.focus();\n }}\n onCancel={() => {\n setVisiblePanel(\"calendar\");\n monthPickerButtonRef.current?.focus();\n }}\n />\n )}\n </>\n );\n};\n","import * as React from \"react\";\nimport { useMemo } from \"react\";\nimport { Column, Heading, HeadingVariant } from \"@stenajs-webui/core\";\nimport { ValueAndOnValueChangeProps } from \"@stenajs-webui/forms\";\nimport { TravelCalendarSizeVariant } from \"../../../features/travel-calendar/components/TravelCalendar\";\nimport { TravelDateCalendarBody } from \"../../../features/travel-calendar/components/TravelDateCalendarBody\";\nimport { useTravelDateInput } from \"../../../features/travel-calendar/hooks/UseTravelDateInput\";\nimport { TravelDateTextInputField } from \"../../../features/travel-calendar/components/TravelDateTextInputField\";\nimport {\n DateTextInputVariant,\n RenderTravelDateContent,\n} from \"../../../features/travel-calendar/types\";\nimport { SupportedLocaleCode } from \"../../../features/localize-date-format/LocaleMapper\";\nimport { VisibleMonthState } from \"../../../features/travel-calendar/hooks/UseVisibleMonthState\";\n\nexport interface TravelDateCalendarProps\n extends ValueAndOnValueChangeProps<string>, VisibleMonthState {\n localeCode?: SupportedLocaleCode;\n languageLocaleCode?: SupportedLocaleCode;\n label?: string;\n previousMonthButtonAriaLabel?: string;\n nextMonthButtonAriaLabel?: string;\n heading?: string;\n headingLevel?: HeadingVariant;\n firstMonthInMonthPicker?: Date;\n numMonthsInMonthPicker?: number;\n isDateDisabled?: (date: Date) => boolean;\n /**\n * Renders the content of each date in the calendar, in place of the day\n * number. The cell around it, with the selection, focus and keyboard\n * navigation, stays the calendar's. See RenderTravelDateContent.\n */\n renderDateContent?: RenderTravelDateContent;\n prevMonthDisabled?: (visibleMonth: Date) => boolean;\n nextMonthDisabled?: (visibleMonth: Date) => boolean;\n size?: TravelCalendarSizeVariant;\n dateTestId?: (date: Date) => string | undefined;\n previousMonthButtonTestId?: string;\n nextMonthButtonTestId?: string;\n placeholderWhenBlurred?: string;\n textInputVariant?: DateTextInputVariant;\n autoFocus?: boolean;\n}\n\nexport const TravelDateCalendar: React.FC<TravelDateCalendarProps> = ({\n value,\n onValueChange,\n label,\n localeCode = \"sv\",\n languageLocaleCode = localeCode,\n visibleMonth: visibleMonthValue,\n previousMonthButtonAriaLabel = \"Previous month\",\n nextMonthButtonAriaLabel = \"Next month\",\n placeholderWhenBlurred,\n heading,\n headingLevel,\n numMonthsInMonthPicker = 12,\n isDateDisabled,\n renderDateContent,\n onVisibleMonthChange,\n prevMonthDisabled,\n nextMonthDisabled,\n firstMonthInMonthPicker,\n dateTestId,\n size = \"medium\",\n previousMonthButtonTestId,\n nextMonthButtonTestId,\n textInputVariant = \"standard\",\n autoFocus,\n}) => {\n const inputProps = useTravelDateInput(\n value,\n onValueChange,\n localeCode,\n languageLocaleCode,\n visibleMonthValue,\n onVisibleMonthChange,\n );\n\n const { onValueChangeByInputs } = inputProps;\n\n /**\n * A default of new Date() in the destructuring above would be a new date on\n * every render, which the month picker uses as a memo dependency.\n */\n const firstMonth = useMemo(\n () => firstMonthInMonthPicker ?? new Date(),\n [firstMonthInMonthPicker],\n );\n\n return (\n <Column gap={3}>\n {heading && (\n <Heading variant={\"h2\"} as={headingLevel}>\n {heading}\n </Heading>\n )}\n <TravelDateTextInputField\n {...inputProps}\n value={value}\n onValueChange={onValueChangeByInputs}\n localeCode={localeCode}\n label={label}\n calendarSize={size}\n placeholderWhenBlurred={placeholderWhenBlurred}\n variant={textInputVariant}\n readOnlyOnMobile={false}\n autoFocus={autoFocus}\n />\n\n <TravelDateCalendarBody\n inputProps={inputProps}\n languageLocaleCode={languageLocaleCode}\n previousMonthButtonAriaLabel={previousMonthButtonAriaLabel}\n nextMonthButtonAriaLabel={nextMonthButtonAriaLabel}\n firstMonthInMonthPicker={firstMonth}\n numMonthsInMonthPicker={numMonthsInMonthPicker}\n isDateDisabled={isDateDisabled}\n renderDateContent={renderDateContent}\n prevMonthDisabled={prevMonthDisabled}\n nextMonthDisabled={nextMonthDisabled}\n size={size}\n dateTestId={dateTestId}\n previousMonthButtonTestId={previousMonthButtonTestId}\n nextMonthButtonTestId={nextMonthButtonTestId}\n />\n </Column>\n );\n};\n","import * as React from \"react\";\nimport { useMemo } from \"react\";\nimport { ValueAndOnValueChangeProps } from \"@stenajs-webui/forms\";\nimport { TravelCalendarSizeVariant } from \"../../../features/travel-calendar/components/TravelCalendar\";\nimport { TravelDateCalendarBody } from \"../../../features/travel-calendar/components/TravelDateCalendarBody\";\nimport { useTravelDateInput } from \"../../../features/travel-calendar/hooks/UseTravelDateInput\";\nimport { SupportedLocaleCode } from \"../../../features/localize-date-format/LocaleMapper\";\nimport { Column } from \"@stenajs-webui/core\";\nimport { RenderTravelDateContent } from \"../../../features/travel-calendar/types\";\nimport { VisibleMonthState } from \"../../../features/travel-calendar/hooks/UseVisibleMonthState\";\n\nexport interface TravelDateCalendarPanelProps\n extends ValueAndOnValueChangeProps<string>, VisibleMonthState {\n localeCode?: SupportedLocaleCode;\n languageLocaleCode?: SupportedLocaleCode;\n previousMonthButtonAriaLabel?: string;\n nextMonthButtonAriaLabel?: string;\n firstMonthInMonthPicker?: Date;\n numMonthsInMonthPicker?: number;\n isDateDisabled?: (date: Date) => boolean;\n /**\n * Renders the content of each date in the calendar, in place of the day\n * number. The cell around it, with the selection, focus and keyboard\n * navigation, stays the calendar's. See RenderTravelDateContent.\n */\n renderDateContent?: RenderTravelDateContent;\n prevMonthDisabled?: (visibleMonth: Date) => boolean;\n nextMonthDisabled?: (visibleMonth: Date) => boolean;\n size?: TravelCalendarSizeVariant;\n dateTestId?: (date: Date) => string | undefined;\n previousMonthButtonTestId?: string;\n nextMonthButtonTestId?: string;\n /**\n * Accessible name of the calendar grid.\n *\n * The panel has no label of its own, so set this to whatever the date is\n * for, unless there is a visible label next to it that already says so.\n */\n calendarAriaLabel?: string;\n}\n\n/**\n * A calendar for picking a single travel date, without a text input.\n *\n * This is TravelDateCalendar without the label, text input and heading, for\n * cases where the date is entered somewhere else. The visible month follows\n * the value, so a date set from the outside is scrolled into view.\n */\nexport const TravelDateCalendarPanel: React.FC<\n TravelDateCalendarPanelProps\n> = ({\n value,\n onValueChange,\n localeCode = \"sv\",\n languageLocaleCode = localeCode,\n visibleMonth: visibleMonthValue,\n previousMonthButtonAriaLabel = \"Previous month\",\n nextMonthButtonAriaLabel = \"Next month\",\n numMonthsInMonthPicker = 12,\n isDateDisabled,\n renderDateContent,\n onVisibleMonthChange,\n prevMonthDisabled,\n nextMonthDisabled,\n firstMonthInMonthPicker,\n dateTestId,\n size = \"medium\",\n previousMonthButtonTestId,\n nextMonthButtonTestId,\n calendarAriaLabel,\n}) => {\n const inputProps = useTravelDateInput(\n value,\n onValueChange,\n localeCode,\n languageLocaleCode,\n visibleMonthValue,\n onVisibleMonthChange,\n );\n\n /**\n * A default of new Date() in the destructuring above would be a new date on\n * every render, which the month picker uses as a memo dependency.\n */\n const firstMonth = useMemo(\n () => firstMonthInMonthPicker ?? new Date(),\n [firstMonthInMonthPicker],\n );\n\n return (\n <Column gap={3}>\n <TravelDateCalendarBody\n inputProps={inputProps}\n languageLocaleCode={languageLocaleCode}\n previousMonthButtonAriaLabel={previousMonthButtonAriaLabel}\n nextMonthButtonAriaLabel={nextMonthButtonAriaLabel}\n firstMonthInMonthPicker={firstMonth}\n numMonthsInMonthPicker={numMonthsInMonthPicker}\n isDateDisabled={isDateDisabled}\n renderDateContent={renderDateContent}\n prevMonthDisabled={prevMonthDisabled}\n nextMonthDisabled={nextMonthDisabled}\n size={size}\n dateTestId={dateTestId}\n previousMonthButtonTestId={previousMonthButtonTestId}\n nextMonthButtonTestId={nextMonthButtonTestId}\n calendarAriaLabel={calendarAriaLabel}\n />\n </Column>\n );\n};\n","import * as React from \"react\";\nimport { useCallback, useRef, useState } from \"react\";\nimport { Column, Heading, HeadingVariant } from \"@stenajs-webui/core\";\nimport { ValueAndOnValueChangeProps } from \"@stenajs-webui/forms\";\nimport {\n TravelDateRangeTextInputField,\n TravelDateRangeTextInputFields,\n} from \"../../../features/travel-calendar/components/TravelDateRangeTextInputFields\";\nimport { MonthPicker } from \"../../../features/month-picker/MonthPicker\";\nimport { useTravelDateRangeInput } from \"../../../features/travel-calendar/hooks/UseTravelDateRangeInput\";\nimport { MonthHeader } from \"../../../features/travel-calendar/components/MonthHeader\";\nimport {\n TravelCalendar,\n TravelCalendarSizeVariant,\n} from \"../../../features/travel-calendar/components/TravelCalendar\";\nimport {\n DateTextInputVariant,\n TravelDateRangeInputValue,\n RenderTravelDateContent,\n} from \"../../../features/travel-calendar/types\";\nimport { SupportedLocaleCode } from \"../../../features/localize-date-format/LocaleMapper\";\nimport { VisibleMonthState } from \"../../../features/travel-calendar/hooks/UseVisibleMonthState\";\n\nexport interface TravelDateRangeCalendarProps\n extends\n ValueAndOnValueChangeProps<TravelDateRangeInputValue>,\n VisibleMonthState {\n localeCode?: SupportedLocaleCode;\n languageLocaleCode?: SupportedLocaleCode;\n startDateLabel?: string;\n endDateLabel?: string;\n previousMonthButtonAriaLabel?: string;\n nextMonthButtonAriaLabel?: string;\n heading?: string;\n headingLevel?: HeadingVariant;\n firstMonthInMonthPicker?: Date;\n numMonthsInMonthPicker?: number;\n isDateDisabled?: (date: Date) => boolean;\n /**\n * Renders the content of each date in the calendar, in place of the day\n * number. The cell around it, with the selection, focus and keyboard\n * navigation, stays the calendar's. See RenderTravelDateContent.\n */\n renderDateContent?: RenderTravelDateContent;\n prevMonthDisabled?: (visibleMonth: Date) => boolean;\n nextMonthDisabled?: (visibleMonth: Date) => boolean;\n size?: TravelCalendarSizeVariant;\n dateTestId?: (date: Date) => string | undefined;\n previousMonthButtonTestId?: string;\n nextMonthButtonTestId?: string;\n placeholderWhenBlurredStartDate?: string;\n placeholderWhenBlurredEndDate?: string;\n textInputVariant?: DateTextInputVariant;\n autoFocusStartDate?: boolean;\n autoFocusEndDate?: boolean;\n}\n\nexport const TravelDateRangeCalendar: React.FC<\n TravelDateRangeCalendarProps\n> = ({\n value,\n onValueChange,\n startDateLabel,\n endDateLabel,\n localeCode = \"sv\",\n languageLocaleCode = localeCode,\n visibleMonth: visibleMonthValue,\n previousMonthButtonAriaLabel = \"Previous month\",\n nextMonthButtonAriaLabel = \"Next month\",\n heading,\n headingLevel,\n numMonthsInMonthPicker = 12,\n isDateDisabled,\n renderDateContent,\n onVisibleMonthChange,\n prevMonthDisabled,\n nextMonthDisabled,\n firstMonthInMonthPicker = new Date(),\n size = \"medium\",\n dateTestId,\n previousMonthButtonTestId,\n nextMonthButtonTestId,\n placeholderWhenBlurredStartDate,\n placeholderWhenBlurredEndDate,\n textInputVariant = \"standard\",\n autoFocusStartDate,\n autoFocusEndDate,\n}) => {\n const [fieldLastInFocus, setFieldLastInFocus] = useState<\n \"startDate\" | \"endDate\" | undefined\n >(undefined);\n\n const startDateRef = useRef<HTMLInputElement>(null);\n const endDateRef = useRef<HTMLInputElement>(null);\n\n const moveFocusToField = useCallback((field: \"startDate\" | \"endDate\") => {\n if (field === \"startDate\") {\n startDateRef.current?.focus();\n } else if (field === \"endDate\") {\n endDateRef.current?.focus();\n }\n }, []);\n\n const inputProps = useTravelDateRangeInput(\n value,\n onValueChange,\n localeCode,\n languageLocaleCode,\n visibleMonthValue,\n onVisibleMonthChange,\n fieldLastInFocus,\n setFieldLastInFocus,\n moveFocusToField,\n undefined,\n );\n\n const onInputFocus = useCallback((field: TravelDateRangeTextInputField) => {\n setFieldLastInFocus(field);\n }, []);\n\n const {\n visiblePanel,\n visibleMonth,\n onValueChangeByInputs,\n setVisibleMonth,\n setVisiblePanel,\n monthPickerButtonRef,\n } = inputProps;\n\n return (\n <Column gap={3}>\n {heading && (\n <Heading variant={\"h2\"} as={headingLevel}>\n {heading}\n </Heading>\n )}\n <TravelDateRangeTextInputFields\n {...inputProps}\n value={value}\n onValueChange={onValueChangeByInputs}\n startDateRef={startDateRef}\n endDateRef={endDateRef}\n localeCode={localeCode}\n startDateLabel={startDateLabel}\n endDateLabel={endDateLabel}\n onFocus={onInputFocus}\n calendarSize={size}\n placeholderWhenBlurredStartDate={placeholderWhenBlurredStartDate}\n placeholderWhenBlurredEndDate={placeholderWhenBlurredEndDate}\n variant={textInputVariant}\n autoFocusStartDate={autoFocusStartDate}\n autoFocusEndDate={autoFocusEndDate}\n /*\n When focusing on the input, the calendar popover appears.\n But the keyboard appears as well and covers the calendar.\n\n readOnly disables input and hides the keyboard on mobile.\n This enables the user to click on input to select it, then click in the calendar.\n\n This is not needed for TravelDate*Calendar, since the calendar is always visible.\n */\n readOnlyOnMobile={false}\n />\n\n <MonthHeader\n {...inputProps}\n previousMonthButtonAriaLabel={previousMonthButtonAriaLabel}\n nextMonthButtonAriaLabel={nextMonthButtonAriaLabel}\n calendarSize={size}\n prevMonthDisabled={prevMonthDisabled}\n nextMonthDisabled={nextMonthDisabled}\n previousMonthButtonTestId={previousMonthButtonTestId}\n nextMonthButtonTestId={nextMonthButtonTestId}\n />\n\n {visiblePanel === \"calendar\" && (\n <TravelCalendar\n {...inputProps}\n size={size}\n multiSelectable={true}\n isDateDisabled={isDateDisabled}\n renderDateContent={renderDateContent}\n dateTestId={dateTestId}\n />\n )}\n\n {visiblePanel === \"month-picker\" && (\n <MonthPicker\n firstMonth={firstMonthInMonthPicker}\n numMonths={numMonthsInMonthPicker}\n value={visibleMonth}\n size={size}\n localeCode={languageLocaleCode}\n onValueChange={(v) => {\n setVisibleMonth(v);\n setVisiblePanel(\"calendar\");\n monthPickerButtonRef.current?.focus();\n }}\n onCancel={() => {\n setVisiblePanel(\"calendar\");\n monthPickerButtonRef.current?.focus();\n }}\n />\n )}\n </Column>\n );\n};\n","import { useCallback } from \"react\";\nimport { isBefore, isSameDay, isSameMonth } from \"date-fns\";\nimport { useToday } from \"@stenajs-webui/core\";\n\nexport const useDisabledBeforeToday = () => {\n const today = useToday();\n\n return useCallback<(date: Date) => boolean>(\n (date) => !isSameDay(date, today) && isBefore(date, today),\n [today],\n );\n};\n\nexport const usePrevMonthDisabledBeforeToday = () => {\n const today = useToday();\n\n return useCallback(\n (visibleMonth: Date) =>\n isSameMonth(today, visibleMonth) || isBefore(visibleMonth, today),\n [today],\n );\n};\n","import { startOfMonth } from \"date-fns\";\nimport { useState } from \"react\";\n\n/**\n * The visible month of a travel calendar, which the app keeps. All five\n * travel calendars take these two props, and useVisibleMonthState returns\n * them, ready to spread onto one.\n */\nexport interface VisibleMonthState {\n /**\n * The month the calendar shows. Only its year and month are read, so any\n * day of the month will do. The calendar never changes it by itself; see\n * onVisibleMonthChange.\n *\n * It is not taken from the value. To open on the month of the value, pass\n * that month; useVisibleMonthState shows how.\n */\n visibleMonth: Date;\n /**\n * Called when the calendar should show another month: from the month\n * buttons, the month picker, the arrow keys, or a date in another month\n * that the calendar follows. The single date calendars follow their value,\n * typed or set from outside. The range calendars only follow a date typed\n * into one of their fields.\n *\n * It gets the first day of that month, and the calendar moves once\n * visibleMonth is set to it. It is not called for the month already shown.\n *\n * When it follows a date, it never asks for a month before the current\n * one: a date in the past asks for the current month, unless it is in the\n * month already shown. The month buttons and the arrow keys are not\n * limited that way. To keep the user out of past months, set\n * prevMonthDisabled and isDateDisabled, for example with\n * usePrevMonthDisabledBeforeToday() and useDisabledBeforeToday(). The\n * month picker starts at firstMonthInMonthPicker, the current month by\n * default.\n *\n * useVisibleMonthState() keeps this state, for when nothing else needs it.\n */\n onVisibleMonthChange: (visibleMonth: Date) => void;\n}\n\n/**\n * Keeps the visible month of a travel calendar, for when nothing else needs to\n * know it.\n *\n * The travel calendars do not keep their visible month themselves; the app\n * passes it in as visibleMonth and changes it in onVisibleMonthChange. This is\n * that state, returned as those two props, so it can be spread onto the\n * calendar. Keep the state elsewhere instead when something else depends on\n * the month, such as data loaded for it.\n *\n * It starts at the current month, not at the month of a value. Before the\n * month was controlled, a calendar without initialMonthInFocus opened on the\n * month of its value. To keep that, start from the value's date, with a\n * function, the way useState takes one:\n *\n * const visibleMonthState = useVisibleMonthState(() =>\n * value ? parseLocalizedDateString(value, localeCode) : undefined,\n * );\n *\n * The function only runs on the first render, so the value is not parsed\n * again on every render after it, and the check for a missing value keeps\n * it type safe for an optional value. parseLocalizedDateString returns\n * undefined for an incomplete value as well, and undefined falls back to\n * the current month.\n *\n * The value of a range calendar is an object of two strings, so parse its\n * start date instead:\n *\n * const visibleMonthState = useVisibleMonthState(() =>\n * value?.startDate\n * ? parseLocalizedDateString(value.startDate, localeCode)\n * : undefined,\n * );\n *\n * A calendar that had initialMonthInFocus passes that month instead:\n * useVisibleMonthState(initialMonthInFocus).\n *\n * @param initialMonth The month to show first, or a function that returns it,\n * called once. Defaults to the current month, also when it is or returns\n * undefined.\n *\n * @example\n * const visibleMonthState = useVisibleMonthState();\n *\n * <TravelDateInput\n * value={value}\n * onValueChange={setValue}\n * {...visibleMonthState}\n * />\n */\nexport const useVisibleMonthState = (\n initialMonth?: Date | (() => Date | undefined),\n): VisibleMonthState => {\n const [visibleMonth, setVisibleMonth] = useState(() => {\n const month =\n typeof initialMonth === \"function\" ? initialMonth() : initialMonth;\n return startOfMonth(month ?? new Date());\n });\n\n return { visibleMonth, onVisibleMonthChange: setVisibleMonth };\n};\n"],"names":["DateFormats","buildDayStateForDateRange","statePerMonth","start","end","isAfter","eachDayOfInterval","result","date","isFirstInRange","isSameDay","isLastInRange","addDayStateHighlights","state","buildDayStateForSingleMonth","dateInFocus","buildDayStateForRange","startOfMonth","endOfMonth","startLimit","endLimit","max","subDays","min","addDays","setDayStateValue","values","monthString","format","weekNumber","getISOWeek","dayInMonth","getDate","setDayStateValueFunction","setter","calendarState","highlights","month","dayState","addDayStateHighlightsOnSingleDay","addWeekStateHighlights","week","day","weekState","newHighlights","newWeekState","addWeekRangeHighlights","startDate","endDate","last","useHighlightToday","enabled","useMemo","convertFirstCharToUpper","value","Month","WeekDay","getMonthsInYear","year","startMonth","numMonths","locale","months","i","getMonthInYear","yearToUse","monthToUse","firstDayOfMonth","getWeeksForMonth","forceSixWeeks","firstDayOfFirstWeek","startOfWeek","weeks","getWeekForDate","addWeeks","firstDayOfWeek","isLastWeekOfMonth","getMonth","getWeek","getYear","getDaysForWeekForDate","createDay","dayOfWeek","getISODay","addHours","d","calculateOverflowingMonth","dayHasHighlight","defaultHighlights","highlight","dayHighlightSelect","highlightsOrBoolean","returnValues","fallbackValue","defaultWrapperStyleProvider","selectedBackground","todayBackground","rangeBackground","borderColor","_","defaultTextPropsProvider","selectedColor","disabledColor","inOtherMonthColor","rangeTextColor","isOtherMonth","defaultCalendarTheme","extranetCalendarTheme","WeekDayCell","onClickWeekDay","theme","content","jsx","Box","Text","Clickable","ev","CalendarDay","userData","onClickDay","ExtraDayContent","showDatesInOtherMonths","WrapperTd","styled","InnerWrapperDiv","CellWrapperDiv","disabled","isDisabled","jsxs","Fragment","WeekNumberCell","onClickWeek","background","backgroundColor","prefix","isDateInMinMaxRange","isBefore","DisabledDayWrapper","DayComponent","minDate","maxDate","props","activeDayState","CalendarMonth","dayComponent","statePerWeek","userDataPerWeek","onClickMonth","renderWeekNumber","renderWeekDay","headerRightContent","extraDayContent","showWeekNumber","Row","FlatButton","stenaAngleDown","CalendarPanel","monthRows","userDataPerMonth","minDateObj","parse","maxDateObj","cx","styles","monthRow","rowIndex","Spacing","Calendar","initialDate","getInitialDate","getMonthRows","enGB","now","monthsPerRow","chunk","getDomIdForMonth","position","monthPickerId","getDomIdForKeyboardKey","key","currentPosition","numColumnsPerRow","next","movePositionByKey","id","row","column","locales","enUS","enIE","deAT","nlBE","nl","de","nb","sv","da","lv","lt","it","et","fi","cs","es","fr","pl","fallbackLocaleCode","fallbackLocaleCodeForFormatting","getSupportedLocaleCode","localeCode","matchLanguage","fallback","languageCode","getSupportedLocaleCodeMatchingLanguage","getLocaleForLocaleCode","lang","localeCodes","l","getDefaultLocaleForFormatting","getLocaleCodeForLocale","MonthPickerCell","onClick","selected","autoFocus","size","label","abbr","ref","useRef","domId","tabIndex","useEffect","onKeyDown","useCallback","nextDomId","PrimaryButton","createMonths","firstMonth","currentYear","currentRow","currentColumn","currentMonth","input","addMonths","MonthPicker","onValueChange","onCancel","useId","today","useToday","clampedNumMonths","inited","setInited","useState","getNumColumns","lastMonth","Column","getWidth","yearIndex","rows","React","Heading","r","columns","isSameMonth","exhaustSwitchCase","createStandardDateRangePresets","PresetPicker","onClickPreset","pageIndex","setPageIndex","pages","currentPage","stenaAngleLeft","stenaAngleRight","Space","preset","CalendarWithMonthYearPickers","setDateInFocus","currentPanel","setCurrentPanel","renderMonthPicker","firstMonthInMonthPicker","numMonthsInMonthPicker","onChangeSelectedMonth","selectedMonth","useSelectedMonthStepperLogic","nextMonth","nextYear","addYears","prevMonth","subMonths","prevYear","subYears","WithMonthSwitcherBelow","children","Indent","SecondaryButton","stenaAngleLeftDouble","stenaArrowLeft","stenaArrowRight","stenaAngleRightDouble","noop","CalendarWithMonthSwitcher","monthSwitcherPlacement","onSelectPreset","calendarProps","fallbackIfNoPlacement","dateRangeToStrings","dateRange","stringsToDateRange","isDateRangeInvalid","toggleDatesIfEndIsEarlierThanStart","toggleDateStringsIfEndIsEarlierThanStart","useDateRangeOnClickDayHandler","focusedInput","setFocusedInput","useInternalPanelState","onChangePanel","_setCurrentPanel","useDateRangeSelection","initialDateInFocus","statePerMonthWithSelection","DateRangeCalendar","dateRangeSelectionProps","useDateRangeCalendarState","setStartDate","setEndDate","useSingleDateSelection","onChange","statePerMonthWithSelectedDate","SingleDateCalendar","singleDateSelectionProps","useMultiDateSelection","isSelected","v","stateSum","MultiDateCalendar","selectionProps","useSingleWeekSelection","getWeekDataFromWeekString","getWeekStringFromWeekData","weekData","parts","firstDateOfWeek","setWeek","SingleWeekCalendar","singleWeekSelectionProps","defaultPopoverPlacement","useDateInput","onClose","openOnMount","showingCalendar","setShowingCalendar","showCalendar","hideCalendar","onSelectDate","defaultMaxDate","DateInput","displayFormat","placeholder","calendarTheme","variant","width","portalTarget","zIndex","ControlledPopover","TextInput","TextInputButton","stenaCalendar","useDateRangeInput","startDateInputRef","endDateInputRef","showCalendarStartDate","showCalendarEndDate","startDateIsAfterEnd","DateRangeInput","placeholderStartDate","placeholderEndDate","Icon","stenaArrowWideRight","cssColor","DateTextInput","closeOnCalendarSelectDate","dateFormat","disableCalender","hideCalenderIcon","open","setOpen","toggleCalendar","onValueChangeHandler","onCalendarSelectDate","inValidInput","dateIsValid","isValid","invalid","popoverProps","formatHours","hours","h","formatMinutes","minutes","m","formatTimeString","time","validUserInput","arr","timeNumber","TimeTextInput","showPlaceholder","useIcon","valid","setValid","timeFormat","onBlur","formattedResult","onChangeHandler","validInput","stenaClock","DualTextInput","autoFocusLeft","autoFocusRight","onEsc","onEnter","onValueChangeLeft","onValueChangeRight","separatorIcon","placeholderLeft","placeholderRight","typeLeft","typeRight","onChangeLeft","onChangeRight","valueLeft","valueRight","minLeft","maxLeft","minRight","maxRight","onClickLeft","onClickRight","onClickCalendar","onClickArrowDown","onBlurLeft","onBlurRight","onFocusLeft","onFocusRight","inputRefLeft","inputRefRight","variantLeft","variantRight","showPresets","widthLeft","widthRight","focusCounter","tryTriggerOnBlur","debounce","focusLeftHandler","focusRightHandler","blurLeftHandler","blurRightHandler","TextInputBox","SeparatorLine","transformTimeStringToNumber","isValidTimeString","getHoursAndMinutesFromTimeString","p","parseIntElseUndefined","transformTimeInDateToTimeString","TimePickerCell","item","columnRef","canScrollRef","targetScroll","padStart","TimePickerColumn","items","selectedItem","range","TimePicker","hour","setHour","minute","setMinute","onClickHour","onClickMinutes","useDateRangeEffects","dateInputRef","useDateRangeHandlers","showCalendarInternal","hideCalendarInternal","setFirstFocusedInput","localTime","setLocalTime","localDate","setLocalDate","onChangeDate","incomingDate","newDate","onChangeTime","newTime","inputLeftChangeHandler","inputRightChangeHandler","useInputStates","isCalendarVisible","useBoolean","isTimePickerVisible","showTimePicker","hideTimePicker","firstFocusedInput","useUserInputHandlers","onClickArrowButton","onClickCalendarButton","onKeyDownHandler","DateTimeInput","appendTo","timeInputRef","states","dateToHighlight","hideAll","timeValue","delayedIsCalendarVisible","useDelayedFalse","delayedIsTimePickerVisible","YearPickerCell","YearPicker","initialLastYear","lastYear","setLastYear","yearRows","startYear","prev","calculateLastYearInFocus","yearRow","yearDiff","remaining","yearsToAdd","yearsToSubtract","DateRangeDualTextInput","renderBelowCalendar","TravelDateTextInput","readOnly","mask","pipe","guide","keepCharPositions","placeholderChar","showMask","calendarSize","onFocus","placeholderWhenBlurred","valueWhenBlurred","inputProps","localRef","isFocused","setIsFocused","inputRef","maskedOnChange","useMaskedInput","onFocusHandler","onBlurHandler","activePlaceholder","Label","LabelledTextInput","calenderSize","yearMask","monthMask","dayMask","createInputMaskForDateFormat","splitByNewLetter","tokenToMask","token","str","currentSegment","getDateFormatForLocaleCode","formatMap","part","parseLocalizedDateString","dateString","options","supportedLocaleCode","formatLocalizedDate","reformatLocalizedDateString","TravelDateRangeTextInputFields","startDateLabel","endDateLabel","startDateRef","endDateRef","placeholderWhenBlurredStartDate","placeholderWhenBlurredEndDate","valueWhenBlurredStartDate","valueWhenBlurredEndDate","readOnlyOnMobile","autoFocusStartDate","autoFocusEndDate","deviceSize","useDeviceSize","isDeviceSameOrLarger","dateFormatForLocaleCode","useControlledVisibleMonth","visibleMonthValue","onVisibleMonthChange","visibleMonth","setVisibleMonth","useEventCallback","requested","setVisibleMonthClamped","formatDateDescription","isSameYear","isInvalidRange","startDateStr","endDateStr","resetDateRangeIfInvalid","obj","master","useTravelDateRangeInput","languageLocaleCode","fieldLastInFocus","setFieldLastInFocus","moveFocusToField","languageLocale","calendarId","monthPickerButtonRef","selectedStartDate","selectedEndDate","visibleMonthData","monthPickerButtonLabel","intlFormat","todayIsInVisibleMonth","hoverDate","setHoverDate","visiblePanel","setVisiblePanel","onValueChangeByInputs","isValidDateRange","hoverAnchor","s","hoverHighlightDirection","callOnValueChange","MonthHeader","previousMonthButtonAriaLabel","nextMonthButtonAriaLabel","prevMonthDisabled","nextMonthDisabled","previousMonthButtonTestId","nextMonthButtonTestId","stenaAngleUp","rangeBgColor","getCellBackgroundColors","dayIsInMonth","getCellBackgroundHoverRangeHighlight","getCellBackgroundHighlight","highlightStartDate","highlightEndDate","flipLeftRight","isInHighlightRange","isWithinInterval","dateIsHoverDate","dateIsHoverAnchor","flip","left","right","getDateToFocusOn","currentDate","createDayId","TravelDateCellBackground","bgColorLeft","bgColorRight","TravelDateCell","onChangeVisibleMonth","focusDateWhenShown","onStartHover","onEndHover","focusableDate","isDateDisabled","dateTestId","renderDateContent","e","nextDate","nextDateDisabled","hoverRightOfAnchor","isShowingHoverRange","isHoverRangeStart","isHoverRangeEnd","isSelectionStart","isSelectionEnd","isToday","bgColors","isHovered","isDrawnAsSelectionStart","isDrawnAsSelectionEnd","isInRange","defaultContent","defaultTodayMarker","cursorClassName","disabledContentStyle","TravelCalendar","onClickDate","multiSelectable","ariaLabel","pendingFocusDate","gridRef","focused","daysInVisibleMonth","TravelDateRangeInput","heading","headingLevel","zIndexWhenClosed","onHideCalendar","textInputVariant","calendarOpen","setCalendarOpen","calendarInDom","setCalendarInDom","boxSize","setBoxSize","field","inputFieldsHeight","calendarOpenRef","onInputFocus","sizeSourceRef","useOnClickOutside","useLayoutEffect","height","CardBody","TravelDateTextInputField","useTravelDateInput","selectedDate","lastSyncedSelectedTime","selectedTime","TravelDateInput","delayedHideCalendar","TravelDateCalendarBody","calendarAriaLabel","TravelDateCalendar","TravelDateCalendarPanel","TravelDateRangeCalendar","useDisabledBeforeToday","usePrevMonthDisabledBeforeToday","useVisibleMonthState","initialMonth"],"mappings":"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"}