@stenajs-webui/calendar 21.13.0 → 21.14.0

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/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/travel-calendar/util/UseToday.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/util/DateDescriptionFormatter.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/components/calendar-types/travel-date-calendar/TravelDateCalendar.tsx","../src/components/calendar-types/travel-date-range-calendar/TravelDateRangeCalendar.tsx"],"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","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 { startCase } from \"lodash-es\";\nimport { DateFormats } from \"../date/DateFormats\";\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: startCase(\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}: 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 && (\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 [\"disabled\"],\n [true],\n false,\n );\n","import { Box, Clickable, Text } from \"@stenajs-webui/core\";\nimport * as React 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?: JSX.Element;\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 enUS,\n es,\n fr,\n nb,\n nl,\n pl,\n sv,\n} from \"date-fns/locale\";\n\ntype LocalesMap = {\n [key: string]: Locale;\n};\n\nconst locales: LocalesMap = {\n \"en-US\": enUS,\n \"en-GB\": enGB,\n \"de-AT\": deAT,\n \"de-DE\": de,\n fr,\n de,\n es,\n sv,\n pl,\n da,\n nl,\n nb,\n};\n\nexport const getLocaleForLocaleCode = (\n localeCode: string,\n): Locale | undefined => {\n return locales[localeCode];\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 = (locale: Locale): string | undefined => {\n const localeCodes = Object.keys(locales);\n for (const localeCode of localeCodes) {\n if (locales[localeCode].code === locale.code) {\n return localeCode;\n }\n }\n return undefined;\n};\n","import { startCase } from \"lodash-es\";\nimport * 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 { getLocaleForLocaleCode } from \"../localize-date-format/LocaleMapper\";\n\ninterface MonthPickerCellProps {\n month: Date;\n onClick: () => void;\n selected: boolean;\n localeCode: string;\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 () => startCase(format(month, \"MMM\", { locale })),\n [locale, month],\n );\n\n const abbr = useMemo(\n () => startCase(format(month, \"MMMM\", { 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 { useMemo } from \"react\";\n\nexport const useToday = () => {\n return useMemo(() => new Date(), []);\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 { Column, exhaustSwitchCase, Heading } from \"@stenajs-webui/core\";\nimport { MonthPickerCell } from \"./MonthPickerCell\";\nimport { addMonths, isSameMonth } from \"date-fns\";\nimport { createMonths } from \"./MonthPickerDataFactory\";\nimport { useToday } from \"../travel-calendar/util/UseToday\";\n\nexport type MonthPickerSizeVariant = \"small\" | \"medium\" | \"large\";\n\nexport interface MonthPickerProps extends ValueAndOnValueChangeProps<Date> {\n localeCode: string;\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 \"small\":\n return \"280px\";\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 \"small\":\n return 3;\n case \"medium\":\n return 4;\n case \"large\":\n return 5;\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 } 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 { getLocaleCodeForLocale } from \"../localize-date-format/LocaleMapper\";\n\ninterface CalendarWithMonthYearPickersProps<T>\n extends Omit<CalendarProps<T>, \"date\" | \"year\" | \"month\"> {\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}\n\nexport const CalendarWithMonthYearPickers =\n function CalendarWithMonthYearPickers<T>({\n locale,\n dateInFocus,\n setDateInFocus,\n currentPanel,\n setCurrentPanel,\n renderMonthPicker,\n ...props\n }: CalendarWithMonthYearPickersProps<T>) {\n const localeCode = useMemo(\n () =>\n locale == null ? \"en-GB\" : (getLocaleCodeForLocale(locale) ?? \"en-GB\"),\n [locale],\n );\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: new Date(),\n numMonths: 24,\n dateInFocus,\n })\n ) : (\n <MonthPicker\n value={dateInFocus}\n onValueChange={onChangeSelectedMonth}\n localeCode={localeCode}\n firstMonth={new Date()}\n numMonths={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}\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 ...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 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}: MultiDateCalendarProps<T>): CalendarWithMonthSwitcherProps<T> => {\n const { currentPanel, setCurrentPanel } =\n useInternalPanelState(onChangePanel);\n\n const [dateInFocus, setDateInFocus] = useState(() => new Date());\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 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 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 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 { 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={(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 {...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 { MutableRefObject, 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>;\n canScrollRef: MutableRefObject<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>,\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>,\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>,\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 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>,\n endDateInputRef: RefObject<HTMLInputElement>,\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 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,\n endDate,\n setCurrentPanel,\n showCalendarInternal,\n 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>,\n endDateInputRef: RefObject<HTMLInputElement>,\n showCalendar: () => void,\n hideCalendar: () => void,\n {\n firstFocusedInput,\n setFirstFocusedInput,\n isCalendarVisible,\n setFocusedInput,\n focusedInput,\n setCurrentPanel,\n }: UseInputStatesResult,\n) => {\n const onFocusLeft = useCallback(() => {\n if (firstFocusedInput == null) {\n setFirstFocusedInput(\"startDate\");\n }\n setFocusedInput(\"startDate\");\n if (!isCalendarVisible) {\n showCalendar();\n }\n }, [\n isCalendarVisible,\n setFocusedInput,\n showCalendar,\n setFirstFocusedInput,\n firstFocusedInput,\n ]);\n\n const onFocusRight = useCallback(() => {\n if (firstFocusedInput == null) {\n setFirstFocusedInput(\"endDate\");\n }\n setFocusedInput(\"endDate\");\n if (!isCalendarVisible) {\n showCalendar();\n }\n }, [\n isCalendarVisible,\n setFocusedInput,\n showCalendar,\n setFirstFocusedInput,\n firstFocusedInput,\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 } 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}\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 variant,\n disabled,\n zIndex,\n appendTo,\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 <CalendarWithMonthSwitcher\n onClickDay={onClickDay}\n dateInFocus={dateInFocus}\n setDateInFocus={setDateInFocus}\n currentPanel={currentPanel}\n setCurrentPanel={setCurrentPanel}\n minDate={minDate}\n maxDate={maxDate}\n {...calendarProps}\n statePerMonth={statePerMonth}\n />\n </ControlledPopover>\n </Box>\n );\n}\n","import * as React from \"react\";\nimport { FocusEventHandler, useCallback, useRef, useState } 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 | \"onChange\"\n | \"onValueChange\"\n | \"value\"\n | \"onFocus\"\n | \"onBlur\"\n | \"placeholder\"\n | \"label\"\n | \"borderRadiusVariant\"\n > {\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}\n\nexport const TravelDateTextInput: React.FC<TravelDateTextInputProps> = ({\n onChange,\n onValueChange,\n mask,\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 ...inputProps\n}) => {\n const inputRef = useRef(null);\n const [isFocused, setIsFocused] = useState(false);\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 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 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 \"small\":\n return \"140px\";\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\nexport const getDateFormatForLocaleCode = (locale: string): string => {\n const formatter = new Intl.DateTimeFormat(locale, { 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 { getLocaleForLocaleCode } from \"./LocaleMapper\";\n\nexport const parseLocalizedDateString = (\n dateString: string,\n localeCode: string,\n referenceDate?: Date,\n): Date | undefined => {\n const locale = getLocaleForLocaleCode(localeCode);\n\n if (locale == null) {\n return undefined;\n }\n\n const date = parse(\n dateString,\n getDateFormatForLocaleCode(localeCode),\n 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 { getLocaleForLocaleCode } from \"./LocaleMapper\";\n\nexport const formatLocalizedDate = (date: Date, localeCode: string): string =>\n format(date, getDateFormatForLocaleCode(localeCode), {\n locale: getLocaleForLocaleCode(localeCode),\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 { 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\";\n\nexport interface TravelDateRangeTextInputFieldsProps {\n value: TravelDateRangeInputValue | undefined;\n onValueChange:\n | ((value: Partial<TravelDateRangeInputValue>) => void)\n | undefined;\n localeCode: string;\n startDateLabel?: string;\n endDateLabel?: string;\n onFocus?: () => void;\n calendarSize: TravelCalendarSizeVariant;\n placeholderWhenBlurredStartDate: string | undefined;\n placeholderWhenBlurredEndDate: string | undefined;\n valueWhenBlurredStartDate: string | undefined;\n valueWhenBlurredEndDate: string | undefined;\n variant: DateTextInputVariant;\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 calendarSize,\n placeholderWhenBlurredStartDate,\n placeholderWhenBlurredEndDate,\n valueWhenBlurredStartDate,\n valueWhenBlurredEndDate,\n variant,\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?.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 }}\n onFocus={onFocus}\n label={startDateLabel}\n borderRadiusVariant={\"onlyLeft\"}\n placeholder={placeholder}\n placeholderWhenBlurred={placeholderWhenBlurredStartDate}\n valueWhenBlurred={valueWhenBlurredStartDate}\n calendarSize={calendarSize}\n variant={variant}\n />\n <TravelDateTextInput\n mask={mask}\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 }}\n onFocus={onFocus}\n label={endDateLabel}\n borderRadiusVariant={\"onlyRight\"}\n placeholder={placeholder}\n placeholderWhenBlurred={placeholderWhenBlurredEndDate}\n valueWhenBlurred={valueWhenBlurredEndDate}\n calendarSize={calendarSize}\n variant={variant}\n />\n </Row>\n );\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 {\n getDefaultLocaleForFormatting,\n getLocaleForLocaleCode,\n} from \"../../localize-date-format/LocaleMapper\";\nimport { useCallback, useId, useMemo, useRef, useState } from \"react\";\nimport { useToday } from \"../util/UseToday\";\nimport { getDateFormatForLocaleCode } from \"../../localize-date-format/DateFormatProvider\";\nimport { parseLocalizedDateString } from \"../../localize-date-format/LocalizedDateParser\";\nimport { format, isAfter, isBefore, isSameDay, isSameMonth } from \"date-fns\";\nimport { getMonthInYear } from \"../../../util/calendar/CalendarDataFactory\";\nimport { startCase } from \"lodash-es\";\nimport { formatLocalizedDate } from \"../../localize-date-format/LocalizedDateFormatter\";\nimport { TravelDateRangeInputValue, VisiblePanel } from \"../types\";\nimport { formatDateDescription } from \"../util/DateDescriptionFormatter\";\n\nexport const useTravelDateRangeInput = (\n value: TravelDateRangeInputValue | undefined,\n onValueChange: ((value: TravelDateRangeInputValue) => void) | undefined,\n localeCode: string,\n initialMonthInFocus: Date | undefined,\n) => {\n const locale =\n getLocaleForLocaleCode(localeCode) ?? getDefaultLocaleForFormatting();\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, locale)\n : undefined,\n [locale, selectedStartDate, today],\n );\n\n const valueWhenBlurredEndDate = useMemo(\n () =>\n selectedEndDate != null\n ? formatDateDescription(selectedEndDate, today, locale)\n : undefined,\n [locale, selectedEndDate, today],\n );\n\n const [visibleMonth, setVisibleMonth] = useState<Date>(\n initialMonthInFocus ?? selectedStartDate ?? new Date(),\n );\n\n const setVisibleMonthClamped = useCallback(\n (month: Date) => {\n if (isSameMonth(month, today) || isAfter(month, today)) {\n setVisibleMonth(month);\n } else {\n setVisibleMonth(today);\n }\n },\n [today],\n );\n\n const visibleMonthData = useMemo(\n () =>\n getMonthInYear(\n visibleMonth.getFullYear(),\n visibleMonth.getMonth(),\n locale,\n ),\n [locale, visibleMonth],\n );\n\n const monthPickerButtonLabel = useMemo(() => {\n return startCase(format(visibleMonth, \"MMMM yyyy\", { locale }));\n }, [locale, 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 prevMonthDisabled = useMemo(\n () => isSameMonth(today, visibleMonth) || isBefore(visibleMonth, today),\n [today, visibleMonth],\n );\n\n const isValidDateRange = useMemo(\n () =>\n (selectedStartDate &&\n selectedEndDate &&\n (isSameDay(selectedStartDate, selectedEndDate) ||\n isBefore(selectedStartDate, selectedEndDate))) ??\n false,\n [selectedEndDate, selectedStartDate],\n );\n\n const isDateDisabled = useCallback<(date: Date) => boolean>(\n (date) => !isSameDay(date, today) && isBefore(date, today),\n [today],\n );\n\n const onClickDate = (date: Date) => {\n const isSameMonthAndYear =\n date.getFullYear() === visibleMonth.getFullYear() &&\n date.getMonth() === visibleMonth.getMonth();\n\n if (isSameMonthAndYear) {\n if (selectedStartDate && selectedEndDate == null) {\n if (isBefore(date, selectedStartDate)) {\n onValueChange?.({\n startDate: formatLocalizedDate(date, localeCode),\n endDate: undefined,\n });\n } else {\n onValueChange?.({\n startDate: value?.startDate,\n endDate: formatLocalizedDate(date, localeCode),\n });\n }\n } else {\n onValueChange?.({\n startDate: formatLocalizedDate(date, localeCode),\n endDate: undefined,\n });\n }\n }\n };\n\n return {\n isDateDisabled,\n onClickDate,\n onValueChangeByInputs,\n isValidDateRange,\n prevMonthDisabled,\n monthPickerButtonRef,\n calendarId,\n monthPickerButtonLabel,\n visiblePanel,\n setVisiblePanel,\n setVisibleMonth,\n visibleMonthData,\n todayIsInVisibleMonth,\n hoverDate,\n setHoverDate,\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: 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 calendarSize,\n previousMonthButtonTestId,\n nextMonthButtonTestId,\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={calendarSize === \"small\" ? \"medium\" : \"large\"}\n />\n <Row alignItems={\"center\"} gap={2}>\n <SecondaryButton\n leftIcon={stenaArrowLeft}\n onClick={() => setVisibleMonth(subMonths(visibleMonth, 1))}\n disabled={prevMonthDisabled}\n aria-label={previousMonthButtonAriaLabel}\n size={calendarSize === \"small\" ? \"medium\" : \"large\"}\n data-testid={previousMonthButtonTestId}\n />\n <SecondaryButton\n leftIcon={stenaArrowRight}\n onClick={() => setVisibleMonth(addMonths(visibleMonth, 1))}\n aria-label={nextMonthButtonAriaLabel}\n size={calendarSize === \"small\" ? \"medium\" : \"large\"}\n data-testid={nextMonthButtonTestId}\n />\n </Row>\n </Row>\n );\n};\n","import { cssColor } from \"@stenajs-webui/theme\";\nimport { isAfter, isBefore, isSameDay } from \"date-fns\";\n\nconst rangeBgColor = cssColor(\"--lhds-color-red-100\");\n\nexport const getCellBackgroundColors = (\n date: Date,\n selectedStartDate: Date | undefined,\n selectedEndDate: Date | undefined,\n hoverDate: Date | undefined,\n dayIsInMonth: boolean,\n isValidDateRange: boolean,\n): { left: string; right: string } => {\n if (!dayIsInMonth) {\n return {\n left: \"transparent\",\n right: \"transparent\",\n };\n }\n\n if (\n selectedStartDate &&\n selectedEndDate &&\n isSameDay(selectedStartDate, selectedEndDate)\n ) {\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 const isInSelectionRange =\n selectedStartDate && selectedEndDate\n ? isAfter(date, selectedStartDate) &&\n isBefore(date, selectedEndDate) &&\n !isSameDay(date, selectedStartDate) &&\n !isSameDay(date, selectedEndDate)\n : false;\n\n const isInHoverRange =\n selectedStartDate && hoverDate\n ? isAfter(date, selectedStartDate) &&\n isBefore(date, hoverDate) &&\n !isSameDay(date, selectedStartDate) &&\n !isSameDay(date, hoverDate)\n : false;\n\n if (isInSelectionRange) {\n return {\n left: rangeBgColor,\n right: rangeBgColor,\n };\n }\n\n if (selectedStartDate && selectedEndDate) {\n if (isSameDay(date, selectedStartDate)) {\n return {\n left: \"transparent\",\n right: rangeBgColor,\n };\n }\n\n if (isSameDay(date, selectedEndDate)) {\n return {\n left: rangeBgColor,\n right: \"transparent\",\n };\n }\n\n return {\n left: \"transparent\",\n right: \"transparent\",\n };\n }\n\n if (selectedStartDate && hoverDate && isAfter(hoverDate, selectedStartDate)) {\n if (isSameDay(date, selectedStartDate)) {\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 if (isInHoverRange) {\n return {\n left: rangeBgColor,\n right: rangeBgColor,\n };\n }\n\n return {\n left: \"transparent\",\n right: \"transparent\",\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 { 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 { 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\";\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 onStartHover: (date: Date) => void;\n onEndHover: (date: Date) => void;\n hoverDate: Date | undefined;\n today: Date;\n todayIsInVisibleMonth: boolean;\n calendarId: string;\n isDateDisabled: (date: Date) => boolean;\n dateTestId?: (date: Date) => string | undefined;\n size: TravelCalendarSizeVariant;\n}\n\nexport const TravelDateCell: React.FC<TravelDateCellProps> = ({\n onClick,\n visibleMonth,\n onChangeVisibleMonth,\n day,\n isValidDateRange,\n selectedStartDate,\n selectedEndDate,\n onStartHover,\n onEndHover,\n hoverDate,\n today,\n todayIsInVisibleMonth,\n calendarId,\n isDateDisabled,\n size,\n dateTestId,\n}) => {\n const onKeyDown = useCallback<KeyboardEventHandler<HTMLTableDataCellElement>>(\n async (e) => {\n const nextDate = getDateToFocusOn(day.date, e.key);\n if (nextDate && !isDateDisabled(nextDate)) {\n onStartHover(nextDate);\n if (!isSameMonth(day.date, nextDate)) {\n onChangeVisibleMonth(nextDate);\n setTimeout(() => {\n document.getElementById(createDayId(nextDate, calendarId))?.focus();\n }, 10);\n } else {\n document.getElementById(createDayId(nextDate, calendarId))?.focus();\n }\n }\n\n if (e.key === \"Enter\" || e.code === \"Space\") {\n onClick(day.date);\n }\n },\n [\n calendarId,\n day.date,\n isDateDisabled,\n onChangeVisibleMonth,\n onClick,\n onStartHover,\n ],\n );\n\n const dayIsInMonth = day.month === visibleMonth.getMonth();\n\n const disabled = isDateDisabled(day.date);\n\n const isSelectionStart = selectedStartDate\n ? isSameDay(selectedStartDate, day.date)\n : false;\n\n const isSelectionEnd = selectedEndDate\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 hoverDate,\n dayIsInMonth,\n isValidDateRange,\n );\n\n return (\n <td\n className={cx(styles.travelDateCell, styles[size])}\n onClick={disabled ? undefined : () => 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 : getTabIndex(\n day,\n selectedStartDate,\n isToday,\n visibleMonth,\n todayIsInVisibleMonth,\n )\n }\n id={disabled ? undefined : createDayId(day.date, calendarId)}\n onKeyDown={disabled ? undefined : onKeyDown}\n {...(disabled\n ? undefined\n : { \"aria-selected\": isSelectionStart || isSelectionEnd })}\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 isToday ? styles.isToday : undefined,\n selectedStartDate ? styles.startSelected : undefined,\n selectedEndDate ? styles.endSelected : undefined,\n hoverDate && isSameDay(hoverDate, day.date)\n ? styles.hover\n : undefined,\n isSelectionStart && styles.isSelectionStart,\n isSelectionEnd && styles.isSelectionEnd,\n disabled && styles.disabled,\n )}\n >\n <Text\n variant={\"bold\"}\n color={disabled ? cssColor(\"--lhds-color-ui-500\") : undefined}\n >\n {day.dayOfMonth}\n </Text>\n </div>\n )}\n </td>\n );\n};\n\nconst getTabIndex = (\n day: DayData,\n selectedStartDate: Date | undefined,\n isToday: boolean,\n visibleMonth: Date,\n todayIsInVisibleMonth: boolean,\n): number => {\n const selectedStartDateIsVisible = selectedStartDate\n ? isSameMonth(selectedStartDate, visibleMonth)\n : false;\n\n /**\n * If date has been selected that date should be tabIndex = 0.\n * If no date has been selected, today's date should be tabIndex = 0.\n * All else should be -1.\n */\n if (\n selectedStartDate && selectedStartDateIsVisible\n ? isSameDay(day.date, selectedStartDate)\n : isToday\n ) {\n return 0;\n }\n\n if (\n !selectedStartDateIsVisible &&\n !todayIsInVisibleMonth &&\n day.date.getDate() === 1\n ) {\n return 0;\n }\n\n return -1;\n};\n","import * as React 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 } from \"date-fns\";\nimport { Dispatch, SetStateAction } from \"react\";\nimport styles from \"./TravelCalendar.module.css\";\n\nexport type TravelCalendarSizeVariant = \"small\" | \"medium\" | \"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 hoverDate: Date | undefined;\n today: Date;\n isDateDisabled: (date: Date) => boolean;\n dateTestId?: (date: Date) => string | undefined;\n calendarId: string;\n todayIsInVisibleMonth: boolean;\n size?: TravelCalendarSizeVariant;\n multiSelectable: boolean;\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 today,\n calendarId,\n isDateDisabled,\n todayIsInVisibleMonth,\n size = \"medium\",\n multiSelectable,\n dateTestId,\n}) => {\n return (\n <table\n className={styles.travelCalendar}\n role=\"grid\"\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 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 today={today}\n todayIsInVisibleMonth={todayIsInVisibleMonth}\n calendarId={calendarId}\n isDateDisabled={isDateDisabled}\n dateTestId={dateTestId}\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 { TravelDateRangeTextInputFields } 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} from \"../../../features/travel-calendar/types\";\nimport styles from \"./TravelDateRangeInput.module.css\";\nimport cx from \"classnames\";\n\nexport interface RenderBelowCalendarArgs {\n hideCalendar: () => void;\n}\n\nexport interface TravelDateRangeInputProps\n extends ValueAndOnValueChangeProps<TravelDateRangeInputValue> {\n localeCode?: string;\n initialMonthInFocus?: Date;\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 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}\n\nexport const TravelDateRangeInput: React.FC<TravelDateRangeInputProps> = ({\n value,\n onValueChange,\n startDateLabel,\n endDateLabel,\n localeCode = \"sv\",\n initialMonthInFocus,\n previousMonthButtonAriaLabel = \"Previous month\",\n nextMonthButtonAriaLabel = \"Next month\",\n placeholderWhenBlurredStartDate,\n placeholderWhenBlurredEndDate,\n heading,\n headingLevel,\n numMonthsInMonthPicker = 12,\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 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 initialMonthInFocus,\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 localeCode={localeCode}\n startDateLabel={startDateLabel}\n endDateLabel={endDateLabel}\n onFocus={showCalendar}\n calendarSize={size}\n placeholderWhenBlurredStartDate={placeholderWhenBlurredStartDate}\n placeholderWhenBlurredEndDate={placeholderWhenBlurredEndDate}\n variant={textInputVariant}\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 previousMonthButtonTestId={previousMonthButtonTestId}\n nextMonthButtonTestId={nextMonthButtonTestId}\n />\n\n {visiblePanel === \"calendar\" && (\n <TravelCalendar\n {...inputProps}\n size={size}\n multiSelectable={true}\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={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 { 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\";\n\nexport interface TravelDateTextInputFieldProps {\n value: string | undefined;\n onValueChange: ((value: string) => void) | undefined;\n localeCode: string;\n label?: string;\n onFocus?: () => void;\n calendarSize: TravelCalendarSizeVariant;\n placeholderWhenBlurred: string | undefined;\n valueWhenBlurred: string | undefined;\n variant: DateTextInputVariant;\n}\n\nexport const TravelDateTextInputField: React.FC<\n TravelDateTextInputFieldProps\n> = ({\n value,\n onValueChange,\n label = \"Date\",\n localeCode,\n onFocus,\n calendarSize,\n placeholderWhenBlurred,\n valueWhenBlurred,\n variant,\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 onFocus={onFocus}\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 getDefaultLocaleForFormatting,\n getLocaleForLocaleCode,\n} from \"../../localize-date-format/LocaleMapper\";\nimport { useCallback, useId, useMemo, useRef, useState } from \"react\";\nimport { useToday } from \"../util/UseToday\";\nimport { getDateFormatForLocaleCode } from \"../../localize-date-format/DateFormatProvider\";\nimport { parseLocalizedDateString } from \"../../localize-date-format/LocalizedDateParser\";\nimport { format, isAfter, isBefore, isSameDay, isSameMonth } from \"date-fns\";\nimport { getMonthInYear } from \"../../../util/calendar/CalendarDataFactory\";\nimport { startCase } from \"lodash-es\";\nimport { formatLocalizedDate } from \"../../localize-date-format/LocalizedDateFormatter\";\nimport { VisiblePanel } from \"../types\";\nimport { formatDateDescription } from \"../util/DateDescriptionFormatter\";\n\nexport const useTravelDateInput = (\n value: string | undefined,\n onValueChange: ((value: string) => void) | undefined,\n localeCode: string,\n initialMonthInFocus: Date | undefined,\n) => {\n const locale =\n getLocaleForLocaleCode(localeCode) ?? getDefaultLocaleForFormatting();\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, locale)\n : undefined,\n [locale, selectedDate, today],\n );\n\n const [visibleMonth, setVisibleMonth] = useState<Date>(\n initialMonthInFocus ?? selectedDate ?? new Date(),\n );\n\n const setVisibleMonthClamped = useCallback(\n (month: Date) => {\n if (isSameMonth(month, today) || isAfter(month, today)) {\n setVisibleMonth(month);\n } else {\n setVisibleMonth(today);\n }\n },\n [today],\n );\n\n const visibleMonthData = useMemo(\n () =>\n getMonthInYear(\n visibleMonth.getFullYear(),\n visibleMonth.getMonth(),\n locale,\n ),\n [locale, visibleMonth],\n );\n\n const monthPickerButtonLabel = useMemo(() => {\n return startCase(format(visibleMonth, \"MMMM yyyy\", { locale }));\n }, [locale, 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 setVisibleMonthClamped(startDate);\n }\n\n onValueChange?.(v);\n },\n [dateFormat.length, localeCode, onValueChange, setVisibleMonthClamped],\n );\n\n const prevMonthDisabled = useMemo(\n () => isSameMonth(today, visibleMonth) || isBefore(visibleMonth, today),\n [today, visibleMonth],\n );\n\n const isDateDisabled = useCallback<(date: Date) => boolean>(\n (date) => !isSameDay(date, today) && isBefore(date, today),\n [today],\n );\n\n const onClickDate = (date: Date) => {\n onValueChange?.(formatLocalizedDate(date, localeCode));\n };\n\n return {\n isDateDisabled,\n onClickDate,\n onValueChangeByInputs,\n prevMonthDisabled,\n monthPickerButtonRef,\n calendarId,\n monthPickerButtonLabel,\n visiblePanel,\n setVisiblePanel,\n setVisibleMonth,\n visibleMonthData,\n todayIsInVisibleMonth,\n hoverDate,\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 { DateTextInputVariant } from \"../../../features/travel-calendar/types\";\n\nexport interface RenderBelowSingleDateCalendarArgs {\n hideCalendar: () => void;\n}\n\nexport interface TravelDateInputProps\n extends ValueAndOnValueChangeProps<string> {\n localeCode?: string;\n initialMonthInFocus?: Date;\n label?: string;\n previousMonthButtonAriaLabel?: string;\n nextMonthButtonAriaLabel?: string;\n heading?: string;\n headingLevel?: HeadingVariant;\n firstMonthInMonthPicker?: Date;\n numMonthsInMonthPicker?: number;\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}\n\nexport const TravelDateInput: React.FC<TravelDateInputProps> = ({\n value,\n onValueChange,\n label,\n localeCode = \"sv\",\n initialMonthInFocus,\n previousMonthButtonAriaLabel = \"Previous month\",\n nextMonthButtonAriaLabel = \"Next month\",\n placeholderWhenBlurred,\n heading,\n headingLevel,\n numMonthsInMonthPicker = 12,\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 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 initialMonthInFocus,\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 value={value}\n onValueChange={onValueChangeByInputs}\n localeCode={localeCode}\n label={label}\n onFocus={showCalendar}\n calendarSize={size}\n placeholderWhenBlurred={placeholderWhenBlurred}\n variant={textInputVariant}\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 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 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={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 { Column, Heading, HeadingVariant } from \"@stenajs-webui/core\";\nimport { ValueAndOnValueChangeProps } from \"@stenajs-webui/forms\";\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 { useTravelDateInput } from \"../../../features/travel-calendar/hooks/UseTravelDateInput\";\nimport { TravelDateTextInputField } from \"../../../features/travel-calendar/components/TravelDateTextInputField\";\nimport { DateTextInputVariant } from \"../../../features/travel-calendar/types\";\n\nexport interface TravelDateCalendarProps\n extends ValueAndOnValueChangeProps<string> {\n localeCode?: string;\n initialMonthInFocus?: Date;\n label?: string;\n previousMonthButtonAriaLabel?: string;\n nextMonthButtonAriaLabel?: string;\n heading?: string;\n headingLevel?: HeadingVariant;\n firstMonthInMonthPicker?: Date;\n numMonthsInMonthPicker?: number;\n size?: TravelCalendarSizeVariant;\n dateTestId?: (date: Date) => string | undefined;\n previousMonthButtonTestId?: string;\n nextMonthButtonTestId?: string;\n placeholderWhenBlurred?: string;\n textInputVariant?: DateTextInputVariant;\n}\n\nexport const TravelDateCalendar: React.FC<TravelDateCalendarProps> = ({\n value,\n onValueChange,\n label,\n localeCode = \"sv\",\n initialMonthInFocus,\n previousMonthButtonAriaLabel = \"Previous month\",\n nextMonthButtonAriaLabel = \"Next month\",\n placeholderWhenBlurred,\n heading,\n headingLevel,\n numMonthsInMonthPicker = 12,\n firstMonthInMonthPicker = new Date(),\n dateTestId,\n size = \"medium\",\n previousMonthButtonTestId,\n nextMonthButtonTestId,\n textInputVariant = \"standard\",\n}) => {\n const inputProps = useTravelDateInput(\n value,\n onValueChange,\n localeCode,\n initialMonthInFocus,\n );\n\n const {\n visiblePanel,\n visibleMonth,\n onValueChangeByInputs,\n setVisibleMonth,\n setVisiblePanel,\n monthPickerButtonRef,\n selectedDate,\n } = inputProps;\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 />\n\n <MonthHeader\n {...inputProps}\n previousMonthButtonAriaLabel={previousMonthButtonAriaLabel}\n nextMonthButtonAriaLabel={nextMonthButtonAriaLabel}\n calendarSize={size}\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 multiSelectable={false}\n dateTestId={dateTestId}\n />\n )}\n\n {visiblePanel === \"month-picker\" && (\n <MonthPicker\n firstMonth={firstMonthInMonthPicker}\n numMonths={numMonthsInMonthPicker}\n value={visibleMonth}\n localeCode={localeCode}\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 </Column>\n );\n};\n","import * as React from \"react\";\nimport { Column, Heading, HeadingVariant } from \"@stenajs-webui/core\";\nimport { ValueAndOnValueChangeProps } from \"@stenajs-webui/forms\";\nimport { TravelDateRangeTextInputFields } 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} from \"../../../features/travel-calendar/types\";\n\nexport interface TravelDateRangeCalendarProps\n extends ValueAndOnValueChangeProps<TravelDateRangeInputValue> {\n localeCode?: string;\n initialMonthInFocus?: Date;\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 size?: TravelCalendarSizeVariant;\n dateTestId?: (date: Date) => string | undefined;\n previousMonthButtonTestId?: string;\n nextMonthButtonTestId?: string;\n placeholderWhenBlurredStartDate?: string;\n placeholderWhenBlurredEndDate?: string;\n textInputVariant?: DateTextInputVariant;\n}\n\nexport const TravelDateRangeCalendar: React.FC<\n TravelDateRangeCalendarProps\n> = ({\n value,\n onValueChange,\n startDateLabel,\n endDateLabel,\n localeCode = \"sv\",\n initialMonthInFocus,\n previousMonthButtonAriaLabel = \"Previous month\",\n nextMonthButtonAriaLabel = \"Next month\",\n heading,\n headingLevel,\n numMonthsInMonthPicker = 12,\n firstMonthInMonthPicker = new Date(),\n size = \"medium\",\n dateTestId,\n previousMonthButtonTestId,\n nextMonthButtonTestId,\n placeholderWhenBlurredStartDate,\n placeholderWhenBlurredEndDate,\n textInputVariant = \"standard\",\n}) => {\n const inputProps = useTravelDateRangeInput(\n value,\n onValueChange,\n localeCode,\n initialMonthInFocus,\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 localeCode={localeCode}\n startDateLabel={startDateLabel}\n endDateLabel={endDateLabel}\n calendarSize={size}\n placeholderWhenBlurredStartDate={placeholderWhenBlurredStartDate}\n placeholderWhenBlurredEndDate={placeholderWhenBlurredEndDate}\n variant={textInputVariant}\n />\n\n <MonthHeader\n {...inputProps}\n previousMonthButtonAriaLabel={previousMonthButtonAriaLabel}\n nextMonthButtonAriaLabel={nextMonthButtonAriaLabel}\n calendarSize={size}\n previousMonthButtonTestId={previousMonthButtonTestId}\n nextMonthButtonTestId={nextMonthButtonTestId}\n />\n\n {visiblePanel === \"calendar\" && (\n <TravelCalendar\n {...inputProps}\n size={size}\n multiSelectable={true}\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={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 </Column>\n );\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","Month","Month2","WeekDay","WeekDay2","getMonthsInYear","year","startMonth","numMonths","locale","months","i","getMonthInYear","yearToUse","monthToUse","firstDayOfMonth","startCase","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","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","deAT","de","fr","es","sv","pl","da","nl","nb","getLocaleForLocaleCode","localeCode","getDefaultLocaleForFormatting","getLocaleCodeForLocale","localeCodes","MonthPickerCell","onClick","selected","autoFocus","size","label","abbr","ref","useRef","domId","tabIndex","useEffect","_a","onKeyDown","useCallback","nextDomId","PrimaryButton","createMonths","firstMonth","currentYear","currentRow","currentColumn","currentMonth","input","addMonths","useToday","MonthPicker","value","onValueChange","onCancel","useId","today","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","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","_b","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","_d","_c","DateRangeDualTextInput","TravelDateTextInput","mask","pipe","guide","keepCharPositions","placeholderChar","showMask","calendarSize","onFocus","placeholderWhenBlurred","valueWhenBlurred","inputProps","inputRef","isFocused","setIsFocused","maskedOnChange","useMaskedInput","onFocusHandler","onBlurHandler","activePlaceholder","Label","LabelledTextInput","calenderSize","yearMask","monthMask","dayMask","createInputMaskForDateFormat","splitByNewLetter","tokenToMask","token","str","currentSegment","getDateFormatForLocaleCode","formatMap","part","parseLocalizedDateString","dateString","referenceDate","formatLocalizedDate","reformatLocalizedDateString","TravelDateRangeTextInputFields","startDateLabel","endDateLabel","placeholderWhenBlurredStartDate","placeholderWhenBlurredEndDate","valueWhenBlurredStartDate","valueWhenBlurredEndDate","dateFormatForLocaleCode","formatDateDescription","isSameYear","useTravelDateRangeInput","initialMonthInFocus","calendarId","monthPickerButtonRef","selectedStartDate","selectedEndDate","visibleMonth","setVisibleMonth","setVisibleMonthClamped","visibleMonthData","monthPickerButtonLabel","todayIsInVisibleMonth","hoverDate","setHoverDate","visiblePanel","setVisiblePanel","onValueChangeByInputs","prevMonthDisabled","isValidDateRange","MonthHeader","previousMonthButtonAriaLabel","nextMonthButtonAriaLabel","previousMonthButtonTestId","nextMonthButtonTestId","stenaAngleUp","rangeBgColor","getCellBackgroundColors","dayIsInMonth","isInSelectionRange","isInHoverRange","getDateToFocusOn","currentDate","createDayId","TravelDateCellBackground","bgColorLeft","bgColorRight","TravelDateCell","onChangeVisibleMonth","onStartHover","onEndHover","isDateDisabled","dateTestId","e","nextDate","isSelectionStart","isSelectionEnd","isToday","bgColors","getTabIndex","selectedStartDateIsVisible","TravelCalendar","onClickDate","multiSelectable","TravelDateRangeInput","heading","headingLevel","numMonthsInMonthPicker","firstMonthInMonthPicker","zIndexWhenClosed","onHideCalendar","renderBelowCalendar","textInputVariant","calendarOpen","setCalendarOpen","calendarInDom","setCalendarInDom","boxSize","setBoxSize","inputFieldsHeight","calendarOpenRef","sizeSourceRef","useOnClickOutside","useLayoutEffect","height","CardBody","TravelDateTextInputField","useTravelDateInput","selectedDate","TravelDateInput","TravelDateCalendar","TravelDateRangeCalendar"],"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/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/travel-calendar/util/UseToday.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/util/DateDescriptionFormatter.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/components/calendar-types/travel-date-calendar/TravelDateCalendar.tsx","../src/components/calendar-types/travel-date-range-calendar/TravelDateRangeCalendar.tsx"],"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","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 { startCase } from \"lodash-es\";\nimport { DateFormats } from \"../date/DateFormats\";\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: startCase(\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}: 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 && (\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 [\"disabled\"],\n [true],\n false,\n );\n","import { Box, Clickable, Text } from \"@stenajs-webui/core\";\nimport * as React 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?: JSX.Element;\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 enUS,\n es,\n fr,\n nb,\n nl,\n pl,\n sv,\n} from \"date-fns/locale\";\n\ntype LocalesMap = {\n [key: string]: Locale;\n};\n\nconst locales: LocalesMap = {\n \"en-US\": enUS,\n \"en-GB\": enGB,\n \"de-AT\": deAT,\n \"de-DE\": de,\n \"sv-SE\": sv,\n \"da-DK\": da,\n fr,\n de,\n es,\n sv,\n pl,\n da,\n nl,\n nb,\n};\n\nexport const getLocaleForLocaleCode = (\n localeCode: string,\n): Locale | undefined => {\n const exactMatch = locales[localeCode];\n if (exactMatch != null) {\n return exactMatch;\n }\n\n const languageCode = getMappedLocaleCodeMatchingLanguage(localeCode);\n\n if (languageCode != null) {\n const languageMatch = locales[languageCode];\n if (languageMatch != null) {\n return languageMatch;\n }\n }\n\n return undefined;\n};\n\nexport const getMappedLocaleCodeMatchingLanguage = (\n localeCode: string,\n): string | 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;\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 = (locale: Locale): string | undefined => {\n const localeCodes = Object.keys(locales);\n for (const localeCode of localeCodes) {\n if (locales[localeCode].code === locale.code) {\n return localeCode;\n }\n }\n return undefined;\n};\n","import { startCase } from \"lodash-es\";\nimport * 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 { getLocaleForLocaleCode } from \"../localize-date-format/LocaleMapper\";\n\ninterface MonthPickerCellProps {\n month: Date;\n onClick: () => void;\n selected: boolean;\n localeCode: string;\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 () => startCase(format(month, \"MMM\", { locale })),\n [locale, month],\n );\n\n const abbr = useMemo(\n () => startCase(format(month, \"MMMM\", { 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 { useMemo } from \"react\";\n\nexport const useToday = () => {\n return useMemo(() => new Date(), []);\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 { Column, exhaustSwitchCase, Heading } from \"@stenajs-webui/core\";\nimport { MonthPickerCell } from \"./MonthPickerCell\";\nimport { addMonths, isSameMonth } from \"date-fns\";\nimport { createMonths } from \"./MonthPickerDataFactory\";\nimport { useToday } from \"../travel-calendar/util/UseToday\";\n\nexport type MonthPickerSizeVariant = \"small\" | \"medium\" | \"large\";\n\nexport interface MonthPickerProps extends ValueAndOnValueChangeProps<Date> {\n localeCode: string;\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 \"small\":\n return \"280px\";\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 \"small\":\n return 3;\n case \"medium\":\n return 4;\n case \"large\":\n return 5;\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 } 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 { getLocaleCodeForLocale } from \"../localize-date-format/LocaleMapper\";\n\ninterface CalendarWithMonthYearPickersProps<T>\n extends Omit<CalendarProps<T>, \"date\" | \"year\" | \"month\"> {\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}\n\nexport const CalendarWithMonthYearPickers =\n function CalendarWithMonthYearPickers<T>({\n locale,\n dateInFocus,\n setDateInFocus,\n currentPanel,\n setCurrentPanel,\n renderMonthPicker,\n ...props\n }: CalendarWithMonthYearPickersProps<T>) {\n const localeCode = useMemo(\n () =>\n locale == null ? \"en-GB\" : (getLocaleCodeForLocale(locale) ?? \"en-GB\"),\n [locale],\n );\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: new Date(),\n numMonths: 24,\n dateInFocus,\n })\n ) : (\n <MonthPicker\n value={dateInFocus}\n onValueChange={onChangeSelectedMonth}\n localeCode={localeCode}\n firstMonth={new Date()}\n numMonths={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}\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 ...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 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}: MultiDateCalendarProps<T>): CalendarWithMonthSwitcherProps<T> => {\n const { currentPanel, setCurrentPanel } =\n useInternalPanelState(onChangePanel);\n\n const [dateInFocus, setDateInFocus] = useState(() => new Date());\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 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 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 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 { 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={(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 {...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 { MutableRefObject, 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>;\n canScrollRef: MutableRefObject<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>,\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>,\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>,\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 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>,\n endDateInputRef: RefObject<HTMLInputElement>,\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 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,\n endDate,\n setCurrentPanel,\n showCalendarInternal,\n 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>,\n endDateInputRef: RefObject<HTMLInputElement>,\n showCalendar: () => void,\n hideCalendar: () => void,\n {\n firstFocusedInput,\n setFirstFocusedInput,\n isCalendarVisible,\n setFocusedInput,\n focusedInput,\n setCurrentPanel,\n }: UseInputStatesResult,\n) => {\n const onFocusLeft = useCallback(() => {\n if (firstFocusedInput == null) {\n setFirstFocusedInput(\"startDate\");\n }\n setFocusedInput(\"startDate\");\n if (!isCalendarVisible) {\n showCalendar();\n }\n }, [\n isCalendarVisible,\n setFocusedInput,\n showCalendar,\n setFirstFocusedInput,\n firstFocusedInput,\n ]);\n\n const onFocusRight = useCallback(() => {\n if (firstFocusedInput == null) {\n setFirstFocusedInput(\"endDate\");\n }\n setFocusedInput(\"endDate\");\n if (!isCalendarVisible) {\n showCalendar();\n }\n }, [\n isCalendarVisible,\n setFocusedInput,\n showCalendar,\n setFirstFocusedInput,\n firstFocusedInput,\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 } 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}\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 variant,\n disabled,\n zIndex,\n appendTo,\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 <CalendarWithMonthSwitcher\n onClickDay={onClickDay}\n dateInFocus={dateInFocus}\n setDateInFocus={setDateInFocus}\n currentPanel={currentPanel}\n setCurrentPanel={setCurrentPanel}\n minDate={minDate}\n maxDate={maxDate}\n {...calendarProps}\n statePerMonth={statePerMonth}\n />\n </ControlledPopover>\n </Box>\n );\n}\n","import * as React from \"react\";\nimport { FocusEventHandler, useCallback, useRef, useState } 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 | \"onChange\"\n | \"onValueChange\"\n | \"value\"\n | \"onFocus\"\n | \"onBlur\"\n | \"placeholder\"\n | \"label\"\n | \"borderRadiusVariant\"\n > {\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}\n\nexport const TravelDateTextInput: React.FC<TravelDateTextInputProps> = ({\n onChange,\n onValueChange,\n mask,\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 ...inputProps\n}) => {\n const inputRef = useRef(null);\n const [isFocused, setIsFocused] = useState(false);\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 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 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 \"small\":\n return \"140px\";\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\nexport const getDateFormatForLocaleCode = (locale: string): string => {\n const formatter = new Intl.DateTimeFormat(locale, { 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 { getLocaleForLocaleCode } from \"./LocaleMapper\";\n\nexport const parseLocalizedDateString = (\n dateString: string,\n localeCode: string,\n referenceDate?: Date,\n): Date | undefined => {\n const locale = getLocaleForLocaleCode(localeCode);\n\n if (locale == null) {\n return undefined;\n }\n\n const date = parse(\n dateString,\n getDateFormatForLocaleCode(localeCode),\n 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 { getLocaleForLocaleCode } from \"./LocaleMapper\";\n\nexport const formatLocalizedDate = (date: Date, localeCode: string): string =>\n format(date, getDateFormatForLocaleCode(localeCode), {\n locale: getLocaleForLocaleCode(localeCode),\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 { 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\";\n\nexport interface TravelDateRangeTextInputFieldsProps {\n value: TravelDateRangeInputValue | undefined;\n onValueChange:\n | ((value: Partial<TravelDateRangeInputValue>) => void)\n | undefined;\n localeCode: string;\n startDateLabel?: string;\n endDateLabel?: string;\n onFocus?: () => void;\n calendarSize: TravelCalendarSizeVariant;\n placeholderWhenBlurredStartDate: string | undefined;\n placeholderWhenBlurredEndDate: string | undefined;\n valueWhenBlurredStartDate: string | undefined;\n valueWhenBlurredEndDate: string | undefined;\n variant: DateTextInputVariant;\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 calendarSize,\n placeholderWhenBlurredStartDate,\n placeholderWhenBlurredEndDate,\n valueWhenBlurredStartDate,\n valueWhenBlurredEndDate,\n variant,\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?.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 }}\n onFocus={onFocus}\n label={startDateLabel}\n borderRadiusVariant={\"onlyLeft\"}\n placeholder={placeholder}\n placeholderWhenBlurred={placeholderWhenBlurredStartDate}\n valueWhenBlurred={valueWhenBlurredStartDate}\n calendarSize={calendarSize}\n variant={variant}\n />\n <TravelDateTextInput\n mask={mask}\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 }}\n onFocus={onFocus}\n label={endDateLabel}\n borderRadiusVariant={\"onlyRight\"}\n placeholder={placeholder}\n placeholderWhenBlurred={placeholderWhenBlurredEndDate}\n valueWhenBlurred={valueWhenBlurredEndDate}\n calendarSize={calendarSize}\n variant={variant}\n />\n </Row>\n );\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 {\n getDefaultLocaleForFormatting,\n getLocaleForLocaleCode,\n} from \"../../localize-date-format/LocaleMapper\";\nimport { useCallback, useId, useMemo, useRef, useState } from \"react\";\nimport { useToday } from \"../util/UseToday\";\nimport { getDateFormatForLocaleCode } from \"../../localize-date-format/DateFormatProvider\";\nimport { parseLocalizedDateString } from \"../../localize-date-format/LocalizedDateParser\";\nimport { format, isAfter, isBefore, isSameDay, isSameMonth } from \"date-fns\";\nimport { getMonthInYear } from \"../../../util/calendar/CalendarDataFactory\";\nimport { startCase } from \"lodash-es\";\nimport { formatLocalizedDate } from \"../../localize-date-format/LocalizedDateFormatter\";\nimport { TravelDateRangeInputValue, VisiblePanel } from \"../types\";\nimport { formatDateDescription } from \"../util/DateDescriptionFormatter\";\n\nexport const useTravelDateRangeInput = (\n value: TravelDateRangeInputValue | undefined,\n onValueChange: ((value: TravelDateRangeInputValue) => void) | undefined,\n localeCode: string,\n initialMonthInFocus: Date | undefined,\n) => {\n const locale =\n getLocaleForLocaleCode(localeCode) ?? getDefaultLocaleForFormatting();\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, locale)\n : undefined,\n [locale, selectedStartDate, today],\n );\n\n const valueWhenBlurredEndDate = useMemo(\n () =>\n selectedEndDate != null\n ? formatDateDescription(selectedEndDate, today, locale)\n : undefined,\n [locale, selectedEndDate, today],\n );\n\n const [visibleMonth, setVisibleMonth] = useState<Date>(\n initialMonthInFocus ?? selectedStartDate ?? new Date(),\n );\n\n const setVisibleMonthClamped = useCallback(\n (month: Date) => {\n if (isSameMonth(month, today) || isAfter(month, today)) {\n setVisibleMonth(month);\n } else {\n setVisibleMonth(today);\n }\n },\n [today],\n );\n\n const visibleMonthData = useMemo(\n () =>\n getMonthInYear(\n visibleMonth.getFullYear(),\n visibleMonth.getMonth(),\n locale,\n ),\n [locale, visibleMonth],\n );\n\n const monthPickerButtonLabel = useMemo(() => {\n return startCase(format(visibleMonth, \"MMMM yyyy\", { locale }));\n }, [locale, 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 prevMonthDisabled = useMemo(\n () => isSameMonth(today, visibleMonth) || isBefore(visibleMonth, today),\n [today, visibleMonth],\n );\n\n const isValidDateRange = useMemo(\n () =>\n (selectedStartDate &&\n selectedEndDate &&\n (isSameDay(selectedStartDate, selectedEndDate) ||\n isBefore(selectedStartDate, selectedEndDate))) ??\n false,\n [selectedEndDate, selectedStartDate],\n );\n\n const isDateDisabled = useCallback<(date: Date) => boolean>(\n (date) => !isSameDay(date, today) && isBefore(date, today),\n [today],\n );\n\n const onClickDate = (date: Date) => {\n const isSameMonthAndYear =\n date.getFullYear() === visibleMonth.getFullYear() &&\n date.getMonth() === visibleMonth.getMonth();\n\n if (isSameMonthAndYear) {\n if (selectedStartDate && selectedEndDate == null) {\n if (isBefore(date, selectedStartDate)) {\n onValueChange?.({\n startDate: formatLocalizedDate(date, localeCode),\n endDate: undefined,\n });\n } else {\n onValueChange?.({\n startDate: value?.startDate,\n endDate: formatLocalizedDate(date, localeCode),\n });\n }\n } else {\n onValueChange?.({\n startDate: formatLocalizedDate(date, localeCode),\n endDate: undefined,\n });\n }\n }\n };\n\n return {\n isDateDisabled,\n onClickDate,\n onValueChangeByInputs,\n isValidDateRange,\n prevMonthDisabled,\n monthPickerButtonRef,\n calendarId,\n monthPickerButtonLabel,\n visiblePanel,\n setVisiblePanel,\n setVisibleMonth,\n visibleMonthData,\n todayIsInVisibleMonth,\n hoverDate,\n setHoverDate,\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: 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 calendarSize,\n previousMonthButtonTestId,\n nextMonthButtonTestId,\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={calendarSize === \"small\" ? \"medium\" : \"large\"}\n />\n <Row alignItems={\"center\"} gap={2}>\n <SecondaryButton\n leftIcon={stenaArrowLeft}\n onClick={() => setVisibleMonth(subMonths(visibleMonth, 1))}\n disabled={prevMonthDisabled}\n aria-label={previousMonthButtonAriaLabel}\n size={calendarSize === \"small\" ? \"medium\" : \"large\"}\n data-testid={previousMonthButtonTestId}\n />\n <SecondaryButton\n leftIcon={stenaArrowRight}\n onClick={() => setVisibleMonth(addMonths(visibleMonth, 1))}\n aria-label={nextMonthButtonAriaLabel}\n size={calendarSize === \"small\" ? \"medium\" : \"large\"}\n data-testid={nextMonthButtonTestId}\n />\n </Row>\n </Row>\n );\n};\n","import { cssColor } from \"@stenajs-webui/theme\";\nimport { isAfter, isBefore, isSameDay } from \"date-fns\";\n\nconst rangeBgColor = cssColor(\"--lhds-color-red-100\");\n\nexport const getCellBackgroundColors = (\n date: Date,\n selectedStartDate: Date | undefined,\n selectedEndDate: Date | undefined,\n hoverDate: Date | undefined,\n dayIsInMonth: boolean,\n isValidDateRange: boolean,\n): { left: string; right: string } => {\n if (!dayIsInMonth) {\n return {\n left: \"transparent\",\n right: \"transparent\",\n };\n }\n\n if (\n selectedStartDate &&\n selectedEndDate &&\n isSameDay(selectedStartDate, selectedEndDate)\n ) {\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 const isInSelectionRange =\n selectedStartDate && selectedEndDate\n ? isAfter(date, selectedStartDate) &&\n isBefore(date, selectedEndDate) &&\n !isSameDay(date, selectedStartDate) &&\n !isSameDay(date, selectedEndDate)\n : false;\n\n const isInHoverRange =\n selectedStartDate && hoverDate\n ? isAfter(date, selectedStartDate) &&\n isBefore(date, hoverDate) &&\n !isSameDay(date, selectedStartDate) &&\n !isSameDay(date, hoverDate)\n : false;\n\n if (isInSelectionRange) {\n return {\n left: rangeBgColor,\n right: rangeBgColor,\n };\n }\n\n if (selectedStartDate && selectedEndDate) {\n if (isSameDay(date, selectedStartDate)) {\n return {\n left: \"transparent\",\n right: rangeBgColor,\n };\n }\n\n if (isSameDay(date, selectedEndDate)) {\n return {\n left: rangeBgColor,\n right: \"transparent\",\n };\n }\n\n return {\n left: \"transparent\",\n right: \"transparent\",\n };\n }\n\n if (selectedStartDate && hoverDate && isAfter(hoverDate, selectedStartDate)) {\n if (isSameDay(date, selectedStartDate)) {\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 if (isInHoverRange) {\n return {\n left: rangeBgColor,\n right: rangeBgColor,\n };\n }\n\n return {\n left: \"transparent\",\n right: \"transparent\",\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 { 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 { 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\";\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 onStartHover: (date: Date) => void;\n onEndHover: (date: Date) => void;\n hoverDate: Date | undefined;\n today: Date;\n todayIsInVisibleMonth: boolean;\n calendarId: string;\n isDateDisabled: (date: Date) => boolean;\n dateTestId?: (date: Date) => string | undefined;\n size: TravelCalendarSizeVariant;\n}\n\nexport const TravelDateCell: React.FC<TravelDateCellProps> = ({\n onClick,\n visibleMonth,\n onChangeVisibleMonth,\n day,\n isValidDateRange,\n selectedStartDate,\n selectedEndDate,\n onStartHover,\n onEndHover,\n hoverDate,\n today,\n todayIsInVisibleMonth,\n calendarId,\n isDateDisabled,\n size,\n dateTestId,\n}) => {\n const onKeyDown = useCallback<KeyboardEventHandler<HTMLTableDataCellElement>>(\n async (e) => {\n const nextDate = getDateToFocusOn(day.date, e.key);\n if (nextDate && !isDateDisabled(nextDate)) {\n onStartHover(nextDate);\n if (!isSameMonth(day.date, nextDate)) {\n onChangeVisibleMonth(nextDate);\n setTimeout(() => {\n document.getElementById(createDayId(nextDate, calendarId))?.focus();\n }, 10);\n } else {\n document.getElementById(createDayId(nextDate, calendarId))?.focus();\n }\n }\n\n if (e.key === \"Enter\" || e.code === \"Space\") {\n onClick(day.date);\n }\n },\n [\n calendarId,\n day.date,\n isDateDisabled,\n onChangeVisibleMonth,\n onClick,\n onStartHover,\n ],\n );\n\n const dayIsInMonth = day.month === visibleMonth.getMonth();\n\n const disabled = isDateDisabled(day.date);\n\n const isSelectionStart = selectedStartDate\n ? isSameDay(selectedStartDate, day.date)\n : false;\n\n const isSelectionEnd = selectedEndDate\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 hoverDate,\n dayIsInMonth,\n isValidDateRange,\n );\n\n return (\n <td\n className={cx(styles.travelDateCell, styles[size])}\n onClick={disabled ? undefined : () => 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 : getTabIndex(\n day,\n selectedStartDate,\n isToday,\n visibleMonth,\n todayIsInVisibleMonth,\n )\n }\n id={disabled ? undefined : createDayId(day.date, calendarId)}\n onKeyDown={disabled ? undefined : onKeyDown}\n {...(disabled\n ? undefined\n : { \"aria-selected\": isSelectionStart || isSelectionEnd })}\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 isToday ? styles.isToday : undefined,\n selectedStartDate ? styles.startSelected : undefined,\n selectedEndDate ? styles.endSelected : undefined,\n hoverDate && isSameDay(hoverDate, day.date)\n ? styles.hover\n : undefined,\n isSelectionStart && styles.isSelectionStart,\n isSelectionEnd && styles.isSelectionEnd,\n disabled && styles.disabled,\n )}\n >\n <Text\n variant={\"bold\"}\n color={disabled ? cssColor(\"--lhds-color-ui-500\") : undefined}\n >\n {day.dayOfMonth}\n </Text>\n </div>\n )}\n </td>\n );\n};\n\nconst getTabIndex = (\n day: DayData,\n selectedStartDate: Date | undefined,\n isToday: boolean,\n visibleMonth: Date,\n todayIsInVisibleMonth: boolean,\n): number => {\n const selectedStartDateIsVisible = selectedStartDate\n ? isSameMonth(selectedStartDate, visibleMonth)\n : false;\n\n /**\n * If date has been selected that date should be tabIndex = 0.\n * If no date has been selected, today's date should be tabIndex = 0.\n * All else should be -1.\n */\n if (\n selectedStartDate && selectedStartDateIsVisible\n ? isSameDay(day.date, selectedStartDate)\n : isToday\n ) {\n return 0;\n }\n\n if (\n !selectedStartDateIsVisible &&\n !todayIsInVisibleMonth &&\n day.date.getDate() === 1\n ) {\n return 0;\n }\n\n return -1;\n};\n","import * as React 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 } from \"date-fns\";\nimport { Dispatch, SetStateAction } from \"react\";\nimport styles from \"./TravelCalendar.module.css\";\n\nexport type TravelCalendarSizeVariant = \"small\" | \"medium\" | \"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 hoverDate: Date | undefined;\n today: Date;\n isDateDisabled: (date: Date) => boolean;\n dateTestId?: (date: Date) => string | undefined;\n calendarId: string;\n todayIsInVisibleMonth: boolean;\n size?: TravelCalendarSizeVariant;\n multiSelectable: boolean;\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 today,\n calendarId,\n isDateDisabled,\n todayIsInVisibleMonth,\n size = \"medium\",\n multiSelectable,\n dateTestId,\n}) => {\n return (\n <table\n className={styles.travelCalendar}\n role=\"grid\"\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 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 today={today}\n todayIsInVisibleMonth={todayIsInVisibleMonth}\n calendarId={calendarId}\n isDateDisabled={isDateDisabled}\n dateTestId={dateTestId}\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 { TravelDateRangeTextInputFields } 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} from \"../../../features/travel-calendar/types\";\nimport styles from \"./TravelDateRangeInput.module.css\";\nimport cx from \"classnames\";\n\nexport interface RenderBelowCalendarArgs {\n hideCalendar: () => void;\n}\n\nexport interface TravelDateRangeInputProps\n extends ValueAndOnValueChangeProps<TravelDateRangeInputValue> {\n localeCode?: string;\n initialMonthInFocus?: Date;\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 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}\n\nexport const TravelDateRangeInput: React.FC<TravelDateRangeInputProps> = ({\n value,\n onValueChange,\n startDateLabel,\n endDateLabel,\n localeCode = \"sv\",\n initialMonthInFocus,\n previousMonthButtonAriaLabel = \"Previous month\",\n nextMonthButtonAriaLabel = \"Next month\",\n placeholderWhenBlurredStartDate,\n placeholderWhenBlurredEndDate,\n heading,\n headingLevel,\n numMonthsInMonthPicker = 12,\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 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 initialMonthInFocus,\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 localeCode={localeCode}\n startDateLabel={startDateLabel}\n endDateLabel={endDateLabel}\n onFocus={showCalendar}\n calendarSize={size}\n placeholderWhenBlurredStartDate={placeholderWhenBlurredStartDate}\n placeholderWhenBlurredEndDate={placeholderWhenBlurredEndDate}\n variant={textInputVariant}\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 previousMonthButtonTestId={previousMonthButtonTestId}\n nextMonthButtonTestId={nextMonthButtonTestId}\n />\n\n {visiblePanel === \"calendar\" && (\n <TravelCalendar\n {...inputProps}\n size={size}\n multiSelectable={true}\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={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 { 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\";\n\nexport interface TravelDateTextInputFieldProps {\n value: string | undefined;\n onValueChange: ((value: string) => void) | undefined;\n localeCode: string;\n label?: string;\n onFocus?: () => void;\n calendarSize: TravelCalendarSizeVariant;\n placeholderWhenBlurred: string | undefined;\n valueWhenBlurred: string | undefined;\n variant: DateTextInputVariant;\n}\n\nexport const TravelDateTextInputField: React.FC<\n TravelDateTextInputFieldProps\n> = ({\n value,\n onValueChange,\n label = \"Date\",\n localeCode,\n onFocus,\n calendarSize,\n placeholderWhenBlurred,\n valueWhenBlurred,\n variant,\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 onFocus={onFocus}\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 getDefaultLocaleForFormatting,\n getLocaleForLocaleCode,\n} from \"../../localize-date-format/LocaleMapper\";\nimport { useCallback, useId, useMemo, useRef, useState } from \"react\";\nimport { useToday } from \"../util/UseToday\";\nimport { getDateFormatForLocaleCode } from \"../../localize-date-format/DateFormatProvider\";\nimport { parseLocalizedDateString } from \"../../localize-date-format/LocalizedDateParser\";\nimport { format, isAfter, isBefore, isSameDay, isSameMonth } from \"date-fns\";\nimport { getMonthInYear } from \"../../../util/calendar/CalendarDataFactory\";\nimport { startCase } from \"lodash-es\";\nimport { formatLocalizedDate } from \"../../localize-date-format/LocalizedDateFormatter\";\nimport { VisiblePanel } from \"../types\";\nimport { formatDateDescription } from \"../util/DateDescriptionFormatter\";\n\nexport const useTravelDateInput = (\n value: string | undefined,\n onValueChange: ((value: string) => void) | undefined,\n localeCode: string,\n initialMonthInFocus: Date | undefined,\n) => {\n const locale =\n getLocaleForLocaleCode(localeCode) ?? getDefaultLocaleForFormatting();\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, locale)\n : undefined,\n [locale, selectedDate, today],\n );\n\n const [visibleMonth, setVisibleMonth] = useState<Date>(\n initialMonthInFocus ?? selectedDate ?? new Date(),\n );\n\n const setVisibleMonthClamped = useCallback(\n (month: Date) => {\n if (isSameMonth(month, today) || isAfter(month, today)) {\n setVisibleMonth(month);\n } else {\n setVisibleMonth(today);\n }\n },\n [today],\n );\n\n const visibleMonthData = useMemo(\n () =>\n getMonthInYear(\n visibleMonth.getFullYear(),\n visibleMonth.getMonth(),\n locale,\n ),\n [locale, visibleMonth],\n );\n\n const monthPickerButtonLabel = useMemo(() => {\n return startCase(format(visibleMonth, \"MMMM yyyy\", { locale }));\n }, [locale, 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 setVisibleMonthClamped(startDate);\n }\n\n onValueChange?.(v);\n },\n [dateFormat.length, localeCode, onValueChange, setVisibleMonthClamped],\n );\n\n const prevMonthDisabled = useMemo(\n () => isSameMonth(today, visibleMonth) || isBefore(visibleMonth, today),\n [today, visibleMonth],\n );\n\n const isDateDisabled = useCallback<(date: Date) => boolean>(\n (date) => !isSameDay(date, today) && isBefore(date, today),\n [today],\n );\n\n const onClickDate = (date: Date) => {\n onValueChange?.(formatLocalizedDate(date, localeCode));\n };\n\n return {\n isDateDisabled,\n onClickDate,\n onValueChangeByInputs,\n prevMonthDisabled,\n monthPickerButtonRef,\n calendarId,\n monthPickerButtonLabel,\n visiblePanel,\n setVisiblePanel,\n setVisibleMonth,\n visibleMonthData,\n todayIsInVisibleMonth,\n hoverDate,\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 { DateTextInputVariant } from \"../../../features/travel-calendar/types\";\n\nexport interface RenderBelowSingleDateCalendarArgs {\n hideCalendar: () => void;\n}\n\nexport interface TravelDateInputProps\n extends ValueAndOnValueChangeProps<string> {\n localeCode?: string;\n initialMonthInFocus?: Date;\n label?: string;\n previousMonthButtonAriaLabel?: string;\n nextMonthButtonAriaLabel?: string;\n heading?: string;\n headingLevel?: HeadingVariant;\n firstMonthInMonthPicker?: Date;\n numMonthsInMonthPicker?: number;\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}\n\nexport const TravelDateInput: React.FC<TravelDateInputProps> = ({\n value,\n onValueChange,\n label,\n localeCode = \"sv\",\n initialMonthInFocus,\n previousMonthButtonAriaLabel = \"Previous month\",\n nextMonthButtonAriaLabel = \"Next month\",\n placeholderWhenBlurred,\n heading,\n headingLevel,\n numMonthsInMonthPicker = 12,\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 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 initialMonthInFocus,\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 value={value}\n onValueChange={onValueChangeByInputs}\n localeCode={localeCode}\n label={label}\n onFocus={showCalendar}\n calendarSize={size}\n placeholderWhenBlurred={placeholderWhenBlurred}\n variant={textInputVariant}\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 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 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={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 { Column, Heading, HeadingVariant } from \"@stenajs-webui/core\";\nimport { ValueAndOnValueChangeProps } from \"@stenajs-webui/forms\";\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 { useTravelDateInput } from \"../../../features/travel-calendar/hooks/UseTravelDateInput\";\nimport { TravelDateTextInputField } from \"../../../features/travel-calendar/components/TravelDateTextInputField\";\nimport { DateTextInputVariant } from \"../../../features/travel-calendar/types\";\n\nexport interface TravelDateCalendarProps\n extends ValueAndOnValueChangeProps<string> {\n localeCode?: string;\n initialMonthInFocus?: Date;\n label?: string;\n previousMonthButtonAriaLabel?: string;\n nextMonthButtonAriaLabel?: string;\n heading?: string;\n headingLevel?: HeadingVariant;\n firstMonthInMonthPicker?: Date;\n numMonthsInMonthPicker?: number;\n size?: TravelCalendarSizeVariant;\n dateTestId?: (date: Date) => string | undefined;\n previousMonthButtonTestId?: string;\n nextMonthButtonTestId?: string;\n placeholderWhenBlurred?: string;\n textInputVariant?: DateTextInputVariant;\n}\n\nexport const TravelDateCalendar: React.FC<TravelDateCalendarProps> = ({\n value,\n onValueChange,\n label,\n localeCode = \"sv\",\n initialMonthInFocus,\n previousMonthButtonAriaLabel = \"Previous month\",\n nextMonthButtonAriaLabel = \"Next month\",\n placeholderWhenBlurred,\n heading,\n headingLevel,\n numMonthsInMonthPicker = 12,\n firstMonthInMonthPicker = new Date(),\n dateTestId,\n size = \"medium\",\n previousMonthButtonTestId,\n nextMonthButtonTestId,\n textInputVariant = \"standard\",\n}) => {\n const inputProps = useTravelDateInput(\n value,\n onValueChange,\n localeCode,\n initialMonthInFocus,\n );\n\n const {\n visiblePanel,\n visibleMonth,\n onValueChangeByInputs,\n setVisibleMonth,\n setVisiblePanel,\n monthPickerButtonRef,\n selectedDate,\n } = inputProps;\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 />\n\n <MonthHeader\n {...inputProps}\n previousMonthButtonAriaLabel={previousMonthButtonAriaLabel}\n nextMonthButtonAriaLabel={nextMonthButtonAriaLabel}\n calendarSize={size}\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 multiSelectable={false}\n dateTestId={dateTestId}\n />\n )}\n\n {visiblePanel === \"month-picker\" && (\n <MonthPicker\n firstMonth={firstMonthInMonthPicker}\n numMonths={numMonthsInMonthPicker}\n value={visibleMonth}\n localeCode={localeCode}\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 </Column>\n );\n};\n","import * as React from \"react\";\nimport { Column, Heading, HeadingVariant } from \"@stenajs-webui/core\";\nimport { ValueAndOnValueChangeProps } from \"@stenajs-webui/forms\";\nimport { TravelDateRangeTextInputFields } 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} from \"../../../features/travel-calendar/types\";\n\nexport interface TravelDateRangeCalendarProps\n extends ValueAndOnValueChangeProps<TravelDateRangeInputValue> {\n localeCode?: string;\n initialMonthInFocus?: Date;\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 size?: TravelCalendarSizeVariant;\n dateTestId?: (date: Date) => string | undefined;\n previousMonthButtonTestId?: string;\n nextMonthButtonTestId?: string;\n placeholderWhenBlurredStartDate?: string;\n placeholderWhenBlurredEndDate?: string;\n textInputVariant?: DateTextInputVariant;\n}\n\nexport const TravelDateRangeCalendar: React.FC<\n TravelDateRangeCalendarProps\n> = ({\n value,\n onValueChange,\n startDateLabel,\n endDateLabel,\n localeCode = \"sv\",\n initialMonthInFocus,\n previousMonthButtonAriaLabel = \"Previous month\",\n nextMonthButtonAriaLabel = \"Next month\",\n heading,\n headingLevel,\n numMonthsInMonthPicker = 12,\n firstMonthInMonthPicker = new Date(),\n size = \"medium\",\n dateTestId,\n previousMonthButtonTestId,\n nextMonthButtonTestId,\n placeholderWhenBlurredStartDate,\n placeholderWhenBlurredEndDate,\n textInputVariant = \"standard\",\n}) => {\n const inputProps = useTravelDateRangeInput(\n value,\n onValueChange,\n localeCode,\n initialMonthInFocus,\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 localeCode={localeCode}\n startDateLabel={startDateLabel}\n endDateLabel={endDateLabel}\n calendarSize={size}\n placeholderWhenBlurredStartDate={placeholderWhenBlurredStartDate}\n placeholderWhenBlurredEndDate={placeholderWhenBlurredEndDate}\n variant={textInputVariant}\n />\n\n <MonthHeader\n {...inputProps}\n previousMonthButtonAriaLabel={previousMonthButtonAriaLabel}\n nextMonthButtonAriaLabel={nextMonthButtonAriaLabel}\n calendarSize={size}\n previousMonthButtonTestId={previousMonthButtonTestId}\n nextMonthButtonTestId={nextMonthButtonTestId}\n />\n\n {visiblePanel === \"calendar\" && (\n <TravelCalendar\n {...inputProps}\n size={size}\n multiSelectable={true}\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={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 </Column>\n );\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","Month","Month2","WeekDay","WeekDay2","getMonthsInYear","year","startMonth","numMonths","locale","months","i","getMonthInYear","yearToUse","monthToUse","firstDayOfMonth","startCase","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","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","deAT","de","sv","da","fr","es","pl","nl","nb","getLocaleForLocaleCode","localeCode","exactMatch","languageCode","getMappedLocaleCodeMatchingLanguage","languageMatch","lang","localeCodes","l","getDefaultLocaleForFormatting","getLocaleCodeForLocale","MonthPickerCell","onClick","selected","autoFocus","size","label","abbr","ref","useRef","domId","tabIndex","useEffect","_a","onKeyDown","useCallback","nextDomId","PrimaryButton","createMonths","firstMonth","currentYear","currentRow","currentColumn","currentMonth","input","addMonths","useToday","MonthPicker","value","onValueChange","onCancel","useId","today","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","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","_b","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","_d","_c","DateRangeDualTextInput","TravelDateTextInput","mask","pipe","guide","keepCharPositions","placeholderChar","showMask","calendarSize","onFocus","placeholderWhenBlurred","valueWhenBlurred","inputProps","inputRef","isFocused","setIsFocused","maskedOnChange","useMaskedInput","onFocusHandler","onBlurHandler","activePlaceholder","Label","LabelledTextInput","calenderSize","yearMask","monthMask","dayMask","createInputMaskForDateFormat","splitByNewLetter","tokenToMask","token","str","currentSegment","getDateFormatForLocaleCode","formatMap","part","parseLocalizedDateString","dateString","referenceDate","formatLocalizedDate","reformatLocalizedDateString","TravelDateRangeTextInputFields","startDateLabel","endDateLabel","placeholderWhenBlurredStartDate","placeholderWhenBlurredEndDate","valueWhenBlurredStartDate","valueWhenBlurredEndDate","dateFormatForLocaleCode","formatDateDescription","isSameYear","useTravelDateRangeInput","initialMonthInFocus","calendarId","monthPickerButtonRef","selectedStartDate","selectedEndDate","visibleMonth","setVisibleMonth","setVisibleMonthClamped","visibleMonthData","monthPickerButtonLabel","todayIsInVisibleMonth","hoverDate","setHoverDate","visiblePanel","setVisiblePanel","onValueChangeByInputs","prevMonthDisabled","isValidDateRange","MonthHeader","previousMonthButtonAriaLabel","nextMonthButtonAriaLabel","previousMonthButtonTestId","nextMonthButtonTestId","stenaAngleUp","rangeBgColor","getCellBackgroundColors","dayIsInMonth","isInSelectionRange","isInHoverRange","getDateToFocusOn","currentDate","createDayId","TravelDateCellBackground","bgColorLeft","bgColorRight","TravelDateCell","onChangeVisibleMonth","onStartHover","onEndHover","isDateDisabled","dateTestId","e","nextDate","isSelectionStart","isSelectionEnd","isToday","bgColors","getTabIndex","selectedStartDateIsVisible","TravelCalendar","onClickDate","multiSelectable","TravelDateRangeInput","heading","headingLevel","numMonthsInMonthPicker","firstMonthInMonthPicker","zIndexWhenClosed","onHideCalendar","renderBelowCalendar","textInputVariant","calendarOpen","setCalendarOpen","calendarInDom","setCalendarInDom","boxSize","setBoxSize","inputFieldsHeight","calendarOpenRef","sizeSourceRef","useOnClickOutside","useLayoutEffect","height","CardBody","TravelDateTextInputField","useTravelDateInput","selectedDate","TravelDateInput","TravelDateCalendar","TravelDateRangeCalendar"],"mappings":"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"}