@stenajs-webui/calendar 23.8.1 → 23.10.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/features/travel-calendar/components/TravelCalendar.d.ts +11 -1
- package/dist/features/travel-calendar/components/TravelDateCell.d.ts +7 -0
- package/dist/features/travel-calendar/components/TravelDateRangeTextInputFields.d.ts +7 -1
- package/dist/features/travel-calendar/components/TravelDateTextInput.d.ts +3 -1
- package/dist/features/travel-calendar/components/TravelDateTextInputField.d.ts +1 -0
- package/dist/features/travel-calendar/hooks/UseTravelDateInput.d.ts +1 -0
- package/dist/features/travel-calendar/hooks/UseTravelDateRangeInput.d.ts +3 -1
- package/dist/features/travel-calendar/util/CellBgColors.d.ts +9 -1
- package/dist/features/travel-calendar/util/DateRangeNormalizer.d.ts +18 -0
- package/dist/index.es.js +2759 -2523
- package/dist/index.es.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +8 -8
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/util/date/DateFormats.ts","../src/util/calendar/StateModifier.ts","../src/features/today-state/UseHighlightToday.ts","../src/util/caseFormat/CaseFormat.ts","../src/util/calendar/CalendarDataFactory.ts","../src/util/calendar/StateHelper.ts","../src/components/calendar/CalendarTheme.tsx","../src/components/calendar/renderers/WeekDayCell.tsx","../src/components/calendar/renderers/CalendarDay.tsx","../src/components/calendar/renderers/WeekNumberCell.tsx","../src/util/date/DateMinMaxValidator.ts","../src/components/calendar/DisabledDayWrapper.tsx","../src/components/calendar/CalendarMonth.tsx","../src/components/calendar/Calendar.tsx","../src/features/month-picker/MonthPickerKeyboardNavigation.ts","../src/features/localize-date-format/LocaleMapper.ts","../src/features/month-picker/MonthPickerCell.tsx","../src/features/month-picker/MonthPickerDataFactory.ts","../src/features/month-picker/MonthPicker.tsx","../src/features/preset-picker/PresetFactory.ts","../src/features/preset-picker/PresetPicker.tsx","../src/features/calendar-with-month-year-pickers/CalendarWithMonthYearPickers.tsx","../src/features/month-switcher/hooks/UseSelectedMonthStepperLogic.ts","../src/features/month-switcher/MonthSwitcherBelow.tsx","../src/features/month-switcher/CalendarWithMonthSwitcher.tsx","../src/util/date-range/DateRangeTransformer.ts","../src/util/date-range/DateRangeValidator.ts","../src/features/date-range/hooks/UseDateRangeOnClickDayHandler.ts","../src/features/internal-panel-state/UseInternalPanelState.tsx","../src/components/calendar-types/date-range-calendar/hooks/UseDateRangeSelection.ts","../src/components/calendar-types/date-range-calendar/DateRangeCalendar.tsx","../src/components/calendar-types/date-range-calendar/hooks/UseDateRangeCalendarState.ts","../src/components/calendar-types/single-date-calendar/UseSingleDateSelection.ts","../src/components/calendar-types/single-date-calendar/SingleDateCalendar.tsx","../src/components/calendar-types/multi-date-calendar/UseMultiDateSelection.ts","../src/components/calendar-types/multi-date-calendar/MultiDateCalendar.tsx","../src/components/calendar-types/single-week-calendar/UseSingleWeekSelection.ts","../src/components/calendar-types/single-week-calendar/SingleWeekCalendar.tsx","../src/config/DefaultPopoverPlacement.ts","../src/components/input-types/date-input/UseDateInput.tsx","../src/config/DefaultMaxDate.ts","../src/components/input-types/date-input/DateInput.tsx","../src/components/input-types/date-range-input/hooks/UseDateRangeInput.tsx","../src/components/input-types/date-range-input/DateRangeInput.tsx","../src/components/input-types/date-text-input/DateTextInput.tsx","../src/util/time/TimeStringFormatValidator.ts","../src/components/input-types/time-text-input/TimeTextInput.tsx","../src/features/dual-text-input/DualTextInput.tsx","../src/util/time/TimeTransformer.ts","../src/features/time-picker/TimePickerCell.tsx","../src/features/time-picker/TimePickerColumn.tsx","../src/features/time-picker/TimePicker.tsx","../src/components/input-types/date-time-input/hooks/UseDateRangeEffects.ts","../src/components/input-types/date-time-input/hooks/UseDateRangeHandlers.ts","../src/components/input-types/date-time-input/hooks/UseInputStates.ts","../src/components/input-types/date-time-input/hooks/UseUserInputHandlers.ts","../src/components/input-types/date-time-input/DateTimeInput.tsx","../src/features/year-picker/YearPickerCell.tsx","../src/features/year-picker/YearPicker.tsx","../src/components/input-types/date-range-dual-text-input/hooks/UseDateRangeEffects.ts","../src/components/input-types/date-range-dual-text-input/hooks/UseDateRangeHandlers.ts","../src/components/input-types/date-range-dual-text-input/hooks/UseInputStates.ts","../src/components/input-types/date-range-dual-text-input/hooks/UseUserInputHandlers.ts","../src/components/input-types/date-range-dual-text-input/DateRangeDualTextInput.tsx","../src/features/travel-calendar/components/TravelDateTextInput.tsx","../src/features/localize-date-format/InputMaskProvider.ts","../src/features/localize-date-format/DateFormatProvider.ts","../src/features/localize-date-format/LocalizedDateParser.ts","../src/features/localize-date-format/LocalizedDateFormatter.ts","../src/features/localize-date-format/LocalizedDateReformatter.ts","../src/features/travel-calendar/components/TravelDateRangeTextInputFields.tsx","../src/features/travel-calendar/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","../src/features/travel-calendar/hooks/DisabledDateHooks.ts"],"sourcesContent":["export const DateFormats = {\n yearAndMonth: \"yyyy-MM\",\n fullDate: \"yyyy-MM-dd\",\n fullMonthName: \"LLLL\",\n fullDateAndTime: \"yyyy-MM-dd HH:mm\",\n fullDateAndTimeSystem: \"yyyy-MM-ddTHH:MM\",\n weekDayName: \"EEEE\", // Tuesday\n weekDayNameShort: \"EEE\", // Tue\n dateAndMonth: \"d MMM\", // 2 Jan\n monthAndDate: \"MMM do\", // Jan 2nd\n};\n","import {\n addDays,\n eachDayOfInterval,\n endOfMonth,\n format,\n getDate,\n getISOWeek,\n isAfter,\n isSameDay,\n max,\n min,\n startOfMonth,\n subDays,\n} from \"date-fns\";\nimport { last } from \"lodash-es\";\nimport {\n CalendarState,\n CalendarUserData,\n DayState,\n DayStateHighlight,\n StateForWeek,\n} from \"../../types/CalendarTypes\";\nimport { DateFormats } from \"../date/DateFormats\";\nimport { WeekData } from \"./CalendarDataFactory\";\n\nexport const buildDayStateForDateRange = (\n statePerMonth: CalendarUserData<DayState> = {},\n start?: Date,\n end?: Date,\n): CalendarUserData<DayState> | undefined => {\n if (start && end && isAfter(end, start)) {\n return eachDayOfInterval({ start, end }).reduce(\n (result: CalendarUserData<DayState>, date: Date) => {\n const isFirstInRange = isSameDay(date, start);\n const isLastInRange = isSameDay(date, end);\n const highlights = isFirstInRange\n ? [\"selected\", \"selectedStart\", \"range\"]\n : isLastInRange\n ? [\"selected\", \"selectedEnd\", \"range\"]\n : [\"range\"];\n return addDayStateHighlights(result, date, highlights);\n },\n statePerMonth,\n );\n }\n\n let state = statePerMonth;\n\n if (start) {\n state = addDayStateHighlights(state, start, [\"selected\", \"singleSelected\"]);\n }\n\n if (end) {\n state = addDayStateHighlights(state, end, [\"selected\", \"singleSelected\"]);\n }\n\n return state;\n};\n\nexport const buildDayStateForSingleMonth = (\n statePerMonth: CalendarUserData<DayState> = {},\n start: Date | undefined,\n end: Date | undefined,\n dateInFocus: Date,\n): CalendarUserData<DayState> | undefined =>\n buildDayStateForRange(\n statePerMonth,\n start,\n end,\n startOfMonth(dateInFocus),\n endOfMonth(dateInFocus),\n );\n\nexport const buildDayStateForRange = (\n statePerMonth: CalendarUserData<DayState> = {},\n start: Date | undefined,\n end: Date | undefined,\n startLimit: Date,\n endLimit: Date,\n): CalendarUserData<DayState> | undefined => {\n if (start && end) {\n return buildDayStateForDateRange(\n statePerMonth,\n max([start, subDays(startLimit, 1)]),\n min([end, addDays(endLimit, 1)]),\n );\n } else {\n return buildDayStateForDateRange(statePerMonth, start, end);\n }\n};\n\nexport const setDayStateValue = (\n state: CalendarUserData<DayState> | undefined,\n date: Date,\n values: Partial<DayState>,\n): CalendarUserData<DayState> => {\n const monthString = format(date, DateFormats.yearAndMonth);\n const weekNumber = getISOWeek(date);\n const dayInMonth = getDate(date);\n return {\n ...state,\n [monthString]: {\n ...(state && state[monthString]),\n [weekNumber]: {\n ...(state && state[monthString] && state[monthString][weekNumber]),\n [dayInMonth]: {\n ...(state &&\n state[monthString] &&\n state[monthString][weekNumber] &&\n state[monthString][weekNumber][dayInMonth]),\n ...values,\n },\n },\n },\n };\n};\n\nexport const setDayStateValueFunction = (\n state: CalendarUserData<DayState> | undefined,\n date: Date,\n setter: (dayState: DayState | undefined) => Partial<DayState>,\n): CalendarUserData<DayState> => {\n const monthString = format(date, DateFormats.yearAndMonth);\n const weekNumber = getISOWeek(date);\n const dayInMonth = getDate(date);\n return {\n ...state,\n [monthString]: {\n ...(state && state[monthString]),\n [weekNumber]: {\n ...(state && state[monthString] && state[monthString][weekNumber]),\n [dayInMonth]: {\n ...(state &&\n state[monthString] &&\n state[monthString][weekNumber] &&\n state[monthString][weekNumber][dayInMonth]),\n ...setter(\n state &&\n state[monthString] &&\n state[monthString][weekNumber] &&\n state[monthString][weekNumber][dayInMonth],\n ),\n },\n },\n },\n };\n};\n\nexport const addDayStateHighlights = (\n calendarState: CalendarState | undefined,\n date: Date,\n highlights: Array<DayStateHighlight>,\n): CalendarUserData<DayState> => {\n const month = date.getMonth() + 1;\n const monthString = `${date.getFullYear()}-${month < 10 ? \"0\" : \"\"}${month}`;\n const weekNumber = getISOWeek(date);\n const dayInMonth = getDate(date);\n const dayState: DayState | undefined =\n calendarState &&\n calendarState[monthString] &&\n calendarState[monthString][weekNumber] &&\n calendarState[monthString][weekNumber][dayInMonth];\n\n return {\n ...calendarState,\n [monthString]: {\n ...(calendarState && calendarState[monthString]),\n [weekNumber]: {\n ...(calendarState &&\n calendarState[monthString] &&\n calendarState[monthString][weekNumber]),\n [dayInMonth]: addDayStateHighlightsOnSingleDay(dayState, highlights),\n },\n },\n };\n};\n\nexport const addDayStateHighlightsOnSingleDay = (\n dayState: DayState | undefined,\n highlights: Array<DayStateHighlight>,\n): DayState => {\n return {\n ...dayState,\n highlights: [...(dayState?.highlights ?? []), ...highlights],\n };\n};\n\nexport const addWeekStateHighlights = (\n calendarState: CalendarState | undefined,\n week: WeekData,\n highlights: Array<DayStateHighlight>,\n): CalendarUserData<DayState> => {\n const date = week.days[0].date;\n const month = date.getMonth() + 1;\n const monthString = `${date.getFullYear()}-${month < 10 ? \"0\" : \"\"}${month}`;\n const weekNumber = week.weekNumber;\n\n let state = calendarState;\n week.days.forEach((day) => {\n state = addDayStateHighlights(state, day.date, highlights);\n });\n\n const weekState =\n state && state[monthString] ? state[monthString][weekNumber] : undefined;\n\n const newHighlights: Array<DayStateHighlight> =\n weekState && weekState.highlights\n ? [...weekState.highlights, ...highlights]\n : highlights;\n\n const newWeekState: StateForWeek = {\n ...weekState,\n highlights: newHighlights,\n };\n\n return {\n ...state,\n [monthString]: {\n ...(calendarState && calendarState[monthString]),\n [weekNumber]: newWeekState,\n },\n };\n};\n\nexport const addWeekRangeHighlights = (\n calendarState: CalendarState | undefined,\n week: WeekData,\n): CalendarUserData<DayState> => {\n if (!week.days.length) {\n return { ...calendarState };\n }\n const startDate = week.days[0].date;\n const endDate = last(week.days)?.date;\n return {\n ...buildDayStateForDateRange(calendarState, startDate, endDate),\n };\n};\n","import { useMemo } from \"react\";\nimport { CalendarState } from \"../../types/CalendarTypes\";\nimport { addDayStateHighlights } from \"../../util/calendar/StateModifier\";\n\nexport const useHighlightToday = (\n enabled: boolean | undefined,\n statePerMonth: CalendarState | undefined,\n) => {\n return useMemo(() => {\n return enabled\n ? addDayStateHighlights(statePerMonth, new Date(), [\"today\"])\n : statePerMonth;\n }, [enabled, statePerMonth]);\n};\n","export const convertFirstCharToUpper = (value: string): string => {\n if (value.length === 0) {\n return value;\n }\n\n if (value.length === 1) {\n return value.toUpperCase();\n }\n\n return value.charAt(0).toUpperCase() + value.slice(1);\n};\n","import {\n addDays,\n addHours,\n addWeeks,\n eachDayOfInterval,\n endOfMonth,\n format,\n getDate,\n getISODay,\n getMonth,\n getWeek,\n getYear,\n isSameDay,\n Locale,\n startOfMonth,\n startOfWeek,\n} from \"date-fns\";\nimport { DateFormats } from \"../date/DateFormats\";\nimport { convertFirstCharToUpper } from \"../caseFormat/CaseFormat\";\n\nexport enum Month {\n JANUARY = 0,\n FEBRUARY,\n MARCH,\n APRIL,\n MAY,\n JUNE,\n JULY,\n AUGUST,\n SEPTEMBER,\n OCTOBER,\n NOVEMBER,\n DECEMBER,\n}\n\nexport enum WeekDay {\n SUNDAY = 0,\n MONDAY,\n TUESDAY,\n WEDNESDAY,\n THURSDAY,\n FRIDAY,\n SATURDAY,\n}\n\nexport interface DayData {\n name: string;\n fullName: string;\n date: Date; // YYYY-MM\n dateString: string; // YYYY-MM\n weekNumber: number;\n year: number; // 2018\n month: number; // 0-11\n dayOfMonth: number; // 1-31\n dayOfWeek: number; // 1-7\n isFirstDayOfWeek: boolean;\n isLastDayOfWeek: boolean;\n isFirstDayOfMonth: boolean;\n isLastDayOfMonth: boolean;\n}\n\nexport interface WeekData {\n weekNumber: number;\n startMonth: number;\n startYear: number;\n endMonth: number;\n endYear: number;\n isLastWeekOfMonth: boolean;\n days: Array<DayData>;\n}\n\nexport interface MonthData {\n monthString: string;\n name: string;\n year: number;\n monthInYear: number;\n weeks: Array<WeekData>;\n}\n\nexport const getMonthsInYear = (\n year: number,\n startMonth: number,\n numMonths: number,\n locale: Locale,\n): Array<MonthData> => {\n const months = [];\n for (let i = 0; i < numMonths; i++) {\n months.push(getMonthInYear(year, startMonth + i, locale));\n }\n return months;\n};\n\nexport const getMonthInYear = (\n year: number,\n month: number,\n locale: Locale,\n): MonthData => {\n if (isNaN(year) || isNaN(month)) {\n throw new Error(\"getMonthInYear() received NaN.\");\n }\n const yearToUse = year + Math.floor(month / 12);\n const monthToUse = month % 12;\n const firstDayOfMonth = new Date(yearToUse, monthToUse, 1);\n return {\n monthString: format(firstDayOfMonth, DateFormats.yearAndMonth),\n name: convertFirstCharToUpper(\n format(firstDayOfMonth, DateFormats.fullMonthName, { locale }),\n ),\n year: yearToUse,\n monthInYear: monthToUse,\n weeks: getWeeksForMonth(yearToUse, monthToUse, locale),\n };\n};\n\nexport const getWeeksForMonth = (\n year: number,\n month: number,\n locale: Locale,\n forceSixWeeks: boolean = true,\n): Array<WeekData> => {\n const firstDayOfMonth = new Date(year, month, 1);\n const firstDayOfFirstWeek = startOfWeek(firstDayOfMonth, { locale });\n\n const weeks = [];\n\n for (let i = 0; i < 6; i++) {\n const week = getWeekForDate(addWeeks(firstDayOfFirstWeek, i), locale);\n if (i > 0 && week.startMonth !== month && !forceSixWeeks) {\n return weeks;\n }\n weeks.push(week);\n }\n return weeks;\n};\n\nexport const getWeekForDate = (\n firstDayOfWeek: Date,\n locale: Locale,\n): WeekData => {\n const isLastWeekOfMonth =\n getMonth(addDays(firstDayOfWeek, 7)) !== getMonth(firstDayOfWeek);\n return {\n weekNumber: getWeek(firstDayOfWeek, { locale }),\n startMonth: getMonth(firstDayOfWeek),\n startYear: getYear(firstDayOfWeek),\n endMonth: getMonth(addDays(firstDayOfWeek, 6)),\n endYear: getYear(addDays(firstDayOfWeek, 6)),\n days: getDaysForWeekForDate(firstDayOfWeek, locale),\n isLastWeekOfMonth,\n };\n};\n\nexport const createDay = (date: Date, locale: Locale): DayData => {\n const dayOfWeek = getISODay(date);\n return {\n date,\n name: format(date, \"EEE\", locale ? { locale } : undefined),\n fullName: format(date, \"EEEE\", locale ? { locale } : undefined),\n dateString: format(addHours(date, 12), DateFormats.fullDate),\n weekNumber: getWeek(date, { locale }),\n year: getYear(date),\n month: getMonth(date),\n dayOfMonth: getDate(date),\n dayOfWeek,\n isFirstDayOfWeek: dayOfWeek === 1,\n isLastDayOfWeek: dayOfWeek === 7,\n isFirstDayOfMonth: isSameDay(startOfMonth(date), date),\n isLastDayOfMonth: isSameDay(endOfMonth(date), date),\n };\n};\n\nexport const getDaysForWeekForDate = (\n firstDayOfWeek: Date,\n locale: Locale,\n): Array<DayData> => {\n return eachDayOfInterval({\n start: firstDayOfWeek,\n end: addDays(firstDayOfWeek, 6),\n }).map((d) => createDay(d, locale));\n};\n\nexport const calculateOverflowingMonth = (\n year: number,\n month: number,\n): { year: number; month: number } => {\n if (month > Month.DECEMBER) {\n return { year: year + Math.floor(month / 12), month: month % 12 };\n }\n if (month < Month.JANUARY) {\n return { year: year + Math.floor(month / 12), month: 12 + (month % 12) };\n }\n return { year, month };\n};\n","import { DayState, DayStateHighlight } from \"../../types/CalendarTypes\";\n\nexport const dayHasHighlight = (\n dayState: DayState | undefined,\n defaultHighlights: Array<DayStateHighlight> | undefined,\n highlight: string,\n): boolean => {\n if (defaultHighlights && defaultHighlights.indexOf(highlight) >= 0) {\n return true;\n }\n if (\n dayState &&\n dayState.highlights &&\n dayState.highlights.indexOf(highlight) >= 0\n ) {\n return true;\n }\n return false;\n};\n\nexport const dayHighlightSelect = <T>(\n dayState: DayState | undefined,\n defaultHighlights: Array<DayStateHighlight> | undefined,\n highlightsOrBoolean: Array<string | boolean>,\n returnValues: Array<T>,\n fallbackValue?: T,\n): T | undefined => {\n if (highlightsOrBoolean.length !== returnValues.length) {\n throw new Error(\n \"Select highlight failed, number of values do not equal number of highlights.\",\n );\n }\n if (highlightsOrBoolean.length === 0) {\n return fallbackValue;\n }\n for (let i = 0; i < highlightsOrBoolean.length; i++) {\n if (typeof highlightsOrBoolean[i] === \"boolean\" && highlightsOrBoolean[i]) {\n return returnValues[i];\n }\n if (\n typeof highlightsOrBoolean[i] === \"string\" &&\n dayHasHighlight(\n dayState,\n defaultHighlights,\n highlightsOrBoolean[i] as string,\n )\n ) {\n return returnValues[i];\n }\n }\n return fallbackValue;\n};\n","import { IconDefinition } from \"@fortawesome/fontawesome-svg-core\";\nimport { TextProps } from \"@stenajs-webui/core\";\nimport { CSSProperties } from \"react\";\nimport { DayState, DayStateHighlight } from \"../../types/CalendarTypes\";\n\nimport {\n DayData,\n MonthData,\n WeekData,\n} from \"../../util/calendar/CalendarDataFactory\";\nimport { dayHighlightSelect } from \"../../util/calendar/StateHelper\";\n\nexport interface CalendarTheme<TUserData = unknown> {\n width: string;\n height: string;\n WeekNumber: WeekNumberTheme;\n WeekDay: WeekDayTheme;\n CalendarDay: CalendarDayTheme<TUserData>;\n CalendarMonth: CalendarMonthTheme;\n}\n\nexport interface WeekNumberTheme {\n backgroundColor: string;\n textColor?: string;\n clickableTextColor?: string;\n}\n\nexport interface CalendarMonthTheme {\n headerTextColor?: string;\n cellSpacing?: string;\n headerLeftIcon?: IconDefinition;\n headerRightIcon?: IconDefinition;\n}\n\nexport interface WeekDayTheme {\n textColor?: string;\n clickableTextColor?: string;\n}\n\nexport type CalendarStyleProvider<TUserData, TResult> = (\n defaultHighlights: Array<DayStateHighlight> | undefined,\n dayState: DayState | undefined,\n day: DayData,\n week: WeekData,\n month: MonthData,\n userData?: TUserData,\n) => TResult;\n\nexport type CalendarWrapperStyleProvider<TUserData> = CalendarStyleProvider<\n TUserData,\n CSSProperties | undefined\n>;\n\ntype TextPropsProvider<TUserData> = CalendarStyleProvider<\n TUserData,\n TextProps | undefined\n>;\n\nexport interface CalendarDayTheme<TUserData> {\n tdStyle?: CalendarWrapperStyleProvider<TUserData>;\n innerWrapperStyle?: CalendarWrapperStyleProvider<TUserData>;\n cellWrapperStyle?: CalendarWrapperStyleProvider<TUserData>;\n textProps?: TextPropsProvider<TUserData>;\n}\n\nexport interface CalendarDefaultWrapperColors {\n selectedBackground: string;\n rangeBackground: string;\n todayBackground: string;\n borderColor?: string;\n borderRadius?: string;\n rangeBorderRadius?: string;\n}\n\nexport const defaultWrapperStyleProvider =\n ({\n selectedBackground,\n todayBackground,\n rangeBackground,\n borderColor = \"transparent\",\n }: CalendarDefaultWrapperColors): CalendarWrapperStyleProvider<unknown> =>\n (defaultHighlights, dayState, day, _, month) => {\n const backgroundColor = dayHighlightSelect(\n dayState,\n defaultHighlights,\n [\"selected\", \"range\", \"today\", day.month === month.monthInYear],\n [selectedBackground, rangeBackground, todayBackground, \"#fff\"],\n \"transparent\",\n );\n\n return {\n backgroundColor,\n borderWidth: \"1px\",\n borderStyle: \"solid\",\n borderColor: dayHighlightSelect(\n dayState,\n defaultHighlights,\n [\"selectedStart\", \"selectedEnd\", \"singleSelected\", \"range\", \"today\"],\n [\n \"var(--swui-calendar-wrapper-range-background)\",\n \"var(--swui-calendar-wrapper-range-background)\",\n \"var(--swui-calendar-wrapper-range-background)\",\n \"var(--swui-calendar-wrapper-range-border)\",\n \"var(--lhds-color-ui-500)\",\n ],\n borderColor,\n ),\n borderTopLeftRadius: dayHighlightSelect(\n dayState,\n defaultHighlights,\n [\"selectedStart\", \"singleSelected\", \"today\"],\n [\n \"var(--swui-calendar-day-border-radius)\",\n \"var(--swui-calendar-day-border-radius)\",\n \"var(--swui-calendar-day-border-radius)\",\n ],\n \"unset\",\n ),\n borderBottomLeftRadius: dayHighlightSelect(\n dayState,\n defaultHighlights,\n [\"selectedStart\", \"singleSelected\", \"today\"],\n [\n \"var(--swui-calendar-day-border-radius)\",\n \"var(--swui-calendar-day-border-radius)\",\n \"var(--swui-calendar-day-border-radius)\",\n ],\n \"unset\",\n ),\n borderTopRightRadius: dayHighlightSelect(\n dayState,\n defaultHighlights,\n [\"selectedEnd\", \"singleSelected\", \"today\"],\n [\n \"var(--swui-calendar-day-border-radius)\",\n \"var(--swui-calendar-day-border-radius)\",\n \"var(--swui-calendar-day-border-radius)\",\n ],\n \"unset\",\n ),\n borderBottomRightRadius: dayHighlightSelect(\n dayState,\n defaultHighlights,\n [\"selectedEnd\", \"singleSelected\", \"today\"],\n [\n \"var(--swui-calendar-day-border-radius)\",\n \"var(--swui-calendar-day-border-radius)\",\n \"var(--swui-calendar-day-border-radius)\",\n ],\n \"unset\",\n ),\n boxSizing: \"border-box\",\n };\n };\n\ninterface DefaultTextColors {\n disabledColor: string;\n inOtherMonthColor: string;\n selectedColor: string;\n rangeTextColor?: string;\n}\n\nexport const defaultTextPropsProvider = ({\n selectedColor,\n disabledColor,\n inOtherMonthColor,\n rangeTextColor,\n}: DefaultTextColors): TextPropsProvider<unknown> => {\n return (defaultHighlights, dayState, day, _, month) => {\n const isOtherMonth = day.month !== month.monthInYear;\n const color = dayHighlightSelect(\n dayState,\n defaultHighlights,\n [isOtherMonth, \"selected\", \"range\", \"enabled\", \"disabled\"],\n [\n inOtherMonthColor,\n selectedColor,\n rangeTextColor,\n undefined,\n disabledColor,\n ],\n );\n return {\n color,\n };\n };\n};\n\nexport const defaultCalendarTheme: CalendarTheme = {\n width: \"var(--swui-calendar-day-width)\",\n height: \"var(--swui-calendar-day-height)\",\n WeekNumber: {\n backgroundColor: \"var(--swui-calendar-week-number-bg-color)\",\n textColor: \"var(--swui-calendar-week-number-text-color)\",\n clickableTextColor: \"var(--swui-calendar-week-number-clickable-text-color)\",\n },\n WeekDay: {\n textColor: \"var(--swui-calendar-week-day-text-color)\",\n clickableTextColor: \"var(--swui-calendar-week-day-clickable-text-color)\",\n },\n CalendarDay: {\n tdStyle: defaultWrapperStyleProvider({\n selectedBackground: \"var(--swui-calendar-wrapper-selected-background)\",\n rangeBackground: \"var(--swui-calendar-wrapper-range-background)\",\n todayBackground: \"var(--swui-calendar-wrapper-today-background)\",\n }),\n textProps: defaultTextPropsProvider({\n selectedColor: \"var(--swui-calendar-text-selected-color)\",\n disabledColor: \"var(--swui-calendar-text-disabled-color)\",\n inOtherMonthColor: \"var(--swui-calendar-text-in-other-month-color)\",\n }),\n },\n CalendarMonth: {\n headerTextColor: \"var(--swui-calendar-week-day-text-color)\",\n },\n};\n\nexport const extranetCalendarTheme: CalendarTheme = {\n ...defaultCalendarTheme,\n width: \"37px\",\n height: \"37px\",\n};\n","import { Box, Clickable, Text } from \"@stenajs-webui/core\";\nimport * as React from \"react\";\nimport { OnClickWeekDay } from \"../../../types/CalendarTypes\";\nimport { DayData } from \"../../../util/calendar/CalendarDataFactory\";\nimport { CalendarTheme } from \"../CalendarTheme\";\n\nexport interface WeekDayCellProps {\n onClickWeekDay?: OnClickWeekDay;\n day: DayData;\n theme: CalendarTheme;\n}\n\nexport const WeekDayCell = ({\n onClickWeekDay,\n day,\n theme,\n}: WeekDayCellProps) => {\n const content = (\n <Box\n width={theme.width}\n height={theme.height}\n justifyContent={\"center\"}\n alignItems={\"center\"}\n >\n <Text\n size={\"small\"}\n color={\n onClickWeekDay\n ? theme.WeekDay.clickableTextColor\n : theme.WeekDay.textColor\n }\n >\n {day.name}\n </Text>\n </Box>\n );\n\n if (onClickWeekDay) {\n return (\n <Clickable\n borderRadius={\"var(--swui-calendar-day-border-radius)\"}\n onClick={(ev) => onClickWeekDay(day.dayOfWeek, ev)}\n disableFocusHighlight={!onClickWeekDay}\n >\n {content}\n </Clickable>\n );\n }\n\n return content;\n};\n","import styled from \"@emotion/styled\";\nimport { Box, Text } from \"@stenajs-webui/core\";\nimport * as React from \"react\";\nimport {\n CalendarDayProps,\n DayState,\n DayStateHighlight,\n} from \"../../../types/CalendarTypes\";\nimport { dayHighlightSelect } from \"../../../util/calendar/StateHelper\";\n\nexport const CalendarDay = function CalendarDay<T>({\n day,\n week,\n month,\n dayState,\n userData,\n onClickDay,\n theme,\n extraDayContent: ExtraDayContent,\n defaultHighlights,\n showDatesInOtherMonths,\n}: CalendarDayProps<T>) {\n const content = (\n <Box\n width={\"100%\"}\n height={\"100%\"}\n justifyContent={\"center\"}\n alignItems={\"center\"}\n >\n <Text\n {...(theme.CalendarDay.textProps &&\n theme.CalendarDay.textProps(\n defaultHighlights,\n dayState,\n day,\n week,\n month,\n userData,\n ))}\n >\n {day.dayOfMonth}\n </Text>\n </Box>\n );\n\n const WrapperTd = styled.td({\n ...(theme.CalendarDay.tdStyle &&\n theme.CalendarDay.tdStyle(\n defaultHighlights,\n dayState,\n day,\n week,\n month,\n userData,\n )),\n });\n\n const InnerWrapperDiv = styled.div({\n ...(theme.CalendarDay.innerWrapperStyle &&\n theme.CalendarDay.innerWrapperStyle(\n defaultHighlights,\n dayState,\n day,\n week,\n month,\n userData,\n )),\n width: \"100%\",\n height: \"100%\",\n });\n\n const CellWrapperDiv = styled.div({\n ...(theme.CalendarDay.cellWrapperStyle &&\n theme.CalendarDay.cellWrapperStyle(\n defaultHighlights,\n dayState,\n day,\n week,\n month,\n userData,\n )),\n width: \"100%\",\n height: \"100%\",\n position: \"relative\",\n });\n\n const disabled = isDisabled(defaultHighlights, dayState);\n\n return (\n <WrapperTd\n onClick={disabled ? undefined : (ev) => onClickDay?.(day, userData, ev)}\n >\n <InnerWrapperDiv>\n <CellWrapperDiv>\n {(day.month === month.monthInYear || showDatesInOtherMonths) && (\n <>\n {ExtraDayContent && (\n <ExtraDayContent\n week={week}\n month={month}\n day={day}\n dayState={dayState}\n theme={theme}\n userData={userData}\n />\n )}\n {content}\n </>\n )}\n </CellWrapperDiv>\n </InnerWrapperDiv>\n </WrapperTd>\n );\n};\n\nconst isDisabled = (\n defaultHighlights: Array<DayStateHighlight> | undefined,\n dayState: DayState | undefined,\n): boolean =>\n !!dayHighlightSelect<boolean>(\n dayState,\n defaultHighlights,\n [\"enabled\", \"disabled\"],\n [false, true],\n false,\n );\n","import { Box, Clickable, Text } from \"@stenajs-webui/core\";\nimport * as React from \"react\";\nimport { ReactNode } from \"react\";\nimport { OnClickWeek } from \"../../../types/CalendarTypes\";\nimport { WeekData } from \"../../../util/calendar/CalendarDataFactory\";\nimport { CalendarTheme } from \"../CalendarTheme\";\n\nexport interface WeekNumberCellProps {\n week: WeekData;\n onClickWeek?: OnClickWeek;\n theme: CalendarTheme;\n background?: ReactNode;\n prefix?: string;\n backgroundColor?: string;\n}\n\nexport const WeekNumberCell: React.FC<WeekNumberCellProps> = ({\n onClickWeek,\n theme,\n week,\n background,\n backgroundColor,\n prefix,\n}) => {\n const content = (\n <Box\n width={theme.width}\n height={theme.height}\n justifyContent={\"center\"}\n alignItems={\"center\"}\n >\n {background && <Box position={\"absolute\"}>{background}</Box>}\n <Box position={\"absolute\"}>\n <Text\n color={\n onClickWeek\n ? theme.WeekNumber.clickableTextColor\n : theme.WeekNumber.textColor\n }\n >\n {prefix}\n {week.weekNumber}\n </Text>\n </Box>\n </Box>\n );\n return (\n <Box\n background={backgroundColor || theme.WeekNumber.backgroundColor}\n position={\"relative\"}\n >\n {onClickWeek ? (\n <Clickable\n borderRadius={\"var(--swui-calendar-day-border-radius)\"}\n onClick={(ev) => onClickWeek(week, ev)}\n disableFocusHighlight={!onClickWeek}\n >\n {content}\n </Clickable>\n ) : (\n content\n )}\n </Box>\n );\n};\n","import { isAfter, isBefore, isSameDay } from \"date-fns\";\n\nexport const isDateInMinMaxRange = (\n date: Date,\n min: Date | undefined,\n max: Date | undefined,\n): boolean => {\n if (min && isBefore(date, min)) {\n return isSameDay(date, min);\n }\n if (max && isAfter(date, max)) {\n return isSameDay(date, max);\n }\n return true;\n};\n","import * as React from \"react\";\nimport { useMemo } from \"react\";\nimport {\n CalendarDayProps,\n OptionalMinMaxDates,\n} from \"../../types/CalendarTypes\";\nimport { addDayStateHighlightsOnSingleDay } from \"../../util/calendar/StateModifier\";\nimport { isDateInMinMaxRange } from \"../../util/date/DateMinMaxValidator\";\n\ninterface DisabledDayWrapperProps<T>\n extends CalendarDayProps<T>,\n OptionalMinMaxDates {\n dayComponent: React.ComponentType<CalendarDayProps<T>>;\n}\n\nexport const DisabledDayWrapper = function DisabledDayWrapper<T>({\n dayComponent: DayComponent,\n minDate,\n maxDate,\n dayState,\n day,\n ...props\n}: DisabledDayWrapperProps<T>) {\n const activeDayState = useMemo(\n () =>\n !isDateInMinMaxRange(day.date, minDate, maxDate)\n ? addDayStateHighlightsOnSingleDay(dayState, [\"disabled\"])\n : dayState,\n [day.date, dayState, maxDate, minDate],\n );\n\n return <DayComponent day={day} {...props} dayState={activeDayState} />;\n};\n","import { Box, Row, Text } from \"@stenajs-webui/core\";\nimport * as React from \"react\";\nimport { ReactNode } from \"react\";\nimport {\n CalendarDayProps,\n CalendarOnClicks,\n CalendarUserMonthData,\n DayState,\n DayStateHighlight,\n ExtraDayContentProps,\n OptionalMinMaxDates,\n Renderers,\n} from \"../../types/CalendarTypes\";\nimport {\n DayData,\n MonthData,\n WeekData,\n} from \"../../util/calendar/CalendarDataFactory\";\nimport { CalendarTheme, defaultCalendarTheme } from \"./CalendarTheme\";\nimport { WeekDayCell } from \"./renderers/WeekDayCell\";\nimport { CalendarDay } from \"./renderers/CalendarDay\";\nimport { FlatButton, stenaAngleDown } from \"@stenajs-webui/elements\";\nimport { WeekNumberCell } from \"./renderers/WeekNumberCell\";\nimport { DisabledDayWrapper } from \"./DisabledDayWrapper\";\n\nexport interface CalendarMonthProps<T>\n extends CalendarOnClicks<T>,\n Renderers,\n OptionalMinMaxDates {\n month: MonthData;\n dayComponent?: React.ComponentType<CalendarDayProps<T>>;\n userDataPerWeek?: CalendarUserMonthData<T>;\n statePerWeek?: CalendarUserMonthData<DayState>;\n theme?: CalendarTheme;\n headerRightContent?: ReactNode;\n extraDayContent?: React.ComponentType<ExtraDayContentProps<T>>;\n defaultHighlights?: Array<DayStateHighlight>;\n showWeekNumber: boolean;\n}\n\nexport function CalendarMonth<T>({\n month,\n dayComponent = CalendarDay,\n statePerWeek,\n userDataPerWeek,\n minDate,\n maxDate,\n onClickDay,\n onClickWeek,\n onClickWeekDay,\n onClickMonth,\n renderWeekNumber,\n renderWeekDay,\n headerRightContent,\n theme = defaultCalendarTheme,\n extraDayContent,\n defaultHighlights,\n showWeekNumber,\n}: CalendarMonthProps<T>) {\n return (\n <>\n <Box alignItems={\"stretch\"}>\n <Row\n justifyContent={headerRightContent ? \"space-between\" : \"center\"}\n alignItems={\"center\"}\n >\n <Row justifyContent={\"center\"} alignItems={\"center\"}>\n {onClickMonth ? (\n <FlatButton\n onClick={() => onClickMonth(month)}\n label={month.name + \" \" + String(month.year)}\n rightIcon={stenaAngleDown}\n />\n ) : (\n <Text whiteSpace={\"nowrap\"}>\n {month.name} {month.year}\n </Text>\n )}\n </Row>\n\n {headerRightContent && (\n <Box alignItems={\"center\"}>{headerRightContent}</Box>\n )}\n </Row>\n\n <table>\n <tbody>\n <tr>\n {showWeekNumber && (\n <td>\n <Box width={theme.width} height={theme.height} />\n </td>\n )}\n {month.weeks[0].days.map((day: DayData) => (\n <td key={day.name}>\n {renderWeekDay ? (\n renderWeekDay(day.name, theme, onClickWeekDay)\n ) : (\n <WeekDayCell\n day={day}\n onClickWeekDay={onClickWeekDay}\n theme={theme}\n />\n )}\n </td>\n ))}\n </tr>\n {month.weeks.map((week: WeekData) => (\n <tr key={week.weekNumber}>\n {showWeekNumber && (\n <td>\n {renderWeekNumber ? (\n renderWeekNumber(week, theme, onClickWeek)\n ) : (\n <WeekNumberCell\n week={week}\n onClickWeek={onClickWeek}\n theme={theme}\n />\n )}\n </td>\n )}\n {week.days.map((day) => (\n <DisabledDayWrapper\n dayComponent={dayComponent}\n key={day.dateString}\n day={day}\n week={week}\n month={month}\n dayState={\n statePerWeek &&\n statePerWeek[week.weekNumber] &&\n statePerWeek[week.weekNumber][day.dayOfMonth]\n }\n userData={\n userDataPerWeek &&\n userDataPerWeek[week.weekNumber] &&\n userDataPerWeek[week.weekNumber][day.dayOfMonth]\n }\n onClickDay={onClickDay}\n theme={theme}\n extraDayContent={extraDayContent}\n defaultHighlights={defaultHighlights}\n minDate={minDate}\n maxDate={maxDate}\n />\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </Box>\n </>\n );\n}\n","import { Row, Spacing } from \"@stenajs-webui/core\";\nimport { getMonth, getYear, Locale, parse } from \"date-fns\";\nimport { enGB } from \"date-fns/locale\";\nimport { chunk } from \"lodash-es\";\nimport * as React from \"react\";\nimport { useMemo } from \"react\";\nimport { useHighlightToday } from \"../../features/today-state/UseHighlightToday\";\nimport {\n CalendarOnClicks,\n CalendarProps,\n CalendarUserData,\n DayState,\n Renderers,\n} from \"../../types/CalendarTypes\";\nimport {\n calculateOverflowingMonth,\n getMonthInYear,\n getMonthsInYear,\n MonthData,\n} from \"../../util/calendar/CalendarDataFactory\";\nimport cx from \"classnames\";\nimport styles from \"./Calendar.module.css\";\n\nimport { CalendarMonth } from \"./CalendarMonth\";\nimport { CalendarTheme, defaultCalendarTheme } from \"./CalendarTheme\";\nimport { CalendarDay } from \"./renderers/CalendarDay\";\n\ninterface CalendarPanelProps<T>\n extends CalendarProps<T>,\n CalendarOnClicks<T>,\n Renderers {\n year: number;\n month: number;\n monthRows: Array<Array<MonthData>>;\n userDataPerMonth?: CalendarUserData<T>;\n statePerMonth?: CalendarUserData<DayState>;\n width?: string;\n height?: string;\n theme?: CalendarTheme;\n}\n\nfunction CalendarPanel<T>({\n monthRows,\n dayComponent = CalendarDay,\n userDataPerMonth,\n statePerMonth,\n minDate,\n maxDate,\n onClickDay,\n onClickWeekDay,\n onClickWeek,\n onClickMonth,\n renderWeekDay,\n renderWeekNumber,\n headerRightContent,\n extraDayContent,\n defaultHighlights,\n showWeekNumber,\n theme = defaultCalendarTheme,\n}: CalendarPanelProps<T>) {\n const minDateObj = useMemo(\n () => (minDate ? parse(minDate, \"yyyy-MM-dd\", new Date()) : undefined),\n [minDate],\n );\n\n const maxDateObj = useMemo(\n () => (maxDate ? parse(maxDate, \"yyyy-MM-dd\", new Date()) : undefined),\n [maxDate],\n );\n\n return (\n <div\n className={cx(\n styles.calendar,\n showWeekNumber && styles.weekNumberVisible,\n )}\n >\n {monthRows.map((monthRow, rowIndex) => (\n <Spacing key={rowIndex}>\n <Row gap={2}>\n {monthRow.map((month) => (\n <CalendarMonth<T>\n key={month.name}\n month={month}\n dayComponent={dayComponent}\n userDataPerWeek={\n userDataPerMonth && userDataPerMonth[month.monthString]\n }\n statePerWeek={statePerMonth && statePerMonth[month.monthString]}\n onClickDay={onClickDay}\n onClickWeekDay={onClickWeekDay}\n onClickWeek={onClickWeek}\n onClickMonth={onClickMonth}\n theme={theme}\n renderWeekNumber={renderWeekNumber}\n renderWeekDay={renderWeekDay}\n headerRightContent={headerRightContent}\n extraDayContent={extraDayContent}\n defaultHighlights={defaultHighlights}\n minDate={minDateObj}\n maxDate={maxDateObj}\n showWeekNumber={showWeekNumber ?? false}\n />\n ))}\n </Row>\n </Spacing>\n ))}\n </div>\n );\n}\n\nexport function Calendar<T>(props: CalendarProps<T>) {\n const initialDate = getInitialDate(props.year, props.month, props.date);\n const { year, month } = calculateOverflowingMonth(\n initialDate.year,\n initialDate.month,\n );\n const monthRows = getMonthRows(\n year,\n month,\n props.locale ?? enGB,\n props.numMonths,\n props.monthsPerRow,\n );\n\n const statePerMonth = useHighlightToday(\n props.highlightToday,\n props.statePerMonth,\n );\n\n return (\n <CalendarPanel<T>\n year={year}\n month={month}\n monthRows={monthRows}\n {...props}\n statePerMonth={statePerMonth}\n />\n );\n}\n\nconst getInitialDate = (year?: number, month?: number, date?: Date) => {\n if (month && year) {\n return {\n month,\n year,\n };\n }\n if (date) {\n return {\n month: getMonth(date),\n year: getYear(date),\n };\n }\n const now = new Date();\n return {\n month: getMonth(now),\n year: getYear(now),\n };\n};\n\nconst getMonthRows = (\n year: number,\n month: number,\n locale: Locale,\n numMonths?: number,\n monthsPerRow?: number,\n): Array<Array<MonthData>> => {\n if (numMonths == null) {\n return [[getMonthInYear(year, month, locale)]];\n }\n if (monthsPerRow == null) {\n return [getMonthsInYear(year, month, numMonths, locale)];\n }\n return chunk(getMonthsInYear(year, month, numMonths, locale), monthsPerRow);\n};\n","import { Position } from \"./Position\";\n\nexport const getDomIdForMonth = (\n position: Position,\n monthPickerId: string,\n): string => {\n return `${position.row}-${position.column}-${monthPickerId}`;\n};\n\nexport const getDomIdForKeyboardKey = (\n key: string,\n currentPosition: Position,\n monthPickerId: string,\n numColumnsPerRow: number,\n): string | undefined => {\n let next = currentPosition;\n for (let i = 0; i < numColumnsPerRow; i++) {\n next = movePositionByKey(next, key, numColumnsPerRow);\n const id = getDomIdForMonth(next, monthPickerId);\n if (document.getElementById(id)) {\n return id;\n }\n }\n return undefined;\n};\n\nexport const movePositionByKey = (\n currentPosition: Position,\n key: string,\n numColumnsPerRow: number,\n): Position => {\n let row = currentPosition.row;\n let column = currentPosition.column;\n if (key === \"ArrowLeft\") {\n column--;\n } else if (key === \"ArrowUp\") {\n row--;\n } else if (key === \"ArrowRight\") {\n column++;\n } else if (key === \"ArrowDown\") {\n row++;\n }\n\n if (column < 0) {\n column = numColumnsPerRow - 1;\n row--;\n }\n if (column > numColumnsPerRow - 1) {\n column = 0;\n row++;\n }\n\n return {\n column,\n row,\n };\n};\n","import { Locale } from \"date-fns\";\nimport {\n da,\n de,\n deAT,\n enGB,\n enIE,\n enUS,\n es,\n cs,\n it,\n fi,\n fr,\n lv,\n nb,\n nl,\n et,\n nlBE,\n pl,\n lt,\n sv,\n} from \"date-fns/locale\";\n\ntype LocalesMap = {\n [key: string]: Locale;\n};\n\nexport type SupportedLocaleCode =\n | \"en\"\n | \"en-US\"\n | \"en-GB\"\n | \"en-IE\"\n | \"de-AT\"\n | \"nl-BE\"\n | \"nl-NL\"\n | \"de-DE\"\n | \"nb-NO\"\n | \"sv-SE\"\n | \"da-DK\"\n | \"lv-LV\"\n | \"lt-LT\"\n | \"it-IT\"\n | \"et-EE\"\n | \"fi-FI\"\n | \"cs-CZ\"\n | \"es-ES\"\n | \"fr-FR\"\n | \"pl-PL\"\n | \"nl\"\n | \"de\"\n | \"nb\"\n | \"sv\"\n | \"da\"\n | \"lv\"\n | \"lt\"\n | \"it\"\n | \"et\"\n | \"fi\"\n | \"cs\"\n | \"es\"\n | \"fr\"\n | \"pl\";\n\nconst locales: LocalesMap = {\n en: enGB,\n \"en-US\": enUS,\n \"en-GB\": enGB,\n \"en-IE\": enIE,\n \"de-AT\": deAT,\n \"nl-BE\": nlBE,\n \"nl-NL\": nl,\n \"de-DE\": de,\n \"nb-NO\": nb,\n \"sv-SE\": sv,\n \"da-DK\": da,\n \"lv-LV\": lv,\n \"lt-LT\": lt,\n \"it-IT\": it,\n \"et-EE\": et,\n \"fi-FI\": fi,\n \"cs-CZ\": cs,\n \"es-ES\": es,\n \"fr-FR\": fr,\n \"pl-PL\": pl,\n nl,\n de,\n nb,\n sv,\n da,\n lv,\n lt,\n it,\n et,\n fi,\n cs,\n es,\n fr,\n pl,\n};\n\nexport const fallbackLocaleCode: SupportedLocaleCode = \"en-GB\";\nexport const fallbackLocaleCodeForFormatting: SupportedLocaleCode = \"sv\";\n\nexport const getSupportedLocaleCode = (\n localeCode: string,\n matchLanguage: boolean,\n fallback: SupportedLocaleCode,\n): SupportedLocaleCode => {\n if (locales[localeCode]) {\n return localeCode as SupportedLocaleCode;\n }\n if (matchLanguage) {\n const languageCode = getSupportedLocaleCodeMatchingLanguage(localeCode);\n if (languageCode) {\n return languageCode;\n }\n }\n return fallback;\n};\n\nexport const getLocaleForLocaleCode = (\n localeCode: SupportedLocaleCode,\n): Locale => {\n return locales[localeCode];\n};\n\nexport const getSupportedLocaleCodeMatchingLanguage = (\n localeCode: string,\n): SupportedLocaleCode | undefined => {\n const [lang] = localeCode.split(\"-\");\n const localeCodes = Object.keys(locales);\n for (const l of localeCodes) {\n if (l.startsWith(lang)) {\n return l as SupportedLocaleCode;\n }\n }\n return undefined;\n};\n\nexport const getDefaultLocaleForFormatting = (): Locale => {\n return locales[\"sv\"];\n};\n\n/**\n * This is only used by old calendar components, to pass localeCode to updated components.\n * All updated calendar components just take localeCode, for example \"en-GB\", since that is what the browser provides,\n * and is not library dependent.\n */\nexport const getLocaleCodeForLocale = (\n locale: Locale,\n): SupportedLocaleCode | undefined => {\n const localeCodes = Object.keys(locales);\n for (const localeCode of localeCodes) {\n if (locales[localeCode].code === locale.code) {\n return localeCode as SupportedLocaleCode;\n }\n }\n return undefined;\n};\n","import * as React from \"react\";\nimport {\n KeyboardEventHandler,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n} from \"react\";\nimport { Row } from \"@stenajs-webui/core\";\nimport { FlatButton, PrimaryButton } from \"@stenajs-webui/elements\";\nimport { format } from \"date-fns\";\nimport {\n getDomIdForKeyboardKey,\n getDomIdForMonth,\n} from \"./MonthPickerKeyboardNavigation\";\nimport { Position } from \"./Position\";\nimport { MonthPickerSizeVariant } from \"./MonthPicker\";\nimport {\n getLocaleForLocaleCode,\n SupportedLocaleCode,\n} from \"../localize-date-format/LocaleMapper\";\nimport { convertFirstCharToUpper } from \"../../util/caseFormat/CaseFormat\";\n\ninterface MonthPickerCellProps {\n month: Date;\n onClick: () => void;\n selected: boolean;\n localeCode: SupportedLocaleCode;\n autoFocus: boolean;\n monthPickerId: string;\n firstAvailableMonth: Date;\n lastAvailableMonth: Date;\n position: Position;\n size: MonthPickerSizeVariant;\n}\n\nexport const MonthPickerCell: React.FC<MonthPickerCellProps> = ({\n month,\n onClick,\n selected,\n localeCode,\n autoFocus,\n monthPickerId,\n position,\n size,\n}) => {\n const locale = useMemo(\n () => getLocaleForLocaleCode(localeCode) ?? getLocaleForLocaleCode(\"en-GB\"),\n [localeCode],\n );\n\n const label = useMemo(\n () => convertFirstCharToUpper(format(month, \"LLL\", { locale })),\n [locale, month],\n );\n\n const abbr = useMemo(\n () => format(month, \"LLLL\", { locale }),\n [locale, month],\n );\n\n const ref = useRef<HTMLButtonElement>(null);\n\n const domId = getDomIdForMonth(position, monthPickerId);\n const tabIndex = selected ? 0 : -1;\n\n useEffect(() => {\n ref.current?.focus();\n }, []);\n\n const onKeyDown = useCallback<KeyboardEventHandler<HTMLDivElement>>(\n (ev) => {\n const nextDomId = getDomIdForKeyboardKey(\n ev.key,\n position,\n monthPickerId,\n 4,\n );\n if (nextDomId) {\n document.getElementById(nextDomId)?.focus();\n }\n },\n [monthPickerId, position],\n );\n\n return (\n <Row justifyContent={\"center\"} onKeyDown={onKeyDown}>\n {selected ? (\n <PrimaryButton\n id={domId}\n aria-label={abbr}\n label={label}\n onClick={onClick}\n aria-selected={true}\n autoFocus={autoFocus}\n ref={ref}\n size={size === \"large\" ? \"large\" : \"medium\"}\n tabIndex={tabIndex}\n />\n ) : (\n <FlatButton\n id={domId}\n label={label}\n aria-label={abbr}\n onClick={onClick}\n size={size === \"large\" ? \"large\" : \"medium\"}\n tabIndex={tabIndex}\n />\n )}\n </Row>\n );\n};\n","import { addMonths } from \"date-fns\";\nimport { Position } from \"./Position\";\n\nexport interface MonthInput {\n yearOrder: Array<number>;\n years: Record<number, YearInput>;\n rows: Array<RowInput>;\n lastMonthRow: number;\n lastMonthColumn: number;\n}\n\nexport interface YearInput {\n year: number;\n rows: Array<number>;\n}\n\nexport interface RowInput {\n rowIndex: number;\n columns: Array<Columns>;\n}\n\nexport interface Columns {\n position: Position;\n month: Date;\n}\n\nexport const createMonths = (\n firstMonth: Date,\n numMonths: number,\n numColumnsPerRow: number,\n): MonthInput => {\n let currentYear = firstMonth.getFullYear();\n let currentRow = 0;\n let currentColumn = 0;\n let currentMonth = firstMonth;\n\n const input: MonthInput = {\n yearOrder: [],\n rows: [],\n years: {},\n lastMonthColumn: -1,\n lastMonthRow: -1,\n };\n\n for (let i = 0; i < numMonths; i++) {\n if (input.years[currentYear] == null) {\n input.yearOrder.push(currentYear);\n input.years[currentYear] = { year: currentYear, rows: [] };\n }\n\n input.rows[currentRow] = input.rows[currentRow] ?? {\n columns: [],\n rowIndex: currentRow,\n };\n\n input.rows[currentRow].columns[currentColumn] = {\n position: {\n column: currentColumn,\n row: currentRow,\n },\n month: currentMonth,\n };\n\n if (i === numMonths - 1) {\n // Last one, add it and exit\n input.years[currentYear].rows.push(currentRow);\n break;\n }\n\n currentMonth = addMonths(currentMonth, 1);\n\n if (currentMonth.getFullYear() !== currentYear) {\n input.years[currentYear].rows.push(currentRow);\n currentYear++;\n currentColumn = 0;\n currentRow++;\n } else {\n currentColumn++;\n if (currentColumn > numColumnsPerRow - 1) {\n input.years[currentYear].rows.push(currentRow);\n currentColumn = 0;\n currentRow++;\n }\n }\n }\n\n input.lastMonthColumn = currentColumn;\n input.lastMonthRow = currentRow;\n\n return input;\n};\n","import * as React from \"react\";\nimport {\n KeyboardEventHandler,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useState,\n} from \"react\";\nimport { ValueAndOnValueChangeProps } from \"@stenajs-webui/forms\";\nimport {\n Column,\n exhaustSwitchCase,\n Heading,\n useToday,\n} from \"@stenajs-webui/core\";\nimport { MonthPickerCell } from \"./MonthPickerCell\";\nimport { addMonths, isSameMonth } from \"date-fns\";\nimport { createMonths } from \"./MonthPickerDataFactory\";\nimport { SupportedLocaleCode } from \"../localize-date-format/LocaleMapper\";\n\nexport type MonthPickerSizeVariant = \"smaller\" | \"small\" | \"medium\" | \"large\";\n\nexport interface MonthPickerProps extends ValueAndOnValueChangeProps<Date> {\n localeCode: SupportedLocaleCode;\n firstMonth: Date;\n numMonths: number;\n onCancel?: () => void;\n size?: MonthPickerSizeVariant;\n}\n\nexport const MonthPicker: React.FC<MonthPickerProps> = ({\n value,\n onValueChange,\n firstMonth,\n localeCode,\n numMonths,\n onCancel,\n size = \"medium\",\n}) => {\n const monthPickerId = useId();\n const today = useToday();\n\n const clampedNumMonths = numMonths > 0 ? numMonths : 12;\n\n const [inited, setInited] = useState(false);\n\n const input = createMonths(firstMonth, clampedNumMonths, getNumColumns(size));\n\n const lastMonth = useMemo(() => {\n return addMonths(firstMonth, clampedNumMonths);\n }, [clampedNumMonths, firstMonth]);\n\n useEffect(() => {\n setInited(true);\n }, []);\n\n const onKeyDown = useCallback<KeyboardEventHandler>(\n (ev) => {\n if (ev.key === \"Escape\") {\n onCancel?.();\n ev.preventDefault();\n ev.stopPropagation();\n }\n },\n [onCancel],\n );\n\n return (\n <Column gap={1} maxWidth={getWidth(size)} onKeyDown={onKeyDown}>\n {input.yearOrder.map((year, yearIndex) => {\n const { rows } = input.years[year];\n return (\n <React.Fragment key={year}>\n {(yearIndex !== 0 || year !== today.getFullYear()) && (\n <Heading variant={\"h4\"}>{year}</Heading>\n )}\n <table style={{ borderSpacing: \"0 8px\" }}>\n <tbody>\n {rows.map((r) => {\n const { columns } = input.rows[r];\n return (\n <tr key={r}>\n {columns.map(({ month, position }) => (\n <td key={month.getMonth()}>\n <MonthPickerCell\n month={month}\n firstAvailableMonth={firstMonth}\n lastAvailableMonth={lastMonth}\n localeCode={localeCode}\n selected={value ? isSameMonth(value, month) : false}\n autoFocus={inited}\n onClick={() => onValueChange?.(month)}\n monthPickerId={monthPickerId}\n position={position}\n size={size}\n />\n </td>\n ))}\n </tr>\n );\n })}\n </tbody>\n </table>\n </React.Fragment>\n );\n })}\n </Column>\n );\n};\n\nconst getWidth = (size: MonthPickerSizeVariant) => {\n // For cell size = 48px, 48*7 = 336px\n switch (size) {\n case \"smaller\":\n return \"280px\";\n case \"small\":\n return \"308px\";\n case \"medium\":\n return \"336px\";\n case \"large\":\n return \"448px\";\n default:\n return exhaustSwitchCase(size, \"336px\");\n }\n};\n\nconst getNumColumns = (size: MonthPickerSizeVariant): number => {\n switch (size) {\n case \"smaller\":\n case \"small\":\n return 3;\n case \"medium\":\n case \"large\":\n return 4;\n default:\n return exhaustSwitchCase(size, 4);\n }\n};\n","import { PresetPage } from \"./CalendarPreset\";\nimport { addDays, subDays } from \"date-fns\";\n\nexport const createStandardDateRangePresets = (\n now: Date,\n): Array<PresetPage> => [\n {\n label: \"Past\",\n presets: [\n { label: \"Last 3 days\", startDate: now, endDate: subDays(now, 2) },\n { label: \"Last 7 days\", startDate: now, endDate: subDays(now, 6) },\n { label: \"Last 30 days\", startDate: now, endDate: subDays(now, 29) },\n { label: \"Last 45 days\", startDate: now, endDate: subDays(now, 44) },\n ],\n },\n {\n label: \"Future\",\n presets: [\n { label: \"Next 3 days\", startDate: now, endDate: addDays(now, 2) },\n { label: \"Next 7 days\", startDate: now, endDate: addDays(now, 6) },\n { label: \"Next 30 days\", startDate: now, endDate: addDays(now, 29) },\n { label: \"Next 45 days\", startDate: now, endDate: addDays(now, 44) },\n ],\n },\n];\n","import * as React from \"react\";\nimport { useMemo, useState } from \"react\";\nimport { createStandardDateRangePresets } from \"./PresetFactory\";\nimport { Column, Row, Space, Text } from \"@stenajs-webui/core\";\nimport {\n FlatButton,\n PrimaryButton,\n stenaAngleLeft,\n stenaAngleRight,\n} from \"@stenajs-webui/elements\";\nimport { CalendarPreset } from \"./CalendarPreset\";\n\nexport interface PresetPickerProps {\n onClickPreset: (preset: CalendarPreset) => void;\n}\n\nexport const PresetPicker: React.FC<PresetPickerProps> = ({\n onClickPreset,\n}) => {\n const [pageIndex, setPageIndex] = useState(0);\n const pages = useMemo(() => createStandardDateRangePresets(new Date()), []);\n\n const currentPage = pages[pageIndex] ?? pages[0];\n\n return (\n <Column>\n <Row\n justifyContent={\"space-between\"}\n alignItems={\"center\"}\n width={\"200px\"}\n >\n <FlatButton\n size={\"small\"}\n leftIcon={stenaAngleLeft}\n disabled={pageIndex === 0}\n onClick={() => setPageIndex(pageIndex - 1)}\n />\n <Text>{currentPage.label}</Text>\n <FlatButton\n size={\"small\"}\n leftIcon={stenaAngleRight}\n disabled={pageIndex === pages.length - 1}\n onClick={() => setPageIndex(pageIndex + 1)}\n />\n </Row>\n <Space />\n <Column alignItems={\"center\"}>\n {currentPage.presets.map((preset) => (\n <React.Fragment key={preset.label}>\n <PrimaryButton\n label={preset.label}\n onClick={() => onClickPreset(preset)}\n />\n <Space />\n </React.Fragment>\n ))}\n </Column>\n </Column>\n );\n};\n","import { Box, useToday } from \"@stenajs-webui/core\";\nimport { PrimaryButton } from \"@stenajs-webui/elements\";\nimport * as React from \"react\";\nimport { ReactNode, useCallback, useMemo } from \"react\";\nimport { Calendar } from \"../../components/calendar/Calendar\";\nimport {\n CalendarProps,\n RenderMonthPickerArgs,\n} from \"../../types/CalendarTypes\";\nimport { MonthPicker } from \"../month-picker/MonthPicker\";\nimport { CalendarPreset } from \"../preset-picker/CalendarPreset\";\nimport { PresetPicker } from \"../preset-picker/PresetPicker\";\nimport { CalendarPanelType } from \"./CalendarPanelType\";\nimport {\n getLocaleCodeForLocale,\n SupportedLocaleCode,\n} from \"../localize-date-format/LocaleMapper\";\n\ninterface CalendarWithMonthYearPickersProps<T>\n extends Omit<CalendarProps<T>, \"date\" | \"year\" | \"month\"> {\n dateInFocus: Date;\n firstMonthInMonthPicker?: Date;\n numMonthsInMonthPicker?: number;\n setDateInFocus: (dateInFocus: Date) => void;\n currentPanel: CalendarPanelType;\n setCurrentPanel: (currentPanel: CalendarPanelType) => void;\n onSelectPreset: (preset: CalendarPreset) => void;\n renderMonthPicker?: (args: RenderMonthPickerArgs) => ReactNode;\n}\n\nexport const CalendarWithMonthYearPickers =\n function CalendarWithMonthYearPickers<T>({\n locale,\n dateInFocus,\n setDateInFocus,\n currentPanel,\n setCurrentPanel,\n renderMonthPicker,\n firstMonthInMonthPicker,\n numMonthsInMonthPicker,\n ...props\n }: CalendarWithMonthYearPickersProps<T>) {\n const localeCode = useMemo<SupportedLocaleCode>(\n () =>\n locale == null ? \"en-GB\" : (getLocaleCodeForLocale(locale) ?? \"en-GB\"),\n [locale],\n );\n const today = useToday();\n\n const onChangeSelectedMonth = useCallback(\n (selectedMonth: Date) => {\n if (setDateInFocus) {\n setDateInFocus(selectedMonth);\n }\n setCurrentPanel(\"calendar\");\n },\n [setDateInFocus, setCurrentPanel],\n );\n\n const onClickMonth = useCallback(() => {\n setCurrentPanel(\"month\");\n }, [setCurrentPanel]);\n\n switch (currentPanel) {\n case \"calendar\":\n return (\n <Calendar<T>\n {...props}\n date={dateInFocus}\n onClickMonth={onClickMonth}\n locale={locale}\n />\n );\n case \"month\":\n return renderMonthPicker ? (\n renderMonthPicker({\n value: dateInFocus,\n onValueChange: onChangeSelectedMonth,\n locale: locale,\n firstMonth: firstMonthInMonthPicker ?? today,\n numMonths: numMonthsInMonthPicker ?? 24,\n dateInFocus,\n })\n ) : (\n <MonthPicker\n value={dateInFocus}\n onValueChange={onChangeSelectedMonth}\n localeCode={localeCode}\n firstMonth={firstMonthInMonthPicker ?? today}\n numMonths={numMonthsInMonthPicker ?? 24}\n />\n );\n case \"presets\":\n return <PresetPicker onClickPreset={() => {}} />;\n\n default:\n return (\n <Box>\n <PrimaryButton\n label={\"Show calendar\"}\n onClick={() => setCurrentPanel(\"calendar\")}\n />\n </Box>\n );\n }\n };\n","import { addMonths, addYears, subMonths, subYears } from \"date-fns\";\nimport { useCallback } from \"react\";\n\nexport const useSelectedMonthStepperLogic = (\n dateInFocus: Date,\n setDateInFocus?: (dateInFocus: Date) => void,\n monthsPerRow?: number,\n numMonths?: number,\n) => {\n const nextMonth = useCallback(() => {\n const d = addMonths(dateInFocus, monthsPerRow ?? numMonths ?? 1);\n setDateInFocus?.(d);\n }, [setDateInFocus, dateInFocus, monthsPerRow, numMonths]);\n\n const nextYear = useCallback(() => {\n const d = addYears(dateInFocus, 1);\n setDateInFocus?.(d);\n }, [setDateInFocus, dateInFocus]);\n\n const prevMonth = useCallback(() => {\n const d = subMonths(dateInFocus, monthsPerRow ?? numMonths ?? 1);\n setDateInFocus?.(d);\n }, [setDateInFocus, dateInFocus, monthsPerRow, numMonths]);\n\n const prevYear = useCallback(() => {\n const d = subYears(dateInFocus, 1);\n setDateInFocus?.(d);\n }, [setDateInFocus, dateInFocus]);\n\n return {\n nextMonth,\n prevMonth,\n nextYear,\n prevYear,\n };\n};\n","import { Indent, Row, Space } from \"@stenajs-webui/core\";\nimport {\n SecondaryButton,\n stenaAngleLeftDouble,\n stenaAngleRightDouble,\n stenaArrowLeft,\n stenaArrowRight,\n} from \"@stenajs-webui/elements\";\nimport * as React from \"react\";\nimport { ReactNode } from \"react\";\nimport { CalendarTheme } from \"../../components/calendar/CalendarTheme\";\n\nexport interface WithMonthSwitcherBelowProps {\n theme: CalendarTheme;\n nextMonth: () => void;\n prevMonth: () => void;\n nextYear: () => void;\n prevYear: () => void;\n children?: ReactNode;\n}\n\nexport const WithMonthSwitcherBelow: React.FC<WithMonthSwitcherBelowProps> = ({\n children,\n prevMonth,\n nextMonth,\n prevYear,\n nextYear,\n}) => (\n <div>\n {children}\n <Indent>\n <Row gap={1}>\n <SecondaryButton onClick={prevYear} leftIcon={stenaAngleLeftDouble} />\n <SecondaryButton onClick={prevMonth} leftIcon={stenaArrowLeft} />\n <Indent num={2} />\n <SecondaryButton onClick={nextMonth} leftIcon={stenaArrowRight} />\n <SecondaryButton onClick={nextYear} leftIcon={stenaAngleRightDouble} />\n </Row>\n </Indent>\n <Space />\n </div>\n);\n","import { Column, Row } from \"@stenajs-webui/core\";\nimport {\n SecondaryButton,\n stenaArrowLeft,\n stenaArrowRight,\n} from \"@stenajs-webui/elements\";\nimport * as React from \"react\";\nimport { Calendar } from \"../../components/calendar/Calendar\";\nimport { defaultCalendarTheme } from \"../../components/calendar/CalendarTheme\";\nimport {\n CalendarProps,\n RenderMonthPickerArgs,\n} from \"../../types/CalendarTypes\";\nimport { CalendarPanelType } from \"../calendar-with-month-year-pickers/CalendarPanelType\";\nimport { CalendarWithMonthYearPickers } from \"../calendar-with-month-year-pickers/CalendarWithMonthYearPickers\";\nimport { CalendarPreset } from \"../preset-picker/CalendarPreset\";\nimport { useSelectedMonthStepperLogic } from \"./hooks/UseSelectedMonthStepperLogic\";\nimport { WithMonthSwitcherBelow } from \"./MonthSwitcherBelow\";\nimport { ReactNode } from \"react\";\n\nexport type MonthSwitcherPlacement = \"header\" | \"below\";\n\nexport interface CalendarWithMonthSwitcherProps<T> extends CalendarProps<T> {\n monthSwitcherPlacement?: MonthSwitcherPlacement;\n dateInFocus: Date;\n setDateInFocus: (dateInFocus: Date) => void;\n currentPanel: CalendarPanelType;\n setCurrentPanel: (currentPanel: CalendarPanelType) => void;\n onSelectPreset?: (preset: CalendarPreset) => void;\n renderMonthPicker?: (args: RenderMonthPickerArgs) => ReactNode;\n firstMonthInMonthPicker?: Date;\n numMonthsInMonthPicker?: number;\n}\n\nconst noop = () => {};\n\nexport function CalendarWithMonthSwitcher<T>({\n monthSwitcherPlacement,\n theme = defaultCalendarTheme,\n dateInFocus,\n setDateInFocus,\n currentPanel,\n setCurrentPanel,\n onSelectPreset = noop,\n renderMonthPicker,\n firstMonthInMonthPicker,\n numMonthsInMonthPicker,\n ...calendarProps\n}: CalendarWithMonthSwitcherProps<T>) {\n const { nextMonth, prevMonth, nextYear, prevYear } =\n useSelectedMonthStepperLogic(\n dateInFocus,\n setDateInFocus,\n calendarProps.monthsPerRow,\n calendarProps.numMonths,\n );\n\n const placement = fallbackIfNoPlacement(\n monthSwitcherPlacement,\n calendarProps.numMonths,\n );\n\n switch (placement) {\n case \"below\": {\n return (\n <WithMonthSwitcherBelow\n theme={theme}\n nextMonth={nextMonth}\n prevMonth={prevMonth}\n nextYear={nextYear}\n prevYear={prevYear}\n >\n <Calendar<T> {...calendarProps} theme={theme} date={dateInFocus} />\n </WithMonthSwitcherBelow>\n );\n }\n case \"header\": {\n return (\n <Column>\n <CalendarWithMonthYearPickers<T>\n {...calendarProps}\n theme={theme}\n renderMonthPicker={renderMonthPicker}\n dateInFocus={dateInFocus}\n setDateInFocus={setDateInFocus}\n currentPanel={currentPanel}\n setCurrentPanel={setCurrentPanel}\n onSelectPreset={onSelectPreset}\n firstMonthInMonthPicker={firstMonthInMonthPicker}\n numMonthsInMonthPicker={numMonthsInMonthPicker}\n headerRightContent={\n <Row alignItems={\"center\"} gap={1}>\n <SecondaryButton\n onClick={prevMonth}\n leftIcon={stenaArrowLeft}\n />\n <SecondaryButton\n onClick={nextMonth}\n leftIcon={stenaArrowRight}\n />\n </Row>\n }\n />\n </Column>\n );\n }\n default: {\n return (\n <Calendar<T> {...calendarProps} theme={theme} date={dateInFocus} />\n );\n }\n }\n}\n\nconst fallbackIfNoPlacement = (\n monthSwitcherPlacement: MonthSwitcherPlacement | undefined,\n numMonths: number | undefined,\n): MonthSwitcherPlacement => {\n return monthSwitcherPlacement || (numMonths || 1) > 1 ? \"below\" : \"header\";\n};\n","import { DateRange, DateStringRange } from \"../../types/DateRange\";\nimport { format, parse } from \"date-fns\";\n\nexport const dateRangeToStrings = (dateRange: DateRange): DateStringRange => ({\n startDate: dateRange.startDate\n ? format(dateRange.startDate, \"yyyy-MM-dd\")\n : undefined,\n endDate: dateRange.endDate\n ? format(dateRange.endDate, \"yyyy-MM-dd\")\n : undefined,\n});\n\nexport const stringsToDateRange = ({\n startDate,\n endDate,\n}: DateStringRange): DateRange => {\n const now = new Date();\n return {\n startDate: startDate ? parse(startDate, \"yyyy-MM-dd\", now) : undefined,\n endDate: endDate ? parse(endDate, \"yyyy-MM-dd\", now) : undefined,\n };\n};\n","import { isAfter, isSameDay } from \"date-fns\";\nimport { DateRange, DateStringRange } from \"../../types/DateRange\";\nimport { dateRangeToStrings, stringsToDateRange } from \"./DateRangeTransformer\";\n\nexport const isDateRangeInvalid = ({\n startDate,\n endDate,\n}: DateRange): boolean =>\n Boolean(\n startDate &&\n endDate &&\n !isSameDay(startDate, endDate) &&\n isAfter(startDate, endDate),\n );\n\nexport const toggleDatesIfEndIsEarlierThanStart = (\n dateRange: DateRange,\n): DateRange => {\n if (isDateRangeInvalid(dateRange)) {\n return {\n startDate: dateRange.endDate,\n endDate: dateRange.startDate,\n };\n }\n return dateRange;\n};\n\nexport const toggleDateStringsIfEndIsEarlierThanStart = (\n dateRange: DateStringRange,\n): DateStringRange => {\n if (dateRange.startDate && dateRange.endDate) {\n return dateRangeToStrings(\n toggleDatesIfEndIsEarlierThanStart(stringsToDateRange(dateRange)),\n );\n }\n return dateRange;\n};\n","import { useCallback } from \"react\";\nimport { DateRangeFocusedInput } from \"../../../components/calendar-types/date-range-calendar/DateRangeCalendar\";\nimport { OnClickDay } from \"../../../types/CalendarTypes\";\nimport { DayData } from \"../../../util/calendar/CalendarDataFactory\";\nimport {\n isDateRangeInvalid,\n toggleDatesIfEndIsEarlierThanStart,\n} from \"../../../util/date-range/DateRangeValidator\";\nimport { DateRange } from \"../../../types/DateRange\";\n\nexport const useDateRangeOnClickDayHandler = <T>(\n value: DateRange | undefined,\n onValueChange: ((dateRange: DateRange) => void) | undefined,\n focusedInput: DateRangeFocusedInput,\n setFocusedInput: (focusedInput: DateRangeFocusedInput) => void,\n): OnClickDay<T> => {\n return useCallback(\n (day: DayData) => {\n const dateRange = {\n startDate: focusedInput === \"startDate\" ? day.date : value?.startDate,\n endDate: focusedInput === \"endDate\" ? day.date : value?.endDate,\n };\n\n if (!isDateRangeInvalid(dateRange)) {\n setFocusedInput(focusedInput === \"startDate\" ? \"endDate\" : \"startDate\");\n }\n onValueChange?.(toggleDatesIfEndIsEarlierThanStart(dateRange));\n },\n [\n focusedInput,\n onValueChange,\n setFocusedInput,\n value?.endDate,\n value?.startDate,\n ],\n );\n};\n","import { CalendarPanelType } from \"../calendar-with-month-year-pickers/CalendarPanelType\";\nimport { useCallback, useState } from \"react\";\n\nexport type OnChangePanel = (panel: CalendarPanelType) => void;\n\nexport interface UseInternalPanelStateProps {\n onChangePanel?: OnChangePanel;\n}\n\nexport const useInternalPanelState = (\n onChangePanel: OnChangePanel | undefined,\n) => {\n const [currentPanel, _setCurrentPanel] =\n useState<CalendarPanelType>(\"calendar\");\n\n const setCurrentPanel = useCallback(\n (currentPanel: CalendarPanelType) => {\n _setCurrentPanel(currentPanel);\n onChangePanel?.(currentPanel);\n },\n [onChangePanel],\n );\n\n return {\n currentPanel,\n setCurrentPanel,\n };\n};\n","import { useMemo, useState } from \"react\";\nimport { useDateRangeOnClickDayHandler } from \"../../../../features/date-range/hooks/UseDateRangeOnClickDayHandler\";\nimport { DateRangeCalendarProps } from \"../DateRangeCalendar\";\nimport { CalendarWithMonthSwitcherProps } from \"../../../../features/month-switcher/CalendarWithMonthSwitcher\";\nimport { buildDayStateForDateRange } from \"../../../../util/calendar/StateModifier\";\nimport { useInternalPanelState } from \"../../../../features/internal-panel-state/UseInternalPanelState\";\n\nexport const useDateRangeSelection = <T>({\n focusedInput,\n value,\n onValueChange,\n setFocusedInput,\n statePerMonth,\n onChangePanel,\n initialDateInFocus,\n}: DateRangeCalendarProps<T>): CalendarWithMonthSwitcherProps<T> => {\n const { currentPanel, setCurrentPanel } =\n useInternalPanelState(onChangePanel);\n const [dateInFocus, setDateInFocus] = useState(\n () => initialDateInFocus ?? new Date(),\n );\n\n const onClickDay = useDateRangeOnClickDayHandler(\n value,\n onValueChange,\n focusedInput,\n setFocusedInput,\n );\n\n const statePerMonthWithSelection = useMemo(\n () =>\n buildDayStateForDateRange(\n statePerMonth,\n value?.startDate,\n value?.endDate,\n ),\n [statePerMonth, value?.endDate, value?.startDate],\n );\n\n return {\n onClickDay,\n statePerMonth: statePerMonthWithSelection,\n currentPanel,\n setCurrentPanel,\n setDateInFocus,\n dateInFocus,\n };\n};\n","import * as React from \"react\";\nimport { CalendarWithMonthSwitcher } from \"../../../features/month-switcher/CalendarWithMonthSwitcher\";\nimport { useDateRangeSelection } from \"./hooks/UseDateRangeSelection\";\nimport { InternalPanelAndFocusStateProps } from \"../../../types/InternalPanelAndFocusStateProps\";\nimport { ValueAndOnValueChangeProps } from \"@stenajs-webui/forms\";\nimport { DateRange } from \"../../../types/DateRange\";\n\nexport type DateRangeFocusedInput = \"startDate\" | \"endDate\" | undefined;\n\nexport interface DateRangeCalendarProps<T>\n extends InternalPanelAndFocusStateProps<T>,\n ValueAndOnValueChangeProps<DateRange> {\n focusedInput?: DateRangeFocusedInput;\n setFocusedInput: (focusedInput: DateRangeFocusedInput) => void;\n initialDateInFocus?: Date;\n}\n\nexport function DateRangeCalendar<T>(props: DateRangeCalendarProps<T>) {\n const dateRangeSelectionProps = useDateRangeSelection(props);\n return (\n <CalendarWithMonthSwitcher<T> {...props} {...dateRangeSelectionProps} />\n );\n}\n\nexport type DateRangeInputCalendarProps<T> = Omit<\n DateRangeCalendarProps<T>,\n | \"startDateInFocus\"\n | \"value\"\n | \"onValueChange\"\n | \"focusedInput\"\n | \"setFocusedInput\"\n | \"theme\"\n | \"currentPanel\"\n | \"setCurrentPanel\"\n>;\n","import { useState } from \"react\";\nimport { DateRangeFocusedInput } from \"../DateRangeCalendar\";\n\nexport const useDateRangeCalendarState = () => {\n const [startDate, setStartDate] = useState<Date | undefined>();\n const [endDate, setEndDate] = useState<Date | undefined>();\n const [focusedInput, setFocusedInput] =\n useState<DateRangeFocusedInput>(\"startDate\");\n return {\n startDate,\n setStartDate,\n endDate,\n setEndDate,\n focusedInput,\n setFocusedInput,\n };\n};\n","import { useCallback, useMemo, useState } from \"react\";\nimport { OnClickDay } from \"../../../types/CalendarTypes\";\nimport { addDayStateHighlights } from \"../../../util/calendar/StateModifier\";\nimport { SingleDateCalendarProps } from \"./SingleDateCalendar\";\nimport { CalendarWithMonthSwitcherProps } from \"../../../features/month-switcher/CalendarWithMonthSwitcher\";\nimport { useInternalPanelState } from \"../../../features/internal-panel-state/UseInternalPanelState\";\n\nexport const useSingleDateSelection = <T>({\n onChange,\n value,\n statePerMonth,\n onChangePanel,\n}: SingleDateCalendarProps<T>): CalendarWithMonthSwitcherProps<T> => {\n const { currentPanel, setCurrentPanel } =\n useInternalPanelState(onChangePanel);\n\n const [dateInFocus, setDateInFocus] = useState(() => value ?? new Date());\n\n const onClickDay: OnClickDay<T> = useCallback(\n (day) => {\n if (onChange) {\n onChange(day.date);\n }\n },\n [onChange],\n );\n\n const statePerMonthWithSelectedDate = useMemo(\n () =>\n value\n ? addDayStateHighlights(statePerMonth, value, [\n \"selected\",\n \"singleSelected\",\n ])\n : statePerMonth,\n [statePerMonth, value],\n );\n\n return {\n onClickDay,\n statePerMonth: statePerMonthWithSelectedDate,\n date: value,\n currentPanel,\n setCurrentPanel,\n dateInFocus,\n setDateInFocus,\n };\n};\n","import * as React from \"react\";\nimport { CalendarWithMonthSwitcher } from \"../../../features/month-switcher/CalendarWithMonthSwitcher\";\n\nimport { useSingleDateSelection } from \"./UseSingleDateSelection\";\nimport { InternalPanelAndFocusStateProps } from \"../../../types/InternalPanelAndFocusStateProps\";\n\nexport interface SingleDateCalendarProps<T>\n extends InternalPanelAndFocusStateProps<T> {\n value: Date | undefined;\n onChange: (value: Date | undefined) => void;\n}\n\nexport function SingleDateCalendar<T>(props: SingleDateCalendarProps<T>) {\n const singleDateSelectionProps = useSingleDateSelection(props);\n return (\n <CalendarWithMonthSwitcher<T> {...props} {...singleDateSelectionProps} />\n );\n}\n","import { isSameDay } from \"date-fns\";\nimport { useCallback, useMemo, useState } from \"react\";\nimport { OnClickDay } from \"../../../types/CalendarTypes\";\nimport { addDayStateHighlights } from \"../../../util/calendar/StateModifier\";\nimport { MultiDateCalendarProps } from \"./MultiDateCalendar\";\nimport { CalendarWithMonthSwitcherProps } from \"../../../features/month-switcher/CalendarWithMonthSwitcher\";\nimport { useInternalPanelState } from \"../../../features/internal-panel-state/UseInternalPanelState\";\n\nexport const useMultiDateSelection = <T>({\n onChange,\n value,\n statePerMonth,\n onChangePanel,\n initialDateInFocus,\n}: MultiDateCalendarProps<T>): CalendarWithMonthSwitcherProps<T> => {\n const { currentPanel, setCurrentPanel } =\n useInternalPanelState(onChangePanel);\n const [dateInFocus, setDateInFocus] = useState(\n initialDateInFocus ?? new Date(),\n );\n\n const onClickDay: OnClickDay<T> = useCallback(\n (day) => {\n if (!onChange) {\n return;\n }\n const isSelected = value && value.find((d) => isSameDay(d, day.date));\n if (value && isSelected) {\n onChange(value.filter((v) => !isSameDay(v, day.date)));\n } else {\n onChange([...(value || []), day.date]);\n }\n },\n [onChange, value],\n );\n const statePerMonthWithSelectedDate = useMemo(() => {\n if (!value) {\n return statePerMonth;\n }\n return value.reduce(\n (stateSum, date) => addDayStateHighlights(stateSum, date, [\"selected\"]),\n statePerMonth,\n );\n }, [statePerMonth, value]);\n\n return {\n onClickDay,\n statePerMonth: statePerMonthWithSelectedDate,\n currentPanel,\n setCurrentPanel,\n dateInFocus,\n setDateInFocus,\n };\n};\n","import * as React from \"react\";\nimport { CalendarWithMonthSwitcher } from \"../../../features/month-switcher/CalendarWithMonthSwitcher\";\nimport { useMultiDateSelection } from \"./UseMultiDateSelection\";\nimport { UseInternalPanelStateProps } from \"../../../features/internal-panel-state/UseInternalPanelState\";\nimport { InternalPanelAndFocusStateProps } from \"../../../types/InternalPanelAndFocusStateProps\";\n\nexport interface MultiDateCalendarProps<T>\n extends InternalPanelAndFocusStateProps<T>,\n UseInternalPanelStateProps {\n initialDateInFocus?: Date;\n value?: Array<Date>;\n onChange?: (value: Array<Date>) => void;\n}\n\nexport function MultiDateCalendar<T>(props: MultiDateCalendarProps<T>) {\n const selectionProps = useMultiDateSelection(props);\n return <CalendarWithMonthSwitcher<T> {...props} {...selectionProps} />;\n}\n","import { Locale, setWeek, startOfWeek } from \"date-fns\";\nimport { enGB } from \"date-fns/locale\";\nimport { useCallback, useMemo, useState } from \"react\";\nimport { useInternalPanelState } from \"../../../features/internal-panel-state/UseInternalPanelState\";\nimport { CalendarWithMonthSwitcherProps } from \"../../../features/month-switcher/CalendarWithMonthSwitcher\";\nimport { OnClickDay, OnClickWeek } from \"../../../types/CalendarTypes\";\nimport {\n getWeekForDate,\n WeekData,\n} from \"../../../util/calendar/CalendarDataFactory\";\nimport { addWeekRangeHighlights } from \"../../../util/calendar/StateModifier\";\nimport { SingleWeekCalendarProps } from \"./SingleWeekCalendar\";\n\nexport const useSingleWeekSelection = <T>({\n onChange,\n value,\n statePerMonth,\n onChangePanel,\n locale = enGB,\n}: SingleWeekCalendarProps<T>): CalendarWithMonthSwitcherProps<T> => {\n const [dateInFocus, setDateInFocus] = useState(() => {\n const week = getWeekDataFromWeekString(value, locale);\n if (!week) {\n return new Date();\n }\n return week.days[0].date;\n });\n const { currentPanel, setCurrentPanel } =\n useInternalPanelState(onChangePanel);\n\n const onClickDay = useCallback<OnClickDay<T>>(\n (day) => {\n if (onChange) {\n onChange(getWeekStringFromWeekData(getWeekForDate(day.date, locale)));\n }\n },\n [locale, onChange],\n );\n const onClickWeek = useCallback<OnClickWeek>(\n (week) => {\n if (onChange) {\n onChange(getWeekStringFromWeekData(week));\n }\n },\n [onChange],\n );\n\n const statePerMonthWithSelection = useMemo(() => {\n const weekData = getWeekDataFromWeekString(value, locale);\n return weekData\n ? addWeekRangeHighlights(statePerMonth, weekData)\n : statePerMonth;\n }, [value, locale, statePerMonth]);\n\n const date = useMemo(() => {\n const week = getWeekDataFromWeekString(value, locale);\n if (!week) {\n return new Date();\n }\n return week.days[0].date;\n }, [locale, value]);\n\n return {\n statePerMonth: statePerMonthWithSelection,\n date,\n dateInFocus,\n setDateInFocus,\n onClickDay,\n onClickWeek,\n currentPanel,\n setCurrentPanel,\n };\n};\n\nconst getWeekStringFromWeekData = (\n week: WeekData | undefined,\n): string | undefined => {\n if (!week) {\n return undefined;\n }\n return `${week.endYear}-${week.weekNumber}`;\n};\n\nconst getWeekDataFromWeekString = (\n week: string | undefined,\n locale: Locale,\n): WeekData | undefined => {\n if (!week) {\n return undefined;\n }\n const parts = week.split(\"-\");\n const weekNumber = parseInt(parts[1], 10);\n const year = parseInt(parts[0], 10);\n const date = new Date();\n date.setFullYear(year);\n const firstDateOfWeek = startOfWeek(setWeek(date, weekNumber), { locale });\n return getWeekForDate(firstDateOfWeek, locale);\n};\n","import * as React from \"react\";\nimport { CalendarWithMonthSwitcher } from \"../../../features/month-switcher/CalendarWithMonthSwitcher\";\nimport { useSingleWeekSelection } from \"./UseSingleWeekSelection\";\nimport { InternalPanelAndFocusStateProps } from \"../../../types/InternalPanelAndFocusStateProps\";\n\nexport type SingleWeekValue = string;\n\nexport interface SingleWeekCalendarProps<T>\n extends InternalPanelAndFocusStateProps<T> {\n value: SingleWeekValue | undefined;\n onChange: (value: SingleWeekValue | undefined) => void;\n}\n\nexport function SingleWeekCalendar<T>(props: SingleWeekCalendarProps<T>) {\n const singleWeekSelectionProps = useSingleWeekSelection(props);\n return (\n <CalendarWithMonthSwitcher<T> {...props} {...singleWeekSelectionProps} />\n );\n}\n","export const defaultPopoverPlacement = \"bottom\";\n","import { useCallback, useState } from \"react\";\n\nexport const useDateInput = (\n onChange?: (date: Date | undefined) => void,\n onClose?: () => void,\n openOnMount?: boolean,\n) => {\n const [showingCalendar, setShowingCalendar] = useState(openOnMount || false);\n\n const showCalendar = useCallback(() => {\n setShowingCalendar(true);\n return true;\n }, [setShowingCalendar]);\n\n const hideCalendar = useCallback(() => {\n setShowingCalendar(false);\n if (onClose) {\n onClose();\n }\n }, [setShowingCalendar, onClose]);\n\n const onSelectDate = useCallback(\n (date: Date | undefined) => {\n if (onChange) {\n onChange(date);\n }\n setTimeout(hideCalendar, 150);\n },\n [onChange, hideCalendar],\n );\n\n return {\n showCalendar,\n hideCalendar,\n showingCalendar,\n onSelectDate,\n };\n};\n","export const defaultMaxDate = \"2999-12-31\";\n","import { Box } from \"@stenajs-webui/core\";\nimport { stenaCalendar, TextInputButton } from \"@stenajs-webui/elements\";\nimport { TextInput, TextInputProps } from \"@stenajs-webui/forms\";\nimport { ControlledPopover } from \"@stenajs-webui/tooltip\";\nimport { format } from \"date-fns\";\nimport * as React from \"react\";\nimport { defaultPopoverPlacement } from \"../../../config/DefaultPopoverPlacement\";\nimport { DateFormats } from \"../../../util/date/DateFormats\";\nimport { SingleDateCalendar } from \"../../calendar-types/single-date-calendar/SingleDateCalendar\";\nimport {\n CalendarTheme,\n defaultCalendarTheme,\n} from \"../../calendar/CalendarTheme\";\nimport { DateTextInputCalendarProps } from \"../date-text-input/DateTextInput\";\nimport { useDateInput } from \"./UseDateInput\";\nimport { OptionalMinMaxDatesAsString } from \"../../../types/CalendarTypes\";\nimport { defaultMaxDate } from \"../../../config/DefaultMaxDate\";\n\nexport interface DateInputProps<T = unknown>\n extends OptionalMinMaxDatesAsString {\n /** The current value */\n value?: Date;\n /** onChange handler for when the user selects a date. */\n onChange?: (date: Date | undefined) => void;\n /** Variant of the input field. */\n variant?: TextInputProps[\"variant\"];\n /** If true, calendar will be open when component mounts. */\n openOnMount?: boolean;\n /** Is invoked when user closes the calendar popup. */\n onClose?: () => void;\n /**\n * The date format in the input field. See date-fns docs.\n * @default YYYY-MM-dd\n */\n displayFormat?: string;\n /**\n * Placeholder when no date has been selected.\n * @default Enter date\n */\n placeholder?: string;\n /**\n * Portal target, HTML element. If not set, window.body is used.\n */\n portalTarget?: HTMLElement;\n zIndex?: number;\n width?: string;\n /**\n * The calendar theme to use.\n */\n calendarTheme?: CalendarTheme;\n /** Props to be passed to Calendar, see SingleDateCalendar. */\n calendarProps?: DateTextInputCalendarProps<T>;\n /**\n * Disables the TextInput, Calendar and Popover.\n */\n disabled?: boolean;\n}\n\nexport const DateInput: React.FC<DateInputProps> = ({\n displayFormat = DateFormats.fullDate,\n placeholder = \"Enter date\",\n value,\n calendarTheme = defaultCalendarTheme,\n calendarProps,\n openOnMount,\n onClose,\n onChange,\n variant,\n width,\n minDate,\n maxDate = defaultMaxDate,\n disabled,\n portalTarget,\n zIndex,\n}) => {\n const { hideCalendar, showingCalendar, onSelectDate, showCalendar } =\n useDateInput(onChange, onClose, openOnMount);\n\n return (\n <Box width={width}>\n <ControlledPopover\n hideArrow\n 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 { RefObject, useCallback, useState } from \"react\";\nimport { defaultPopoverPlacement } from \"../../../config/DefaultPopoverPlacement\";\nimport { DateFormats } from \"../../../util/date/DateFormats\";\nimport {\n SingleDateCalendar,\n SingleDateCalendarProps,\n} from \"../../calendar-types/single-date-calendar/SingleDateCalendar\";\nimport {\n CalendarTheme,\n defaultCalendarTheme,\n} from \"../../calendar/CalendarTheme\";\nimport { OptionalMinMaxDatesAsString } from \"../../../types/CalendarTypes\";\nimport { defaultMaxDate } from \"../../../config/DefaultMaxDate\";\n\nexport type DateTextInputCalendarProps<T> = Omit<\n SingleDateCalendarProps<T>,\n \"value\" | \"onChange\" | \"theme\"\n>;\n\nexport interface DateTextInputProps<T>\n extends Omit<TextInputProps, \"onChange\" | \"theme\" | \"min\" | \"max\">,\n OptionalMinMaxDatesAsString {\n /** Props to be passed to Calendar, see SingleDateCalendar. */\n calendarProps?: DateTextInputCalendarProps<T>;\n /** Close calendar when date is selected, @default true */\n closeOnCalendarSelectDate?: boolean;\n /** Valid date format, @default YYYY-MM-DD */\n dateFormat?: string;\n /** Make the icon not clickable, @default false */\n disableCalender?: boolean;\n /** Show or hide the calender icon, @default false */\n hideCalenderIcon?: boolean;\n /** Placeholder for the input, @default YYYY-MM-DD */\n placeholder?: string;\n /** The date text input theme to use. */\n calendarTheme?: CalendarTheme;\n /**\n * Portal target for the popover, HTML element. If not set, window.body is used.\n */\n portalTarget?: HTMLElement;\n zIndex?: number;\n}\n\nexport const DateTextInput: React.FC<DateTextInputProps<unknown>> = ({\n calendarProps,\n closeOnCalendarSelectDate = true,\n dateFormat = DateFormats.fullDate,\n disableCalender = false,\n onValueChange,\n placeholder = \"yyyy-mm-dd\",\n value,\n width = \"130px\",\n calendarTheme = defaultCalendarTheme,\n hideCalenderIcon = false,\n minDate,\n maxDate = defaultMaxDate,\n variant,\n portalTarget,\n zIndex,\n ...props\n}) => {\n const [open, setOpen] = useState(false);\n\n const toggleCalendar = useCallback(() => {\n setOpen(!open);\n }, [setOpen, open]);\n\n const hideCalendar = useCallback(() => {\n setOpen(false);\n }, [setOpen]);\n\n const onValueChangeHandler = useCallback(\n (value: string) => {\n if (onValueChange) {\n onValueChange(value);\n }\n },\n [onValueChange],\n );\n\n const onCalendarSelectDate = useCallback(\n (date: Date | undefined) => {\n if (date) {\n onValueChangeHandler(format(date, dateFormat));\n if (closeOnCalendarSelectDate) {\n setTimeout(() => setOpen(!open), 200);\n }\n }\n },\n [\n onValueChangeHandler,\n dateFormat,\n closeOnCalendarSelectDate,\n setOpen,\n open,\n ],\n );\n\n const inValidInput = !!value && !/^[-/\\\\.0-9]+$/.test(value);\n\n const dateIsValid = !!value && isValid(parse(value, dateFormat, new Date()));\n\n const userInputCorrectLength = !!value && value.length >= dateFormat.length;\n\n const invalid: boolean =\n (userInputCorrectLength && !dateIsValid) || inValidInput;\n\n return (\n <Box width={width}>\n <ControlledPopover\n appendTo={portalTarget}\n zIndex={zIndex}\n renderTrigger={({ ref, ...popoverProps }) => (\n <TextInput\n {...props}\n variant={invalid ? \"error\" : variant}\n disableContentPaddingRight\n contentRight={\n !hideCalenderIcon ? (\n <Row alignItems={\"center\"} indent={0.5}>\n <FlatButton\n size={\"small\"}\n disabled={props.disabled || disableCalender}\n leftIcon={stenaCalendar}\n onClick={toggleCalendar}\n />\n </Row>\n ) : undefined\n }\n onValueChange={onValueChangeHandler}\n placeholder={placeholder}\n value={value || \"\"}\n min={minDate}\n max={maxDate}\n size={10}\n inputRef={ref as RefObject<HTMLInputElement>}\n {...popoverProps}\n />\n )}\n hideArrow\n open={open}\n placement={defaultPopoverPlacement}\n onRequestClose={hideCalendar}\n >\n <SingleDateCalendar\n {...calendarProps}\n onChange={onCalendarSelectDate}\n value={\n value && dateIsValid\n ? parse(value, dateFormat, new Date())\n : undefined\n }\n minDate={minDate}\n maxDate={maxDate}\n theme={calendarTheme}\n />\n </ControlledPopover>\n </Box>\n );\n};\n","export interface FormatTimeStringResult {\n time: string;\n success: boolean;\n}\n\nexport const formatHours = (hours: string): string => {\n if (hours === \"\") {\n return \"00\";\n }\n\n const h = parseInt(hours, 10);\n\n if (isNaN(h)) {\n throw new Error(\"Hours is not a number\");\n }\n\n if (h < 0 || h > 23) {\n throw new Error(\"Hours is an invalid number\");\n }\n\n switch (hours.length) {\n case 1:\n return `0${h}`;\n case 2:\n return hours;\n default:\n throw new Error(\"Invalid hour string\");\n }\n};\n\nexport const formatMinutes = (minutes: string): string => {\n if (minutes === \"\") {\n return \"00\";\n }\n\n const m = parseInt(minutes, 10);\n\n if (isNaN(m)) {\n throw new Error(\"Minutes is not a number\");\n }\n\n if (m < 0 || m > 59) {\n throw new Error(\"Minutes is an invalid number\");\n }\n\n switch (minutes.length) {\n case 1:\n return `0${m}`;\n case 2:\n return minutes;\n default:\n throw new Error(\"Invalid minute string\");\n }\n};\n\nexport const formatTimeString = (time: string): FormatTimeStringResult => {\n if (!validUserInput(time)) {\n return { time, success: false };\n }\n\n const arr = time && time.split(/-|:|,|;|[/]|[.]| /); // consider all these chars as user input separator\n if (arr && arr.length === 2) {\n try {\n const hours = formatHours(arr[0]);\n const minutes = formatMinutes(arr[1]);\n return { time: `${hours}:${minutes}`, success: true };\n } catch {\n return { time, success: false };\n }\n } else if (arr && arr.length === 1) {\n let hours = 0;\n let minutes = 0;\n switch (time.length) {\n case 1:\n return { time: `0${time}:00`, success: true };\n case 2: {\n const timeNumber = parseInt(arr[0], 10);\n if (timeNumber >= 0 && timeNumber < 24) {\n return { time: `${time}:00`, success: true };\n } else if (timeNumber >= 24 && timeNumber < 59) {\n return { time: `00:${time}`, success: true };\n }\n return { time, success: false };\n }\n case 3:\n minutes = parseInt(time.substring(1, 3), 10);\n if (minutes >= 0 && minutes <= 59) {\n return {\n time: `0${time.substring(0, 1)}:${time.substring(1, 3)}`,\n success: true,\n };\n }\n return { time, success: false };\n case 4:\n hours = parseInt(time.substring(0, 2), 10);\n minutes = parseInt(time.substring(2, 4), 10);\n if (hours < 0 || hours > 23) {\n return { time, success: false };\n }\n if (minutes < 0 || minutes > 59) {\n return { time, success: false };\n }\n return {\n time: `${time.substring(0, 2)}:${time.substring(2, 4)}`,\n success: true,\n };\n default:\n return { time, success: false };\n }\n }\n\n return { time, success: false };\n};\n\nexport const validUserInput = (input: string | undefined): boolean => {\n if (input) {\n return /^[-:.,/; 0-9]+$/.test(input);\n }\n\n return true;\n};\n","import { Omit } from \"@stenajs-webui/core\";\nimport { TextInput, TextInputProps } from \"@stenajs-webui/forms\";\nimport * as React from \"react\";\nimport { ChangeEventHandler, useCallback, useState } from \"react\";\nimport {\n formatTimeString,\n validUserInput,\n} from \"../../../util/time/TimeStringFormatValidator\";\n\nimport { stenaClock } from \"@stenajs-webui/elements\";\n\nexport interface TimeTextInputProps extends Omit<TextInputProps, \"onChange\"> {\n /** Show placeholder when true */\n showPlaceholder?: boolean;\n /** Show icon when true */\n useIcon?: boolean;\n /** Variant of the input field. */\n variant?: TextInputProps[\"variant\"];\n}\n\n/**\n * @deprecated\n */\nexport const TimeTextInput: React.FC<TimeTextInputProps> = ({\n onValueChange,\n showPlaceholder = true,\n useIcon = true,\n value,\n width = \"85px\",\n variant,\n ...props\n}) => {\n const [valid, setValid] = useState(() => validUserInput(value));\n\n const timeFormat = \"hh:mm\";\n\n const onBlur = useCallback(() => {\n if (value) {\n const formattedResult = formatTimeString(value);\n setValid(formattedResult.success);\n if (formattedResult.success) {\n if (onValueChange) {\n onValueChange(formattedResult.time);\n }\n }\n }\n }, [value, onValueChange, setValid]);\n\n const onChangeHandler = useCallback<ChangeEventHandler<HTMLInputElement>>(\n (ev) => {\n const time = ev.target.value;\n const validInput = validUserInput(time);\n\n setValid(validInput && time.length <= timeFormat.length);\n\n if (onValueChange) {\n onValueChange(time);\n }\n },\n [onValueChange, setValid],\n );\n\n return (\n <TextInput\n {...props}\n type={\"time\"}\n variant={!valid ? \"error\" : variant}\n iconLeft={useIcon ? stenaClock : undefined}\n value={value}\n placeholder={showPlaceholder ? timeFormat : undefined}\n onChange={onChangeHandler}\n onBlur={onBlur}\n width={width}\n />\n );\n};\n","import { IconDefinition } from \"@fortawesome/fontawesome-svg-core\";\nimport {\n Box,\n BoxProps,\n ButtonElementProps,\n Indent,\n Row,\n SeparatorLine,\n} from \"@stenajs-webui/core\";\nimport {\n FlatButton,\n Icon,\n stenaCalendar,\n stenaAngleDown,\n} from \"@stenajs-webui/elements\";\nimport {\n TextInput,\n TextInputBox,\n TextInputBoxProps,\n TextInputProps,\n} from \"@stenajs-webui/forms\";\nimport { debounce } from \"lodash-es\";\nimport * as React from \"react\";\nimport { FocusEventHandler, useCallback, useMemo, useRef } from \"react\";\nimport { cssColor } from \"@stenajs-webui/theme\";\n\nexport interface DualTextInputProps {\n onEsc?: TextInputProps[\"onEsc\"];\n onEnter?: TextInputProps[\"onEnter\"];\n widthLeft?: BoxProps[\"width\"];\n widthRight?: BoxProps[\"width\"];\n valueLeft?: TextInputProps[\"value\"];\n valueRight?: TextInputProps[\"value\"];\n minLeft?: string;\n maxLeft?: string;\n minRight?: string;\n maxRight?: string;\n typeLeft?: TextInputProps[\"type\"];\n typeRight?: TextInputProps[\"type\"];\n separatorIcon?: IconDefinition;\n placeholderLeft?: TextInputProps[\"placeholder\"];\n placeholderRight?: TextInputProps[\"placeholder\"];\n onValueChangeLeft?: TextInputProps[\"onValueChange\"];\n onValueChangeRight?: TextInputProps[\"onValueChange\"];\n onChangeLeft?: TextInputProps[\"onChange\"];\n onChangeRight?: TextInputProps[\"onChange\"];\n onClickLeft?: TextInputProps[\"onClick\"];\n onClickRight?: TextInputProps[\"onClick\"];\n onClickCalendar?: ButtonElementProps[\"onClick\"];\n onClickArrowDown?: ButtonElementProps[\"onClick\"];\n onFocusLeft?: TextInputProps[\"onFocus\"];\n onFocusRight?: TextInputProps[\"onFocus\"];\n onBlur?: () => void;\n onBlurLeft?: TextInputProps[\"onBlur\"];\n onBlurRight?: TextInputProps[\"onBlur\"];\n inputRefLeft?: TextInputProps[\"inputRef\"];\n inputRefRight?: TextInputProps[\"inputRef\"];\n variantLeft?: TextInputProps[\"variant\"];\n variantRight?: TextInputProps[\"variant\"];\n variant?: TextInputBoxProps[\"variant\"];\n showPresets?: false;\n autoFocusLeft?: boolean;\n autoFocusRight?: boolean;\n disabled?: boolean;\n}\n\nexport const DualTextInput: React.FC<DualTextInputProps> = ({\n autoFocusLeft,\n autoFocusRight,\n onEsc,\n onEnter,\n onValueChangeLeft,\n onValueChangeRight,\n separatorIcon,\n placeholderLeft,\n placeholderRight,\n typeLeft,\n typeRight,\n onChangeLeft,\n onChangeRight,\n valueLeft,\n valueRight,\n minLeft,\n maxLeft,\n minRight,\n maxRight,\n onClickLeft,\n onClickRight,\n onClickCalendar,\n onClickArrowDown,\n onBlurLeft,\n onBlurRight,\n onFocusLeft,\n onFocusRight,\n inputRefLeft,\n inputRefRight,\n variant,\n variantLeft,\n variantRight,\n onBlur,\n showPresets,\n widthLeft,\n widthRight,\n disabled,\n}) => {\n const focusCounter = useRef(0);\n\n const tryTriggerOnBlur = useMemo(\n () =>\n debounce((focusCounter: number) => {\n if (focusCounter === 0) {\n onBlur?.();\n }\n }, 10),\n [onBlur],\n );\n\n const focusLeftHandler = useCallback<FocusEventHandler<HTMLInputElement>>(\n (ev) => {\n focusCounter.current++;\n tryTriggerOnBlur(focusCounter.current);\n if (onFocusLeft) {\n onFocusLeft(ev);\n }\n },\n [onFocusLeft, focusCounter, tryTriggerOnBlur],\n );\n\n const focusRightHandler = useCallback<FocusEventHandler<HTMLInputElement>>(\n (ev) => {\n focusCounter.current++;\n tryTriggerOnBlur(focusCounter.current);\n if (onFocusRight) {\n onFocusRight(ev);\n }\n },\n [onFocusRight, focusCounter, tryTriggerOnBlur],\n );\n\n const blurLeftHandler = useCallback<FocusEventHandler<HTMLInputElement>>(\n (ev) => {\n focusCounter.current--;\n tryTriggerOnBlur(focusCounter.current);\n if (onBlurLeft) {\n onBlurLeft(ev);\n }\n },\n [onBlurLeft, focusCounter, tryTriggerOnBlur],\n );\n\n const blurRightHandler = useCallback<FocusEventHandler<HTMLInputElement>>(\n (ev) => {\n focusCounter.current--;\n tryTriggerOnBlur(focusCounter.current);\n if (onBlurRight) {\n onBlurRight(ev);\n }\n },\n [onBlurRight, focusCounter, tryTriggerOnBlur],\n );\n\n return (\n <Box>\n <TextInputBox\n disableContentPaddingRight\n disabled={disabled}\n variant={variant}\n contentRight={\n <Row alignItems={\"center\"}>\n <Indent num={0.5}>\n <FlatButton\n leftIcon={stenaCalendar}\n onClick={onClickCalendar}\n disabled={disabled}\n size={\"small\"}\n />\n </Indent>\n\n {showPresets ? (\n <>\n <Row height={\"22px\"}>\n <SeparatorLine vertical />\n </Row>\n\n <Indent num={0.5}>\n <FlatButton\n leftIcon={stenaAngleDown}\n onClick={onClickArrowDown}\n disabled={disabled}\n size={\"small\"}\n />\n </Indent>\n </>\n ) : null}\n </Row>\n }\n >\n <Box width={widthLeft}>\n <TextInput\n onEsc={onEsc}\n onEnter={onEnter}\n onClick={onClickLeft}\n disabled={disabled}\n hideBorder\n placeholder={placeholderLeft}\n value={valueLeft}\n onValueChange={onValueChangeLeft}\n onChange={onChangeLeft}\n onBlur={blurLeftHandler}\n onFocus={focusLeftHandler}\n inputRef={inputRefLeft}\n variant={variantLeft}\n type={typeLeft}\n autoFocus={autoFocusLeft}\n min={minLeft}\n max={maxLeft}\n />\n </Box>\n <Row indent={0.5} alignItems={\"center\"} justifyContent={\"center\"}>\n <Icon\n icon={separatorIcon}\n size={12}\n color={cssColor(\"--lhds-color-ui-500\")}\n />\n </Row>\n <Box width={widthRight}>\n <TextInput\n onEsc={onEsc}\n onEnter={onEnter}\n onClick={onClickRight}\n disabled={disabled}\n hideBorder\n placeholder={placeholderRight}\n value={valueRight}\n onValueChange={onValueChangeRight}\n onChange={onChangeRight}\n onBlur={blurRightHandler}\n onFocus={focusRightHandler}\n inputRef={inputRefRight}\n variant={variantRight}\n type={typeRight}\n autoFocus={autoFocusRight}\n min={minRight}\n max={maxRight}\n />\n </Box>\n </TextInputBox>\n </Box>\n );\n};\n","import { parseIntElseUndefined } from \"@stenajs-webui/core\";\nimport { formatHours, formatMinutes } from \"./TimeStringFormatValidator\";\n\nexport const transformNumberTimeToString = (\n time: number | undefined | null,\n): string | undefined => {\n if (time == null) {\n return undefined;\n }\n const timeStr = time.toString();\n if (timeStr.length === 3) {\n return `${timeStr.substr(0, 1)}:${timeStr.substr(1, 2)}`;\n }\n if (timeStr.length === 4) {\n return `${timeStr.substr(0, 2)}:${timeStr.substr(2, 2)}`;\n }\n if (timeStr.length === 2) {\n return `0:${timeStr}`;\n }\n if (timeStr.length === 1) {\n return `0:0${timeStr}`;\n }\n throw new Error(\"Invalid time number.\");\n};\n\nexport const transformTimeStringToNumber = (\n time: string | undefined | null,\n): number | null => {\n if (time == null) {\n throw new Error(\"Time is not set.\");\n }\n if (time === \"\") {\n throw new Error(\"Time is empty.\");\n }\n const parts = time.split(\":\");\n if (parts.length !== 2) {\n throw new Error(\"Invalid time.\");\n }\n\n if (parts[1].length !== 2) {\n throw new Error(\"Invalid time.\");\n }\n\n if (parts[0].length < 1 || parts[0].length > 2) {\n throw new Error(\"Invalid time.\");\n }\n\n const hours = parseInt(parts[0], 10);\n const minutes = parseInt(parts[1], 10);\n\n if (isNaN(hours)) {\n throw new Error(\"Invalid time.\");\n }\n if (isNaN(minutes)) {\n throw new Error(\"Invalid time.\");\n }\n if (hours < 0 || hours > 23) {\n throw new Error(\"Invalid time.\");\n }\n if (minutes < 0 || minutes > 59) {\n throw new Error(\"Invalid time.\");\n }\n return hours * 100 + minutes;\n};\n\nexport const isValidTimeString = (time: string | undefined): boolean => {\n try {\n transformTimeStringToNumber(time);\n return true;\n } catch {\n return false;\n }\n};\n\nexport const getHoursAndMinutesFromTimeString = (\n value: string | undefined,\n): {\n hour: number | undefined;\n minute: number | undefined;\n} => {\n if (value && isValidTimeString(value)) {\n const p = value.split(\":\");\n return {\n hour: parseIntElseUndefined(p[0]),\n minute: parseIntElseUndefined(p[1]),\n };\n }\n return {\n hour: undefined,\n minute: undefined,\n };\n};\n\nexport const transformTimeInDateToTimeString = (date: Date): string =>\n `${formatHours(String(date.getHours()))}:${formatMinutes(\n String(date.getMinutes()),\n )}`;\n","import { Row } from \"@stenajs-webui/core\";\nimport { FlatButton, PrimaryButton } from \"@stenajs-webui/elements\";\nimport * as React from \"react\";\nimport { RefObject, useEffect, useRef } from \"react\";\nimport { padStart } from \"lodash-es\";\n\nexport interface TimePickerCellProps {\n item: number;\n selected?: boolean;\n onClick: (label: number) => void;\n columnRef: RefObject<HTMLDivElement | null>;\n canScrollRef: RefObject<boolean>;\n}\n\nexport const TimePickerCell: React.FC<TimePickerCellProps> = ({\n onClick,\n item,\n selected,\n columnRef,\n canScrollRef,\n}) => {\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(\n function scrollToSelectedItem() {\n if (\n selected &&\n columnRef.current &&\n ref.current &&\n canScrollRef.current\n ) {\n const targetScroll = ref.current.scrollHeight * Math.max(item - 2, 0);\n columnRef.current.scrollTo(0, targetScroll);\n canScrollRef.current = false;\n }\n },\n [columnRef, item, selected, canScrollRef],\n );\n\n return (\n <Row\n width={\"64px\"}\n justifyContent={\"center\"}\n spacing={0.5}\n indent={0.5}\n ref={ref}\n >\n {selected ? (\n <PrimaryButton\n label={padStart(String(item), 2, \"0\")}\n onClick={() => onClick && onClick(item)}\n />\n ) : (\n <FlatButton\n label={String(item).padStart(2, \"0\")}\n onClick={() => onClick && onClick(item)}\n />\n )}\n </Row>\n );\n};\n","import { Column } from \"@stenajs-webui/core\";\nimport * as React from \"react\";\nimport { MutableRefObject, useRef } from \"react\";\nimport styles from \"./TimePicker.module.css\";\nimport { TimePickerCell } from \"./TimePickerCell\";\n\ninterface Props {\n items: Array<number>;\n onClick: (item: number) => void;\n selectedItem: number | undefined;\n canScrollRef: MutableRefObject<boolean>;\n}\n\nexport const TimePickerColumn: React.FC<Props> = ({\n onClick,\n items,\n selectedItem,\n canScrollRef,\n}) => {\n const columnRef = useRef<HTMLDivElement>(null);\n\n return (\n <Column className={styles.timePickerColumn} ref={columnRef}>\n {items.map((item) => (\n <TimePickerCell\n key={item}\n item={item}\n onClick={onClick}\n selected={item === selectedItem}\n columnRef={columnRef}\n canScrollRef={canScrollRef}\n />\n ))}\n </Column>\n );\n};\n","import { Indent, Row } from \"@stenajs-webui/core\";\nimport { ValueAndOnValueChangeProps } from \"@stenajs-webui/forms\";\nimport { range } from \"lodash-es\";\nimport * as React from \"react\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport {\n formatHours,\n formatMinutes,\n} from \"../../util/time/TimeStringFormatValidator\";\nimport { getHoursAndMinutesFromTimeString } from \"../../util/time/TimeTransformer\";\nimport styles from \"./TimePicker.module.css\";\nimport { TimePickerColumn } from \"./TimePickerColumn\";\n\nexport interface TimePickerProps extends ValueAndOnValueChangeProps<string> {}\n\nconst hours = range(0, 24);\nconst minutes = range(0, 60);\n\nexport const TimePicker: React.FC<TimePickerProps> = ({\n value,\n onValueChange,\n}) => {\n const canScrollRef = useRef(true);\n const [hour, setHour] = useState<number | undefined>(undefined);\n const [minute, setMinute] = useState<number | undefined>(undefined);\n\n useEffect(() => {\n if (value) {\n const { minute, hour } = getHoursAndMinutesFromTimeString(value);\n setHour(hour);\n setMinute(minute);\n }\n }, [value]);\n\n const onClickHour = useCallback(\n (h: number) => {\n setHour(h);\n onValueChange?.(\n `${formatHours(String(h ?? 0))}:${formatMinutes(String(minute ?? 0))}`,\n );\n },\n [minute, onValueChange],\n );\n\n const onClickMinutes = useCallback(\n (m: number) => {\n setMinute(m);\n onValueChange?.(\n `${formatHours(String(hour ?? 0))}:${formatMinutes(String(m ?? 0))}`,\n );\n },\n [hour, onValueChange],\n );\n\n return (\n <Row className={styles.timePicker}>\n <TimePickerColumn\n items={hours}\n onClick={onClickHour}\n selectedItem={hour}\n canScrollRef={canScrollRef}\n />\n <Indent />\n <TimePickerColumn\n items={minutes}\n onClick={onClickMinutes}\n selectedItem={minute}\n canScrollRef={canScrollRef}\n />\n </Row>\n );\n};\n","import { RefObject, useEffect } from \"react\";\n\nexport const useDateRangeEffects = (\n date: Date | undefined | null,\n setDateInFocus: (date: Date) => void,\n dateInputRef: RefObject<HTMLInputElement | null>,\n) => {\n useEffect(\n function moveFocusedDateWhenDateChanges() {\n if (date) {\n setDateInFocus(date);\n }\n },\n [date, setDateInFocus],\n );\n\n useEffect(\n function updateDateFieldWhenValueChanges() {\n if (dateInputRef.current) {\n if (date) {\n dateInputRef.current.valueAsDate = new Date(\n Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()),\n );\n } else {\n dateInputRef.current.valueAsDate = null;\n }\n }\n },\n [date, dateInputRef],\n );\n};\n","import { ChangeEvent, RefObject, useCallback } from \"react\";\nimport { getHoursAndMinutesFromTimeString } from \"../../../../util/time/TimeTransformer\";\nimport { DateTimeInputProps } from \"../DateTimeInput\";\nimport { UseInputStatesResult } from \"./UseInputStates\";\n\nexport const useDateRangeHandlers = (\n date: Date | undefined | null,\n onValueChange: DateTimeInputProps[\"onValueChange\"],\n {\n setDateInFocus,\n showCalendarInternal,\n hideCalendarInternal,\n setFirstFocusedInput,\n setCurrentPanel,\n localTime,\n setLocalTime,\n localDate,\n setLocalDate,\n }: UseInputStatesResult,\n dateInputRef: RefObject<HTMLInputElement | null>,\n) => {\n const onChangeDate = useCallback(\n (incomingDate: Date | null) => {\n if (!incomingDate) {\n return;\n }\n const newDate = new Date(incomingDate);\n\n if (date) {\n // Full date is available\n\n newDate.setHours(date.getHours());\n newDate.setMinutes(date.getMinutes());\n\n onValueChange?.(newDate);\n setLocalDate(undefined);\n } else if (localTime) {\n // Only time has been selected\n const { minute, hour } = getHoursAndMinutesFromTimeString(localTime);\n\n newDate.setHours(hour ?? 0);\n newDate.setMinutes(minute ?? 0);\n\n onValueChange?.(newDate);\n setLocalDate(undefined);\n } else {\n // Nothing has been selected\n setLocalDate(newDate);\n }\n setDateInFocus(newDate);\n if (dateInputRef.current) {\n dateInputRef.current.valueAsDate = new Date(\n Date.UTC(\n newDate.getFullYear(),\n newDate.getMonth(),\n newDate.getDate(),\n ),\n );\n }\n },\n [\n date,\n dateInputRef,\n localTime,\n onValueChange,\n setDateInFocus,\n setLocalDate,\n ],\n );\n\n const onChangeTime = useCallback(\n (time: string) => {\n if (!time) {\n return;\n }\n\n if (date) {\n // Full date is available\n const newTime = getHoursAndMinutesFromTimeString(time);\n const newDate = new Date(date);\n\n newDate.setHours(newTime.hour || 0);\n newDate.setMinutes(newTime.minute || 0);\n\n onValueChange?.(newDate);\n setLocalTime(undefined);\n } else if (localDate) {\n // Only date has already been selected\n const newTime = getHoursAndMinutesFromTimeString(time);\n const newDate = new Date(localDate);\n\n newDate.setHours(newTime.hour || 0);\n newDate.setMinutes(newTime.minute || 0);\n\n onValueChange?.(newDate);\n setLocalTime(undefined);\n } else {\n // Nothing has been selected\n setLocalTime(time);\n }\n },\n [onValueChange, date, localDate, setLocalTime],\n );\n\n const inputLeftChangeHandler = useCallback(\n (ev: ChangeEvent<HTMLInputElement>) => {\n if (ev.target.value[0] !== \"0\") {\n onChangeDate(ev.target.valueAsDate);\n }\n },\n [onChangeDate],\n );\n\n const inputRightChangeHandler = useCallback(\n (ev: ChangeEvent<HTMLInputElement>) => onChangeTime(ev.target.value),\n [onChangeTime],\n );\n\n const showCalendar = useCallback(() => {\n if (date) {\n setDateInFocus(date);\n } else {\n setDateInFocus(new Date());\n }\n setCurrentPanel(\"calendar\");\n showCalendarInternal();\n }, [date, setCurrentPanel, showCalendarInternal, setDateInFocus]);\n\n const hideCalendar = useCallback(() => {\n setFirstFocusedInput(undefined);\n hideCalendarInternal();\n }, [setFirstFocusedInput, hideCalendarInternal]);\n\n return {\n inputLeftChangeHandler,\n inputRightChangeHandler,\n hideCalendar,\n showCalendar,\n onChangeTime,\n onChangeDate,\n };\n};\n","import { useBoolean } from \"@stenajs-webui/core\";\nimport { useState } from \"react\";\nimport { DateRangeFocusedInput } from \"../../../calendar-types/date-range-calendar/DateRangeCalendar\";\nimport { CalendarPanelType } from \"../../../../features/calendar-with-month-year-pickers/CalendarPanelType\";\n\nexport type UseInputStatesResult = ReturnType<typeof useInputStates>;\n\nexport const useInputStates = (date: Date | undefined | null) => {\n const [localDate, setLocalDate] = useState<Date | undefined>(undefined);\n const [localTime, setLocalTime] = useState<string | undefined>(undefined);\n\n const [isCalendarVisible, showCalendarInternal, hideCalendarInternal] =\n useBoolean(false);\n\n const [isTimePickerVisible, showTimePicker, hideTimePicker] =\n useBoolean(false);\n\n const [firstFocusedInput, setFirstFocusedInput] = useState<\n DateRangeFocusedInput | undefined\n >(undefined);\n\n const [dateInFocus, setDateInFocus] = useState<Date>(\n () => date ?? new Date(),\n );\n\n const [currentPanel, setCurrentPanel] =\n useState<CalendarPanelType>(\"calendar\");\n\n return {\n isCalendarVisible,\n showCalendarInternal,\n hideCalendarInternal,\n firstFocusedInput,\n setFirstFocusedInput,\n dateInFocus,\n setDateInFocus,\n currentPanel,\n setCurrentPanel,\n isTimePickerVisible,\n showTimePicker,\n hideTimePicker,\n localDate,\n setLocalDate,\n localTime,\n setLocalTime,\n };\n};\n","import * as React from \"react\";\nimport { RefObject, useCallback } from \"react\";\nimport { DayData } from \"../../../../util/calendar/CalendarDataFactory\";\nimport { UseInputStatesResult } from \"./UseInputStates\";\n\nexport const useUserInputHandlers = (\n onChangeDate: (incomingDate: Date | null) => void,\n dateInputRef: RefObject<HTMLInputElement | null>,\n showCalendar: () => void,\n hideCalendar: () => void,\n {\n isCalendarVisible,\n setCurrentPanel,\n showTimePicker,\n hideTimePicker,\n }: UseInputStatesResult,\n) => {\n const onFocusLeft = useCallback(() => {\n if (!isCalendarVisible) {\n showCalendar();\n }\n setCurrentPanel(\"calendar\");\n hideTimePicker();\n }, [hideTimePicker, isCalendarVisible, setCurrentPanel, showCalendar]);\n\n const onFocusRight = useCallback(() => {\n hideCalendar();\n showTimePicker();\n }, [hideCalendar, showTimePicker]);\n\n const onClickDay = useCallback(\n (day: DayData) => {\n onChangeDate(day.date);\n hideCalendar();\n showTimePicker();\n },\n [onChangeDate, hideCalendar, showTimePicker],\n );\n\n const onClickArrowButton = useCallback(() => {\n setCurrentPanel(\"presets\");\n showCalendar();\n }, [setCurrentPanel, showCalendar]);\n\n const onClickCalendarButton = useCallback(() => {\n if (isCalendarVisible) {\n hideCalendar();\n } else {\n dateInputRef.current?.focus();\n setCurrentPanel(\"calendar\");\n showCalendar();\n }\n }, [\n isCalendarVisible,\n hideCalendar,\n dateInputRef,\n setCurrentPanel,\n showCalendar,\n ]);\n\n const onKeyDownHandler = useCallback(\n (ev: React.KeyboardEvent<HTMLDivElement>) => {\n if (ev.key === \"Escape\") {\n hideCalendar();\n }\n },\n [hideCalendar],\n );\n\n return {\n onFocusLeft,\n onFocusRight,\n onClickDay,\n onClickArrowButton,\n onClickCalendarButton,\n onKeyDownHandler,\n };\n};\n","import { Box, Column, Row, Space, useDelayedFalse } from \"@stenajs-webui/core\";\nimport { PrimaryButton, stenaClock } from \"@stenajs-webui/elements\";\nimport {\n TextInputProps,\n ValueAndOnValueChangeProps,\n} from \"@stenajs-webui/forms\";\nimport {\n ControlledPopover,\n ControlledPopoverProps,\n} from \"@stenajs-webui/tooltip\";\nimport * as React from \"react\";\nimport { useCallback, useMemo, useRef } from \"react\";\nimport { defaultPopoverPlacement } from \"../../../config/DefaultPopoverPlacement\";\nimport {\n DualTextInput,\n DualTextInputProps,\n} from \"../../../features/dual-text-input/DualTextInput\";\nimport { CalendarWithMonthSwitcher } from \"../../../features/month-switcher/CalendarWithMonthSwitcher\";\nimport { TimePicker } from \"../../../features/time-picker/TimePicker\";\nimport { addDayStateHighlights } from \"../../../util/calendar/StateModifier\";\nimport { transformTimeInDateToTimeString } from \"../../../util/time/TimeTransformer\";\nimport { useDateRangeEffects } from \"./hooks/UseDateRangeEffects\";\nimport { useDateRangeHandlers } from \"./hooks/UseDateRangeHandlers\";\nimport { useInputStates } from \"./hooks/UseInputStates\";\nimport { useUserInputHandlers } from \"./hooks/UseUserInputHandlers\";\nimport { OptionalMinMaxDatesAsString } from \"../../../types/CalendarTypes\";\nimport { defaultMaxDate } from \"../../../config/DefaultMaxDate\";\n\nexport interface DateTimeInputProps\n extends ValueAndOnValueChangeProps<Date | null>,\n OptionalMinMaxDatesAsString,\n Pick<DualTextInputProps, \"widthLeft\" | \"widthRight\" | \"variant\">,\n Pick<ControlledPopoverProps, \"zIndex\" | \"appendTo\"> {\n onEsc?: () => void;\n onEnter?: () => void;\n onBlur?: () => void;\n autoFocus?: boolean;\n disabled?: boolean;\n}\n\nexport const DateTimeInput: React.FC<DateTimeInputProps> = ({\n value,\n onValueChange,\n onEnter,\n onEsc,\n onBlur,\n autoFocus,\n minDate,\n widthLeft = 128,\n widthRight = 80,\n maxDate = defaultMaxDate,\n variant,\n disabled,\n zIndex,\n appendTo,\n}) => {\n const dateInputRef: TextInputProps[\"inputRef\"] = useRef(null);\n const timeInputRef: TextInputProps[\"inputRef\"] = useRef(null);\n\n const states = useInputStates(value);\n\n const {\n setCurrentPanel,\n currentPanel,\n isCalendarVisible,\n dateInFocus,\n setDateInFocus,\n isTimePickerVisible,\n hideTimePicker,\n localTime,\n localDate,\n } = states;\n\n const {\n showCalendar,\n hideCalendar,\n inputLeftChangeHandler,\n inputRightChangeHandler,\n onChangeTime,\n onChangeDate,\n } = useDateRangeHandlers(value, onValueChange, states, dateInputRef);\n\n const {\n onKeyDownHandler,\n onFocusRight,\n onFocusLeft,\n onClickDay,\n onClickCalendarButton,\n onClickArrowButton,\n } = useUserInputHandlers(\n onChangeDate,\n dateInputRef,\n showCalendar,\n hideCalendar,\n states,\n );\n\n useDateRangeEffects(value, setDateInFocus, dateInputRef);\n\n const statePerMonth = useMemo(() => {\n const dateToHighlight = value || localDate;\n if (!dateToHighlight) {\n return {};\n }\n return addDayStateHighlights(undefined, dateToHighlight, [\n \"singleSelected\",\n \"selected\",\n ]);\n }, [localDate, value]);\n\n const hideAll = useCallback(() => {\n hideCalendar();\n hideTimePicker();\n }, [hideCalendar, hideTimePicker]);\n\n const timeValue = useMemo<string | undefined>(\n () => (value ? transformTimeInDateToTimeString(value) : localTime),\n [value, localTime],\n );\n\n const delayedIsCalendarVisible = useDelayedFalse(isCalendarVisible, 300);\n const delayedIsTimePickerVisible = useDelayedFalse(isTimePickerVisible, 300);\n\n return (\n <Box onKeyDown={onKeyDownHandler}>\n <ControlledPopover\n hideArrow\n zIndex={zIndex}\n appendTo={appendTo}\n renderTrigger={(props) => (\n <Box {...props}>\n <DualTextInput\n autoFocusLeft={autoFocus}\n onEsc={onEsc}\n onEnter={onEnter}\n onBlur={onBlur}\n disabled={disabled}\n separatorIcon={stenaClock}\n typeLeft={\"date\"}\n typeRight={\"time\"}\n placeholderLeft={\"yyyy-mm-dd\"}\n placeholderRight={\"hh:mm\"}\n onChangeLeft={inputLeftChangeHandler}\n onChangeRight={inputRightChangeHandler}\n onClickArrowDown={onClickArrowButton}\n onClickCalendar={onClickCalendarButton}\n onFocusLeft={onFocusLeft}\n onFocusRight={onFocusRight}\n onClickLeft={onFocusLeft}\n onClickRight={onFocusRight}\n inputRefLeft={dateInputRef}\n inputRefRight={timeInputRef}\n valueRight={timeValue ?? \"\"}\n widthLeft={widthLeft}\n widthRight={widthRight}\n minLeft={minDate}\n maxLeft={maxDate}\n variant={variant}\n />\n </Box>\n )}\n placement={defaultPopoverPlacement}\n open={isCalendarVisible || isTimePickerVisible}\n onRequestClose={hideAll}\n >\n {(delayedIsCalendarVisible || delayedIsTimePickerVisible) && (\n <Column>\n {delayedIsCalendarVisible ? (\n <CalendarWithMonthSwitcher\n statePerMonth={statePerMonth}\n onClickDay={onClickDay}\n dateInFocus={dateInFocus}\n setDateInFocus={setDateInFocus}\n currentPanel={currentPanel}\n setCurrentPanel={setCurrentPanel}\n minDate={minDate}\n maxDate={maxDate}\n />\n ) : delayedIsTimePickerVisible ? (\n <Column>\n <Column overflow={\"hidden\"} height={\"250px\"}>\n <TimePicker\n value={timeValue ?? \"\"}\n onValueChange={onChangeTime}\n />\n </Column>\n <Space />\n <Row justifyContent={\"flex-end\"}>\n <PrimaryButton label={\"Done\"} onClick={hideTimePicker} />\n </Row>\n </Column>\n ) : null}\n </Column>\n )}\n </ControlledPopover>\n </Box>\n );\n};\n","import * as React from \"react\";\nimport { Row } from \"@stenajs-webui/core\";\nimport { FlatButton, PrimaryButton } from \"@stenajs-webui/elements\";\nimport { ValueAndOnValueChangeProps } from \"@stenajs-webui/forms\";\n\ninterface Props extends ValueAndOnValueChangeProps<number> {\n year: number;\n}\n\nexport const YearPickerCell: React.FC<Props> = ({\n value,\n onValueChange,\n year,\n}) => {\n const label = String(year);\n return (\n <Row justifyContent={\"center\"}>\n {value === year ? (\n <PrimaryButton label={label} onClick={() => onValueChange?.(year)} />\n ) : (\n <FlatButton label={label} onClick={() => onValueChange?.(year)} />\n )}\n </Row>\n );\n};\n","import * as React from \"react\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport { ValueAndOnValueChangeProps } from \"@stenajs-webui/forms\";\nimport { Column, Row } from \"@stenajs-webui/core\";\nimport { YearPickerCell } from \"./YearPickerCell\";\nimport {\n FlatButton,\n stenaArrowLeft,\n stenaArrowRight,\n} from \"@stenajs-webui/elements\";\nimport { chunk, range } from \"lodash-es\";\n\nexport interface YearPickerProps extends ValueAndOnValueChangeProps<number> {\n initialLastYear?: number;\n}\n\nexport const YearPicker: React.FC<YearPickerProps> = ({\n value,\n onValueChange,\n initialLastYear,\n}) => {\n const [lastYear, setLastYear] = useState(() => {\n if (value) {\n return value + 4;\n }\n return initialLastYear ?? new Date().getFullYear() + 4;\n });\n\n const yearRows = useMemo(() => {\n const startYear = lastYear - 11;\n return chunk(range(startYear, lastYear + 1), 3);\n }, [lastYear]);\n\n useEffect(() => {\n setLastYear((prev) => calculateLastYearInFocus(value, prev));\n }, [value]);\n\n return (\n <Row>\n <Column justifyContent={\"center\"}>\n <FlatButton\n leftIcon={stenaArrowLeft}\n onClick={() => setLastYear(lastYear - 3)}\n />\n </Column>\n <Column gap={1}>\n {yearRows.map((yearRow) => (\n <Row key={yearRow[0]} gap={1}>\n {yearRow.map((year) => (\n <YearPickerCell\n key={year}\n year={year}\n onValueChange={onValueChange}\n value={value}\n />\n ))}\n </Row>\n ))}\n </Column>\n <Column justifyContent={\"center\"}>\n <FlatButton\n leftIcon={stenaArrowRight}\n onClick={() => setLastYear(lastYear + 3)}\n />\n </Column>\n </Row>\n );\n};\n\nconst calculateLastYearInFocus = (\n value: number | undefined,\n lastYear: number,\n): number => {\n if (value == null) {\n return lastYear;\n }\n if (value > lastYear) {\n const yearDiff = value - lastYear;\n const remaining = yearDiff % 3;\n const yearsToAdd = yearDiff - remaining + 3;\n return lastYear + yearsToAdd;\n }\n const startYear = lastYear - 11;\n if (value < startYear) {\n const yearDiff = startYear - value;\n const remaining = yearDiff % 3;\n const yearsToSubtract = yearDiff - remaining + 3;\n return lastYear - yearsToSubtract;\n }\n\n return lastYear;\n};\n","import { RefObject, useEffect } from \"react\";\n\nexport const useDateRangeEffects = (\n startDate: Date | undefined,\n endDate: Date | undefined,\n setDateInFocus: (date: Date) => void,\n startDateInputRef: RefObject<HTMLInputElement | null>,\n endDateInputRef: RefObject<HTMLInputElement | null>,\n) => {\n useEffect(\n function moveFocusedDateWhenStartDateChanges() {\n if (startDate) {\n setDateInFocus(startDate);\n }\n },\n [startDate, setDateInFocus],\n );\n\n useEffect(\n function moveFocusedDateWhenEndDateChanges() {\n if (endDate) {\n setDateInFocus(endDate);\n }\n },\n [endDate, setDateInFocus],\n );\n\n useEffect(\n function updateStartDateFieldWhenValueChanges() {\n if (startDateInputRef.current) {\n if (startDate) {\n startDateInputRef.current.valueAsDate = new Date(\n Date.UTC(\n startDate.getFullYear(),\n startDate.getMonth(),\n startDate.getDate(),\n ),\n );\n } else {\n startDateInputRef.current.valueAsDate = null;\n }\n }\n },\n [startDate, startDateInputRef],\n );\n\n useEffect(\n function updateEndDateFieldWhenValueChanges() {\n if (endDateInputRef.current) {\n if (endDate) {\n endDateInputRef.current.valueAsDate = new Date(\n Date.UTC(\n endDate.getFullYear(),\n endDate.getMonth(),\n endDate.getDate(),\n ),\n );\n } else {\n endDateInputRef.current.valueAsDate = null;\n }\n }\n },\n [endDate, endDateInputRef],\n );\n};\n","import { ChangeEvent, useCallback } from \"react\";\nimport { DateRangeDualTextInputProps } from \"../DateRangeDualTextInput\";\nimport { UseInputStatesResult } from \"./UseInputStates\";\n\nexport const useDateRangeHandlers = (\n startDate: Date | undefined,\n endDate: Date | undefined,\n onValueChange: DateRangeDualTextInputProps[\"onValueChange\"],\n {\n setDateInFocus,\n showCalendarInternal,\n hideCalendarInternal,\n setFirstFocusedInput,\n setCurrentPanel,\n }: UseInputStatesResult,\n) => {\n const inputLeftChangeHandler = useCallback(\n (ev: ChangeEvent<HTMLInputElement>) => {\n if (ev.target.value[0] !== \"0\") {\n onValueChange?.({\n startDate: ev.target.valueAsDate ?? undefined,\n endDate,\n });\n }\n },\n [onValueChange, endDate],\n );\n\n const inputRightChangeHandler = useCallback(\n (ev: ChangeEvent<HTMLInputElement>) => {\n if (ev.target.value[0] !== \"0\") {\n onValueChange?.({\n startDate,\n endDate: ev.target.valueAsDate ?? undefined,\n });\n }\n },\n [onValueChange, startDate],\n );\n\n const showCalendar = useCallback(\n (dateInFocus?: Date) => {\n if (dateInFocus != null) {\n setDateInFocus(dateInFocus);\n } else if (startDate) {\n setDateInFocus(startDate);\n } else if (endDate) {\n setDateInFocus(endDate);\n } else {\n setDateInFocus(new Date());\n }\n setCurrentPanel(\"calendar\");\n showCalendarInternal();\n },\n [startDate, endDate, setCurrentPanel, showCalendarInternal, setDateInFocus],\n );\n\n const hideCalendar = useCallback(() => {\n setFirstFocusedInput(undefined);\n hideCalendarInternal();\n }, [setFirstFocusedInput, hideCalendarInternal]);\n\n return {\n inputLeftChangeHandler,\n inputRightChangeHandler,\n hideCalendar,\n setDateInFocus,\n setCurrentPanel,\n showCalendar,\n };\n};\n","import { useBoolean } from \"@stenajs-webui/core\";\nimport { useState } from \"react\";\nimport { DateRangeFocusedInput } from \"../../../calendar-types/date-range-calendar/DateRangeCalendar\";\nimport { CalendarPanelType } from \"../../../../features/calendar-with-month-year-pickers/CalendarPanelType\";\n\nexport type UseInputStatesResult = ReturnType<typeof useInputStates>;\n\nexport const useInputStates = (\n startDate: Date | undefined,\n endDate: Date | undefined,\n) => {\n const [isCalendarVisible, showCalendarInternal, hideCalendarInternal] =\n useBoolean(false);\n\n const [firstFocusedInput, setFirstFocusedInput] = useState<\n DateRangeFocusedInput | undefined\n >(undefined);\n\n const [focusedInput, setFocusedInput] =\n useState<DateRangeFocusedInput>(\"startDate\");\n\n const [dateInFocus, setDateInFocus] = useState<Date>(() => {\n const fromValue =\n focusedInput === \"startDate\"\n ? startDate\n : focusedInput === \"endDate\"\n ? endDate\n : undefined;\n\n return fromValue ?? new Date();\n });\n\n const [currentPanel, setCurrentPanel] =\n useState<CalendarPanelType>(\"calendar\");\n\n return {\n isCalendarVisible,\n showCalendarInternal,\n hideCalendarInternal,\n firstFocusedInput,\n setFirstFocusedInput,\n focusedInput,\n setFocusedInput,\n dateInFocus,\n setDateInFocus,\n currentPanel,\n setCurrentPanel,\n };\n};\n","import { isAfter } from \"date-fns\";\nimport * as React from \"react\";\nimport { RefObject, useCallback } from \"react\";\nimport { DayData } from \"../../../../util/calendar/CalendarDataFactory\";\nimport { DateRangeDualTextInputProps } from \"../DateRangeDualTextInput\";\nimport { UseInputStatesResult } from \"./UseInputStates\";\n\nexport const useUserInputHandlers = (\n startDate: Date | undefined,\n endDate: Date | undefined,\n onValueChange: DateRangeDualTextInputProps[\"onValueChange\"],\n startDateInputRef: RefObject<HTMLInputElement | null>,\n endDateInputRef: RefObject<HTMLInputElement | null>,\n showCalendar: (dateInFocus?: Date) => void,\n hideCalendar: () => void,\n {\n firstFocusedInput,\n setFirstFocusedInput,\n isCalendarVisible,\n setFocusedInput,\n focusedInput,\n setCurrentPanel,\n setDateInFocus,\n }: UseInputStatesResult,\n) => {\n const onFocusLeft = useCallback(() => {\n if (firstFocusedInput == null) {\n setFirstFocusedInput(\"startDate\");\n }\n setFocusedInput(\"startDate\");\n if (!isCalendarVisible) {\n showCalendar(startDate);\n } else if (startDate != null) {\n setDateInFocus(startDate);\n }\n }, [\n firstFocusedInput,\n setFocusedInput,\n isCalendarVisible,\n startDate,\n setFirstFocusedInput,\n showCalendar,\n setDateInFocus,\n ]);\n\n const onFocusRight = useCallback(() => {\n if (firstFocusedInput == null) {\n setFirstFocusedInput(\"endDate\");\n }\n setFocusedInput(\"endDate\");\n if (!isCalendarVisible) {\n showCalendar(endDate);\n } else if (endDate != null) {\n setDateInFocus(endDate);\n }\n }, [\n firstFocusedInput,\n setFocusedInput,\n isCalendarVisible,\n endDate,\n setFirstFocusedInput,\n showCalendar,\n setDateInFocus,\n ]);\n\n const onClickDay = useCallback(\n (day: DayData) => {\n if (focusedInput === \"startDate\") {\n if (endDate != null && isAfter(day.date, endDate)) {\n onValueChange?.({\n startDate: day.date,\n endDate: undefined,\n });\n setFocusedInput(\"endDate\");\n endDateInputRef.current?.focus();\n } else {\n onValueChange?.({\n startDate: day.date,\n endDate,\n });\n if (firstFocusedInput === \"startDate\") {\n setFocusedInput(\"endDate\");\n endDateInputRef.current?.focus();\n } else {\n setTimeout(hideCalendar, 50);\n }\n }\n } else if (focusedInput === \"endDate\") {\n if (!startDate) {\n onValueChange?.({\n startDate,\n endDate: day.date,\n });\n setFocusedInput(\"startDate\");\n startDateInputRef.current?.focus();\n } else if (isAfter(startDate, day.date)) {\n onValueChange?.({\n startDate: day.date,\n endDate: undefined,\n });\n setFocusedInput(\"endDate\");\n endDateInputRef.current?.focus();\n } else {\n onValueChange?.({\n startDate,\n endDate: day.date,\n });\n setTimeout(hideCalendar, 50);\n }\n }\n },\n [\n focusedInput,\n onValueChange,\n endDate,\n firstFocusedInput,\n setFocusedInput,\n endDateInputRef,\n hideCalendar,\n startDate,\n startDateInputRef,\n ],\n );\n\n const onClickArrowButton = useCallback(() => {\n setCurrentPanel(\"presets\");\n showCalendar();\n }, [setCurrentPanel, showCalendar]);\n\n const onClickCalendarButton = useCallback(() => {\n if (isCalendarVisible) {\n hideCalendar();\n } else {\n setFocusedInput(\"startDate\");\n setFirstFocusedInput(\"startDate\");\n startDateInputRef.current?.focus();\n setCurrentPanel(\"calendar\");\n showCalendar();\n }\n }, [\n isCalendarVisible,\n hideCalendar,\n setFocusedInput,\n setFirstFocusedInput,\n startDateInputRef,\n setCurrentPanel,\n showCalendar,\n ]);\n\n const onKeyDownHandler = useCallback(\n (ev: React.KeyboardEvent<HTMLDivElement>) => {\n if (ev.key === \"Escape\") {\n hideCalendar();\n }\n },\n [hideCalendar],\n );\n\n return {\n onFocusLeft,\n onFocusRight,\n onClickDay,\n onClickArrowButton,\n onClickCalendarButton,\n onKeyDownHandler,\n };\n};\n","import { Box, Column } from \"@stenajs-webui/core\";\nimport { stenaArrowRight } from \"@stenajs-webui/elements\";\nimport {\n TextInputProps,\n ValueAndOnValueChangeProps,\n} from \"@stenajs-webui/forms\";\nimport {\n ControlledPopover,\n ControlledPopoverProps,\n} from \"@stenajs-webui/tooltip\";\nimport { isAfter } from \"date-fns\";\nimport * as React from \"react\";\nimport { useMemo, useRef } from \"react\";\nimport { defaultPopoverPlacement } from \"../../../config/DefaultPopoverPlacement\";\nimport {\n DualTextInput,\n DualTextInputProps,\n} from \"../../../features/dual-text-input/DualTextInput\";\nimport { CalendarWithMonthSwitcher } from \"../../../features/month-switcher/CalendarWithMonthSwitcher\";\nimport { buildDayStateForSingleMonth } from \"../../../util/calendar/StateModifier\";\nimport { useDateRangeEffects } from \"./hooks/UseDateRangeEffects\";\nimport { useDateRangeHandlers } from \"./hooks/UseDateRangeHandlers\";\nimport { useInputStates } from \"./hooks/UseInputStates\";\nimport { useUserInputHandlers } from \"./hooks/UseUserInputHandlers\";\nimport { DateRangeInputCalendarProps } from \"../../calendar-types/date-range-calendar/DateRangeCalendar\";\nimport { OptionalMinMaxDatesAsString } from \"../../../types/CalendarTypes\";\nimport { DateRange } from \"../../../types/DateRange\";\nimport { defaultMaxDate } from \"../../../config/DefaultMaxDate\";\n\nexport interface DateRangeDualTextInputProps<TData = unknown>\n extends ValueAndOnValueChangeProps<DateRange>,\n OptionalMinMaxDatesAsString,\n Pick<DualTextInputProps, \"widthLeft\" | \"widthRight\" | \"variant\">,\n Pick<ControlledPopoverProps, \"zIndex\" | \"appendTo\"> {\n onEsc?: () => void;\n onEnter?: () => void;\n onBlur?: () => void;\n autoFocus?: boolean;\n calendarProps?: DateRangeInputCalendarProps<TData>;\n disabled?: boolean;\n renderBelowCalendar?: React.ReactNode;\n firstMonthInMonthPicker?: Date;\n numMonthsInMonthPicker?: number;\n}\n\nexport function DateRangeDualTextInput<TData>({\n value,\n onValueChange,\n autoFocus,\n onBlur,\n onEnter,\n onEsc,\n minDate,\n maxDate = defaultMaxDate,\n calendarProps,\n widthLeft = 128,\n widthRight = 128,\n firstMonthInMonthPicker,\n numMonthsInMonthPicker,\n variant,\n disabled,\n zIndex,\n appendTo,\n renderBelowCalendar,\n}: DateRangeDualTextInputProps<TData>) {\n const { startDate, endDate } = value || {};\n\n const startDateInputRef: TextInputProps[\"inputRef\"] = useRef(null);\n const endDateInputRef: TextInputProps[\"inputRef\"] = useRef(null);\n\n const states = useInputStates(startDate, endDate);\n\n const {\n dateInFocus,\n setDateInFocus,\n isCalendarVisible,\n currentPanel,\n setCurrentPanel,\n } = states;\n\n const {\n showCalendar,\n hideCalendar,\n inputLeftChangeHandler,\n inputRightChangeHandler,\n } = useDateRangeHandlers(startDate, endDate, onValueChange, states);\n\n const {\n onKeyDownHandler,\n onFocusRight,\n onFocusLeft,\n onClickDay,\n onClickCalendarButton,\n onClickArrowButton,\n } = useUserInputHandlers(\n startDate,\n endDate,\n onValueChange,\n startDateInputRef,\n endDateInputRef,\n showCalendar,\n hideCalendar,\n states,\n );\n\n useDateRangeEffects(\n startDate,\n endDate,\n setDateInFocus,\n startDateInputRef,\n endDateInputRef,\n );\n\n const startDateIsAfterEnd = useMemo(\n () => startDate && endDate && isAfter(startDate, endDate),\n [startDate, endDate],\n );\n\n const statePerMonth = useMemo(\n () =>\n buildDayStateForSingleMonth(\n calendarProps?.statePerMonth,\n startDate,\n endDate,\n dateInFocus,\n ),\n [calendarProps?.statePerMonth, startDate, endDate, dateInFocus],\n );\n\n return (\n <Box onKeyDown={onKeyDownHandler}>\n <ControlledPopover\n hideArrow\n restoreFocus={false}\n returnFocus={false}\n zIndex={zIndex}\n appendTo={appendTo}\n renderTrigger={(props) => (\n <Box {...props}>\n <DualTextInput\n autoFocusLeft={autoFocus}\n onEsc={onEsc}\n onEnter={onEnter}\n onBlur={onBlur}\n disabled={disabled}\n separatorIcon={stenaArrowRight}\n typeLeft={\"date\"}\n typeRight={\"date\"}\n placeholderLeft={\"Start date\"}\n placeholderRight={\"End date\"}\n onChangeLeft={inputLeftChangeHandler}\n onChangeRight={inputRightChangeHandler}\n onClickArrowDown={onClickArrowButton}\n onClickCalendar={onClickCalendarButton}\n onFocusLeft={onFocusLeft}\n onFocusRight={onFocusRight}\n onClickLeft={onFocusLeft}\n onClickRight={onFocusRight}\n inputRefLeft={startDateInputRef}\n inputRefRight={endDateInputRef}\n variant={startDateIsAfterEnd ? \"error\" : variant}\n widthLeft={widthLeft}\n widthRight={widthRight}\n minLeft={minDate}\n maxLeft={maxDate}\n minRight={minDate}\n maxRight={maxDate}\n />\n </Box>\n )}\n placement={defaultPopoverPlacement}\n onRequestClose={hideCalendar}\n open={isCalendarVisible}\n >\n <Column>\n <CalendarWithMonthSwitcher\n onClickDay={onClickDay}\n dateInFocus={dateInFocus}\n firstMonthInMonthPicker={firstMonthInMonthPicker}\n numMonthsInMonthPicker={numMonthsInMonthPicker}\n setDateInFocus={setDateInFocus}\n currentPanel={currentPanel}\n setCurrentPanel={setCurrentPanel}\n minDate={minDate}\n maxDate={maxDate}\n {...calendarProps}\n statePerMonth={statePerMonth}\n />\n {currentPanel === \"calendar\" && renderBelowCalendar}\n </Column>\n </ControlledPopover>\n </Box>\n );\n}\n","import * as React from \"react\";\nimport { 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 \"smaller\":\n return \"140px\";\n case \"small\":\n return \"154px\";\n case \"medium\":\n return \"168px\";\n case \"large\":\n return \"196px\";\n default:\n return exhaustSwitchCase(calenderSize, \"168px\");\n }\n};\n","export const yearMask = [/[1-2]/, /\\d/, /\\d/, /\\d/];\nexport const monthMask = [/[0-1]/, /\\d/];\nexport const dayMask = [/[0-3]/, /\\d/];\n\nexport const createInputMaskForDateFormat = (\n dateFormat: string, // For example: yyyy-MM-dd\n): Array<string | RegExp> => {\n const l = splitByNewLetter(dateFormat);\n return l.flatMap(tokenToMask);\n};\n\nconst tokenToMask = (token: string): Array<string | RegExp> => {\n switch (token) {\n case \"yyyy\":\n return yearMask;\n case \"mm\":\n case \"MM\":\n return monthMask;\n case \"dd\":\n case \"DD\":\n return dayMask;\n default:\n return [token];\n }\n};\n\nconst splitByNewLetter = (str: string): Array<string> => {\n if (str.length === 0) return [];\n\n const result: Array<string> = [];\n let currentSegment = str[0];\n\n for (let i = 1; i < str.length; i++) {\n if (str[i] !== str[i - 1]) {\n result.push(currentSegment);\n currentSegment = str[i];\n } else {\n currentSegment += str[i];\n }\n }\n\n result.push(currentSegment);\n return result;\n};\n","// Define the supported locales\n\nimport { SupportedLocaleCode } from \"./LocaleMapper\";\n\nexport const getDateFormatForLocaleCode = (\n localeCode: SupportedLocaleCode,\n): string => {\n const formatter = new Intl.DateTimeFormat(localeCode, { dateStyle: \"short\" });\n const parts = formatter.formatToParts(new Date());\n const formatMap: { [key: string]: string } = {\n year: \"yyyy\",\n month: \"MM\",\n day: \"dd\",\n };\n return parts.map((part) => formatMap[part.type] || part.value).join(\"\");\n};\n","import { parse } from \"date-fns\";\nimport { getDateFormatForLocaleCode } from \"./DateFormatProvider\";\nimport {\n fallbackLocaleCode,\n getLocaleForLocaleCode,\n getSupportedLocaleCode,\n SupportedLocaleCode,\n} from \"./LocaleMapper\";\n\ninterface ParseLocalizedDateStringOptions {\n matchLanguage?: boolean;\n fallbackLocaleCode?: SupportedLocaleCode;\n referenceDate?: Date;\n}\n\nexport const parseLocalizedDateString = (\n dateString: string,\n localeCode: string,\n options?: ParseLocalizedDateStringOptions,\n): Date | undefined => {\n const supportedLocaleCode = getSupportedLocaleCode(\n localeCode,\n options?.matchLanguage ?? false,\n options?.fallbackLocaleCode ?? fallbackLocaleCode,\n );\n\n const locale = getLocaleForLocaleCode(supportedLocaleCode);\n\n if (locale == null) {\n return undefined;\n }\n\n const date = parse(\n dateString,\n getDateFormatForLocaleCode(supportedLocaleCode),\n options?.referenceDate ?? new Date(),\n {\n locale: locale,\n },\n );\n\n if (isNaN(date.getTime())) {\n return undefined;\n }\n\n return date;\n};\n","import { format } from \"date-fns\";\nimport { getDateFormatForLocaleCode } from \"./DateFormatProvider\";\nimport {\n fallbackLocaleCode,\n getLocaleForLocaleCode,\n getSupportedLocaleCode,\n SupportedLocaleCode,\n} from \"./LocaleMapper\";\n\nexport interface FormatLocalizedDateOptions {\n matchLanguage?: boolean;\n fallbackLocaleCode?: SupportedLocaleCode;\n}\n\nexport const formatLocalizedDate = (\n date: Date,\n localeCode: string,\n options?: FormatLocalizedDateOptions,\n): string => {\n const l = getSupportedLocaleCode(\n localeCode,\n options?.matchLanguage ?? false,\n options?.fallbackLocaleCode ?? fallbackLocaleCode,\n );\n return format(date, getDateFormatForLocaleCode(l), {\n locale: getLocaleForLocaleCode(l),\n });\n};\n","import { parseLocalizedDateString } from \"./LocalizedDateParser\";\nimport { formatLocalizedDate } from \"./LocalizedDateFormatter\";\n\nexport const reformatLocalizedDateString = (\n dateString: string,\n locale: string,\n): string | undefined => {\n const d = parseLocalizedDateString(dateString, locale);\n if (d == null) {\n return undefined;\n }\n return formatLocalizedDate(d, locale);\n};\n","import * as React from \"react\";\nimport { useMemo } from \"react\";\nimport { Row } from \"@stenajs-webui/core\";\nimport { TravelDateTextInput } from \"./TravelDateTextInput\";\nimport { createInputMaskForDateFormat } from \"../../localize-date-format/InputMaskProvider\";\nimport { getDateFormatForLocaleCode } from \"../../localize-date-format/DateFormatProvider\";\nimport { reformatLocalizedDateString } from \"../../localize-date-format/LocalizedDateReformatter\";\nimport { DateTextInputVariant, TravelDateRangeInputValue } from \"../types\";\nimport { TravelCalendarSizeVariant } from \"./TravelCalendar\";\nimport { SupportedLocaleCode } from \"../../localize-date-format/LocaleMapper\";\n\nexport interface TravelDateRangeTextInputFieldsProps {\n value: TravelDateRangeInputValue | undefined;\n onValueChange:\n | ((value: Partial<TravelDateRangeInputValue>) => void)\n | undefined;\n localeCode: SupportedLocaleCode;\n startDateLabel?: string;\n endDateLabel?: string;\n onFocus?: () => 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 getLocaleForLocaleCode,\n SupportedLocaleCode,\n} from \"../../localize-date-format/LocaleMapper\";\nimport { useCallback, useId, useMemo, useRef, useState } from \"react\";\nimport { useToday } from \"@stenajs-webui/core\";\nimport { getDateFormatForLocaleCode } from \"../../localize-date-format/DateFormatProvider\";\nimport { parseLocalizedDateString } from \"../../localize-date-format/LocalizedDateParser\";\nimport {\n intlFormat,\n isAfter,\n isBefore,\n isSameDay,\n isSameMonth,\n} from \"date-fns\";\nimport { getMonthInYear } from \"../../../util/calendar/CalendarDataFactory\";\nimport { formatLocalizedDate } from \"../../localize-date-format/LocalizedDateFormatter\";\nimport { TravelDateRangeInputValue, VisiblePanel } from \"../types\";\nimport { formatDateDescription } from \"../util/DateDescriptionFormatter\";\nimport { convertFirstCharToUpper } from \"../../../util/caseFormat/CaseFormat\";\n\nexport const useTravelDateRangeInput = (\n value: TravelDateRangeInputValue | undefined,\n onValueChange: ((value: TravelDateRangeInputValue) => void) | undefined,\n localeCode: SupportedLocaleCode,\n languageLocaleCode: SupportedLocaleCode,\n initialMonthInFocus: Date | undefined,\n) => {\n const languageLocale = getLocaleForLocaleCode(languageLocaleCode);\n\n const calendarId = useId();\n const today = useToday();\n\n const monthPickerButtonRef = useRef<HTMLButtonElement>(null);\n\n const dateFormat = useMemo(\n () => getDateFormatForLocaleCode(localeCode),\n [localeCode],\n );\n\n const selectedStartDate = useMemo(\n () =>\n value?.startDate?.length === dateFormat.length\n ? parseLocalizedDateString(value.startDate, localeCode)\n : undefined,\n [dateFormat.length, localeCode, value?.startDate],\n );\n\n const selectedEndDate = useMemo(\n () =>\n value?.endDate?.length === dateFormat.length\n ? parseLocalizedDateString(value.endDate, localeCode)\n : undefined,\n [dateFormat.length, localeCode, value?.endDate],\n );\n\n const valueWhenBlurredStartDate = useMemo(\n () =>\n selectedStartDate != null\n ? formatDateDescription(selectedStartDate, today, languageLocale)\n : undefined,\n [languageLocale, selectedStartDate, today],\n );\n\n const valueWhenBlurredEndDate = useMemo(\n () =>\n selectedEndDate != null\n ? formatDateDescription(selectedEndDate, today, languageLocale)\n : undefined,\n [languageLocale, selectedEndDate, today],\n );\n\n const [visibleMonth, setVisibleMonth] = 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 languageLocale,\n ),\n [languageLocale, visibleMonth],\n );\n\n const monthPickerButtonLabel = useMemo(() => {\n return convertFirstCharToUpper(\n intlFormat(\n visibleMonth,\n { month: \"long\", year: \"numeric\" },\n { locale: languageLocale.code },\n ),\n );\n }, [languageLocale, visibleMonth]);\n\n const todayIsInVisibleMonth = useMemo(() => {\n return isSameMonth(today, visibleMonth);\n }, [today, visibleMonth]);\n\n const [hoverDate, setHoverDate] = useState<Date | undefined>();\n\n const [visiblePanel, setVisiblePanel] = useState<VisiblePanel>(\"calendar\");\n\n const onValueChangeByInputs = useCallback<\n (value: TravelDateRangeInputValue) => void\n >(\n (v) => {\n const startDate =\n v?.startDate?.length === dateFormat.length\n ? parseLocalizedDateString(v.startDate, localeCode)\n : undefined;\n\n const endDate =\n v?.endDate?.length === dateFormat.length\n ? parseLocalizedDateString(v.endDate, localeCode)\n : undefined;\n\n if (startDate) {\n setVisibleMonthClamped(startDate);\n } else if (endDate) {\n setVisibleMonthClamped(endDate);\n }\n\n onValueChange?.({\n ...value,\n ...v,\n });\n },\n [\n dateFormat.length,\n localeCode,\n onValueChange,\n setVisibleMonthClamped,\n value,\n ],\n );\n\n const isValidDateRange = useMemo(\n () =>\n (selectedStartDate &&\n selectedEndDate &&\n (isSameDay(selectedStartDate, selectedEndDate) ||\n isBefore(selectedStartDate, selectedEndDate))) ??\n false,\n [selectedEndDate, selectedStartDate],\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 onClickDate,\n onValueChangeByInputs,\n isValidDateRange,\n monthPickerButtonRef,\n calendarId,\n monthPickerButtonLabel,\n visiblePanel,\n setVisiblePanel,\n setVisibleMonth,\n visibleMonthData,\n todayIsInVisibleMonth,\n hoverDate,\n setHoverDate,\n selectedStartDate,\n selectedEndDate,\n today,\n visibleMonth,\n valueWhenBlurredStartDate,\n valueWhenBlurredEndDate,\n };\n};\n","import * as React from \"react\";\nimport { Ref } from \"react\";\nimport {\n FlatButton,\n SecondaryButton,\n stenaAngleDown,\n stenaAngleUp,\n stenaArrowLeft,\n stenaArrowRight,\n} from \"@stenajs-webui/elements\";\nimport { Row } from \"@stenajs-webui/core\";\nimport { addMonths, subMonths } from \"date-fns\";\nimport { VisiblePanel } from \"../types\";\nimport { TravelCalendarSizeVariant } from \"./TravelCalendar\";\n\nexport interface MonthHeaderProps {\n monthPickerButtonLabel: string;\n nextMonthButtonAriaLabel: string;\n previousMonthButtonAriaLabel: string;\n visiblePanel: VisiblePanel;\n setVisiblePanel: (panel: VisiblePanel) => void;\n monthPickerButtonRef: Ref<HTMLButtonElement>;\n visibleMonth: Date;\n setVisibleMonth: (date: Date) => void;\n prevMonthDisabled?: (visibleMonth: Date) => boolean;\n nextMonthDisabled?: (visibleMonth: Date) => boolean;\n calendarSize: TravelCalendarSizeVariant;\n previousMonthButtonTestId?: string;\n nextMonthButtonTestId?: string;\n}\n\nexport const MonthHeader: React.FC<MonthHeaderProps> = ({\n previousMonthButtonAriaLabel,\n nextMonthButtonAriaLabel,\n monthPickerButtonLabel,\n visiblePanel,\n setVisiblePanel,\n monthPickerButtonRef,\n setVisibleMonth,\n visibleMonth,\n prevMonthDisabled,\n nextMonthDisabled,\n calendarSize,\n previousMonthButtonTestId,\n nextMonthButtonTestId,\n}) => {\n const size =\n calendarSize === \"smaller\" || calendarSize === \"small\" ? \"medium\" : \"large\";\n\n return (\n <Row alignSelf={\"center\"} justifyContent={\"space-between\"} width={\"100%\"}>\n <FlatButton\n aria-live={\"polite\"}\n label={monthPickerButtonLabel}\n rightIcon={visiblePanel === \"calendar\" ? stenaAngleDown : stenaAngleUp}\n onClick={() =>\n setVisiblePanel(\n visiblePanel === \"calendar\" ? \"month-picker\" : \"calendar\",\n )\n }\n ref={monthPickerButtonRef}\n size={size}\n />\n <Row alignItems={\"center\"} gap={2}>\n <SecondaryButton\n leftIcon={stenaArrowLeft}\n onClick={() => setVisibleMonth(subMonths(visibleMonth, 1))}\n disabled={prevMonthDisabled?.(visibleMonth)}\n aria-label={previousMonthButtonAriaLabel}\n size={size}\n data-testid={previousMonthButtonTestId}\n />\n <SecondaryButton\n leftIcon={stenaArrowRight}\n onClick={() => setVisibleMonth(addMonths(visibleMonth, 1))}\n disabled={nextMonthDisabled?.(visibleMonth)}\n aria-label={nextMonthButtonAriaLabel}\n size={size}\n data-testid={nextMonthButtonTestId}\n />\n </Row>\n </Row>\n );\n};\n","import { isAfter, isBefore, isSameDay } from \"date-fns\";\n\nconst rangeBgColor = \"var(--selection-range-background-color)\";\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 const nextDateDisabled =\n (nextDate && isDateDisabled?.(nextDate)) ?? false;\n\n if (nextDate && !nextDateDisabled) {\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) ?? false;\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 =\n | \"smaller\"\n | \"small\"\n | \"medium\"\n | \"large\";\n\nexport interface TravelCalendarProps {\n visibleMonthData: MonthData;\n onClickDate: (date: Date) => void;\n visibleMonth: Date;\n setVisibleMonth: (visibleMonth: Date) => void;\n isValidDateRange: boolean;\n setHoverDate: Dispatch<SetStateAction<Date | undefined>>;\n selectedStartDate: Date | undefined;\n selectedEndDate: Date | undefined;\n 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\";\nimport { SupportedLocaleCode } from \"../../../features/localize-date-format/LocaleMapper\";\n\nexport interface RenderBelowCalendarArgs {\n hideCalendar: () => void;\n}\n\nexport interface TravelDateRangeInputProps\n extends ValueAndOnValueChangeProps<TravelDateRangeInputValue> {\n localeCode?: SupportedLocaleCode;\n languageLocaleCode?: SupportedLocaleCode;\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 isDateDisabled?: (date: Date) => boolean;\n prevMonthDisabled?: (visibleMonth: Date) => boolean;\n nextMonthDisabled?: (visibleMonth: Date) => boolean;\n zIndex?: number;\n zIndexWhenClosed?: number;\n onHideCalendar?: () => void;\n renderBelowCalendar?: (args: RenderBelowCalendarArgs) => ReactNode;\n size?: TravelCalendarSizeVariant;\n dateTestId?: (date: Date) => string | undefined;\n previousMonthButtonTestId?: string;\n nextMonthButtonTestId?: string;\n placeholderWhenBlurredStartDate?: string;\n placeholderWhenBlurredEndDate?: string;\n textInputVariant?: DateTextInputVariant;\n}\n\nexport const TravelDateRangeInput: React.FC<TravelDateRangeInputProps> = ({\n value,\n onValueChange,\n startDateLabel,\n endDateLabel,\n localeCode = \"sv\",\n languageLocaleCode = localeCode,\n initialMonthInFocus,\n previousMonthButtonAriaLabel = \"Previous month\",\n nextMonthButtonAriaLabel = \"Next month\",\n placeholderWhenBlurredStartDate,\n placeholderWhenBlurredEndDate,\n heading,\n headingLevel,\n numMonthsInMonthPicker = 12,\n isDateDisabled,\n prevMonthDisabled,\n nextMonthDisabled,\n firstMonthInMonthPicker = new Date(),\n zIndex = 1000,\n zIndexWhenClosed,\n onHideCalendar,\n renderBelowCalendar,\n size = \"medium\",\n dateTestId,\n previousMonthButtonTestId,\n nextMonthButtonTestId,\n textInputVariant = \"standard\",\n}) => {\n const [calendarOpen, setCalendarOpen] = useState(false);\n const [calendarInDom, setCalendarInDom] = useState(false);\n const [boxSize, setBoxSize] = useState<{ height: number; width: number }>({\n // Sane defaults, this will be updated with actual data from DOM.\n width: 336,\n height: 66,\n });\n\n const inputFieldsHeight = size === \"large\" ? \"8.8rem\" : \"6.6rem\";\n\n const calendarOpenRef = useRef(false);\n\n const showCalendar = useCallback(() => {\n calendarOpenRef.current = true;\n setCalendarInDom(true);\n setTimeout(() => {\n setCalendarOpen(true);\n }, 10);\n }, []);\n\n const hideCalendar = useCallback(() => {\n if (!calendarInDom) {\n return;\n }\n\n setCalendarOpen(false);\n calendarOpenRef.current = false;\n onHideCalendar?.();\n\n setTimeout(() => {\n if (!calendarOpenRef.current) {\n setCalendarInDom(false);\n }\n }, 120);\n }, [calendarInDom, onHideCalendar]);\n\n const ref = useRef<HTMLDivElement>(null);\n const sizeSourceRef = useRef<HTMLDivElement>(null);\n\n useOnClickOutside(ref, hideCalendar);\n\n useLayoutEffect(() => {\n const width = sizeSourceRef.current?.offsetWidth;\n const height = sizeSourceRef.current?.offsetHeight;\n if (width != null && height != null) {\n if (boxSize.height !== height || boxSize.width !== width) {\n setBoxSize({ width, height });\n }\n }\n }, [boxSize.height, boxSize.width]);\n\n const inputProps = useTravelDateRangeInput(\n value,\n onValueChange,\n localeCode,\n languageLocaleCode,\n 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 prevMonthDisabled={prevMonthDisabled}\n nextMonthDisabled={nextMonthDisabled}\n previousMonthButtonTestId={previousMonthButtonTestId}\n nextMonthButtonTestId={nextMonthButtonTestId}\n />\n\n {visiblePanel === \"calendar\" && (\n <TravelCalendar\n {...inputProps}\n size={size}\n multiSelectable={true}\n isDateDisabled={isDateDisabled}\n dateTestId={dateTestId}\n />\n )}\n\n {visiblePanel === \"month-picker\" && (\n <MonthPicker\n firstMonth={firstMonthInMonthPicker}\n numMonths={numMonthsInMonthPicker}\n value={visibleMonth}\n size={size}\n localeCode={languageLocaleCode}\n onValueChange={(v) => {\n setVisibleMonth(v);\n setVisiblePanel(\"calendar\");\n monthPickerButtonRef.current?.focus();\n }}\n onCancel={() => {\n setVisiblePanel(\"calendar\");\n monthPickerButtonRef.current?.focus();\n }}\n />\n )}\n {renderBelowCalendar?.({ hideCalendar })}\n </CardBody>\n </Box>\n </Box>\n )}\n </Box>\n );\n};\n","import * as React from \"react\";\nimport { useMemo } from \"react\";\nimport { Row } from \"@stenajs-webui/core\";\nimport { TravelDateTextInput } from \"./TravelDateTextInput\";\nimport { createInputMaskForDateFormat } from \"../../localize-date-format/InputMaskProvider\";\nimport { getDateFormatForLocaleCode } from \"../../localize-date-format/DateFormatProvider\";\nimport { reformatLocalizedDateString } from \"../../localize-date-format/LocalizedDateReformatter\";\nimport { TravelCalendarSizeVariant } from \"./TravelCalendar\";\nimport { DateTextInputVariant } from \"../types\";\nimport { SupportedLocaleCode } from \"../../localize-date-format/LocaleMapper\";\n\nexport interface TravelDateTextInputFieldProps {\n value: string | undefined;\n onValueChange: ((value: string) => void) | undefined;\n localeCode: SupportedLocaleCode;\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 getLocaleForLocaleCode,\n SupportedLocaleCode,\n} from \"../../localize-date-format/LocaleMapper\";\nimport { useCallback, useId, useMemo, useRef, useState } from \"react\";\nimport { useToday } from \"@stenajs-webui/core\";\nimport { getDateFormatForLocaleCode } from \"../../localize-date-format/DateFormatProvider\";\nimport { parseLocalizedDateString } from \"../../localize-date-format/LocalizedDateParser\";\nimport { intlFormat, isAfter, isSameMonth } from \"date-fns\";\nimport { getMonthInYear } from \"../../../util/calendar/CalendarDataFactory\";\nimport { formatLocalizedDate } from \"../../localize-date-format/LocalizedDateFormatter\";\nimport { VisiblePanel } from \"../types\";\nimport { formatDateDescription } from \"../util/DateDescriptionFormatter\";\nimport { convertFirstCharToUpper } from \"../../../util/caseFormat/CaseFormat\";\n\nexport const useTravelDateInput = (\n value: string | undefined,\n onValueChange: ((value: string) => void) | undefined,\n localeCode: SupportedLocaleCode,\n languageLocaleCode: SupportedLocaleCode,\n initialMonthInFocus: Date | undefined,\n onClickDate?: (date: Date) => void,\n) => {\n const languageLocale = getLocaleForLocaleCode(languageLocaleCode);\n\n const calendarId = useId();\n const today = useToday();\n\n const monthPickerButtonRef = useRef<HTMLButtonElement>(null);\n\n const dateFormat = useMemo(\n () => getDateFormatForLocaleCode(localeCode),\n [localeCode],\n );\n\n const selectedDate = useMemo(\n () =>\n value?.length === dateFormat.length\n ? parseLocalizedDateString(value, localeCode)\n : undefined,\n [dateFormat.length, localeCode, value],\n );\n\n const valueWhenBlurred = useMemo(\n () =>\n selectedDate != null\n ? formatDateDescription(selectedDate, today, languageLocale)\n : undefined,\n [languageLocale, selectedDate, today],\n );\n\n const [visibleMonth, setVisibleMonth] = 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 languageLocale,\n ),\n [languageLocale, visibleMonth],\n );\n\n const monthPickerButtonLabel = useMemo(() => {\n return convertFirstCharToUpper(\n intlFormat(\n visibleMonth,\n { month: \"long\", year: \"numeric\" },\n { locale: languageLocale.code },\n ),\n );\n }, [languageLocale, visibleMonth]);\n\n const todayIsInVisibleMonth = useMemo(() => {\n return isSameMonth(today, visibleMonth);\n }, [today, visibleMonth]);\n\n const [hoverDate, setHoverDate] = useState<Date | undefined>();\n\n const [visiblePanel, setVisiblePanel] = useState<VisiblePanel>(\"calendar\");\n\n const onValueChangeByInputs = useCallback<(value: string) => void>(\n (v) => {\n const startDate =\n v?.length === dateFormat.length\n ? parseLocalizedDateString(v, localeCode)\n : undefined;\n\n if (startDate) {\n setVisibleMonthClamped(startDate);\n }\n\n onValueChange?.(v);\n },\n [dateFormat.length, localeCode, onValueChange, setVisibleMonthClamped],\n );\n\n const onClickDate_ = (date: Date) => {\n onValueChange?.(formatLocalizedDate(date, localeCode));\n onClickDate?.(date);\n };\n\n return {\n onClickDate: onClickDate_,\n onValueChangeByInputs,\n monthPickerButtonRef,\n calendarId,\n monthPickerButtonLabel,\n visiblePanel,\n setVisiblePanel,\n setVisibleMonth,\n visibleMonthData,\n todayIsInVisibleMonth,\n hoverDate,\n 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\";\nimport { SupportedLocaleCode } from \"../../../features/localize-date-format/LocaleMapper\";\n\nexport interface RenderBelowSingleDateCalendarArgs {\n hideCalendar: () => void;\n}\n\nexport interface TravelDateInputProps\n extends ValueAndOnValueChangeProps<string> {\n localeCode?: SupportedLocaleCode;\n languageLocaleCode?: SupportedLocaleCode;\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 isDateDisabled?: (date: Date) => boolean;\n prevMonthDisabled?: (visibleMonth: Date) => boolean;\n nextMonthDisabled?: (visibleMonth: Date) => boolean;\n zIndex?: number;\n zIndexWhenClosed?: number;\n onHideCalendar?: () => void;\n renderBelowCalendar?: (args: RenderBelowSingleDateCalendarArgs) => ReactNode;\n size?: TravelCalendarSizeVariant;\n dateTestId?: (date: Date) => string | undefined;\n previousMonthButtonTestId?: string;\n nextMonthButtonTestId?: string;\n placeholderWhenBlurred?: string;\n textInputVariant?: DateTextInputVariant;\n}\n\nexport const TravelDateInput: React.FC<TravelDateInputProps> = ({\n value,\n onValueChange,\n label,\n localeCode = \"sv\",\n languageLocaleCode = localeCode,\n initialMonthInFocus,\n previousMonthButtonAriaLabel = \"Previous month\",\n nextMonthButtonAriaLabel = \"Next month\",\n placeholderWhenBlurred,\n heading,\n headingLevel,\n numMonthsInMonthPicker = 12,\n isDateDisabled,\n prevMonthDisabled,\n nextMonthDisabled,\n firstMonthInMonthPicker = new Date(),\n zIndex = 1000,\n zIndexWhenClosed,\n onHideCalendar,\n renderBelowCalendar,\n size = \"medium\",\n dateTestId,\n previousMonthButtonTestId,\n nextMonthButtonTestId,\n textInputVariant = \"standard\",\n}) => {\n const [calendarOpen, setCalendarOpen] = useState(false);\n const [calendarInDom, setCalendarInDom] = useState(false);\n const [boxSize, setBoxSize] = useState<{ height: number; width: number }>({\n // Sane defaults, this will be updated with actual data from DOM.\n width: 336,\n height: 66,\n });\n\n const inputFieldsHeight = size === \"large\" ? \"8.8rem\" : \"6.6rem\";\n\n const calendarOpenRef = useRef(false);\n\n const showCalendar = useCallback(() => {\n calendarOpenRef.current = true;\n setCalendarInDom(true);\n setTimeout(() => {\n setCalendarOpen(true);\n }, 10);\n }, []);\n\n const hideCalendar = useCallback(() => {\n if (!calendarInDom) {\n return;\n }\n\n setCalendarOpen(false);\n calendarOpenRef.current = false;\n onHideCalendar?.();\n\n setTimeout(() => {\n if (!calendarOpenRef.current) {\n setCalendarInDom(false);\n }\n }, 120);\n }, [calendarInDom, onHideCalendar]);\n\n const delayedHideCalendar = useCallback(() => {\n setTimeout(() => {\n hideCalendar();\n }, 250);\n }, [hideCalendar]);\n\n const ref = useRef<HTMLDivElement>(null);\n const sizeSourceRef = useRef<HTMLDivElement>(null);\n\n useOnClickOutside(ref, hideCalendar);\n\n useLayoutEffect(() => {\n const width = sizeSourceRef.current?.offsetWidth;\n const height = sizeSourceRef.current?.offsetHeight;\n if (width != null && height != null) {\n if (boxSize.height !== height || boxSize.width !== width) {\n setBoxSize({ width, height });\n }\n }\n }, [boxSize.height, boxSize.width]);\n\n const inputProps = useTravelDateInput(\n value,\n onValueChange,\n localeCode,\n languageLocaleCode,\n initialMonthInFocus,\n delayedHideCalendar,\n );\n\n const {\n visiblePanel,\n visibleMonth,\n onValueChangeByInputs,\n selectedDate,\n setVisibleMonth,\n setVisiblePanel,\n monthPickerButtonRef,\n } = inputProps;\n\n const onKeyDown = useCallback<KeyboardEventHandler<HTMLDivElement>>(\n (ev) => {\n if (ev.key === \"Escape\") {\n hideCalendar();\n }\n },\n [hideCalendar],\n );\n\n return (\n <Box\n position={\"relative\"}\n className={styles.travelDateInput}\n ref={ref}\n onKeyDown={onKeyDown}\n height={boxSize.height}\n width={boxSize.width}\n >\n <Box\n position={\"absolute\"}\n ref={sizeSourceRef}\n zIndex={calendarInDom ? zIndex : zIndexWhenClosed}\n >\n <TravelDateTextInputField\n {...inputProps}\n 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 prevMonthDisabled={prevMonthDisabled}\n nextMonthDisabled={nextMonthDisabled}\n previousMonthButtonTestId={previousMonthButtonTestId}\n nextMonthButtonTestId={nextMonthButtonTestId}\n />\n\n {visiblePanel === \"calendar\" && (\n <TravelCalendar\n {...inputProps}\n size={size}\n isValidDateRange={Boolean(selectedDate)}\n selectedStartDate={selectedDate}\n selectedEndDate={selectedDate}\n multiSelectable={false}\n isDateDisabled={isDateDisabled}\n 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\";\nimport { SupportedLocaleCode } from \"../../../features/localize-date-format/LocaleMapper\";\n\nexport interface TravelDateCalendarProps\n extends ValueAndOnValueChangeProps<string> {\n localeCode?: SupportedLocaleCode;\n languageLocaleCode?: SupportedLocaleCode;\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 isDateDisabled?: (date: Date) => boolean;\n prevMonthDisabled?: (visibleMonth: Date) => boolean;\n nextMonthDisabled?: (visibleMonth: Date) => boolean;\n size?: TravelCalendarSizeVariant;\n dateTestId?: (date: Date) => string | undefined;\n previousMonthButtonTestId?: string;\n nextMonthButtonTestId?: string;\n placeholderWhenBlurred?: string;\n textInputVariant?: DateTextInputVariant;\n}\n\nexport const TravelDateCalendar: React.FC<TravelDateCalendarProps> = ({\n value,\n onValueChange,\n label,\n localeCode = \"sv\",\n languageLocaleCode = localeCode,\n initialMonthInFocus,\n previousMonthButtonAriaLabel = \"Previous month\",\n nextMonthButtonAriaLabel = \"Next month\",\n placeholderWhenBlurred,\n heading,\n headingLevel,\n numMonthsInMonthPicker = 12,\n isDateDisabled,\n prevMonthDisabled,\n nextMonthDisabled,\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 languageLocaleCode,\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 prevMonthDisabled={prevMonthDisabled}\n nextMonthDisabled={nextMonthDisabled}\n previousMonthButtonTestId={previousMonthButtonTestId}\n nextMonthButtonTestId={nextMonthButtonTestId}\n />\n\n {visiblePanel === \"calendar\" && (\n <TravelCalendar\n {...inputProps}\n size={size}\n selectedStartDate={selectedDate}\n selectedEndDate={selectedDate}\n isValidDateRange={Boolean(selectedDate)}\n isDateDisabled={isDateDisabled}\n 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={languageLocaleCode}\n size={size}\n onValueChange={(v) => {\n setVisibleMonth(v);\n setVisiblePanel(\"calendar\");\n monthPickerButtonRef.current?.focus();\n }}\n onCancel={() => {\n setVisiblePanel(\"calendar\");\n monthPickerButtonRef.current?.focus();\n }}\n />\n )}\n </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\";\nimport { SupportedLocaleCode } from \"../../../features/localize-date-format/LocaleMapper\";\n\nexport interface TravelDateRangeCalendarProps\n extends ValueAndOnValueChangeProps<TravelDateRangeInputValue> {\n localeCode?: SupportedLocaleCode;\n languageLocaleCode?: SupportedLocaleCode;\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 isDateDisabled?: (date: Date) => boolean;\n prevMonthDisabled?: (visibleMonth: Date) => boolean;\n nextMonthDisabled?: (visibleMonth: Date) => boolean;\n size?: TravelCalendarSizeVariant;\n dateTestId?: (date: Date) => string | undefined;\n previousMonthButtonTestId?: string;\n nextMonthButtonTestId?: string;\n placeholderWhenBlurredStartDate?: string;\n placeholderWhenBlurredEndDate?: string;\n textInputVariant?: DateTextInputVariant;\n}\n\nexport const TravelDateRangeCalendar: React.FC<\n TravelDateRangeCalendarProps\n> = ({\n value,\n onValueChange,\n startDateLabel,\n endDateLabel,\n localeCode = \"sv\",\n languageLocaleCode = localeCode,\n initialMonthInFocus,\n previousMonthButtonAriaLabel = \"Previous month\",\n nextMonthButtonAriaLabel = \"Next month\",\n heading,\n headingLevel,\n numMonthsInMonthPicker = 12,\n isDateDisabled,\n prevMonthDisabled,\n nextMonthDisabled,\n firstMonthInMonthPicker = new Date(),\n size = \"medium\",\n dateTestId,\n previousMonthButtonTestId,\n nextMonthButtonTestId,\n placeholderWhenBlurredStartDate,\n placeholderWhenBlurredEndDate,\n textInputVariant = \"standard\",\n}) => {\n const inputProps = useTravelDateRangeInput(\n value,\n onValueChange,\n localeCode,\n languageLocaleCode,\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 prevMonthDisabled={prevMonthDisabled}\n nextMonthDisabled={nextMonthDisabled}\n previousMonthButtonTestId={previousMonthButtonTestId}\n nextMonthButtonTestId={nextMonthButtonTestId}\n />\n\n {visiblePanel === \"calendar\" && (\n <TravelCalendar\n {...inputProps}\n size={size}\n multiSelectable={true}\n isDateDisabled={isDateDisabled}\n dateTestId={dateTestId}\n />\n )}\n\n {visiblePanel === \"month-picker\" && (\n <MonthPicker\n firstMonth={firstMonthInMonthPicker}\n numMonths={numMonthsInMonthPicker}\n value={visibleMonth}\n size={size}\n localeCode={languageLocaleCode}\n onValueChange={(v) => {\n setVisibleMonth(v);\n setVisiblePanel(\"calendar\");\n monthPickerButtonRef.current?.focus();\n }}\n onCancel={() => {\n setVisiblePanel(\"calendar\");\n monthPickerButtonRef.current?.focus();\n }}\n />\n )}\n </Column>\n );\n};\n","import { useCallback } from \"react\";\nimport { isBefore, isSameDay, isSameMonth } from \"date-fns\";\nimport { useToday } from \"@stenajs-webui/core\";\n\nexport const useDisabledBeforeToday = () => {\n const today = useToday();\n\n return useCallback<(date: Date) => boolean>(\n (date) => !isSameDay(date, today) && isBefore(date, today),\n [today],\n );\n};\n\nexport const usePrevMonthDisabledBeforeToday = () => {\n const today = useToday();\n\n return useCallback(\n (visibleMonth: Date) =>\n isSameMonth(today, visibleMonth) || isBefore(visibleMonth, today),\n [today],\n );\n};\n"],"names":["DateFormats","buildDayStateForDateRange","statePerMonth","start","end","isAfter","eachDayOfInterval","result","date","isFirstInRange","isSameDay","isLastInRange","addDayStateHighlights","state","buildDayStateForSingleMonth","dateInFocus","buildDayStateForRange","startOfMonth","endOfMonth","startLimit","endLimit","max","subDays","min","addDays","setDayStateValue","values","monthString","format","weekNumber","getISOWeek","dayInMonth","getDate","setDayStateValueFunction","setter","calendarState","highlights","month","dayState","addDayStateHighlightsOnSingleDay","addWeekStateHighlights","week","day","weekState","newHighlights","newWeekState","addWeekRangeHighlights","startDate","endDate","last","useHighlightToday","enabled","useMemo","convertFirstCharToUpper","value","Month","WeekDay","getMonthsInYear","year","startMonth","numMonths","locale","months","i","getMonthInYear","yearToUse","monthToUse","firstDayOfMonth","getWeeksForMonth","forceSixWeeks","firstDayOfFirstWeek","startOfWeek","weeks","getWeekForDate","addWeeks","firstDayOfWeek","isLastWeekOfMonth","getMonth","getWeek","getYear","getDaysForWeekForDate","createDay","dayOfWeek","getISODay","addHours","d","calculateOverflowingMonth","dayHasHighlight","defaultHighlights","highlight","dayHighlightSelect","highlightsOrBoolean","returnValues","fallbackValue","defaultWrapperStyleProvider","selectedBackground","todayBackground","rangeBackground","borderColor","_","defaultTextPropsProvider","selectedColor","disabledColor","inOtherMonthColor","rangeTextColor","isOtherMonth","defaultCalendarTheme","extranetCalendarTheme","WeekDayCell","onClickWeekDay","theme","content","jsx","Box","Text","Clickable","ev","CalendarDay","userData","onClickDay","ExtraDayContent","showDatesInOtherMonths","WrapperTd","styled","InnerWrapperDiv","CellWrapperDiv","disabled","isDisabled","jsxs","Fragment","WeekNumberCell","onClickWeek","background","backgroundColor","prefix","isDateInMinMaxRange","isBefore","DisabledDayWrapper","DayComponent","minDate","maxDate","props","activeDayState","CalendarMonth","dayComponent","statePerWeek","userDataPerWeek","onClickMonth","renderWeekNumber","renderWeekDay","headerRightContent","extraDayContent","showWeekNumber","Row","FlatButton","stenaAngleDown","CalendarPanel","monthRows","userDataPerMonth","minDateObj","parse","maxDateObj","cx","styles","monthRow","rowIndex","Spacing","Calendar","initialDate","getInitialDate","getMonthRows","enGB","now","monthsPerRow","chunk","getDomIdForMonth","position","monthPickerId","getDomIdForKeyboardKey","key","currentPosition","numColumnsPerRow","next","movePositionByKey","id","row","column","locales","enUS","enIE","deAT","nlBE","nl","de","nb","sv","da","lv","lt","it","et","fi","cs","es","fr","pl","fallbackLocaleCode","fallbackLocaleCodeForFormatting","getSupportedLocaleCode","localeCode","matchLanguage","fallback","languageCode","getSupportedLocaleCodeMatchingLanguage","getLocaleForLocaleCode","lang","localeCodes","l","getDefaultLocaleForFormatting","getLocaleCodeForLocale","MonthPickerCell","onClick","selected","autoFocus","size","label","abbr","ref","useRef","domId","tabIndex","useEffect","onKeyDown","useCallback","nextDomId","PrimaryButton","createMonths","firstMonth","currentYear","currentRow","currentColumn","currentMonth","input","addMonths","MonthPicker","onValueChange","onCancel","useId","today","useToday","clampedNumMonths","inited","setInited","useState","getNumColumns","lastMonth","Column","getWidth","yearIndex","rows","React","Heading","r","columns","isSameMonth","exhaustSwitchCase","createStandardDateRangePresets","PresetPicker","onClickPreset","pageIndex","setPageIndex","pages","currentPage","stenaAngleLeft","stenaAngleRight","Space","preset","CalendarWithMonthYearPickers","setDateInFocus","currentPanel","setCurrentPanel","renderMonthPicker","firstMonthInMonthPicker","numMonthsInMonthPicker","onChangeSelectedMonth","selectedMonth","useSelectedMonthStepperLogic","nextMonth","nextYear","addYears","prevMonth","subMonths","prevYear","subYears","WithMonthSwitcherBelow","children","Indent","SecondaryButton","stenaAngleLeftDouble","stenaArrowLeft","stenaArrowRight","stenaAngleRightDouble","noop","CalendarWithMonthSwitcher","monthSwitcherPlacement","onSelectPreset","calendarProps","fallbackIfNoPlacement","dateRangeToStrings","dateRange","stringsToDateRange","isDateRangeInvalid","toggleDatesIfEndIsEarlierThanStart","toggleDateStringsIfEndIsEarlierThanStart","useDateRangeOnClickDayHandler","focusedInput","setFocusedInput","useInternalPanelState","onChangePanel","_setCurrentPanel","useDateRangeSelection","initialDateInFocus","statePerMonthWithSelection","DateRangeCalendar","dateRangeSelectionProps","useDateRangeCalendarState","setStartDate","setEndDate","useSingleDateSelection","onChange","statePerMonthWithSelectedDate","SingleDateCalendar","singleDateSelectionProps","useMultiDateSelection","isSelected","v","stateSum","MultiDateCalendar","selectionProps","useSingleWeekSelection","getWeekDataFromWeekString","getWeekStringFromWeekData","weekData","parts","firstDateOfWeek","setWeek","SingleWeekCalendar","singleWeekSelectionProps","defaultPopoverPlacement","useDateInput","onClose","openOnMount","showingCalendar","setShowingCalendar","showCalendar","hideCalendar","onSelectDate","defaultMaxDate","DateInput","displayFormat","placeholder","calendarTheme","variant","width","portalTarget","zIndex","ControlledPopover","TextInput","TextInputButton","stenaCalendar","useDateRangeInput","startDateInputRef","endDateInputRef","showCalendarStartDate","showCalendarEndDate","startDateIsAfterEnd","DateRangeInput","placeholderStartDate","placeholderEndDate","Icon","stenaArrowWideRight","cssColor","DateTextInput","closeOnCalendarSelectDate","dateFormat","disableCalender","hideCalenderIcon","open","setOpen","toggleCalendar","onValueChangeHandler","onCalendarSelectDate","inValidInput","dateIsValid","isValid","invalid","popoverProps","formatHours","hours","h","formatMinutes","minutes","m","formatTimeString","time","validUserInput","arr","timeNumber","TimeTextInput","showPlaceholder","useIcon","valid","setValid","timeFormat","onBlur","formattedResult","onChangeHandler","validInput","stenaClock","DualTextInput","autoFocusLeft","autoFocusRight","onEsc","onEnter","onValueChangeLeft","onValueChangeRight","separatorIcon","placeholderLeft","placeholderRight","typeLeft","typeRight","onChangeLeft","onChangeRight","valueLeft","valueRight","minLeft","maxLeft","minRight","maxRight","onClickLeft","onClickRight","onClickCalendar","onClickArrowDown","onBlurLeft","onBlurRight","onFocusLeft","onFocusRight","inputRefLeft","inputRefRight","variantLeft","variantRight","showPresets","widthLeft","widthRight","focusCounter","tryTriggerOnBlur","debounce","focusLeftHandler","focusRightHandler","blurLeftHandler","blurRightHandler","TextInputBox","SeparatorLine","transformTimeStringToNumber","isValidTimeString","getHoursAndMinutesFromTimeString","p","parseIntElseUndefined","transformTimeInDateToTimeString","TimePickerCell","item","columnRef","canScrollRef","targetScroll","padStart","TimePickerColumn","items","selectedItem","range","TimePicker","hour","setHour","minute","setMinute","onClickHour","onClickMinutes","useDateRangeEffects","dateInputRef","useDateRangeHandlers","showCalendarInternal","hideCalendarInternal","setFirstFocusedInput","localTime","setLocalTime","localDate","setLocalDate","onChangeDate","incomingDate","newDate","onChangeTime","newTime","inputLeftChangeHandler","inputRightChangeHandler","useInputStates","isCalendarVisible","useBoolean","isTimePickerVisible","showTimePicker","hideTimePicker","firstFocusedInput","useUserInputHandlers","onClickArrowButton","onClickCalendarButton","onKeyDownHandler","DateTimeInput","appendTo","timeInputRef","states","dateToHighlight","hideAll","timeValue","delayedIsCalendarVisible","useDelayedFalse","delayedIsTimePickerVisible","YearPickerCell","YearPicker","initialLastYear","lastYear","setLastYear","yearRows","startYear","prev","calculateLastYearInFocus","yearRow","yearDiff","remaining","yearsToAdd","yearsToSubtract","DateRangeDualTextInput","renderBelowCalendar","TravelDateTextInput","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","options","supportedLocaleCode","formatLocalizedDate","reformatLocalizedDateString","TravelDateRangeTextInputFields","startDateLabel","endDateLabel","placeholderWhenBlurredStartDate","placeholderWhenBlurredEndDate","valueWhenBlurredStartDate","valueWhenBlurredEndDate","dateFormatForLocaleCode","formatDateDescription","isSameYear","useTravelDateRangeInput","languageLocaleCode","initialMonthInFocus","languageLocale","calendarId","monthPickerButtonRef","selectedStartDate","selectedEndDate","visibleMonth","setVisibleMonth","setVisibleMonthClamped","visibleMonthData","monthPickerButtonLabel","intlFormat","todayIsInVisibleMonth","hoverDate","setHoverDate","visiblePanel","setVisiblePanel","onValueChangeByInputs","isValidDateRange","MonthHeader","previousMonthButtonAriaLabel","nextMonthButtonAriaLabel","prevMonthDisabled","nextMonthDisabled","previousMonthButtonTestId","nextMonthButtonTestId","stenaAngleUp","rangeBgColor","getCellBackgroundColors","dayIsInMonth","isInSelectionRange","isInHoverRange","getDateToFocusOn","currentDate","createDayId","TravelDateCellBackground","bgColorLeft","bgColorRight","TravelDateCell","onChangeVisibleMonth","onStartHover","onEndHover","isDateDisabled","dateTestId","e","nextDate","nextDateDisabled","isSelectionStart","isSelectionEnd","isToday","bgColors","getTabIndex","selectedStartDateIsVisible","TravelCalendar","onClickDate","multiSelectable","TravelDateRangeInput","heading","headingLevel","zIndexWhenClosed","onHideCalendar","textInputVariant","calendarOpen","setCalendarOpen","calendarInDom","setCalendarInDom","boxSize","setBoxSize","inputFieldsHeight","calendarOpenRef","sizeSourceRef","useOnClickOutside","useLayoutEffect","height","CardBody","TravelDateTextInputField","useTravelDateInput","selectedDate","TravelDateInput","delayedHideCalendar","TravelDateCalendar","TravelDateRangeCalendar","useDisabledBeforeToday","usePrevMonthDisabledBeforeToday"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/util/date/DateFormats.ts","../src/util/calendar/StateModifier.ts","../src/features/today-state/UseHighlightToday.ts","../src/util/caseFormat/CaseFormat.ts","../src/util/calendar/CalendarDataFactory.ts","../src/util/calendar/StateHelper.ts","../src/components/calendar/CalendarTheme.tsx","../src/components/calendar/renderers/WeekDayCell.tsx","../src/components/calendar/renderers/CalendarDay.tsx","../src/components/calendar/renderers/WeekNumberCell.tsx","../src/util/date/DateMinMaxValidator.ts","../src/components/calendar/DisabledDayWrapper.tsx","../src/components/calendar/CalendarMonth.tsx","../src/components/calendar/Calendar.tsx","../src/features/month-picker/MonthPickerKeyboardNavigation.ts","../src/features/localize-date-format/LocaleMapper.ts","../src/features/month-picker/MonthPickerCell.tsx","../src/features/month-picker/MonthPickerDataFactory.ts","../src/features/month-picker/MonthPicker.tsx","../src/features/preset-picker/PresetFactory.ts","../src/features/preset-picker/PresetPicker.tsx","../src/features/calendar-with-month-year-pickers/CalendarWithMonthYearPickers.tsx","../src/features/month-switcher/hooks/UseSelectedMonthStepperLogic.ts","../src/features/month-switcher/MonthSwitcherBelow.tsx","../src/features/month-switcher/CalendarWithMonthSwitcher.tsx","../src/util/date-range/DateRangeTransformer.ts","../src/util/date-range/DateRangeValidator.ts","../src/features/date-range/hooks/UseDateRangeOnClickDayHandler.ts","../src/features/internal-panel-state/UseInternalPanelState.tsx","../src/components/calendar-types/date-range-calendar/hooks/UseDateRangeSelection.ts","../src/components/calendar-types/date-range-calendar/DateRangeCalendar.tsx","../src/components/calendar-types/date-range-calendar/hooks/UseDateRangeCalendarState.ts","../src/components/calendar-types/single-date-calendar/UseSingleDateSelection.ts","../src/components/calendar-types/single-date-calendar/SingleDateCalendar.tsx","../src/components/calendar-types/multi-date-calendar/UseMultiDateSelection.ts","../src/components/calendar-types/multi-date-calendar/MultiDateCalendar.tsx","../src/components/calendar-types/single-week-calendar/UseSingleWeekSelection.ts","../src/components/calendar-types/single-week-calendar/SingleWeekCalendar.tsx","../src/config/DefaultPopoverPlacement.ts","../src/components/input-types/date-input/UseDateInput.tsx","../src/config/DefaultMaxDate.ts","../src/components/input-types/date-input/DateInput.tsx","../src/components/input-types/date-range-input/hooks/UseDateRangeInput.tsx","../src/components/input-types/date-range-input/DateRangeInput.tsx","../src/components/input-types/date-text-input/DateTextInput.tsx","../src/util/time/TimeStringFormatValidator.ts","../src/components/input-types/time-text-input/TimeTextInput.tsx","../src/features/dual-text-input/DualTextInput.tsx","../src/util/time/TimeTransformer.ts","../src/features/time-picker/TimePickerCell.tsx","../src/features/time-picker/TimePickerColumn.tsx","../src/features/time-picker/TimePicker.tsx","../src/components/input-types/date-time-input/hooks/UseDateRangeEffects.ts","../src/components/input-types/date-time-input/hooks/UseDateRangeHandlers.ts","../src/components/input-types/date-time-input/hooks/UseInputStates.ts","../src/components/input-types/date-time-input/hooks/UseUserInputHandlers.ts","../src/components/input-types/date-time-input/DateTimeInput.tsx","../src/features/year-picker/YearPickerCell.tsx","../src/features/year-picker/YearPicker.tsx","../src/components/input-types/date-range-dual-text-input/hooks/UseDateRangeEffects.ts","../src/components/input-types/date-range-dual-text-input/hooks/UseDateRangeHandlers.ts","../src/components/input-types/date-range-dual-text-input/hooks/UseInputStates.ts","../src/components/input-types/date-range-dual-text-input/hooks/UseUserInputHandlers.ts","../src/components/input-types/date-range-dual-text-input/DateRangeDualTextInput.tsx","../src/features/travel-calendar/components/TravelDateTextInput.tsx","../src/features/localize-date-format/InputMaskProvider.ts","../src/features/localize-date-format/DateFormatProvider.ts","../src/features/localize-date-format/LocalizedDateParser.ts","../src/features/localize-date-format/LocalizedDateFormatter.ts","../src/features/localize-date-format/LocalizedDateReformatter.ts","../../panels/dist/index.es.js","../src/features/travel-calendar/components/TravelDateRangeTextInputFields.tsx","../src/features/travel-calendar/util/DateDescriptionFormatter.ts","../src/features/travel-calendar/util/DateRangeNormalizer.ts","../src/features/travel-calendar/hooks/UseTravelDateRangeInput.ts","../src/features/travel-calendar/components/MonthHeader.tsx","../src/features/travel-calendar/util/CellBgColors.ts","../src/features/travel-calendar/util/KeyboardNavigation.tsx","../src/features/travel-calendar/util/DayIdGenerator.ts","../src/features/travel-calendar/components/TravelDateCellBackground.tsx","../src/features/travel-calendar/components/TravelDateCell.tsx","../src/features/travel-calendar/components/TravelCalendar.tsx","../src/components/input-types/travel-date-range-input/TravelDateRangeInput.tsx","../src/features/travel-calendar/components/TravelDateTextInputField.tsx","../src/features/travel-calendar/hooks/UseTravelDateInput.ts","../src/components/input-types/travel-date-input/TravelDateInput.tsx","../src/components/calendar-types/travel-date-calendar/TravelDateCalendar.tsx","../src/components/calendar-types/travel-date-range-calendar/TravelDateRangeCalendar.tsx","../src/features/travel-calendar/hooks/DisabledDateHooks.ts"],"sourcesContent":["export const DateFormats = {\n yearAndMonth: \"yyyy-MM\",\n fullDate: \"yyyy-MM-dd\",\n fullMonthName: \"LLLL\",\n fullDateAndTime: \"yyyy-MM-dd HH:mm\",\n fullDateAndTimeSystem: \"yyyy-MM-ddTHH:MM\",\n weekDayName: \"EEEE\", // Tuesday\n weekDayNameShort: \"EEE\", // Tue\n dateAndMonth: \"d MMM\", // 2 Jan\n monthAndDate: \"MMM do\", // Jan 2nd\n};\n","import {\n addDays,\n eachDayOfInterval,\n endOfMonth,\n format,\n getDate,\n getISOWeek,\n isAfter,\n isSameDay,\n max,\n min,\n startOfMonth,\n subDays,\n} from \"date-fns\";\nimport { last } from \"lodash-es\";\nimport {\n CalendarState,\n CalendarUserData,\n DayState,\n DayStateHighlight,\n StateForWeek,\n} from \"../../types/CalendarTypes\";\nimport { DateFormats } from \"../date/DateFormats\";\nimport { WeekData } from \"./CalendarDataFactory\";\n\nexport const buildDayStateForDateRange = (\n statePerMonth: CalendarUserData<DayState> = {},\n start?: Date,\n end?: Date,\n): CalendarUserData<DayState> | undefined => {\n if (start && end && isAfter(end, start)) {\n return eachDayOfInterval({ start, end }).reduce(\n (result: CalendarUserData<DayState>, date: Date) => {\n const isFirstInRange = isSameDay(date, start);\n const isLastInRange = isSameDay(date, end);\n const highlights = isFirstInRange\n ? [\"selected\", \"selectedStart\", \"range\"]\n : isLastInRange\n ? [\"selected\", \"selectedEnd\", \"range\"]\n : [\"range\"];\n return addDayStateHighlights(result, date, highlights);\n },\n statePerMonth,\n );\n }\n\n let state = statePerMonth;\n\n if (start) {\n state = addDayStateHighlights(state, start, [\"selected\", \"singleSelected\"]);\n }\n\n if (end) {\n state = addDayStateHighlights(state, end, [\"selected\", \"singleSelected\"]);\n }\n\n return state;\n};\n\nexport const buildDayStateForSingleMonth = (\n statePerMonth: CalendarUserData<DayState> = {},\n start: Date | undefined,\n end: Date | undefined,\n dateInFocus: Date,\n): CalendarUserData<DayState> | undefined =>\n buildDayStateForRange(\n statePerMonth,\n start,\n end,\n startOfMonth(dateInFocus),\n endOfMonth(dateInFocus),\n );\n\nexport const buildDayStateForRange = (\n statePerMonth: CalendarUserData<DayState> = {},\n start: Date | undefined,\n end: Date | undefined,\n startLimit: Date,\n endLimit: Date,\n): CalendarUserData<DayState> | undefined => {\n if (start && end) {\n return buildDayStateForDateRange(\n statePerMonth,\n max([start, subDays(startLimit, 1)]),\n min([end, addDays(endLimit, 1)]),\n );\n } else {\n return buildDayStateForDateRange(statePerMonth, start, end);\n }\n};\n\nexport const setDayStateValue = (\n state: CalendarUserData<DayState> | undefined,\n date: Date,\n values: Partial<DayState>,\n): CalendarUserData<DayState> => {\n const monthString = format(date, DateFormats.yearAndMonth);\n const weekNumber = getISOWeek(date);\n const dayInMonth = getDate(date);\n return {\n ...state,\n [monthString]: {\n ...(state && state[monthString]),\n [weekNumber]: {\n ...(state && state[monthString] && state[monthString][weekNumber]),\n [dayInMonth]: {\n ...(state &&\n state[monthString] &&\n state[monthString][weekNumber] &&\n state[monthString][weekNumber][dayInMonth]),\n ...values,\n },\n },\n },\n };\n};\n\nexport const setDayStateValueFunction = (\n state: CalendarUserData<DayState> | undefined,\n date: Date,\n setter: (dayState: DayState | undefined) => Partial<DayState>,\n): CalendarUserData<DayState> => {\n const monthString = format(date, DateFormats.yearAndMonth);\n const weekNumber = getISOWeek(date);\n const dayInMonth = getDate(date);\n return {\n ...state,\n [monthString]: {\n ...(state && state[monthString]),\n [weekNumber]: {\n ...(state && state[monthString] && state[monthString][weekNumber]),\n [dayInMonth]: {\n ...(state &&\n state[monthString] &&\n state[monthString][weekNumber] &&\n state[monthString][weekNumber][dayInMonth]),\n ...setter(\n state &&\n state[monthString] &&\n state[monthString][weekNumber] &&\n state[monthString][weekNumber][dayInMonth],\n ),\n },\n },\n },\n };\n};\n\nexport const addDayStateHighlights = (\n calendarState: CalendarState | undefined,\n date: Date,\n highlights: Array<DayStateHighlight>,\n): CalendarUserData<DayState> => {\n const month = date.getMonth() + 1;\n const monthString = `${date.getFullYear()}-${month < 10 ? \"0\" : \"\"}${month}`;\n const weekNumber = getISOWeek(date);\n const dayInMonth = getDate(date);\n const dayState: DayState | undefined =\n calendarState &&\n calendarState[monthString] &&\n calendarState[monthString][weekNumber] &&\n calendarState[monthString][weekNumber][dayInMonth];\n\n return {\n ...calendarState,\n [monthString]: {\n ...(calendarState && calendarState[monthString]),\n [weekNumber]: {\n ...(calendarState &&\n calendarState[monthString] &&\n calendarState[monthString][weekNumber]),\n [dayInMonth]: addDayStateHighlightsOnSingleDay(dayState, highlights),\n },\n },\n };\n};\n\nexport const addDayStateHighlightsOnSingleDay = (\n dayState: DayState | undefined,\n highlights: Array<DayStateHighlight>,\n): DayState => {\n return {\n ...dayState,\n highlights: [...(dayState?.highlights ?? []), ...highlights],\n };\n};\n\nexport const addWeekStateHighlights = (\n calendarState: CalendarState | undefined,\n week: WeekData,\n highlights: Array<DayStateHighlight>,\n): CalendarUserData<DayState> => {\n const date = week.days[0].date;\n const month = date.getMonth() + 1;\n const monthString = `${date.getFullYear()}-${month < 10 ? \"0\" : \"\"}${month}`;\n const weekNumber = week.weekNumber;\n\n let state = calendarState;\n week.days.forEach((day) => {\n state = addDayStateHighlights(state, day.date, highlights);\n });\n\n const weekState =\n state && state[monthString] ? state[monthString][weekNumber] : undefined;\n\n const newHighlights: Array<DayStateHighlight> =\n weekState && weekState.highlights\n ? [...weekState.highlights, ...highlights]\n : highlights;\n\n const newWeekState: StateForWeek = {\n ...weekState,\n highlights: newHighlights,\n };\n\n return {\n ...state,\n [monthString]: {\n ...(calendarState && calendarState[monthString]),\n [weekNumber]: newWeekState,\n },\n };\n};\n\nexport const addWeekRangeHighlights = (\n calendarState: CalendarState | undefined,\n week: WeekData,\n): CalendarUserData<DayState> => {\n if (!week.days.length) {\n return { ...calendarState };\n }\n const startDate = week.days[0].date;\n const endDate = last(week.days)?.date;\n return {\n ...buildDayStateForDateRange(calendarState, startDate, endDate),\n };\n};\n","import { useMemo } from \"react\";\nimport { CalendarState } from \"../../types/CalendarTypes\";\nimport { addDayStateHighlights } from \"../../util/calendar/StateModifier\";\n\nexport const useHighlightToday = (\n enabled: boolean | undefined,\n statePerMonth: CalendarState | undefined,\n) => {\n return useMemo(() => {\n return enabled\n ? addDayStateHighlights(statePerMonth, new Date(), [\"today\"])\n : statePerMonth;\n }, [enabled, statePerMonth]);\n};\n","export const convertFirstCharToUpper = (value: string): string => {\n if (value.length === 0) {\n return value;\n }\n\n if (value.length === 1) {\n return value.toUpperCase();\n }\n\n return value.charAt(0).toUpperCase() + value.slice(1);\n};\n","import {\n addDays,\n addHours,\n addWeeks,\n eachDayOfInterval,\n endOfMonth,\n format,\n getDate,\n getISODay,\n getMonth,\n getWeek,\n getYear,\n isSameDay,\n Locale,\n startOfMonth,\n startOfWeek,\n} from \"date-fns\";\nimport { DateFormats } from \"../date/DateFormats\";\nimport { convertFirstCharToUpper } from \"../caseFormat/CaseFormat\";\n\nexport enum Month {\n JANUARY = 0,\n FEBRUARY,\n MARCH,\n APRIL,\n MAY,\n JUNE,\n JULY,\n AUGUST,\n SEPTEMBER,\n OCTOBER,\n NOVEMBER,\n DECEMBER,\n}\n\nexport enum WeekDay {\n SUNDAY = 0,\n MONDAY,\n TUESDAY,\n WEDNESDAY,\n THURSDAY,\n FRIDAY,\n SATURDAY,\n}\n\nexport interface DayData {\n name: string;\n fullName: string;\n date: Date; // YYYY-MM\n dateString: string; // YYYY-MM\n weekNumber: number;\n year: number; // 2018\n month: number; // 0-11\n dayOfMonth: number; // 1-31\n dayOfWeek: number; // 1-7\n isFirstDayOfWeek: boolean;\n isLastDayOfWeek: boolean;\n isFirstDayOfMonth: boolean;\n isLastDayOfMonth: boolean;\n}\n\nexport interface WeekData {\n weekNumber: number;\n startMonth: number;\n startYear: number;\n endMonth: number;\n endYear: number;\n isLastWeekOfMonth: boolean;\n days: Array<DayData>;\n}\n\nexport interface MonthData {\n monthString: string;\n name: string;\n year: number;\n monthInYear: number;\n weeks: Array<WeekData>;\n}\n\nexport const getMonthsInYear = (\n year: number,\n startMonth: number,\n numMonths: number,\n locale: Locale,\n): Array<MonthData> => {\n const months = [];\n for (let i = 0; i < numMonths; i++) {\n months.push(getMonthInYear(year, startMonth + i, locale));\n }\n return months;\n};\n\nexport const getMonthInYear = (\n year: number,\n month: number,\n locale: Locale,\n): MonthData => {\n if (isNaN(year) || isNaN(month)) {\n throw new Error(\"getMonthInYear() received NaN.\");\n }\n const yearToUse = year + Math.floor(month / 12);\n const monthToUse = month % 12;\n const firstDayOfMonth = new Date(yearToUse, monthToUse, 1);\n return {\n monthString: format(firstDayOfMonth, DateFormats.yearAndMonth),\n name: convertFirstCharToUpper(\n format(firstDayOfMonth, DateFormats.fullMonthName, { locale }),\n ),\n year: yearToUse,\n monthInYear: monthToUse,\n weeks: getWeeksForMonth(yearToUse, monthToUse, locale),\n };\n};\n\nexport const getWeeksForMonth = (\n year: number,\n month: number,\n locale: Locale,\n forceSixWeeks: boolean = true,\n): Array<WeekData> => {\n const firstDayOfMonth = new Date(year, month, 1);\n const firstDayOfFirstWeek = startOfWeek(firstDayOfMonth, { locale });\n\n const weeks = [];\n\n for (let i = 0; i < 6; i++) {\n const week = getWeekForDate(addWeeks(firstDayOfFirstWeek, i), locale);\n if (i > 0 && week.startMonth !== month && !forceSixWeeks) {\n return weeks;\n }\n weeks.push(week);\n }\n return weeks;\n};\n\nexport const getWeekForDate = (\n firstDayOfWeek: Date,\n locale: Locale,\n): WeekData => {\n const isLastWeekOfMonth =\n getMonth(addDays(firstDayOfWeek, 7)) !== getMonth(firstDayOfWeek);\n return {\n weekNumber: getWeek(firstDayOfWeek, { locale }),\n startMonth: getMonth(firstDayOfWeek),\n startYear: getYear(firstDayOfWeek),\n endMonth: getMonth(addDays(firstDayOfWeek, 6)),\n endYear: getYear(addDays(firstDayOfWeek, 6)),\n days: getDaysForWeekForDate(firstDayOfWeek, locale),\n isLastWeekOfMonth,\n };\n};\n\nexport const createDay = (date: Date, locale: Locale): DayData => {\n const dayOfWeek = getISODay(date);\n return {\n date,\n name: format(date, \"EEE\", locale ? { locale } : undefined),\n fullName: format(date, \"EEEE\", locale ? { locale } : undefined),\n dateString: format(addHours(date, 12), DateFormats.fullDate),\n weekNumber: getWeek(date, { locale }),\n year: getYear(date),\n month: getMonth(date),\n dayOfMonth: getDate(date),\n dayOfWeek,\n isFirstDayOfWeek: dayOfWeek === 1,\n isLastDayOfWeek: dayOfWeek === 7,\n isFirstDayOfMonth: isSameDay(startOfMonth(date), date),\n isLastDayOfMonth: isSameDay(endOfMonth(date), date),\n };\n};\n\nexport const getDaysForWeekForDate = (\n firstDayOfWeek: Date,\n locale: Locale,\n): Array<DayData> => {\n return eachDayOfInterval({\n start: firstDayOfWeek,\n end: addDays(firstDayOfWeek, 6),\n }).map((d) => createDay(d, locale));\n};\n\nexport const calculateOverflowingMonth = (\n year: number,\n month: number,\n): { year: number; month: number } => {\n if (month > Month.DECEMBER) {\n return { year: year + Math.floor(month / 12), month: month % 12 };\n }\n if (month < Month.JANUARY) {\n return { year: year + Math.floor(month / 12), month: 12 + (month % 12) };\n }\n return { year, month };\n};\n","import { DayState, DayStateHighlight } from \"../../types/CalendarTypes\";\n\nexport const dayHasHighlight = (\n dayState: DayState | undefined,\n defaultHighlights: Array<DayStateHighlight> | undefined,\n highlight: string,\n): boolean => {\n if (defaultHighlights && defaultHighlights.indexOf(highlight) >= 0) {\n return true;\n }\n if (\n dayState &&\n dayState.highlights &&\n dayState.highlights.indexOf(highlight) >= 0\n ) {\n return true;\n }\n return false;\n};\n\nexport const dayHighlightSelect = <T>(\n dayState: DayState | undefined,\n defaultHighlights: Array<DayStateHighlight> | undefined,\n highlightsOrBoolean: Array<string | boolean>,\n returnValues: Array<T>,\n fallbackValue?: T,\n): T | undefined => {\n if (highlightsOrBoolean.length !== returnValues.length) {\n throw new Error(\n \"Select highlight failed, number of values do not equal number of highlights.\",\n );\n }\n if (highlightsOrBoolean.length === 0) {\n return fallbackValue;\n }\n for (let i = 0; i < highlightsOrBoolean.length; i++) {\n if (typeof highlightsOrBoolean[i] === \"boolean\" && highlightsOrBoolean[i]) {\n return returnValues[i];\n }\n if (\n typeof highlightsOrBoolean[i] === \"string\" &&\n dayHasHighlight(\n dayState,\n defaultHighlights,\n highlightsOrBoolean[i] as string,\n )\n ) {\n return returnValues[i];\n }\n }\n return fallbackValue;\n};\n","import { IconDefinition } from \"@fortawesome/fontawesome-svg-core\";\nimport { TextProps } from \"@stenajs-webui/core\";\nimport { CSSProperties } from \"react\";\nimport { DayState, DayStateHighlight } from \"../../types/CalendarTypes\";\n\nimport {\n DayData,\n MonthData,\n WeekData,\n} from \"../../util/calendar/CalendarDataFactory\";\nimport { dayHighlightSelect } from \"../../util/calendar/StateHelper\";\n\nexport interface CalendarTheme<TUserData = unknown> {\n width: string;\n height: string;\n WeekNumber: WeekNumberTheme;\n WeekDay: WeekDayTheme;\n CalendarDay: CalendarDayTheme<TUserData>;\n CalendarMonth: CalendarMonthTheme;\n}\n\nexport interface WeekNumberTheme {\n backgroundColor: string;\n textColor?: string;\n clickableTextColor?: string;\n}\n\nexport interface CalendarMonthTheme {\n headerTextColor?: string;\n cellSpacing?: string;\n headerLeftIcon?: IconDefinition;\n headerRightIcon?: IconDefinition;\n}\n\nexport interface WeekDayTheme {\n textColor?: string;\n clickableTextColor?: string;\n}\n\nexport type CalendarStyleProvider<TUserData, TResult> = (\n defaultHighlights: Array<DayStateHighlight> | undefined,\n dayState: DayState | undefined,\n day: DayData,\n week: WeekData,\n month: MonthData,\n userData?: TUserData,\n) => TResult;\n\nexport type CalendarWrapperStyleProvider<TUserData> = CalendarStyleProvider<\n TUserData,\n CSSProperties | undefined\n>;\n\ntype TextPropsProvider<TUserData> = CalendarStyleProvider<\n TUserData,\n TextProps | undefined\n>;\n\nexport interface CalendarDayTheme<TUserData> {\n tdStyle?: CalendarWrapperStyleProvider<TUserData>;\n innerWrapperStyle?: CalendarWrapperStyleProvider<TUserData>;\n cellWrapperStyle?: CalendarWrapperStyleProvider<TUserData>;\n textProps?: TextPropsProvider<TUserData>;\n}\n\nexport interface CalendarDefaultWrapperColors {\n selectedBackground: string;\n rangeBackground: string;\n todayBackground: string;\n borderColor?: string;\n borderRadius?: string;\n rangeBorderRadius?: string;\n}\n\nexport const defaultWrapperStyleProvider =\n ({\n selectedBackground,\n todayBackground,\n rangeBackground,\n borderColor = \"transparent\",\n }: CalendarDefaultWrapperColors): CalendarWrapperStyleProvider<unknown> =>\n (defaultHighlights, dayState, day, _, month) => {\n const backgroundColor = dayHighlightSelect(\n dayState,\n defaultHighlights,\n [\"selected\", \"range\", \"today\", day.month === month.monthInYear],\n [selectedBackground, rangeBackground, todayBackground, \"#fff\"],\n \"transparent\",\n );\n\n return {\n backgroundColor,\n borderWidth: \"1px\",\n borderStyle: \"solid\",\n borderColor: dayHighlightSelect(\n dayState,\n defaultHighlights,\n [\"selectedStart\", \"selectedEnd\", \"singleSelected\", \"range\", \"today\"],\n [\n \"var(--swui-calendar-wrapper-range-background)\",\n \"var(--swui-calendar-wrapper-range-background)\",\n \"var(--swui-calendar-wrapper-range-background)\",\n \"var(--swui-calendar-wrapper-range-border)\",\n \"var(--lhds-color-ui-500)\",\n ],\n borderColor,\n ),\n borderTopLeftRadius: dayHighlightSelect(\n dayState,\n defaultHighlights,\n [\"selectedStart\", \"singleSelected\", \"today\"],\n [\n \"var(--swui-calendar-day-border-radius)\",\n \"var(--swui-calendar-day-border-radius)\",\n \"var(--swui-calendar-day-border-radius)\",\n ],\n \"unset\",\n ),\n borderBottomLeftRadius: dayHighlightSelect(\n dayState,\n defaultHighlights,\n [\"selectedStart\", \"singleSelected\", \"today\"],\n [\n \"var(--swui-calendar-day-border-radius)\",\n \"var(--swui-calendar-day-border-radius)\",\n \"var(--swui-calendar-day-border-radius)\",\n ],\n \"unset\",\n ),\n borderTopRightRadius: dayHighlightSelect(\n dayState,\n defaultHighlights,\n [\"selectedEnd\", \"singleSelected\", \"today\"],\n [\n \"var(--swui-calendar-day-border-radius)\",\n \"var(--swui-calendar-day-border-radius)\",\n \"var(--swui-calendar-day-border-radius)\",\n ],\n \"unset\",\n ),\n borderBottomRightRadius: dayHighlightSelect(\n dayState,\n defaultHighlights,\n [\"selectedEnd\", \"singleSelected\", \"today\"],\n [\n \"var(--swui-calendar-day-border-radius)\",\n \"var(--swui-calendar-day-border-radius)\",\n \"var(--swui-calendar-day-border-radius)\",\n ],\n \"unset\",\n ),\n boxSizing: \"border-box\",\n };\n };\n\ninterface DefaultTextColors {\n disabledColor: string;\n inOtherMonthColor: string;\n selectedColor: string;\n rangeTextColor?: string;\n}\n\nexport const defaultTextPropsProvider = ({\n selectedColor,\n disabledColor,\n inOtherMonthColor,\n rangeTextColor,\n}: DefaultTextColors): TextPropsProvider<unknown> => {\n return (defaultHighlights, dayState, day, _, month) => {\n const isOtherMonth = day.month !== month.monthInYear;\n const color = dayHighlightSelect(\n dayState,\n defaultHighlights,\n [isOtherMonth, \"selected\", \"range\", \"enabled\", \"disabled\"],\n [\n inOtherMonthColor,\n selectedColor,\n rangeTextColor,\n undefined,\n disabledColor,\n ],\n );\n return {\n color,\n };\n };\n};\n\nexport const defaultCalendarTheme: CalendarTheme = {\n width: \"var(--swui-calendar-day-width)\",\n height: \"var(--swui-calendar-day-height)\",\n WeekNumber: {\n backgroundColor: \"var(--swui-calendar-week-number-bg-color)\",\n textColor: \"var(--swui-calendar-week-number-text-color)\",\n clickableTextColor: \"var(--swui-calendar-week-number-clickable-text-color)\",\n },\n WeekDay: {\n textColor: \"var(--swui-calendar-week-day-text-color)\",\n clickableTextColor: \"var(--swui-calendar-week-day-clickable-text-color)\",\n },\n CalendarDay: {\n tdStyle: defaultWrapperStyleProvider({\n selectedBackground: \"var(--swui-calendar-wrapper-selected-background)\",\n rangeBackground: \"var(--swui-calendar-wrapper-range-background)\",\n todayBackground: \"var(--swui-calendar-wrapper-today-background)\",\n }),\n textProps: defaultTextPropsProvider({\n selectedColor: \"var(--swui-calendar-text-selected-color)\",\n disabledColor: \"var(--swui-calendar-text-disabled-color)\",\n inOtherMonthColor: \"var(--swui-calendar-text-in-other-month-color)\",\n }),\n },\n CalendarMonth: {\n headerTextColor: \"var(--swui-calendar-week-day-text-color)\",\n },\n};\n\nexport const extranetCalendarTheme: CalendarTheme = {\n ...defaultCalendarTheme,\n width: \"37px\",\n height: \"37px\",\n};\n","import { Box, Clickable, Text } from \"@stenajs-webui/core\";\nimport * as React from \"react\";\nimport { OnClickWeekDay } from \"../../../types/CalendarTypes\";\nimport { DayData } from \"../../../util/calendar/CalendarDataFactory\";\nimport { CalendarTheme } from \"../CalendarTheme\";\n\nexport interface WeekDayCellProps {\n onClickWeekDay?: OnClickWeekDay;\n day: DayData;\n theme: CalendarTheme;\n}\n\nexport const WeekDayCell = ({\n onClickWeekDay,\n day,\n theme,\n}: WeekDayCellProps) => {\n const content = (\n <Box\n width={theme.width}\n height={theme.height}\n justifyContent={\"center\"}\n alignItems={\"center\"}\n >\n <Text\n size={\"small\"}\n color={\n onClickWeekDay\n ? theme.WeekDay.clickableTextColor\n : theme.WeekDay.textColor\n }\n >\n {day.name}\n </Text>\n </Box>\n );\n\n if (onClickWeekDay) {\n return (\n <Clickable\n borderRadius={\"var(--swui-calendar-day-border-radius)\"}\n onClick={(ev) => onClickWeekDay(day.dayOfWeek, ev)}\n disableFocusHighlight={!onClickWeekDay}\n >\n {content}\n </Clickable>\n );\n }\n\n return content;\n};\n","import styled from \"@emotion/styled\";\nimport { Box, Text } from \"@stenajs-webui/core\";\nimport * as React from \"react\";\nimport {\n CalendarDayProps,\n DayState,\n DayStateHighlight,\n} from \"../../../types/CalendarTypes\";\nimport { dayHighlightSelect } from \"../../../util/calendar/StateHelper\";\n\nexport const CalendarDay = function CalendarDay<T>({\n day,\n week,\n month,\n dayState,\n userData,\n onClickDay,\n theme,\n extraDayContent: ExtraDayContent,\n defaultHighlights,\n showDatesInOtherMonths,\n}: CalendarDayProps<T>) {\n const content = (\n <Box\n width={\"100%\"}\n height={\"100%\"}\n justifyContent={\"center\"}\n alignItems={\"center\"}\n >\n <Text\n {...(theme.CalendarDay.textProps &&\n theme.CalendarDay.textProps(\n defaultHighlights,\n dayState,\n day,\n week,\n month,\n userData,\n ))}\n >\n {day.dayOfMonth}\n </Text>\n </Box>\n );\n\n const WrapperTd = styled.td({\n ...(theme.CalendarDay.tdStyle &&\n theme.CalendarDay.tdStyle(\n defaultHighlights,\n dayState,\n day,\n week,\n month,\n userData,\n )),\n });\n\n const InnerWrapperDiv = styled.div({\n ...(theme.CalendarDay.innerWrapperStyle &&\n theme.CalendarDay.innerWrapperStyle(\n defaultHighlights,\n dayState,\n day,\n week,\n month,\n userData,\n )),\n width: \"100%\",\n height: \"100%\",\n });\n\n const CellWrapperDiv = styled.div({\n ...(theme.CalendarDay.cellWrapperStyle &&\n theme.CalendarDay.cellWrapperStyle(\n defaultHighlights,\n dayState,\n day,\n week,\n month,\n userData,\n )),\n width: \"100%\",\n height: \"100%\",\n position: \"relative\",\n });\n\n const disabled = isDisabled(defaultHighlights, dayState);\n\n return (\n <WrapperTd\n onClick={disabled ? undefined : (ev) => onClickDay?.(day, userData, ev)}\n >\n <InnerWrapperDiv>\n <CellWrapperDiv>\n {(day.month === month.monthInYear || showDatesInOtherMonths) && (\n <>\n {ExtraDayContent && (\n <ExtraDayContent\n week={week}\n month={month}\n day={day}\n dayState={dayState}\n theme={theme}\n userData={userData}\n />\n )}\n {content}\n </>\n )}\n </CellWrapperDiv>\n </InnerWrapperDiv>\n </WrapperTd>\n );\n};\n\nconst isDisabled = (\n defaultHighlights: Array<DayStateHighlight> | undefined,\n dayState: DayState | undefined,\n): boolean =>\n !!dayHighlightSelect<boolean>(\n dayState,\n defaultHighlights,\n [\"enabled\", \"disabled\"],\n [false, true],\n false,\n );\n","import { Box, Clickable, Text } from \"@stenajs-webui/core\";\nimport * as React from \"react\";\nimport { ReactNode } from \"react\";\nimport { OnClickWeek } from \"../../../types/CalendarTypes\";\nimport { WeekData } from \"../../../util/calendar/CalendarDataFactory\";\nimport { CalendarTheme } from \"../CalendarTheme\";\n\nexport interface WeekNumberCellProps {\n week: WeekData;\n onClickWeek?: OnClickWeek;\n theme: CalendarTheme;\n background?: ReactNode;\n prefix?: string;\n backgroundColor?: string;\n}\n\nexport const WeekNumberCell: React.FC<WeekNumberCellProps> = ({\n onClickWeek,\n theme,\n week,\n background,\n backgroundColor,\n prefix,\n}) => {\n const content = (\n <Box\n width={theme.width}\n height={theme.height}\n justifyContent={\"center\"}\n alignItems={\"center\"}\n >\n {background && <Box position={\"absolute\"}>{background}</Box>}\n <Box position={\"absolute\"}>\n <Text\n color={\n onClickWeek\n ? theme.WeekNumber.clickableTextColor\n : theme.WeekNumber.textColor\n }\n >\n {prefix}\n {week.weekNumber}\n </Text>\n </Box>\n </Box>\n );\n return (\n <Box\n background={backgroundColor || theme.WeekNumber.backgroundColor}\n position={\"relative\"}\n >\n {onClickWeek ? (\n <Clickable\n borderRadius={\"var(--swui-calendar-day-border-radius)\"}\n onClick={(ev) => onClickWeek(week, ev)}\n disableFocusHighlight={!onClickWeek}\n >\n {content}\n </Clickable>\n ) : (\n content\n )}\n </Box>\n );\n};\n","import { isAfter, isBefore, isSameDay } from \"date-fns\";\n\nexport const isDateInMinMaxRange = (\n date: Date,\n min: Date | undefined,\n max: Date | undefined,\n): boolean => {\n if (min && isBefore(date, min)) {\n return isSameDay(date, min);\n }\n if (max && isAfter(date, max)) {\n return isSameDay(date, max);\n }\n return true;\n};\n","import * as React from \"react\";\nimport { useMemo } from \"react\";\nimport {\n CalendarDayProps,\n OptionalMinMaxDates,\n} from \"../../types/CalendarTypes\";\nimport { addDayStateHighlightsOnSingleDay } from \"../../util/calendar/StateModifier\";\nimport { isDateInMinMaxRange } from \"../../util/date/DateMinMaxValidator\";\n\ninterface DisabledDayWrapperProps<T>\n extends CalendarDayProps<T>,\n OptionalMinMaxDates {\n dayComponent: React.ComponentType<CalendarDayProps<T>>;\n}\n\nexport const DisabledDayWrapper = function DisabledDayWrapper<T>({\n dayComponent: DayComponent,\n minDate,\n maxDate,\n dayState,\n day,\n ...props\n}: DisabledDayWrapperProps<T>) {\n const activeDayState = useMemo(\n () =>\n !isDateInMinMaxRange(day.date, minDate, maxDate)\n ? addDayStateHighlightsOnSingleDay(dayState, [\"disabled\"])\n : dayState,\n [day.date, dayState, maxDate, minDate],\n );\n\n return <DayComponent day={day} {...props} dayState={activeDayState} />;\n};\n","import { Box, Row, Text } from \"@stenajs-webui/core\";\nimport * as React from \"react\";\nimport { ReactNode } from \"react\";\nimport {\n CalendarDayProps,\n CalendarOnClicks,\n CalendarUserMonthData,\n DayState,\n DayStateHighlight,\n ExtraDayContentProps,\n OptionalMinMaxDates,\n Renderers,\n} from \"../../types/CalendarTypes\";\nimport {\n DayData,\n MonthData,\n WeekData,\n} from \"../../util/calendar/CalendarDataFactory\";\nimport { CalendarTheme, defaultCalendarTheme } from \"./CalendarTheme\";\nimport { WeekDayCell } from \"./renderers/WeekDayCell\";\nimport { CalendarDay } from \"./renderers/CalendarDay\";\nimport { FlatButton, stenaAngleDown } from \"@stenajs-webui/elements\";\nimport { WeekNumberCell } from \"./renderers/WeekNumberCell\";\nimport { DisabledDayWrapper } from \"./DisabledDayWrapper\";\n\nexport interface CalendarMonthProps<T>\n extends CalendarOnClicks<T>,\n Renderers,\n OptionalMinMaxDates {\n month: MonthData;\n dayComponent?: React.ComponentType<CalendarDayProps<T>>;\n userDataPerWeek?: CalendarUserMonthData<T>;\n statePerWeek?: CalendarUserMonthData<DayState>;\n theme?: CalendarTheme;\n headerRightContent?: ReactNode;\n extraDayContent?: React.ComponentType<ExtraDayContentProps<T>>;\n defaultHighlights?: Array<DayStateHighlight>;\n showWeekNumber: boolean;\n}\n\nexport function CalendarMonth<T>({\n month,\n dayComponent = CalendarDay,\n statePerWeek,\n userDataPerWeek,\n minDate,\n maxDate,\n onClickDay,\n onClickWeek,\n onClickWeekDay,\n onClickMonth,\n renderWeekNumber,\n renderWeekDay,\n headerRightContent,\n theme = defaultCalendarTheme,\n extraDayContent,\n defaultHighlights,\n showWeekNumber,\n}: CalendarMonthProps<T>) {\n return (\n <>\n <Box alignItems={\"stretch\"}>\n <Row\n justifyContent={headerRightContent ? \"space-between\" : \"center\"}\n alignItems={\"center\"}\n >\n <Row justifyContent={\"center\"} alignItems={\"center\"}>\n {onClickMonth ? (\n <FlatButton\n onClick={() => onClickMonth(month)}\n label={month.name + \" \" + String(month.year)}\n rightIcon={stenaAngleDown}\n />\n ) : (\n <Text whiteSpace={\"nowrap\"}>\n {month.name} {month.year}\n </Text>\n )}\n </Row>\n\n {headerRightContent && (\n <Box alignItems={\"center\"}>{headerRightContent}</Box>\n )}\n </Row>\n\n <table>\n <tbody>\n <tr>\n {showWeekNumber && (\n <td>\n <Box width={theme.width} height={theme.height} />\n </td>\n )}\n {month.weeks[0].days.map((day: DayData) => (\n <td key={day.name}>\n {renderWeekDay ? (\n renderWeekDay(day.name, theme, onClickWeekDay)\n ) : (\n <WeekDayCell\n day={day}\n onClickWeekDay={onClickWeekDay}\n theme={theme}\n />\n )}\n </td>\n ))}\n </tr>\n {month.weeks.map((week: WeekData) => (\n <tr key={week.weekNumber}>\n {showWeekNumber && (\n <td>\n {renderWeekNumber ? (\n renderWeekNumber(week, theme, onClickWeek)\n ) : (\n <WeekNumberCell\n week={week}\n onClickWeek={onClickWeek}\n theme={theme}\n />\n )}\n </td>\n )}\n {week.days.map((day) => (\n <DisabledDayWrapper\n dayComponent={dayComponent}\n key={day.dateString}\n day={day}\n week={week}\n month={month}\n dayState={\n statePerWeek &&\n statePerWeek[week.weekNumber] &&\n statePerWeek[week.weekNumber][day.dayOfMonth]\n }\n userData={\n userDataPerWeek &&\n userDataPerWeek[week.weekNumber] &&\n userDataPerWeek[week.weekNumber][day.dayOfMonth]\n }\n onClickDay={onClickDay}\n theme={theme}\n extraDayContent={extraDayContent}\n defaultHighlights={defaultHighlights}\n minDate={minDate}\n maxDate={maxDate}\n />\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </Box>\n </>\n );\n}\n","import { Row, Spacing } from \"@stenajs-webui/core\";\nimport { getMonth, getYear, Locale, parse } from \"date-fns\";\nimport { enGB } from \"date-fns/locale\";\nimport { chunk } from \"lodash-es\";\nimport * as React from \"react\";\nimport { useMemo } from \"react\";\nimport { useHighlightToday } from \"../../features/today-state/UseHighlightToday\";\nimport {\n CalendarOnClicks,\n CalendarProps,\n CalendarUserData,\n DayState,\n Renderers,\n} from \"../../types/CalendarTypes\";\nimport {\n calculateOverflowingMonth,\n getMonthInYear,\n getMonthsInYear,\n MonthData,\n} from \"../../util/calendar/CalendarDataFactory\";\nimport cx from \"classnames\";\nimport styles from \"./Calendar.module.css\";\n\nimport { CalendarMonth } from \"./CalendarMonth\";\nimport { CalendarTheme, defaultCalendarTheme } from \"./CalendarTheme\";\nimport { CalendarDay } from \"./renderers/CalendarDay\";\n\ninterface CalendarPanelProps<T>\n extends CalendarProps<T>,\n CalendarOnClicks<T>,\n Renderers {\n year: number;\n month: number;\n monthRows: Array<Array<MonthData>>;\n userDataPerMonth?: CalendarUserData<T>;\n statePerMonth?: CalendarUserData<DayState>;\n width?: string;\n height?: string;\n theme?: CalendarTheme;\n}\n\nfunction CalendarPanel<T>({\n monthRows,\n dayComponent = CalendarDay,\n userDataPerMonth,\n statePerMonth,\n minDate,\n maxDate,\n onClickDay,\n onClickWeekDay,\n onClickWeek,\n onClickMonth,\n renderWeekDay,\n renderWeekNumber,\n headerRightContent,\n extraDayContent,\n defaultHighlights,\n showWeekNumber,\n theme = defaultCalendarTheme,\n}: CalendarPanelProps<T>) {\n const minDateObj = useMemo(\n () => (minDate ? parse(minDate, \"yyyy-MM-dd\", new Date()) : undefined),\n [minDate],\n );\n\n const maxDateObj = useMemo(\n () => (maxDate ? parse(maxDate, \"yyyy-MM-dd\", new Date()) : undefined),\n [maxDate],\n );\n\n return (\n <div\n className={cx(\n styles.calendar,\n showWeekNumber && styles.weekNumberVisible,\n )}\n >\n {monthRows.map((monthRow, rowIndex) => (\n <Spacing key={rowIndex}>\n <Row gap={2}>\n {monthRow.map((month) => (\n <CalendarMonth<T>\n key={month.name}\n month={month}\n dayComponent={dayComponent}\n userDataPerWeek={\n userDataPerMonth && userDataPerMonth[month.monthString]\n }\n statePerWeek={statePerMonth && statePerMonth[month.monthString]}\n onClickDay={onClickDay}\n onClickWeekDay={onClickWeekDay}\n onClickWeek={onClickWeek}\n onClickMonth={onClickMonth}\n theme={theme}\n renderWeekNumber={renderWeekNumber}\n renderWeekDay={renderWeekDay}\n headerRightContent={headerRightContent}\n extraDayContent={extraDayContent}\n defaultHighlights={defaultHighlights}\n minDate={minDateObj}\n maxDate={maxDateObj}\n showWeekNumber={showWeekNumber ?? false}\n />\n ))}\n </Row>\n </Spacing>\n ))}\n </div>\n );\n}\n\nexport function Calendar<T>(props: CalendarProps<T>) {\n const initialDate = getInitialDate(props.year, props.month, props.date);\n const { year, month } = calculateOverflowingMonth(\n initialDate.year,\n initialDate.month,\n );\n const monthRows = getMonthRows(\n year,\n month,\n props.locale ?? enGB,\n props.numMonths,\n props.monthsPerRow,\n );\n\n const statePerMonth = useHighlightToday(\n props.highlightToday,\n props.statePerMonth,\n );\n\n return (\n <CalendarPanel<T>\n year={year}\n month={month}\n monthRows={monthRows}\n {...props}\n statePerMonth={statePerMonth}\n />\n );\n}\n\nconst getInitialDate = (year?: number, month?: number, date?: Date) => {\n if (month && year) {\n return {\n month,\n year,\n };\n }\n if (date) {\n return {\n month: getMonth(date),\n year: getYear(date),\n };\n }\n const now = new Date();\n return {\n month: getMonth(now),\n year: getYear(now),\n };\n};\n\nconst getMonthRows = (\n year: number,\n month: number,\n locale: Locale,\n numMonths?: number,\n monthsPerRow?: number,\n): Array<Array<MonthData>> => {\n if (numMonths == null) {\n return [[getMonthInYear(year, month, locale)]];\n }\n if (monthsPerRow == null) {\n return [getMonthsInYear(year, month, numMonths, locale)];\n }\n return chunk(getMonthsInYear(year, month, numMonths, locale), monthsPerRow);\n};\n","import { Position } from \"./Position\";\n\nexport const getDomIdForMonth = (\n position: Position,\n monthPickerId: string,\n): string => {\n return `${position.row}-${position.column}-${monthPickerId}`;\n};\n\nexport const getDomIdForKeyboardKey = (\n key: string,\n currentPosition: Position,\n monthPickerId: string,\n numColumnsPerRow: number,\n): string | undefined => {\n let next = currentPosition;\n for (let i = 0; i < numColumnsPerRow; i++) {\n next = movePositionByKey(next, key, numColumnsPerRow);\n const id = getDomIdForMonth(next, monthPickerId);\n if (document.getElementById(id)) {\n return id;\n }\n }\n return undefined;\n};\n\nexport const movePositionByKey = (\n currentPosition: Position,\n key: string,\n numColumnsPerRow: number,\n): Position => {\n let row = currentPosition.row;\n let column = currentPosition.column;\n if (key === \"ArrowLeft\") {\n column--;\n } else if (key === \"ArrowUp\") {\n row--;\n } else if (key === \"ArrowRight\") {\n column++;\n } else if (key === \"ArrowDown\") {\n row++;\n }\n\n if (column < 0) {\n column = numColumnsPerRow - 1;\n row--;\n }\n if (column > numColumnsPerRow - 1) {\n column = 0;\n row++;\n }\n\n return {\n column,\n row,\n };\n};\n","import { Locale } from \"date-fns\";\nimport {\n da,\n de,\n deAT,\n enGB,\n enIE,\n enUS,\n es,\n cs,\n it,\n fi,\n fr,\n lv,\n nb,\n nl,\n et,\n nlBE,\n pl,\n lt,\n sv,\n} from \"date-fns/locale\";\n\ntype LocalesMap = {\n [key: string]: Locale;\n};\n\nexport type SupportedLocaleCode =\n | \"en\"\n | \"en-US\"\n | \"en-GB\"\n | \"en-IE\"\n | \"de-AT\"\n | \"nl-BE\"\n | \"nl-NL\"\n | \"de-DE\"\n | \"nb-NO\"\n | \"sv-SE\"\n | \"da-DK\"\n | \"lv-LV\"\n | \"lt-LT\"\n | \"it-IT\"\n | \"et-EE\"\n | \"fi-FI\"\n | \"cs-CZ\"\n | \"es-ES\"\n | \"fr-FR\"\n | \"pl-PL\"\n | \"nl\"\n | \"de\"\n | \"nb\"\n | \"sv\"\n | \"da\"\n | \"lv\"\n | \"lt\"\n | \"it\"\n | \"et\"\n | \"fi\"\n | \"cs\"\n | \"es\"\n | \"fr\"\n | \"pl\";\n\nconst locales: LocalesMap = {\n en: enGB,\n \"en-US\": enUS,\n \"en-GB\": enGB,\n \"en-IE\": enIE,\n \"de-AT\": deAT,\n \"nl-BE\": nlBE,\n \"nl-NL\": nl,\n \"de-DE\": de,\n \"nb-NO\": nb,\n \"sv-SE\": sv,\n \"da-DK\": da,\n \"lv-LV\": lv,\n \"lt-LT\": lt,\n \"it-IT\": it,\n \"et-EE\": et,\n \"fi-FI\": fi,\n \"cs-CZ\": cs,\n \"es-ES\": es,\n \"fr-FR\": fr,\n \"pl-PL\": pl,\n nl,\n de,\n nb,\n sv,\n da,\n lv,\n lt,\n it,\n et,\n fi,\n cs,\n es,\n fr,\n pl,\n};\n\nexport const fallbackLocaleCode: SupportedLocaleCode = \"en-GB\";\nexport const fallbackLocaleCodeForFormatting: SupportedLocaleCode = \"sv\";\n\nexport const getSupportedLocaleCode = (\n localeCode: string,\n matchLanguage: boolean,\n fallback: SupportedLocaleCode,\n): SupportedLocaleCode => {\n if (locales[localeCode]) {\n return localeCode as SupportedLocaleCode;\n }\n if (matchLanguage) {\n const languageCode = getSupportedLocaleCodeMatchingLanguage(localeCode);\n if (languageCode) {\n return languageCode;\n }\n }\n return fallback;\n};\n\nexport const getLocaleForLocaleCode = (\n localeCode: SupportedLocaleCode,\n): Locale => {\n return locales[localeCode];\n};\n\nexport const getSupportedLocaleCodeMatchingLanguage = (\n localeCode: string,\n): SupportedLocaleCode | undefined => {\n const [lang] = localeCode.split(\"-\");\n const localeCodes = Object.keys(locales);\n for (const l of localeCodes) {\n if (l.startsWith(lang)) {\n return l as SupportedLocaleCode;\n }\n }\n return undefined;\n};\n\nexport const getDefaultLocaleForFormatting = (): Locale => {\n return locales[\"sv\"];\n};\n\n/**\n * This is only used by old calendar components, to pass localeCode to updated components.\n * All updated calendar components just take localeCode, for example \"en-GB\", since that is what the browser provides,\n * and is not library dependent.\n */\nexport const getLocaleCodeForLocale = (\n locale: Locale,\n): SupportedLocaleCode | undefined => {\n const localeCodes = Object.keys(locales);\n for (const localeCode of localeCodes) {\n if (locales[localeCode].code === locale.code) {\n return localeCode as SupportedLocaleCode;\n }\n }\n return undefined;\n};\n","import * as React from \"react\";\nimport {\n KeyboardEventHandler,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n} from \"react\";\nimport { Row } from \"@stenajs-webui/core\";\nimport { FlatButton, PrimaryButton } from \"@stenajs-webui/elements\";\nimport { format } from \"date-fns\";\nimport {\n getDomIdForKeyboardKey,\n getDomIdForMonth,\n} from \"./MonthPickerKeyboardNavigation\";\nimport { Position } from \"./Position\";\nimport { MonthPickerSizeVariant } from \"./MonthPicker\";\nimport {\n getLocaleForLocaleCode,\n SupportedLocaleCode,\n} from \"../localize-date-format/LocaleMapper\";\nimport { convertFirstCharToUpper } from \"../../util/caseFormat/CaseFormat\";\n\ninterface MonthPickerCellProps {\n month: Date;\n onClick: () => void;\n selected: boolean;\n localeCode: SupportedLocaleCode;\n autoFocus: boolean;\n monthPickerId: string;\n firstAvailableMonth: Date;\n lastAvailableMonth: Date;\n position: Position;\n size: MonthPickerSizeVariant;\n}\n\nexport const MonthPickerCell: React.FC<MonthPickerCellProps> = ({\n month,\n onClick,\n selected,\n localeCode,\n autoFocus,\n monthPickerId,\n position,\n size,\n}) => {\n const locale = useMemo(\n () => getLocaleForLocaleCode(localeCode) ?? getLocaleForLocaleCode(\"en-GB\"),\n [localeCode],\n );\n\n const label = useMemo(\n () => convertFirstCharToUpper(format(month, \"LLL\", { locale })),\n [locale, month],\n );\n\n const abbr = useMemo(\n () => format(month, \"LLLL\", { locale }),\n [locale, month],\n );\n\n const ref = useRef<HTMLButtonElement>(null);\n\n const domId = getDomIdForMonth(position, monthPickerId);\n const tabIndex = selected ? 0 : -1;\n\n useEffect(() => {\n ref.current?.focus();\n }, []);\n\n const onKeyDown = useCallback<KeyboardEventHandler<HTMLDivElement>>(\n (ev) => {\n const nextDomId = getDomIdForKeyboardKey(\n ev.key,\n position,\n monthPickerId,\n 4,\n );\n if (nextDomId) {\n document.getElementById(nextDomId)?.focus();\n }\n },\n [monthPickerId, position],\n );\n\n return (\n <Row justifyContent={\"center\"} onKeyDown={onKeyDown}>\n {selected ? (\n <PrimaryButton\n id={domId}\n aria-label={abbr}\n label={label}\n onClick={onClick}\n aria-selected={true}\n autoFocus={autoFocus}\n ref={ref}\n size={size === \"large\" ? \"large\" : \"medium\"}\n tabIndex={tabIndex}\n />\n ) : (\n <FlatButton\n id={domId}\n label={label}\n aria-label={abbr}\n onClick={onClick}\n size={size === \"large\" ? \"large\" : \"medium\"}\n tabIndex={tabIndex}\n />\n )}\n </Row>\n );\n};\n","import { addMonths } from \"date-fns\";\nimport { Position } from \"./Position\";\n\nexport interface MonthInput {\n yearOrder: Array<number>;\n years: Record<number, YearInput>;\n rows: Array<RowInput>;\n lastMonthRow: number;\n lastMonthColumn: number;\n}\n\nexport interface YearInput {\n year: number;\n rows: Array<number>;\n}\n\nexport interface RowInput {\n rowIndex: number;\n columns: Array<Columns>;\n}\n\nexport interface Columns {\n position: Position;\n month: Date;\n}\n\nexport const createMonths = (\n firstMonth: Date,\n numMonths: number,\n numColumnsPerRow: number,\n): MonthInput => {\n let currentYear = firstMonth.getFullYear();\n let currentRow = 0;\n let currentColumn = 0;\n let currentMonth = firstMonth;\n\n const input: MonthInput = {\n yearOrder: [],\n rows: [],\n years: {},\n lastMonthColumn: -1,\n lastMonthRow: -1,\n };\n\n for (let i = 0; i < numMonths; i++) {\n if (input.years[currentYear] == null) {\n input.yearOrder.push(currentYear);\n input.years[currentYear] = { year: currentYear, rows: [] };\n }\n\n input.rows[currentRow] = input.rows[currentRow] ?? {\n columns: [],\n rowIndex: currentRow,\n };\n\n input.rows[currentRow].columns[currentColumn] = {\n position: {\n column: currentColumn,\n row: currentRow,\n },\n month: currentMonth,\n };\n\n if (i === numMonths - 1) {\n // Last one, add it and exit\n input.years[currentYear].rows.push(currentRow);\n break;\n }\n\n currentMonth = addMonths(currentMonth, 1);\n\n if (currentMonth.getFullYear() !== currentYear) {\n input.years[currentYear].rows.push(currentRow);\n currentYear++;\n currentColumn = 0;\n currentRow++;\n } else {\n currentColumn++;\n if (currentColumn > numColumnsPerRow - 1) {\n input.years[currentYear].rows.push(currentRow);\n currentColumn = 0;\n currentRow++;\n }\n }\n }\n\n input.lastMonthColumn = currentColumn;\n input.lastMonthRow = currentRow;\n\n return input;\n};\n","import * as React from \"react\";\nimport {\n KeyboardEventHandler,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useState,\n} from \"react\";\nimport { ValueAndOnValueChangeProps } from \"@stenajs-webui/forms\";\nimport {\n Column,\n exhaustSwitchCase,\n Heading,\n useToday,\n} from \"@stenajs-webui/core\";\nimport { MonthPickerCell } from \"./MonthPickerCell\";\nimport { addMonths, isSameMonth } from \"date-fns\";\nimport { createMonths } from \"./MonthPickerDataFactory\";\nimport { SupportedLocaleCode } from \"../localize-date-format/LocaleMapper\";\n\nexport type MonthPickerSizeVariant = \"smaller\" | \"small\" | \"medium\" | \"large\";\n\nexport interface MonthPickerProps extends ValueAndOnValueChangeProps<Date> {\n localeCode: SupportedLocaleCode;\n firstMonth: Date;\n numMonths: number;\n onCancel?: () => void;\n size?: MonthPickerSizeVariant;\n}\n\nexport const MonthPicker: React.FC<MonthPickerProps> = ({\n value,\n onValueChange,\n firstMonth,\n localeCode,\n numMonths,\n onCancel,\n size = \"medium\",\n}) => {\n const monthPickerId = useId();\n const today = useToday();\n\n const clampedNumMonths = numMonths > 0 ? numMonths : 12;\n\n const [inited, setInited] = useState(false);\n\n const input = createMonths(firstMonth, clampedNumMonths, getNumColumns(size));\n\n const lastMonth = useMemo(() => {\n return addMonths(firstMonth, clampedNumMonths);\n }, [clampedNumMonths, firstMonth]);\n\n useEffect(() => {\n setInited(true);\n }, []);\n\n const onKeyDown = useCallback<KeyboardEventHandler>(\n (ev) => {\n if (ev.key === \"Escape\") {\n onCancel?.();\n ev.preventDefault();\n ev.stopPropagation();\n }\n },\n [onCancel],\n );\n\n return (\n <Column gap={1} maxWidth={getWidth(size)} onKeyDown={onKeyDown}>\n {input.yearOrder.map((year, yearIndex) => {\n const { rows } = input.years[year];\n return (\n <React.Fragment key={year}>\n {(yearIndex !== 0 || year !== today.getFullYear()) && (\n <Heading variant={\"h4\"}>{year}</Heading>\n )}\n <table style={{ borderSpacing: \"0 8px\" }}>\n <tbody>\n {rows.map((r) => {\n const { columns } = input.rows[r];\n return (\n <tr key={r}>\n {columns.map(({ month, position }) => (\n <td key={month.getMonth()}>\n <MonthPickerCell\n month={month}\n firstAvailableMonth={firstMonth}\n lastAvailableMonth={lastMonth}\n localeCode={localeCode}\n selected={value ? isSameMonth(value, month) : false}\n autoFocus={inited}\n onClick={() => onValueChange?.(month)}\n monthPickerId={monthPickerId}\n position={position}\n size={size}\n />\n </td>\n ))}\n </tr>\n );\n })}\n </tbody>\n </table>\n </React.Fragment>\n );\n })}\n </Column>\n );\n};\n\nconst getWidth = (size: MonthPickerSizeVariant) => {\n // For cell size = 48px, 48*7 = 336px\n switch (size) {\n case \"smaller\":\n return \"280px\";\n case \"small\":\n return \"308px\";\n case \"medium\":\n return \"336px\";\n case \"large\":\n return \"448px\";\n default:\n return exhaustSwitchCase(size, \"336px\");\n }\n};\n\nconst getNumColumns = (size: MonthPickerSizeVariant): number => {\n switch (size) {\n case \"smaller\":\n case \"small\":\n return 3;\n case \"medium\":\n case \"large\":\n return 4;\n default:\n return exhaustSwitchCase(size, 4);\n }\n};\n","import { PresetPage } from \"./CalendarPreset\";\nimport { addDays, subDays } from \"date-fns\";\n\nexport const createStandardDateRangePresets = (\n now: Date,\n): Array<PresetPage> => [\n {\n label: \"Past\",\n presets: [\n { label: \"Last 3 days\", startDate: now, endDate: subDays(now, 2) },\n { label: \"Last 7 days\", startDate: now, endDate: subDays(now, 6) },\n { label: \"Last 30 days\", startDate: now, endDate: subDays(now, 29) },\n { label: \"Last 45 days\", startDate: now, endDate: subDays(now, 44) },\n ],\n },\n {\n label: \"Future\",\n presets: [\n { label: \"Next 3 days\", startDate: now, endDate: addDays(now, 2) },\n { label: \"Next 7 days\", startDate: now, endDate: addDays(now, 6) },\n { label: \"Next 30 days\", startDate: now, endDate: addDays(now, 29) },\n { label: \"Next 45 days\", startDate: now, endDate: addDays(now, 44) },\n ],\n },\n];\n","import * as React from \"react\";\nimport { useMemo, useState } from \"react\";\nimport { createStandardDateRangePresets } from \"./PresetFactory\";\nimport { Column, Row, Space, Text } from \"@stenajs-webui/core\";\nimport {\n FlatButton,\n PrimaryButton,\n stenaAngleLeft,\n stenaAngleRight,\n} from \"@stenajs-webui/elements\";\nimport { CalendarPreset } from \"./CalendarPreset\";\n\nexport interface PresetPickerProps {\n onClickPreset: (preset: CalendarPreset) => void;\n}\n\nexport const PresetPicker: React.FC<PresetPickerProps> = ({\n onClickPreset,\n}) => {\n const [pageIndex, setPageIndex] = useState(0);\n const pages = useMemo(() => createStandardDateRangePresets(new Date()), []);\n\n const currentPage = pages[pageIndex] ?? pages[0];\n\n return (\n <Column>\n <Row\n justifyContent={\"space-between\"}\n alignItems={\"center\"}\n width={\"200px\"}\n >\n <FlatButton\n size={\"small\"}\n leftIcon={stenaAngleLeft}\n disabled={pageIndex === 0}\n onClick={() => setPageIndex(pageIndex - 1)}\n />\n <Text>{currentPage.label}</Text>\n <FlatButton\n size={\"small\"}\n leftIcon={stenaAngleRight}\n disabled={pageIndex === pages.length - 1}\n onClick={() => setPageIndex(pageIndex + 1)}\n />\n </Row>\n <Space />\n <Column alignItems={\"center\"}>\n {currentPage.presets.map((preset) => (\n <React.Fragment key={preset.label}>\n <PrimaryButton\n label={preset.label}\n onClick={() => onClickPreset(preset)}\n />\n <Space />\n </React.Fragment>\n ))}\n </Column>\n </Column>\n );\n};\n","import { Box, useToday } from \"@stenajs-webui/core\";\nimport { PrimaryButton } from \"@stenajs-webui/elements\";\nimport * as React from \"react\";\nimport { ReactNode, useCallback, useMemo } from \"react\";\nimport { Calendar } from \"../../components/calendar/Calendar\";\nimport {\n CalendarProps,\n RenderMonthPickerArgs,\n} from \"../../types/CalendarTypes\";\nimport { MonthPicker } from \"../month-picker/MonthPicker\";\nimport { CalendarPreset } from \"../preset-picker/CalendarPreset\";\nimport { PresetPicker } from \"../preset-picker/PresetPicker\";\nimport { CalendarPanelType } from \"./CalendarPanelType\";\nimport {\n getLocaleCodeForLocale,\n SupportedLocaleCode,\n} from \"../localize-date-format/LocaleMapper\";\n\ninterface CalendarWithMonthYearPickersProps<T>\n extends Omit<CalendarProps<T>, \"date\" | \"year\" | \"month\"> {\n dateInFocus: Date;\n firstMonthInMonthPicker?: Date;\n numMonthsInMonthPicker?: number;\n setDateInFocus: (dateInFocus: Date) => void;\n currentPanel: CalendarPanelType;\n setCurrentPanel: (currentPanel: CalendarPanelType) => void;\n onSelectPreset: (preset: CalendarPreset) => void;\n renderMonthPicker?: (args: RenderMonthPickerArgs) => ReactNode;\n}\n\nexport const CalendarWithMonthYearPickers =\n function CalendarWithMonthYearPickers<T>({\n locale,\n dateInFocus,\n setDateInFocus,\n currentPanel,\n setCurrentPanel,\n renderMonthPicker,\n firstMonthInMonthPicker,\n numMonthsInMonthPicker,\n ...props\n }: CalendarWithMonthYearPickersProps<T>) {\n const localeCode = useMemo<SupportedLocaleCode>(\n () =>\n locale == null ? \"en-GB\" : (getLocaleCodeForLocale(locale) ?? \"en-GB\"),\n [locale],\n );\n const today = useToday();\n\n const onChangeSelectedMonth = useCallback(\n (selectedMonth: Date) => {\n if (setDateInFocus) {\n setDateInFocus(selectedMonth);\n }\n setCurrentPanel(\"calendar\");\n },\n [setDateInFocus, setCurrentPanel],\n );\n\n const onClickMonth = useCallback(() => {\n setCurrentPanel(\"month\");\n }, [setCurrentPanel]);\n\n switch (currentPanel) {\n case \"calendar\":\n return (\n <Calendar<T>\n {...props}\n date={dateInFocus}\n onClickMonth={onClickMonth}\n locale={locale}\n />\n );\n case \"month\":\n return renderMonthPicker ? (\n renderMonthPicker({\n value: dateInFocus,\n onValueChange: onChangeSelectedMonth,\n locale: locale,\n firstMonth: firstMonthInMonthPicker ?? today,\n numMonths: numMonthsInMonthPicker ?? 24,\n dateInFocus,\n })\n ) : (\n <MonthPicker\n value={dateInFocus}\n onValueChange={onChangeSelectedMonth}\n localeCode={localeCode}\n firstMonth={firstMonthInMonthPicker ?? today}\n numMonths={numMonthsInMonthPicker ?? 24}\n />\n );\n case \"presets\":\n return <PresetPicker onClickPreset={() => {}} />;\n\n default:\n return (\n <Box>\n <PrimaryButton\n label={\"Show calendar\"}\n onClick={() => setCurrentPanel(\"calendar\")}\n />\n </Box>\n );\n }\n };\n","import { addMonths, addYears, subMonths, subYears } from \"date-fns\";\nimport { useCallback } from \"react\";\n\nexport const useSelectedMonthStepperLogic = (\n dateInFocus: Date,\n setDateInFocus?: (dateInFocus: Date) => void,\n monthsPerRow?: number,\n numMonths?: number,\n) => {\n const nextMonth = useCallback(() => {\n const d = addMonths(dateInFocus, monthsPerRow ?? numMonths ?? 1);\n setDateInFocus?.(d);\n }, [setDateInFocus, dateInFocus, monthsPerRow, numMonths]);\n\n const nextYear = useCallback(() => {\n const d = addYears(dateInFocus, 1);\n setDateInFocus?.(d);\n }, [setDateInFocus, dateInFocus]);\n\n const prevMonth = useCallback(() => {\n const d = subMonths(dateInFocus, monthsPerRow ?? numMonths ?? 1);\n setDateInFocus?.(d);\n }, [setDateInFocus, dateInFocus, monthsPerRow, numMonths]);\n\n const prevYear = useCallback(() => {\n const d = subYears(dateInFocus, 1);\n setDateInFocus?.(d);\n }, [setDateInFocus, dateInFocus]);\n\n return {\n nextMonth,\n prevMonth,\n nextYear,\n prevYear,\n };\n};\n","import { Indent, Row, Space } from \"@stenajs-webui/core\";\nimport {\n SecondaryButton,\n stenaAngleLeftDouble,\n stenaAngleRightDouble,\n stenaArrowLeft,\n stenaArrowRight,\n} from \"@stenajs-webui/elements\";\nimport * as React from \"react\";\nimport { ReactNode } from \"react\";\nimport { CalendarTheme } from \"../../components/calendar/CalendarTheme\";\n\nexport interface WithMonthSwitcherBelowProps {\n theme: CalendarTheme;\n nextMonth: () => void;\n prevMonth: () => void;\n nextYear: () => void;\n prevYear: () => void;\n children?: ReactNode;\n}\n\nexport const WithMonthSwitcherBelow: React.FC<WithMonthSwitcherBelowProps> = ({\n children,\n prevMonth,\n nextMonth,\n prevYear,\n nextYear,\n}) => (\n <div>\n {children}\n <Indent>\n <Row gap={1}>\n <SecondaryButton onClick={prevYear} leftIcon={stenaAngleLeftDouble} />\n <SecondaryButton onClick={prevMonth} leftIcon={stenaArrowLeft} />\n <Indent num={2} />\n <SecondaryButton onClick={nextMonth} leftIcon={stenaArrowRight} />\n <SecondaryButton onClick={nextYear} leftIcon={stenaAngleRightDouble} />\n </Row>\n </Indent>\n <Space />\n </div>\n);\n","import { Column, Row } from \"@stenajs-webui/core\";\nimport {\n SecondaryButton,\n stenaArrowLeft,\n stenaArrowRight,\n} from \"@stenajs-webui/elements\";\nimport * as React from \"react\";\nimport { Calendar } from \"../../components/calendar/Calendar\";\nimport { defaultCalendarTheme } from \"../../components/calendar/CalendarTheme\";\nimport {\n CalendarProps,\n RenderMonthPickerArgs,\n} from \"../../types/CalendarTypes\";\nimport { CalendarPanelType } from \"../calendar-with-month-year-pickers/CalendarPanelType\";\nimport { CalendarWithMonthYearPickers } from \"../calendar-with-month-year-pickers/CalendarWithMonthYearPickers\";\nimport { CalendarPreset } from \"../preset-picker/CalendarPreset\";\nimport { useSelectedMonthStepperLogic } from \"./hooks/UseSelectedMonthStepperLogic\";\nimport { WithMonthSwitcherBelow } from \"./MonthSwitcherBelow\";\nimport { ReactNode } from \"react\";\n\nexport type MonthSwitcherPlacement = \"header\" | \"below\";\n\nexport interface CalendarWithMonthSwitcherProps<T> extends CalendarProps<T> {\n monthSwitcherPlacement?: MonthSwitcherPlacement;\n dateInFocus: Date;\n setDateInFocus: (dateInFocus: Date) => void;\n currentPanel: CalendarPanelType;\n setCurrentPanel: (currentPanel: CalendarPanelType) => void;\n onSelectPreset?: (preset: CalendarPreset) => void;\n renderMonthPicker?: (args: RenderMonthPickerArgs) => ReactNode;\n firstMonthInMonthPicker?: Date;\n numMonthsInMonthPicker?: number;\n}\n\nconst noop = () => {};\n\nexport function CalendarWithMonthSwitcher<T>({\n monthSwitcherPlacement,\n theme = defaultCalendarTheme,\n dateInFocus,\n setDateInFocus,\n currentPanel,\n setCurrentPanel,\n onSelectPreset = noop,\n renderMonthPicker,\n firstMonthInMonthPicker,\n numMonthsInMonthPicker,\n ...calendarProps\n}: CalendarWithMonthSwitcherProps<T>) {\n const { nextMonth, prevMonth, nextYear, prevYear } =\n useSelectedMonthStepperLogic(\n dateInFocus,\n setDateInFocus,\n calendarProps.monthsPerRow,\n calendarProps.numMonths,\n );\n\n const placement = fallbackIfNoPlacement(\n monthSwitcherPlacement,\n calendarProps.numMonths,\n );\n\n switch (placement) {\n case \"below\": {\n return (\n <WithMonthSwitcherBelow\n theme={theme}\n nextMonth={nextMonth}\n prevMonth={prevMonth}\n nextYear={nextYear}\n prevYear={prevYear}\n >\n <Calendar<T> {...calendarProps} theme={theme} date={dateInFocus} />\n </WithMonthSwitcherBelow>\n );\n }\n case \"header\": {\n return (\n <Column>\n <CalendarWithMonthYearPickers<T>\n {...calendarProps}\n theme={theme}\n renderMonthPicker={renderMonthPicker}\n dateInFocus={dateInFocus}\n setDateInFocus={setDateInFocus}\n currentPanel={currentPanel}\n setCurrentPanel={setCurrentPanel}\n onSelectPreset={onSelectPreset}\n firstMonthInMonthPicker={firstMonthInMonthPicker}\n numMonthsInMonthPicker={numMonthsInMonthPicker}\n headerRightContent={\n <Row alignItems={\"center\"} gap={1}>\n <SecondaryButton\n onClick={prevMonth}\n leftIcon={stenaArrowLeft}\n />\n <SecondaryButton\n onClick={nextMonth}\n leftIcon={stenaArrowRight}\n />\n </Row>\n }\n />\n </Column>\n );\n }\n default: {\n return (\n <Calendar<T> {...calendarProps} theme={theme} date={dateInFocus} />\n );\n }\n }\n}\n\nconst fallbackIfNoPlacement = (\n monthSwitcherPlacement: MonthSwitcherPlacement | undefined,\n numMonths: number | undefined,\n): MonthSwitcherPlacement => {\n return monthSwitcherPlacement || (numMonths || 1) > 1 ? \"below\" : \"header\";\n};\n","import { DateRange, DateStringRange } from \"../../types/DateRange\";\nimport { format, parse } from \"date-fns\";\n\nexport const dateRangeToStrings = (dateRange: DateRange): DateStringRange => ({\n startDate: dateRange.startDate\n ? format(dateRange.startDate, \"yyyy-MM-dd\")\n : undefined,\n endDate: dateRange.endDate\n ? format(dateRange.endDate, \"yyyy-MM-dd\")\n : undefined,\n});\n\nexport const stringsToDateRange = ({\n startDate,\n endDate,\n}: DateStringRange): DateRange => {\n const now = new Date();\n return {\n startDate: startDate ? parse(startDate, \"yyyy-MM-dd\", now) : undefined,\n endDate: endDate ? parse(endDate, \"yyyy-MM-dd\", now) : undefined,\n };\n};\n","import { isAfter, isSameDay } from \"date-fns\";\nimport { DateRange, DateStringRange } from \"../../types/DateRange\";\nimport { dateRangeToStrings, stringsToDateRange } from \"./DateRangeTransformer\";\n\nexport const isDateRangeInvalid = ({\n startDate,\n endDate,\n}: DateRange): boolean =>\n Boolean(\n startDate &&\n endDate &&\n !isSameDay(startDate, endDate) &&\n isAfter(startDate, endDate),\n );\n\nexport const toggleDatesIfEndIsEarlierThanStart = (\n dateRange: DateRange,\n): DateRange => {\n if (isDateRangeInvalid(dateRange)) {\n return {\n startDate: dateRange.endDate,\n endDate: dateRange.startDate,\n };\n }\n return dateRange;\n};\n\nexport const toggleDateStringsIfEndIsEarlierThanStart = (\n dateRange: DateStringRange,\n): DateStringRange => {\n if (dateRange.startDate && dateRange.endDate) {\n return dateRangeToStrings(\n toggleDatesIfEndIsEarlierThanStart(stringsToDateRange(dateRange)),\n );\n }\n return dateRange;\n};\n","import { useCallback } from \"react\";\nimport { DateRangeFocusedInput } from \"../../../components/calendar-types/date-range-calendar/DateRangeCalendar\";\nimport { OnClickDay } from \"../../../types/CalendarTypes\";\nimport { DayData } from \"../../../util/calendar/CalendarDataFactory\";\nimport {\n isDateRangeInvalid,\n toggleDatesIfEndIsEarlierThanStart,\n} from \"../../../util/date-range/DateRangeValidator\";\nimport { DateRange } from \"../../../types/DateRange\";\n\nexport const useDateRangeOnClickDayHandler = <T>(\n value: DateRange | undefined,\n onValueChange: ((dateRange: DateRange) => void) | undefined,\n focusedInput: DateRangeFocusedInput,\n setFocusedInput: (focusedInput: DateRangeFocusedInput) => void,\n): OnClickDay<T> => {\n return useCallback(\n (day: DayData) => {\n const dateRange = {\n startDate: focusedInput === \"startDate\" ? day.date : value?.startDate,\n endDate: focusedInput === \"endDate\" ? day.date : value?.endDate,\n };\n\n if (!isDateRangeInvalid(dateRange)) {\n setFocusedInput(focusedInput === \"startDate\" ? \"endDate\" : \"startDate\");\n }\n onValueChange?.(toggleDatesIfEndIsEarlierThanStart(dateRange));\n },\n [\n focusedInput,\n onValueChange,\n setFocusedInput,\n value?.endDate,\n value?.startDate,\n ],\n );\n};\n","import { CalendarPanelType } from \"../calendar-with-month-year-pickers/CalendarPanelType\";\nimport { useCallback, useState } from \"react\";\n\nexport type OnChangePanel = (panel: CalendarPanelType) => void;\n\nexport interface UseInternalPanelStateProps {\n onChangePanel?: OnChangePanel;\n}\n\nexport const useInternalPanelState = (\n onChangePanel: OnChangePanel | undefined,\n) => {\n const [currentPanel, _setCurrentPanel] =\n useState<CalendarPanelType>(\"calendar\");\n\n const setCurrentPanel = useCallback(\n (currentPanel: CalendarPanelType) => {\n _setCurrentPanel(currentPanel);\n onChangePanel?.(currentPanel);\n },\n [onChangePanel],\n );\n\n return {\n currentPanel,\n setCurrentPanel,\n };\n};\n","import { useMemo, useState } from \"react\";\nimport { useDateRangeOnClickDayHandler } from \"../../../../features/date-range/hooks/UseDateRangeOnClickDayHandler\";\nimport { DateRangeCalendarProps } from \"../DateRangeCalendar\";\nimport { CalendarWithMonthSwitcherProps } from \"../../../../features/month-switcher/CalendarWithMonthSwitcher\";\nimport { buildDayStateForDateRange } from \"../../../../util/calendar/StateModifier\";\nimport { useInternalPanelState } from \"../../../../features/internal-panel-state/UseInternalPanelState\";\n\nexport const useDateRangeSelection = <T>({\n focusedInput,\n value,\n onValueChange,\n setFocusedInput,\n statePerMonth,\n onChangePanel,\n initialDateInFocus,\n}: DateRangeCalendarProps<T>): CalendarWithMonthSwitcherProps<T> => {\n const { currentPanel, setCurrentPanel } =\n useInternalPanelState(onChangePanel);\n const [dateInFocus, setDateInFocus] = useState(\n () => initialDateInFocus ?? new Date(),\n );\n\n const onClickDay = useDateRangeOnClickDayHandler(\n value,\n onValueChange,\n focusedInput,\n setFocusedInput,\n );\n\n const statePerMonthWithSelection = useMemo(\n () =>\n buildDayStateForDateRange(\n statePerMonth,\n value?.startDate,\n value?.endDate,\n ),\n [statePerMonth, value?.endDate, value?.startDate],\n );\n\n return {\n onClickDay,\n statePerMonth: statePerMonthWithSelection,\n currentPanel,\n setCurrentPanel,\n setDateInFocus,\n dateInFocus,\n };\n};\n","import * as React from \"react\";\nimport { CalendarWithMonthSwitcher } from \"../../../features/month-switcher/CalendarWithMonthSwitcher\";\nimport { useDateRangeSelection } from \"./hooks/UseDateRangeSelection\";\nimport { InternalPanelAndFocusStateProps } from \"../../../types/InternalPanelAndFocusStateProps\";\nimport { ValueAndOnValueChangeProps } from \"@stenajs-webui/forms\";\nimport { DateRange } from \"../../../types/DateRange\";\n\nexport type DateRangeFocusedInput = \"startDate\" | \"endDate\" | undefined;\n\nexport interface DateRangeCalendarProps<T>\n extends InternalPanelAndFocusStateProps<T>,\n ValueAndOnValueChangeProps<DateRange> {\n focusedInput?: DateRangeFocusedInput;\n setFocusedInput: (focusedInput: DateRangeFocusedInput) => void;\n initialDateInFocus?: Date;\n}\n\nexport function DateRangeCalendar<T>(props: DateRangeCalendarProps<T>) {\n const dateRangeSelectionProps = useDateRangeSelection(props);\n return (\n <CalendarWithMonthSwitcher<T> {...props} {...dateRangeSelectionProps} />\n );\n}\n\nexport type DateRangeInputCalendarProps<T> = Omit<\n DateRangeCalendarProps<T>,\n | \"startDateInFocus\"\n | \"value\"\n | \"onValueChange\"\n | \"focusedInput\"\n | \"setFocusedInput\"\n | \"theme\"\n | \"currentPanel\"\n | \"setCurrentPanel\"\n>;\n","import { useState } from \"react\";\nimport { DateRangeFocusedInput } from \"../DateRangeCalendar\";\n\nexport const useDateRangeCalendarState = () => {\n const [startDate, setStartDate] = useState<Date | undefined>();\n const [endDate, setEndDate] = useState<Date | undefined>();\n const [focusedInput, setFocusedInput] =\n useState<DateRangeFocusedInput>(\"startDate\");\n return {\n startDate,\n setStartDate,\n endDate,\n setEndDate,\n focusedInput,\n setFocusedInput,\n };\n};\n","import { useCallback, useMemo, useState } from \"react\";\nimport { OnClickDay } from \"../../../types/CalendarTypes\";\nimport { addDayStateHighlights } from \"../../../util/calendar/StateModifier\";\nimport { SingleDateCalendarProps } from \"./SingleDateCalendar\";\nimport { CalendarWithMonthSwitcherProps } from \"../../../features/month-switcher/CalendarWithMonthSwitcher\";\nimport { useInternalPanelState } from \"../../../features/internal-panel-state/UseInternalPanelState\";\n\nexport const useSingleDateSelection = <T>({\n onChange,\n value,\n statePerMonth,\n onChangePanel,\n}: SingleDateCalendarProps<T>): CalendarWithMonthSwitcherProps<T> => {\n const { currentPanel, setCurrentPanel } =\n useInternalPanelState(onChangePanel);\n\n const [dateInFocus, setDateInFocus] = useState(() => value ?? new Date());\n\n const onClickDay: OnClickDay<T> = useCallback(\n (day) => {\n if (onChange) {\n onChange(day.date);\n }\n },\n [onChange],\n );\n\n const statePerMonthWithSelectedDate = useMemo(\n () =>\n value\n ? addDayStateHighlights(statePerMonth, value, [\n \"selected\",\n \"singleSelected\",\n ])\n : statePerMonth,\n [statePerMonth, value],\n );\n\n return {\n onClickDay,\n statePerMonth: statePerMonthWithSelectedDate,\n date: value,\n currentPanel,\n setCurrentPanel,\n dateInFocus,\n setDateInFocus,\n };\n};\n","import * as React from \"react\";\nimport { CalendarWithMonthSwitcher } from \"../../../features/month-switcher/CalendarWithMonthSwitcher\";\n\nimport { useSingleDateSelection } from \"./UseSingleDateSelection\";\nimport { InternalPanelAndFocusStateProps } from \"../../../types/InternalPanelAndFocusStateProps\";\n\nexport interface SingleDateCalendarProps<T>\n extends InternalPanelAndFocusStateProps<T> {\n value: Date | undefined;\n onChange: (value: Date | undefined) => void;\n}\n\nexport function SingleDateCalendar<T>(props: SingleDateCalendarProps<T>) {\n const singleDateSelectionProps = useSingleDateSelection(props);\n return (\n <CalendarWithMonthSwitcher<T> {...props} {...singleDateSelectionProps} />\n );\n}\n","import { isSameDay } from \"date-fns\";\nimport { useCallback, useMemo, useState } from \"react\";\nimport { OnClickDay } from \"../../../types/CalendarTypes\";\nimport { addDayStateHighlights } from \"../../../util/calendar/StateModifier\";\nimport { MultiDateCalendarProps } from \"./MultiDateCalendar\";\nimport { CalendarWithMonthSwitcherProps } from \"../../../features/month-switcher/CalendarWithMonthSwitcher\";\nimport { useInternalPanelState } from \"../../../features/internal-panel-state/UseInternalPanelState\";\n\nexport const useMultiDateSelection = <T>({\n onChange,\n value,\n statePerMonth,\n onChangePanel,\n initialDateInFocus,\n}: MultiDateCalendarProps<T>): CalendarWithMonthSwitcherProps<T> => {\n const { currentPanel, setCurrentPanel } =\n useInternalPanelState(onChangePanel);\n const [dateInFocus, setDateInFocus] = useState(\n initialDateInFocus ?? new Date(),\n );\n\n const onClickDay: OnClickDay<T> = useCallback(\n (day) => {\n if (!onChange) {\n return;\n }\n const isSelected = value && value.find((d) => isSameDay(d, day.date));\n if (value && isSelected) {\n onChange(value.filter((v) => !isSameDay(v, day.date)));\n } else {\n onChange([...(value || []), day.date]);\n }\n },\n [onChange, value],\n );\n const statePerMonthWithSelectedDate = useMemo(() => {\n if (!value) {\n return statePerMonth;\n }\n return value.reduce(\n (stateSum, date) => addDayStateHighlights(stateSum, date, [\"selected\"]),\n statePerMonth,\n );\n }, [statePerMonth, value]);\n\n return {\n onClickDay,\n statePerMonth: statePerMonthWithSelectedDate,\n currentPanel,\n setCurrentPanel,\n dateInFocus,\n setDateInFocus,\n };\n};\n","import * as React from \"react\";\nimport { CalendarWithMonthSwitcher } from \"../../../features/month-switcher/CalendarWithMonthSwitcher\";\nimport { useMultiDateSelection } from \"./UseMultiDateSelection\";\nimport { UseInternalPanelStateProps } from \"../../../features/internal-panel-state/UseInternalPanelState\";\nimport { InternalPanelAndFocusStateProps } from \"../../../types/InternalPanelAndFocusStateProps\";\n\nexport interface MultiDateCalendarProps<T>\n extends InternalPanelAndFocusStateProps<T>,\n UseInternalPanelStateProps {\n initialDateInFocus?: Date;\n value?: Array<Date>;\n onChange?: (value: Array<Date>) => void;\n}\n\nexport function MultiDateCalendar<T>(props: MultiDateCalendarProps<T>) {\n const selectionProps = useMultiDateSelection(props);\n return <CalendarWithMonthSwitcher<T> {...props} {...selectionProps} />;\n}\n","import { Locale, setWeek, startOfWeek } from \"date-fns\";\nimport { enGB } from \"date-fns/locale\";\nimport { useCallback, useMemo, useState } from \"react\";\nimport { useInternalPanelState } from \"../../../features/internal-panel-state/UseInternalPanelState\";\nimport { CalendarWithMonthSwitcherProps } from \"../../../features/month-switcher/CalendarWithMonthSwitcher\";\nimport { OnClickDay, OnClickWeek } from \"../../../types/CalendarTypes\";\nimport {\n getWeekForDate,\n WeekData,\n} from \"../../../util/calendar/CalendarDataFactory\";\nimport { addWeekRangeHighlights } from \"../../../util/calendar/StateModifier\";\nimport { SingleWeekCalendarProps } from \"./SingleWeekCalendar\";\n\nexport const useSingleWeekSelection = <T>({\n onChange,\n value,\n statePerMonth,\n onChangePanel,\n locale = enGB,\n}: SingleWeekCalendarProps<T>): CalendarWithMonthSwitcherProps<T> => {\n const [dateInFocus, setDateInFocus] = useState(() => {\n const week = getWeekDataFromWeekString(value, locale);\n if (!week) {\n return new Date();\n }\n return week.days[0].date;\n });\n const { currentPanel, setCurrentPanel } =\n useInternalPanelState(onChangePanel);\n\n const onClickDay = useCallback<OnClickDay<T>>(\n (day) => {\n if (onChange) {\n onChange(getWeekStringFromWeekData(getWeekForDate(day.date, locale)));\n }\n },\n [locale, onChange],\n );\n const onClickWeek = useCallback<OnClickWeek>(\n (week) => {\n if (onChange) {\n onChange(getWeekStringFromWeekData(week));\n }\n },\n [onChange],\n );\n\n const statePerMonthWithSelection = useMemo(() => {\n const weekData = getWeekDataFromWeekString(value, locale);\n return weekData\n ? addWeekRangeHighlights(statePerMonth, weekData)\n : statePerMonth;\n }, [value, locale, statePerMonth]);\n\n const date = useMemo(() => {\n const week = getWeekDataFromWeekString(value, locale);\n if (!week) {\n return new Date();\n }\n return week.days[0].date;\n }, [locale, value]);\n\n return {\n statePerMonth: statePerMonthWithSelection,\n date,\n dateInFocus,\n setDateInFocus,\n onClickDay,\n onClickWeek,\n currentPanel,\n setCurrentPanel,\n };\n};\n\nconst getWeekStringFromWeekData = (\n week: WeekData | undefined,\n): string | undefined => {\n if (!week) {\n return undefined;\n }\n return `${week.endYear}-${week.weekNumber}`;\n};\n\nconst getWeekDataFromWeekString = (\n week: string | undefined,\n locale: Locale,\n): WeekData | undefined => {\n if (!week) {\n return undefined;\n }\n const parts = week.split(\"-\");\n const weekNumber = parseInt(parts[1], 10);\n const year = parseInt(parts[0], 10);\n const date = new Date();\n date.setFullYear(year);\n const firstDateOfWeek = startOfWeek(setWeek(date, weekNumber), { locale });\n return getWeekForDate(firstDateOfWeek, locale);\n};\n","import * as React from \"react\";\nimport { CalendarWithMonthSwitcher } from \"../../../features/month-switcher/CalendarWithMonthSwitcher\";\nimport { useSingleWeekSelection } from \"./UseSingleWeekSelection\";\nimport { InternalPanelAndFocusStateProps } from \"../../../types/InternalPanelAndFocusStateProps\";\n\nexport type SingleWeekValue = string;\n\nexport interface SingleWeekCalendarProps<T>\n extends InternalPanelAndFocusStateProps<T> {\n value: SingleWeekValue | undefined;\n onChange: (value: SingleWeekValue | undefined) => void;\n}\n\nexport function SingleWeekCalendar<T>(props: SingleWeekCalendarProps<T>) {\n const singleWeekSelectionProps = useSingleWeekSelection(props);\n return (\n <CalendarWithMonthSwitcher<T> {...props} {...singleWeekSelectionProps} />\n );\n}\n","export const defaultPopoverPlacement = \"bottom\";\n","import { useCallback, useState } from \"react\";\n\nexport const useDateInput = (\n onChange?: (date: Date | undefined) => void,\n onClose?: () => void,\n openOnMount?: boolean,\n) => {\n const [showingCalendar, setShowingCalendar] = useState(openOnMount || false);\n\n const showCalendar = useCallback(() => {\n setShowingCalendar(true);\n return true;\n }, [setShowingCalendar]);\n\n const hideCalendar = useCallback(() => {\n setShowingCalendar(false);\n if (onClose) {\n onClose();\n }\n }, [setShowingCalendar, onClose]);\n\n const onSelectDate = useCallback(\n (date: Date | undefined) => {\n if (onChange) {\n onChange(date);\n }\n setTimeout(hideCalendar, 150);\n },\n [onChange, hideCalendar],\n );\n\n return {\n showCalendar,\n hideCalendar,\n showingCalendar,\n onSelectDate,\n };\n};\n","export const defaultMaxDate = \"2999-12-31\";\n","import { Box } from \"@stenajs-webui/core\";\nimport { stenaCalendar, TextInputButton } from \"@stenajs-webui/elements\";\nimport { TextInput, TextInputProps } from \"@stenajs-webui/forms\";\nimport { ControlledPopover } from \"@stenajs-webui/tooltip\";\nimport { format } from \"date-fns\";\nimport * as React from \"react\";\nimport { defaultPopoverPlacement } from \"../../../config/DefaultPopoverPlacement\";\nimport { DateFormats } from \"../../../util/date/DateFormats\";\nimport { SingleDateCalendar } from \"../../calendar-types/single-date-calendar/SingleDateCalendar\";\nimport {\n CalendarTheme,\n defaultCalendarTheme,\n} from \"../../calendar/CalendarTheme\";\nimport { DateTextInputCalendarProps } from \"../date-text-input/DateTextInput\";\nimport { useDateInput } from \"./UseDateInput\";\nimport { OptionalMinMaxDatesAsString } from \"../../../types/CalendarTypes\";\nimport { defaultMaxDate } from \"../../../config/DefaultMaxDate\";\n\nexport interface DateInputProps<T = unknown>\n extends OptionalMinMaxDatesAsString {\n /** The current value */\n value?: Date;\n /** onChange handler for when the user selects a date. */\n onChange?: (date: Date | undefined) => void;\n /** Variant of the input field. */\n variant?: TextInputProps[\"variant\"];\n /** If true, calendar will be open when component mounts. */\n openOnMount?: boolean;\n /** Is invoked when user closes the calendar popup. */\n onClose?: () => void;\n /**\n * The date format in the input field. See date-fns docs.\n * @default YYYY-MM-dd\n */\n displayFormat?: string;\n /**\n * Placeholder when no date has been selected.\n * @default Enter date\n */\n placeholder?: string;\n /**\n * Portal target, HTML element. If not set, window.body is used.\n */\n portalTarget?: HTMLElement;\n zIndex?: number;\n width?: string;\n /**\n * The calendar theme to use.\n */\n calendarTheme?: CalendarTheme;\n /** Props to be passed to Calendar, see SingleDateCalendar. */\n calendarProps?: DateTextInputCalendarProps<T>;\n /**\n * Disables the TextInput, Calendar and Popover.\n */\n disabled?: boolean;\n}\n\nexport const DateInput: React.FC<DateInputProps> = ({\n displayFormat = DateFormats.fullDate,\n placeholder = \"Enter date\",\n value,\n calendarTheme = defaultCalendarTheme,\n calendarProps,\n openOnMount,\n onClose,\n onChange,\n variant,\n width,\n minDate,\n maxDate = defaultMaxDate,\n disabled,\n portalTarget,\n zIndex,\n}) => {\n const { hideCalendar, showingCalendar, onSelectDate, showCalendar } =\n useDateInput(onChange, onClose, openOnMount);\n\n return (\n <Box width={width}>\n <ControlledPopover\n hideArrow\n 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 { RefObject, useCallback, useState } from \"react\";\nimport { defaultPopoverPlacement } from \"../../../config/DefaultPopoverPlacement\";\nimport { DateFormats } from \"../../../util/date/DateFormats\";\nimport {\n SingleDateCalendar,\n SingleDateCalendarProps,\n} from \"../../calendar-types/single-date-calendar/SingleDateCalendar\";\nimport {\n CalendarTheme,\n defaultCalendarTheme,\n} from \"../../calendar/CalendarTheme\";\nimport { OptionalMinMaxDatesAsString } from \"../../../types/CalendarTypes\";\nimport { defaultMaxDate } from \"../../../config/DefaultMaxDate\";\n\nexport type DateTextInputCalendarProps<T> = Omit<\n SingleDateCalendarProps<T>,\n \"value\" | \"onChange\" | \"theme\"\n>;\n\nexport interface DateTextInputProps<T>\n extends Omit<TextInputProps, \"onChange\" | \"theme\" | \"min\" | \"max\">,\n OptionalMinMaxDatesAsString {\n /** Props to be passed to Calendar, see SingleDateCalendar. */\n calendarProps?: DateTextInputCalendarProps<T>;\n /** Close calendar when date is selected, @default true */\n closeOnCalendarSelectDate?: boolean;\n /** Valid date format, @default YYYY-MM-DD */\n dateFormat?: string;\n /** Make the icon not clickable, @default false */\n disableCalender?: boolean;\n /** Show or hide the calender icon, @default false */\n hideCalenderIcon?: boolean;\n /** Placeholder for the input, @default YYYY-MM-DD */\n placeholder?: string;\n /** The date text input theme to use. */\n calendarTheme?: CalendarTheme;\n /**\n * Portal target for the popover, HTML element. If not set, window.body is used.\n */\n portalTarget?: HTMLElement;\n zIndex?: number;\n}\n\nexport const DateTextInput: React.FC<DateTextInputProps<unknown>> = ({\n calendarProps,\n closeOnCalendarSelectDate = true,\n dateFormat = DateFormats.fullDate,\n disableCalender = false,\n onValueChange,\n placeholder = \"yyyy-mm-dd\",\n value,\n width = \"130px\",\n calendarTheme = defaultCalendarTheme,\n hideCalenderIcon = false,\n minDate,\n maxDate = defaultMaxDate,\n variant,\n portalTarget,\n zIndex,\n ...props\n}) => {\n const [open, setOpen] = useState(false);\n\n const toggleCalendar = useCallback(() => {\n setOpen(!open);\n }, [setOpen, open]);\n\n const hideCalendar = useCallback(() => {\n setOpen(false);\n }, [setOpen]);\n\n const onValueChangeHandler = useCallback(\n (value: string) => {\n if (onValueChange) {\n onValueChange(value);\n }\n },\n [onValueChange],\n );\n\n const onCalendarSelectDate = useCallback(\n (date: Date | undefined) => {\n if (date) {\n onValueChangeHandler(format(date, dateFormat));\n if (closeOnCalendarSelectDate) {\n setTimeout(() => setOpen(!open), 200);\n }\n }\n },\n [\n onValueChangeHandler,\n dateFormat,\n closeOnCalendarSelectDate,\n setOpen,\n open,\n ],\n );\n\n const inValidInput = !!value && !/^[-/\\\\.0-9]+$/.test(value);\n\n const dateIsValid = !!value && isValid(parse(value, dateFormat, new Date()));\n\n const userInputCorrectLength = !!value && value.length >= dateFormat.length;\n\n const invalid: boolean =\n (userInputCorrectLength && !dateIsValid) || inValidInput;\n\n return (\n <Box width={width}>\n <ControlledPopover\n appendTo={portalTarget}\n zIndex={zIndex}\n renderTrigger={({ ref, ...popoverProps }) => (\n <TextInput\n {...props}\n variant={invalid ? \"error\" : variant}\n disableContentPaddingRight\n contentRight={\n !hideCalenderIcon ? (\n <Row alignItems={\"center\"} indent={0.5}>\n <FlatButton\n size={\"small\"}\n disabled={props.disabled || disableCalender}\n leftIcon={stenaCalendar}\n onClick={toggleCalendar}\n />\n </Row>\n ) : undefined\n }\n onValueChange={onValueChangeHandler}\n placeholder={placeholder}\n value={value || \"\"}\n min={minDate}\n max={maxDate}\n size={10}\n inputRef={ref as RefObject<HTMLInputElement>}\n {...popoverProps}\n />\n )}\n hideArrow\n open={open}\n placement={defaultPopoverPlacement}\n onRequestClose={hideCalendar}\n >\n <SingleDateCalendar\n {...calendarProps}\n onChange={onCalendarSelectDate}\n value={\n value && dateIsValid\n ? parse(value, dateFormat, new Date())\n : undefined\n }\n minDate={minDate}\n maxDate={maxDate}\n theme={calendarTheme}\n />\n </ControlledPopover>\n </Box>\n );\n};\n","export interface FormatTimeStringResult {\n time: string;\n success: boolean;\n}\n\nexport const formatHours = (hours: string): string => {\n if (hours === \"\") {\n return \"00\";\n }\n\n const h = parseInt(hours, 10);\n\n if (isNaN(h)) {\n throw new Error(\"Hours is not a number\");\n }\n\n if (h < 0 || h > 23) {\n throw new Error(\"Hours is an invalid number\");\n }\n\n switch (hours.length) {\n case 1:\n return `0${h}`;\n case 2:\n return hours;\n default:\n throw new Error(\"Invalid hour string\");\n }\n};\n\nexport const formatMinutes = (minutes: string): string => {\n if (minutes === \"\") {\n return \"00\";\n }\n\n const m = parseInt(minutes, 10);\n\n if (isNaN(m)) {\n throw new Error(\"Minutes is not a number\");\n }\n\n if (m < 0 || m > 59) {\n throw new Error(\"Minutes is an invalid number\");\n }\n\n switch (minutes.length) {\n case 1:\n return `0${m}`;\n case 2:\n return minutes;\n default:\n throw new Error(\"Invalid minute string\");\n }\n};\n\nexport const formatTimeString = (time: string): FormatTimeStringResult => {\n if (!validUserInput(time)) {\n return { time, success: false };\n }\n\n const arr = time && time.split(/-|:|,|;|[/]|[.]| /); // consider all these chars as user input separator\n if (arr && arr.length === 2) {\n try {\n const hours = formatHours(arr[0]);\n const minutes = formatMinutes(arr[1]);\n return { time: `${hours}:${minutes}`, success: true };\n } catch {\n return { time, success: false };\n }\n } else if (arr && arr.length === 1) {\n let hours = 0;\n let minutes = 0;\n switch (time.length) {\n case 1:\n return { time: `0${time}:00`, success: true };\n case 2: {\n const timeNumber = parseInt(arr[0], 10);\n if (timeNumber >= 0 && timeNumber < 24) {\n return { time: `${time}:00`, success: true };\n } else if (timeNumber >= 24 && timeNumber < 59) {\n return { time: `00:${time}`, success: true };\n }\n return { time, success: false };\n }\n case 3:\n minutes = parseInt(time.substring(1, 3), 10);\n if (minutes >= 0 && minutes <= 59) {\n return {\n time: `0${time.substring(0, 1)}:${time.substring(1, 3)}`,\n success: true,\n };\n }\n return { time, success: false };\n case 4:\n hours = parseInt(time.substring(0, 2), 10);\n minutes = parseInt(time.substring(2, 4), 10);\n if (hours < 0 || hours > 23) {\n return { time, success: false };\n }\n if (minutes < 0 || minutes > 59) {\n return { time, success: false };\n }\n return {\n time: `${time.substring(0, 2)}:${time.substring(2, 4)}`,\n success: true,\n };\n default:\n return { time, success: false };\n }\n }\n\n return { time, success: false };\n};\n\nexport const validUserInput = (input: string | undefined): boolean => {\n if (input) {\n return /^[-:.,/; 0-9]+$/.test(input);\n }\n\n return true;\n};\n","import { Omit } from \"@stenajs-webui/core\";\nimport { TextInput, TextInputProps } from \"@stenajs-webui/forms\";\nimport * as React from \"react\";\nimport { ChangeEventHandler, useCallback, useState } from \"react\";\nimport {\n formatTimeString,\n validUserInput,\n} from \"../../../util/time/TimeStringFormatValidator\";\n\nimport { stenaClock } from \"@stenajs-webui/elements\";\n\nexport interface TimeTextInputProps extends Omit<TextInputProps, \"onChange\"> {\n /** Show placeholder when true */\n showPlaceholder?: boolean;\n /** Show icon when true */\n useIcon?: boolean;\n /** Variant of the input field. */\n variant?: TextInputProps[\"variant\"];\n}\n\n/**\n * @deprecated\n */\nexport const TimeTextInput: React.FC<TimeTextInputProps> = ({\n onValueChange,\n showPlaceholder = true,\n useIcon = true,\n value,\n width = \"85px\",\n variant,\n ...props\n}) => {\n const [valid, setValid] = useState(() => validUserInput(value));\n\n const timeFormat = \"hh:mm\";\n\n const onBlur = useCallback(() => {\n if (value) {\n const formattedResult = formatTimeString(value);\n setValid(formattedResult.success);\n if (formattedResult.success) {\n if (onValueChange) {\n onValueChange(formattedResult.time);\n }\n }\n }\n }, [value, onValueChange, setValid]);\n\n const onChangeHandler = useCallback<ChangeEventHandler<HTMLInputElement>>(\n (ev) => {\n const time = ev.target.value;\n const validInput = validUserInput(time);\n\n setValid(validInput && time.length <= timeFormat.length);\n\n if (onValueChange) {\n onValueChange(time);\n }\n },\n [onValueChange, setValid],\n );\n\n return (\n <TextInput\n {...props}\n type={\"time\"}\n variant={!valid ? \"error\" : variant}\n iconLeft={useIcon ? stenaClock : undefined}\n value={value}\n placeholder={showPlaceholder ? timeFormat : undefined}\n onChange={onChangeHandler}\n onBlur={onBlur}\n width={width}\n />\n );\n};\n","import { IconDefinition } from \"@fortawesome/fontawesome-svg-core\";\nimport {\n Box,\n BoxProps,\n ButtonElementProps,\n Indent,\n Row,\n SeparatorLine,\n} from \"@stenajs-webui/core\";\nimport {\n FlatButton,\n Icon,\n stenaCalendar,\n stenaAngleDown,\n} from \"@stenajs-webui/elements\";\nimport {\n TextInput,\n TextInputBox,\n TextInputBoxProps,\n TextInputProps,\n} from \"@stenajs-webui/forms\";\nimport { debounce } from \"lodash-es\";\nimport * as React from \"react\";\nimport { FocusEventHandler, useCallback, useMemo, useRef } from \"react\";\nimport { cssColor } from \"@stenajs-webui/theme\";\n\nexport interface DualTextInputProps {\n onEsc?: TextInputProps[\"onEsc\"];\n onEnter?: TextInputProps[\"onEnter\"];\n widthLeft?: BoxProps[\"width\"];\n widthRight?: BoxProps[\"width\"];\n valueLeft?: TextInputProps[\"value\"];\n valueRight?: TextInputProps[\"value\"];\n minLeft?: string;\n maxLeft?: string;\n minRight?: string;\n maxRight?: string;\n typeLeft?: TextInputProps[\"type\"];\n typeRight?: TextInputProps[\"type\"];\n separatorIcon?: IconDefinition;\n placeholderLeft?: TextInputProps[\"placeholder\"];\n placeholderRight?: TextInputProps[\"placeholder\"];\n onValueChangeLeft?: TextInputProps[\"onValueChange\"];\n onValueChangeRight?: TextInputProps[\"onValueChange\"];\n onChangeLeft?: TextInputProps[\"onChange\"];\n onChangeRight?: TextInputProps[\"onChange\"];\n onClickLeft?: TextInputProps[\"onClick\"];\n onClickRight?: TextInputProps[\"onClick\"];\n onClickCalendar?: ButtonElementProps[\"onClick\"];\n onClickArrowDown?: ButtonElementProps[\"onClick\"];\n onFocusLeft?: TextInputProps[\"onFocus\"];\n onFocusRight?: TextInputProps[\"onFocus\"];\n onBlur?: () => void;\n onBlurLeft?: TextInputProps[\"onBlur\"];\n onBlurRight?: TextInputProps[\"onBlur\"];\n inputRefLeft?: TextInputProps[\"inputRef\"];\n inputRefRight?: TextInputProps[\"inputRef\"];\n variantLeft?: TextInputProps[\"variant\"];\n variantRight?: TextInputProps[\"variant\"];\n variant?: TextInputBoxProps[\"variant\"];\n showPresets?: false;\n autoFocusLeft?: boolean;\n autoFocusRight?: boolean;\n disabled?: boolean;\n}\n\nexport const DualTextInput: React.FC<DualTextInputProps> = ({\n autoFocusLeft,\n autoFocusRight,\n onEsc,\n onEnter,\n onValueChangeLeft,\n onValueChangeRight,\n separatorIcon,\n placeholderLeft,\n placeholderRight,\n typeLeft,\n typeRight,\n onChangeLeft,\n onChangeRight,\n valueLeft,\n valueRight,\n minLeft,\n maxLeft,\n minRight,\n maxRight,\n onClickLeft,\n onClickRight,\n onClickCalendar,\n onClickArrowDown,\n onBlurLeft,\n onBlurRight,\n onFocusLeft,\n onFocusRight,\n inputRefLeft,\n inputRefRight,\n variant,\n variantLeft,\n variantRight,\n onBlur,\n showPresets,\n widthLeft,\n widthRight,\n disabled,\n}) => {\n const focusCounter = useRef(0);\n\n const tryTriggerOnBlur = useMemo(\n () =>\n debounce((focusCounter: number) => {\n if (focusCounter === 0) {\n onBlur?.();\n }\n }, 10),\n [onBlur],\n );\n\n const focusLeftHandler = useCallback<FocusEventHandler<HTMLInputElement>>(\n (ev) => {\n focusCounter.current++;\n tryTriggerOnBlur(focusCounter.current);\n if (onFocusLeft) {\n onFocusLeft(ev);\n }\n },\n [onFocusLeft, focusCounter, tryTriggerOnBlur],\n );\n\n const focusRightHandler = useCallback<FocusEventHandler<HTMLInputElement>>(\n (ev) => {\n focusCounter.current++;\n tryTriggerOnBlur(focusCounter.current);\n if (onFocusRight) {\n onFocusRight(ev);\n }\n },\n [onFocusRight, focusCounter, tryTriggerOnBlur],\n );\n\n const blurLeftHandler = useCallback<FocusEventHandler<HTMLInputElement>>(\n (ev) => {\n focusCounter.current--;\n tryTriggerOnBlur(focusCounter.current);\n if (onBlurLeft) {\n onBlurLeft(ev);\n }\n },\n [onBlurLeft, focusCounter, tryTriggerOnBlur],\n );\n\n const blurRightHandler = useCallback<FocusEventHandler<HTMLInputElement>>(\n (ev) => {\n focusCounter.current--;\n tryTriggerOnBlur(focusCounter.current);\n if (onBlurRight) {\n onBlurRight(ev);\n }\n },\n [onBlurRight, focusCounter, tryTriggerOnBlur],\n );\n\n return (\n <Box>\n <TextInputBox\n disableContentPaddingRight\n disabled={disabled}\n variant={variant}\n contentRight={\n <Row alignItems={\"center\"}>\n <Indent num={0.5}>\n <FlatButton\n leftIcon={stenaCalendar}\n onClick={onClickCalendar}\n disabled={disabled}\n size={\"small\"}\n />\n </Indent>\n\n {showPresets ? (\n <>\n <Row height={\"22px\"}>\n <SeparatorLine vertical />\n </Row>\n\n <Indent num={0.5}>\n <FlatButton\n leftIcon={stenaAngleDown}\n onClick={onClickArrowDown}\n disabled={disabled}\n size={\"small\"}\n />\n </Indent>\n </>\n ) : null}\n </Row>\n }\n >\n <Box width={widthLeft}>\n <TextInput\n onEsc={onEsc}\n onEnter={onEnter}\n onClick={onClickLeft}\n disabled={disabled}\n hideBorder\n placeholder={placeholderLeft}\n value={valueLeft}\n onValueChange={onValueChangeLeft}\n onChange={onChangeLeft}\n onBlur={blurLeftHandler}\n onFocus={focusLeftHandler}\n inputRef={inputRefLeft}\n variant={variantLeft}\n type={typeLeft}\n autoFocus={autoFocusLeft}\n min={minLeft}\n max={maxLeft}\n />\n </Box>\n <Row indent={0.5} alignItems={\"center\"} justifyContent={\"center\"}>\n <Icon\n icon={separatorIcon}\n size={12}\n color={cssColor(\"--lhds-color-ui-500\")}\n />\n </Row>\n <Box width={widthRight}>\n <TextInput\n onEsc={onEsc}\n onEnter={onEnter}\n onClick={onClickRight}\n disabled={disabled}\n hideBorder\n placeholder={placeholderRight}\n value={valueRight}\n onValueChange={onValueChangeRight}\n onChange={onChangeRight}\n onBlur={blurRightHandler}\n onFocus={focusRightHandler}\n inputRef={inputRefRight}\n variant={variantRight}\n type={typeRight}\n autoFocus={autoFocusRight}\n min={minRight}\n max={maxRight}\n />\n </Box>\n </TextInputBox>\n </Box>\n );\n};\n","import { parseIntElseUndefined } from \"@stenajs-webui/core\";\nimport { formatHours, formatMinutes } from \"./TimeStringFormatValidator\";\n\nexport const transformNumberTimeToString = (\n time: number | undefined | null,\n): string | undefined => {\n if (time == null) {\n return undefined;\n }\n const timeStr = time.toString();\n if (timeStr.length === 3) {\n return `${timeStr.substr(0, 1)}:${timeStr.substr(1, 2)}`;\n }\n if (timeStr.length === 4) {\n return `${timeStr.substr(0, 2)}:${timeStr.substr(2, 2)}`;\n }\n if (timeStr.length === 2) {\n return `0:${timeStr}`;\n }\n if (timeStr.length === 1) {\n return `0:0${timeStr}`;\n }\n throw new Error(\"Invalid time number.\");\n};\n\nexport const transformTimeStringToNumber = (\n time: string | undefined | null,\n): number | null => {\n if (time == null) {\n throw new Error(\"Time is not set.\");\n }\n if (time === \"\") {\n throw new Error(\"Time is empty.\");\n }\n const parts = time.split(\":\");\n if (parts.length !== 2) {\n throw new Error(\"Invalid time.\");\n }\n\n if (parts[1].length !== 2) {\n throw new Error(\"Invalid time.\");\n }\n\n if (parts[0].length < 1 || parts[0].length > 2) {\n throw new Error(\"Invalid time.\");\n }\n\n const hours = parseInt(parts[0], 10);\n const minutes = parseInt(parts[1], 10);\n\n if (isNaN(hours)) {\n throw new Error(\"Invalid time.\");\n }\n if (isNaN(minutes)) {\n throw new Error(\"Invalid time.\");\n }\n if (hours < 0 || hours > 23) {\n throw new Error(\"Invalid time.\");\n }\n if (minutes < 0 || minutes > 59) {\n throw new Error(\"Invalid time.\");\n }\n return hours * 100 + minutes;\n};\n\nexport const isValidTimeString = (time: string | undefined): boolean => {\n try {\n transformTimeStringToNumber(time);\n return true;\n } catch {\n return false;\n }\n};\n\nexport const getHoursAndMinutesFromTimeString = (\n value: string | undefined,\n): {\n hour: number | undefined;\n minute: number | undefined;\n} => {\n if (value && isValidTimeString(value)) {\n const p = value.split(\":\");\n return {\n hour: parseIntElseUndefined(p[0]),\n minute: parseIntElseUndefined(p[1]),\n };\n }\n return {\n hour: undefined,\n minute: undefined,\n };\n};\n\nexport const transformTimeInDateToTimeString = (date: Date): string =>\n `${formatHours(String(date.getHours()))}:${formatMinutes(\n String(date.getMinutes()),\n )}`;\n","import { Row } from \"@stenajs-webui/core\";\nimport { FlatButton, PrimaryButton } from \"@stenajs-webui/elements\";\nimport * as React from \"react\";\nimport { RefObject, useEffect, useRef } from \"react\";\nimport { padStart } from \"lodash-es\";\n\nexport interface TimePickerCellProps {\n item: number;\n selected?: boolean;\n onClick: (label: number) => void;\n columnRef: RefObject<HTMLDivElement | null>;\n canScrollRef: RefObject<boolean>;\n}\n\nexport const TimePickerCell: React.FC<TimePickerCellProps> = ({\n onClick,\n item,\n selected,\n columnRef,\n canScrollRef,\n}) => {\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(\n function scrollToSelectedItem() {\n if (\n selected &&\n columnRef.current &&\n ref.current &&\n canScrollRef.current\n ) {\n const targetScroll = ref.current.scrollHeight * Math.max(item - 2, 0);\n columnRef.current.scrollTo(0, targetScroll);\n canScrollRef.current = false;\n }\n },\n [columnRef, item, selected, canScrollRef],\n );\n\n return (\n <Row\n width={\"64px\"}\n justifyContent={\"center\"}\n spacing={0.5}\n indent={0.5}\n ref={ref}\n >\n {selected ? (\n <PrimaryButton\n label={padStart(String(item), 2, \"0\")}\n onClick={() => onClick && onClick(item)}\n />\n ) : (\n <FlatButton\n label={String(item).padStart(2, \"0\")}\n onClick={() => onClick && onClick(item)}\n />\n )}\n </Row>\n );\n};\n","import { Column } from \"@stenajs-webui/core\";\nimport * as React from \"react\";\nimport { MutableRefObject, useRef } from \"react\";\nimport styles from \"./TimePicker.module.css\";\nimport { TimePickerCell } from \"./TimePickerCell\";\n\ninterface Props {\n items: Array<number>;\n onClick: (item: number) => void;\n selectedItem: number | undefined;\n canScrollRef: MutableRefObject<boolean>;\n}\n\nexport const TimePickerColumn: React.FC<Props> = ({\n onClick,\n items,\n selectedItem,\n canScrollRef,\n}) => {\n const columnRef = useRef<HTMLDivElement>(null);\n\n return (\n <Column className={styles.timePickerColumn} ref={columnRef}>\n {items.map((item) => (\n <TimePickerCell\n key={item}\n item={item}\n onClick={onClick}\n selected={item === selectedItem}\n columnRef={columnRef}\n canScrollRef={canScrollRef}\n />\n ))}\n </Column>\n );\n};\n","import { Indent, Row } from \"@stenajs-webui/core\";\nimport { ValueAndOnValueChangeProps } from \"@stenajs-webui/forms\";\nimport { range } from \"lodash-es\";\nimport * as React from \"react\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport {\n formatHours,\n formatMinutes,\n} from \"../../util/time/TimeStringFormatValidator\";\nimport { getHoursAndMinutesFromTimeString } from \"../../util/time/TimeTransformer\";\nimport styles from \"./TimePicker.module.css\";\nimport { TimePickerColumn } from \"./TimePickerColumn\";\n\nexport interface TimePickerProps extends ValueAndOnValueChangeProps<string> {}\n\nconst hours = range(0, 24);\nconst minutes = range(0, 60);\n\nexport const TimePicker: React.FC<TimePickerProps> = ({\n value,\n onValueChange,\n}) => {\n const canScrollRef = useRef(true);\n const [hour, setHour] = useState<number | undefined>(undefined);\n const [minute, setMinute] = useState<number | undefined>(undefined);\n\n useEffect(() => {\n if (value) {\n const { minute, hour } = getHoursAndMinutesFromTimeString(value);\n setHour(hour);\n setMinute(minute);\n }\n }, [value]);\n\n const onClickHour = useCallback(\n (h: number) => {\n setHour(h);\n onValueChange?.(\n `${formatHours(String(h ?? 0))}:${formatMinutes(String(minute ?? 0))}`,\n );\n },\n [minute, onValueChange],\n );\n\n const onClickMinutes = useCallback(\n (m: number) => {\n setMinute(m);\n onValueChange?.(\n `${formatHours(String(hour ?? 0))}:${formatMinutes(String(m ?? 0))}`,\n );\n },\n [hour, onValueChange],\n );\n\n return (\n <Row className={styles.timePicker}>\n <TimePickerColumn\n items={hours}\n onClick={onClickHour}\n selectedItem={hour}\n canScrollRef={canScrollRef}\n />\n <Indent />\n <TimePickerColumn\n items={minutes}\n onClick={onClickMinutes}\n selectedItem={minute}\n canScrollRef={canScrollRef}\n />\n </Row>\n );\n};\n","import { RefObject, useEffect } from \"react\";\n\nexport const useDateRangeEffects = (\n date: Date | undefined | null,\n setDateInFocus: (date: Date) => void,\n dateInputRef: RefObject<HTMLInputElement | null>,\n) => {\n useEffect(\n function moveFocusedDateWhenDateChanges() {\n if (date) {\n setDateInFocus(date);\n }\n },\n [date, setDateInFocus],\n );\n\n useEffect(\n function updateDateFieldWhenValueChanges() {\n if (dateInputRef.current) {\n if (date) {\n dateInputRef.current.valueAsDate = new Date(\n Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()),\n );\n } else {\n dateInputRef.current.valueAsDate = null;\n }\n }\n },\n [date, dateInputRef],\n );\n};\n","import { ChangeEvent, RefObject, useCallback } from \"react\";\nimport { getHoursAndMinutesFromTimeString } from \"../../../../util/time/TimeTransformer\";\nimport { DateTimeInputProps } from \"../DateTimeInput\";\nimport { UseInputStatesResult } from \"./UseInputStates\";\n\nexport const useDateRangeHandlers = (\n date: Date | undefined | null,\n onValueChange: DateTimeInputProps[\"onValueChange\"],\n {\n setDateInFocus,\n showCalendarInternal,\n hideCalendarInternal,\n setFirstFocusedInput,\n setCurrentPanel,\n localTime,\n setLocalTime,\n localDate,\n setLocalDate,\n }: UseInputStatesResult,\n dateInputRef: RefObject<HTMLInputElement | null>,\n) => {\n const onChangeDate = useCallback(\n (incomingDate: Date | null) => {\n if (!incomingDate) {\n return;\n }\n const newDate = new Date(incomingDate);\n\n if (date) {\n // Full date is available\n\n newDate.setHours(date.getHours());\n newDate.setMinutes(date.getMinutes());\n\n onValueChange?.(newDate);\n setLocalDate(undefined);\n } else if (localTime) {\n // Only time has been selected\n const { minute, hour } = getHoursAndMinutesFromTimeString(localTime);\n\n newDate.setHours(hour ?? 0);\n newDate.setMinutes(minute ?? 0);\n\n onValueChange?.(newDate);\n setLocalDate(undefined);\n } else {\n // Nothing has been selected\n setLocalDate(newDate);\n }\n setDateInFocus(newDate);\n if (dateInputRef.current) {\n dateInputRef.current.valueAsDate = new Date(\n Date.UTC(\n newDate.getFullYear(),\n newDate.getMonth(),\n newDate.getDate(),\n ),\n );\n }\n },\n [\n date,\n dateInputRef,\n localTime,\n onValueChange,\n setDateInFocus,\n setLocalDate,\n ],\n );\n\n const onChangeTime = useCallback(\n (time: string) => {\n if (!time) {\n return;\n }\n\n if (date) {\n // Full date is available\n const newTime = getHoursAndMinutesFromTimeString(time);\n const newDate = new Date(date);\n\n newDate.setHours(newTime.hour || 0);\n newDate.setMinutes(newTime.minute || 0);\n\n onValueChange?.(newDate);\n setLocalTime(undefined);\n } else if (localDate) {\n // Only date has already been selected\n const newTime = getHoursAndMinutesFromTimeString(time);\n const newDate = new Date(localDate);\n\n newDate.setHours(newTime.hour || 0);\n newDate.setMinutes(newTime.minute || 0);\n\n onValueChange?.(newDate);\n setLocalTime(undefined);\n } else {\n // Nothing has been selected\n setLocalTime(time);\n }\n },\n [onValueChange, date, localDate, setLocalTime],\n );\n\n const inputLeftChangeHandler = useCallback(\n (ev: ChangeEvent<HTMLInputElement>) => {\n if (ev.target.value[0] !== \"0\") {\n onChangeDate(ev.target.valueAsDate);\n }\n },\n [onChangeDate],\n );\n\n const inputRightChangeHandler = useCallback(\n (ev: ChangeEvent<HTMLInputElement>) => onChangeTime(ev.target.value),\n [onChangeTime],\n );\n\n const showCalendar = useCallback(() => {\n if (date) {\n setDateInFocus(date);\n } else {\n setDateInFocus(new Date());\n }\n setCurrentPanel(\"calendar\");\n showCalendarInternal();\n }, [date, setCurrentPanel, showCalendarInternal, setDateInFocus]);\n\n const hideCalendar = useCallback(() => {\n setFirstFocusedInput(undefined);\n hideCalendarInternal();\n }, [setFirstFocusedInput, hideCalendarInternal]);\n\n return {\n inputLeftChangeHandler,\n inputRightChangeHandler,\n hideCalendar,\n showCalendar,\n onChangeTime,\n onChangeDate,\n };\n};\n","import { useBoolean } from \"@stenajs-webui/core\";\nimport { useState } from \"react\";\nimport { DateRangeFocusedInput } from \"../../../calendar-types/date-range-calendar/DateRangeCalendar\";\nimport { CalendarPanelType } from \"../../../../features/calendar-with-month-year-pickers/CalendarPanelType\";\n\nexport type UseInputStatesResult = ReturnType<typeof useInputStates>;\n\nexport const useInputStates = (date: Date | undefined | null) => {\n const [localDate, setLocalDate] = useState<Date | undefined>(undefined);\n const [localTime, setLocalTime] = useState<string | undefined>(undefined);\n\n const [isCalendarVisible, showCalendarInternal, hideCalendarInternal] =\n useBoolean(false);\n\n const [isTimePickerVisible, showTimePicker, hideTimePicker] =\n useBoolean(false);\n\n const [firstFocusedInput, setFirstFocusedInput] = useState<\n DateRangeFocusedInput | undefined\n >(undefined);\n\n const [dateInFocus, setDateInFocus] = useState<Date>(\n () => date ?? new Date(),\n );\n\n const [currentPanel, setCurrentPanel] =\n useState<CalendarPanelType>(\"calendar\");\n\n return {\n isCalendarVisible,\n showCalendarInternal,\n hideCalendarInternal,\n firstFocusedInput,\n setFirstFocusedInput,\n dateInFocus,\n setDateInFocus,\n currentPanel,\n setCurrentPanel,\n isTimePickerVisible,\n showTimePicker,\n hideTimePicker,\n localDate,\n setLocalDate,\n localTime,\n setLocalTime,\n };\n};\n","import * as React from \"react\";\nimport { RefObject, useCallback } from \"react\";\nimport { DayData } from \"../../../../util/calendar/CalendarDataFactory\";\nimport { UseInputStatesResult } from \"./UseInputStates\";\n\nexport const useUserInputHandlers = (\n onChangeDate: (incomingDate: Date | null) => void,\n dateInputRef: RefObject<HTMLInputElement | null>,\n showCalendar: () => void,\n hideCalendar: () => void,\n {\n isCalendarVisible,\n setCurrentPanel,\n showTimePicker,\n hideTimePicker,\n }: UseInputStatesResult,\n) => {\n const onFocusLeft = useCallback(() => {\n if (!isCalendarVisible) {\n showCalendar();\n }\n setCurrentPanel(\"calendar\");\n hideTimePicker();\n }, [hideTimePicker, isCalendarVisible, setCurrentPanel, showCalendar]);\n\n const onFocusRight = useCallback(() => {\n hideCalendar();\n showTimePicker();\n }, [hideCalendar, showTimePicker]);\n\n const onClickDay = useCallback(\n (day: DayData) => {\n onChangeDate(day.date);\n hideCalendar();\n showTimePicker();\n },\n [onChangeDate, hideCalendar, showTimePicker],\n );\n\n const onClickArrowButton = useCallback(() => {\n setCurrentPanel(\"presets\");\n showCalendar();\n }, [setCurrentPanel, showCalendar]);\n\n const onClickCalendarButton = useCallback(() => {\n if (isCalendarVisible) {\n hideCalendar();\n } else {\n dateInputRef.current?.focus();\n setCurrentPanel(\"calendar\");\n showCalendar();\n }\n }, [\n isCalendarVisible,\n hideCalendar,\n dateInputRef,\n setCurrentPanel,\n showCalendar,\n ]);\n\n const onKeyDownHandler = useCallback(\n (ev: React.KeyboardEvent<HTMLDivElement>) => {\n if (ev.key === \"Escape\") {\n hideCalendar();\n }\n },\n [hideCalendar],\n );\n\n return {\n onFocusLeft,\n onFocusRight,\n onClickDay,\n onClickArrowButton,\n onClickCalendarButton,\n onKeyDownHandler,\n };\n};\n","import { Box, Column, Row, Space, useDelayedFalse } from \"@stenajs-webui/core\";\nimport { PrimaryButton, stenaClock } from \"@stenajs-webui/elements\";\nimport {\n TextInputProps,\n ValueAndOnValueChangeProps,\n} from \"@stenajs-webui/forms\";\nimport {\n ControlledPopover,\n ControlledPopoverProps,\n} from \"@stenajs-webui/tooltip\";\nimport * as React from \"react\";\nimport { useCallback, useMemo, useRef } from \"react\";\nimport { defaultPopoverPlacement } from \"../../../config/DefaultPopoverPlacement\";\nimport {\n DualTextInput,\n DualTextInputProps,\n} from \"../../../features/dual-text-input/DualTextInput\";\nimport { CalendarWithMonthSwitcher } from \"../../../features/month-switcher/CalendarWithMonthSwitcher\";\nimport { TimePicker } from \"../../../features/time-picker/TimePicker\";\nimport { addDayStateHighlights } from \"../../../util/calendar/StateModifier\";\nimport { transformTimeInDateToTimeString } from \"../../../util/time/TimeTransformer\";\nimport { useDateRangeEffects } from \"./hooks/UseDateRangeEffects\";\nimport { useDateRangeHandlers } from \"./hooks/UseDateRangeHandlers\";\nimport { useInputStates } from \"./hooks/UseInputStates\";\nimport { useUserInputHandlers } from \"./hooks/UseUserInputHandlers\";\nimport { OptionalMinMaxDatesAsString } from \"../../../types/CalendarTypes\";\nimport { defaultMaxDate } from \"../../../config/DefaultMaxDate\";\n\nexport interface DateTimeInputProps\n extends ValueAndOnValueChangeProps<Date | null>,\n OptionalMinMaxDatesAsString,\n Pick<DualTextInputProps, \"widthLeft\" | \"widthRight\" | \"variant\">,\n Pick<ControlledPopoverProps, \"zIndex\" | \"appendTo\"> {\n onEsc?: () => void;\n onEnter?: () => void;\n onBlur?: () => void;\n autoFocus?: boolean;\n disabled?: boolean;\n}\n\nexport const DateTimeInput: React.FC<DateTimeInputProps> = ({\n value,\n onValueChange,\n onEnter,\n onEsc,\n onBlur,\n autoFocus,\n minDate,\n widthLeft = 128,\n widthRight = 80,\n maxDate = defaultMaxDate,\n variant,\n disabled,\n zIndex,\n appendTo,\n}) => {\n const dateInputRef: TextInputProps[\"inputRef\"] = useRef(null);\n const timeInputRef: TextInputProps[\"inputRef\"] = useRef(null);\n\n const states = useInputStates(value);\n\n const {\n setCurrentPanel,\n currentPanel,\n isCalendarVisible,\n dateInFocus,\n setDateInFocus,\n isTimePickerVisible,\n hideTimePicker,\n localTime,\n localDate,\n } = states;\n\n const {\n showCalendar,\n hideCalendar,\n inputLeftChangeHandler,\n inputRightChangeHandler,\n onChangeTime,\n onChangeDate,\n } = useDateRangeHandlers(value, onValueChange, states, dateInputRef);\n\n const {\n onKeyDownHandler,\n onFocusRight,\n onFocusLeft,\n onClickDay,\n onClickCalendarButton,\n onClickArrowButton,\n } = useUserInputHandlers(\n onChangeDate,\n dateInputRef,\n showCalendar,\n hideCalendar,\n states,\n );\n\n useDateRangeEffects(value, setDateInFocus, dateInputRef);\n\n const statePerMonth = useMemo(() => {\n const dateToHighlight = value || localDate;\n if (!dateToHighlight) {\n return {};\n }\n return addDayStateHighlights(undefined, dateToHighlight, [\n \"singleSelected\",\n \"selected\",\n ]);\n }, [localDate, value]);\n\n const hideAll = useCallback(() => {\n hideCalendar();\n hideTimePicker();\n }, [hideCalendar, hideTimePicker]);\n\n const timeValue = useMemo<string | undefined>(\n () => (value ? transformTimeInDateToTimeString(value) : localTime),\n [value, localTime],\n );\n\n const delayedIsCalendarVisible = useDelayedFalse(isCalendarVisible, 300);\n const delayedIsTimePickerVisible = useDelayedFalse(isTimePickerVisible, 300);\n\n return (\n <Box onKeyDown={onKeyDownHandler}>\n <ControlledPopover\n hideArrow\n zIndex={zIndex}\n appendTo={appendTo}\n renderTrigger={(props) => (\n <Box {...props}>\n <DualTextInput\n autoFocusLeft={autoFocus}\n onEsc={onEsc}\n onEnter={onEnter}\n onBlur={onBlur}\n disabled={disabled}\n separatorIcon={stenaClock}\n typeLeft={\"date\"}\n typeRight={\"time\"}\n placeholderLeft={\"yyyy-mm-dd\"}\n placeholderRight={\"hh:mm\"}\n onChangeLeft={inputLeftChangeHandler}\n onChangeRight={inputRightChangeHandler}\n onClickArrowDown={onClickArrowButton}\n onClickCalendar={onClickCalendarButton}\n onFocusLeft={onFocusLeft}\n onFocusRight={onFocusRight}\n onClickLeft={onFocusLeft}\n onClickRight={onFocusRight}\n inputRefLeft={dateInputRef}\n inputRefRight={timeInputRef}\n valueRight={timeValue ?? \"\"}\n widthLeft={widthLeft}\n widthRight={widthRight}\n minLeft={minDate}\n maxLeft={maxDate}\n variant={variant}\n />\n </Box>\n )}\n placement={defaultPopoverPlacement}\n open={isCalendarVisible || isTimePickerVisible}\n onRequestClose={hideAll}\n >\n {(delayedIsCalendarVisible || delayedIsTimePickerVisible) && (\n <Column>\n {delayedIsCalendarVisible ? (\n <CalendarWithMonthSwitcher\n statePerMonth={statePerMonth}\n onClickDay={onClickDay}\n dateInFocus={dateInFocus}\n setDateInFocus={setDateInFocus}\n currentPanel={currentPanel}\n setCurrentPanel={setCurrentPanel}\n minDate={minDate}\n maxDate={maxDate}\n />\n ) : delayedIsTimePickerVisible ? (\n <Column>\n <Column overflow={\"hidden\"} height={\"250px\"}>\n <TimePicker\n value={timeValue ?? \"\"}\n onValueChange={onChangeTime}\n />\n </Column>\n <Space />\n <Row justifyContent={\"flex-end\"}>\n <PrimaryButton label={\"Done\"} onClick={hideTimePicker} />\n </Row>\n </Column>\n ) : null}\n </Column>\n )}\n </ControlledPopover>\n </Box>\n );\n};\n","import * as React from \"react\";\nimport { Row } from \"@stenajs-webui/core\";\nimport { FlatButton, PrimaryButton } from \"@stenajs-webui/elements\";\nimport { ValueAndOnValueChangeProps } from \"@stenajs-webui/forms\";\n\ninterface Props extends ValueAndOnValueChangeProps<number> {\n year: number;\n}\n\nexport const YearPickerCell: React.FC<Props> = ({\n value,\n onValueChange,\n year,\n}) => {\n const label = String(year);\n return (\n <Row justifyContent={\"center\"}>\n {value === year ? (\n <PrimaryButton label={label} onClick={() => onValueChange?.(year)} />\n ) : (\n <FlatButton label={label} onClick={() => onValueChange?.(year)} />\n )}\n </Row>\n );\n};\n","import * as React from \"react\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport { ValueAndOnValueChangeProps } from \"@stenajs-webui/forms\";\nimport { Column, Row } from \"@stenajs-webui/core\";\nimport { YearPickerCell } from \"./YearPickerCell\";\nimport {\n FlatButton,\n stenaArrowLeft,\n stenaArrowRight,\n} from \"@stenajs-webui/elements\";\nimport { chunk, range } from \"lodash-es\";\n\nexport interface YearPickerProps extends ValueAndOnValueChangeProps<number> {\n initialLastYear?: number;\n}\n\nexport const YearPicker: React.FC<YearPickerProps> = ({\n value,\n onValueChange,\n initialLastYear,\n}) => {\n const [lastYear, setLastYear] = useState(() => {\n if (value) {\n return value + 4;\n }\n return initialLastYear ?? new Date().getFullYear() + 4;\n });\n\n const yearRows = useMemo(() => {\n const startYear = lastYear - 11;\n return chunk(range(startYear, lastYear + 1), 3);\n }, [lastYear]);\n\n useEffect(() => {\n setLastYear((prev) => calculateLastYearInFocus(value, prev));\n }, [value]);\n\n return (\n <Row>\n <Column justifyContent={\"center\"}>\n <FlatButton\n leftIcon={stenaArrowLeft}\n onClick={() => setLastYear(lastYear - 3)}\n />\n </Column>\n <Column gap={1}>\n {yearRows.map((yearRow) => (\n <Row key={yearRow[0]} gap={1}>\n {yearRow.map((year) => (\n <YearPickerCell\n key={year}\n year={year}\n onValueChange={onValueChange}\n value={value}\n />\n ))}\n </Row>\n ))}\n </Column>\n <Column justifyContent={\"center\"}>\n <FlatButton\n leftIcon={stenaArrowRight}\n onClick={() => setLastYear(lastYear + 3)}\n />\n </Column>\n </Row>\n );\n};\n\nconst calculateLastYearInFocus = (\n value: number | undefined,\n lastYear: number,\n): number => {\n if (value == null) {\n return lastYear;\n }\n if (value > lastYear) {\n const yearDiff = value - lastYear;\n const remaining = yearDiff % 3;\n const yearsToAdd = yearDiff - remaining + 3;\n return lastYear + yearsToAdd;\n }\n const startYear = lastYear - 11;\n if (value < startYear) {\n const yearDiff = startYear - value;\n const remaining = yearDiff % 3;\n const yearsToSubtract = yearDiff - remaining + 3;\n return lastYear - yearsToSubtract;\n }\n\n return lastYear;\n};\n","import { RefObject, useEffect } from \"react\";\n\nexport const useDateRangeEffects = (\n startDate: Date | undefined,\n endDate: Date | undefined,\n setDateInFocus: (date: Date) => void,\n startDateInputRef: RefObject<HTMLInputElement | null>,\n endDateInputRef: RefObject<HTMLInputElement | null>,\n) => {\n useEffect(\n function moveFocusedDateWhenStartDateChanges() {\n if (startDate) {\n setDateInFocus(startDate);\n }\n },\n [startDate, setDateInFocus],\n );\n\n useEffect(\n function moveFocusedDateWhenEndDateChanges() {\n if (endDate) {\n setDateInFocus(endDate);\n }\n },\n [endDate, setDateInFocus],\n );\n\n useEffect(\n function updateStartDateFieldWhenValueChanges() {\n if (startDateInputRef.current) {\n if (startDate) {\n startDateInputRef.current.valueAsDate = new Date(\n Date.UTC(\n startDate.getFullYear(),\n startDate.getMonth(),\n startDate.getDate(),\n ),\n );\n } else {\n startDateInputRef.current.valueAsDate = null;\n }\n }\n },\n [startDate, startDateInputRef],\n );\n\n useEffect(\n function updateEndDateFieldWhenValueChanges() {\n if (endDateInputRef.current) {\n if (endDate) {\n endDateInputRef.current.valueAsDate = new Date(\n Date.UTC(\n endDate.getFullYear(),\n endDate.getMonth(),\n endDate.getDate(),\n ),\n );\n } else {\n endDateInputRef.current.valueAsDate = null;\n }\n }\n },\n [endDate, endDateInputRef],\n );\n};\n","import { ChangeEvent, useCallback } from \"react\";\nimport { DateRangeDualTextInputProps } from \"../DateRangeDualTextInput\";\nimport { UseInputStatesResult } from \"./UseInputStates\";\n\nexport const useDateRangeHandlers = (\n startDate: Date | undefined,\n endDate: Date | undefined,\n onValueChange: DateRangeDualTextInputProps[\"onValueChange\"],\n {\n setDateInFocus,\n showCalendarInternal,\n hideCalendarInternal,\n setFirstFocusedInput,\n setCurrentPanel,\n }: UseInputStatesResult,\n) => {\n const inputLeftChangeHandler = useCallback(\n (ev: ChangeEvent<HTMLInputElement>) => {\n if (ev.target.value[0] !== \"0\") {\n onValueChange?.({\n startDate: ev.target.valueAsDate ?? undefined,\n endDate,\n });\n }\n },\n [onValueChange, endDate],\n );\n\n const inputRightChangeHandler = useCallback(\n (ev: ChangeEvent<HTMLInputElement>) => {\n if (ev.target.value[0] !== \"0\") {\n onValueChange?.({\n startDate,\n endDate: ev.target.valueAsDate ?? undefined,\n });\n }\n },\n [onValueChange, startDate],\n );\n\n const showCalendar = useCallback(\n (dateInFocus?: Date) => {\n if (dateInFocus != null) {\n setDateInFocus(dateInFocus);\n } else if (startDate) {\n setDateInFocus(startDate);\n } else if (endDate) {\n setDateInFocus(endDate);\n } else {\n setDateInFocus(new Date());\n }\n setCurrentPanel(\"calendar\");\n showCalendarInternal();\n },\n [startDate, endDate, setCurrentPanel, showCalendarInternal, setDateInFocus],\n );\n\n const hideCalendar = useCallback(() => {\n setFirstFocusedInput(undefined);\n hideCalendarInternal();\n }, [setFirstFocusedInput, hideCalendarInternal]);\n\n return {\n inputLeftChangeHandler,\n inputRightChangeHandler,\n hideCalendar,\n setDateInFocus,\n setCurrentPanel,\n showCalendar,\n };\n};\n","import { useBoolean } from \"@stenajs-webui/core\";\nimport { useState } from \"react\";\nimport { DateRangeFocusedInput } from \"../../../calendar-types/date-range-calendar/DateRangeCalendar\";\nimport { CalendarPanelType } from \"../../../../features/calendar-with-month-year-pickers/CalendarPanelType\";\n\nexport type UseInputStatesResult = ReturnType<typeof useInputStates>;\n\nexport const useInputStates = (\n startDate: Date | undefined,\n endDate: Date | undefined,\n) => {\n const [isCalendarVisible, showCalendarInternal, hideCalendarInternal] =\n useBoolean(false);\n\n const [firstFocusedInput, setFirstFocusedInput] = useState<\n DateRangeFocusedInput | undefined\n >(undefined);\n\n const [focusedInput, setFocusedInput] =\n useState<DateRangeFocusedInput>(\"startDate\");\n\n const [dateInFocus, setDateInFocus] = useState<Date>(() => {\n const fromValue =\n focusedInput === \"startDate\"\n ? startDate\n : focusedInput === \"endDate\"\n ? endDate\n : undefined;\n\n return fromValue ?? new Date();\n });\n\n const [currentPanel, setCurrentPanel] =\n useState<CalendarPanelType>(\"calendar\");\n\n return {\n isCalendarVisible,\n showCalendarInternal,\n hideCalendarInternal,\n firstFocusedInput,\n setFirstFocusedInput,\n focusedInput,\n setFocusedInput,\n dateInFocus,\n setDateInFocus,\n currentPanel,\n setCurrentPanel,\n };\n};\n","import { isAfter } from \"date-fns\";\nimport * as React from \"react\";\nimport { RefObject, useCallback } from \"react\";\nimport { DayData } from \"../../../../util/calendar/CalendarDataFactory\";\nimport { DateRangeDualTextInputProps } from \"../DateRangeDualTextInput\";\nimport { UseInputStatesResult } from \"./UseInputStates\";\n\nexport const useUserInputHandlers = (\n startDate: Date | undefined,\n endDate: Date | undefined,\n onValueChange: DateRangeDualTextInputProps[\"onValueChange\"],\n startDateInputRef: RefObject<HTMLInputElement | null>,\n endDateInputRef: RefObject<HTMLInputElement | null>,\n showCalendar: (dateInFocus?: Date) => void,\n hideCalendar: () => void,\n {\n firstFocusedInput,\n setFirstFocusedInput,\n isCalendarVisible,\n setFocusedInput,\n focusedInput,\n setCurrentPanel,\n setDateInFocus,\n }: UseInputStatesResult,\n) => {\n const onFocusLeft = useCallback(() => {\n if (firstFocusedInput == null) {\n setFirstFocusedInput(\"startDate\");\n }\n setFocusedInput(\"startDate\");\n if (!isCalendarVisible) {\n showCalendar(startDate);\n } else if (startDate != null) {\n setDateInFocus(startDate);\n }\n }, [\n firstFocusedInput,\n setFocusedInput,\n isCalendarVisible,\n startDate,\n setFirstFocusedInput,\n showCalendar,\n setDateInFocus,\n ]);\n\n const onFocusRight = useCallback(() => {\n if (firstFocusedInput == null) {\n setFirstFocusedInput(\"endDate\");\n }\n setFocusedInput(\"endDate\");\n if (!isCalendarVisible) {\n showCalendar(endDate);\n } else if (endDate != null) {\n setDateInFocus(endDate);\n }\n }, [\n firstFocusedInput,\n setFocusedInput,\n isCalendarVisible,\n endDate,\n setFirstFocusedInput,\n showCalendar,\n setDateInFocus,\n ]);\n\n const onClickDay = useCallback(\n (day: DayData) => {\n if (focusedInput === \"startDate\") {\n if (endDate != null && isAfter(day.date, endDate)) {\n onValueChange?.({\n startDate: day.date,\n endDate: undefined,\n });\n setFocusedInput(\"endDate\");\n endDateInputRef.current?.focus();\n } else {\n onValueChange?.({\n startDate: day.date,\n endDate,\n });\n if (firstFocusedInput === \"startDate\") {\n setFocusedInput(\"endDate\");\n endDateInputRef.current?.focus();\n } else {\n setTimeout(hideCalendar, 50);\n }\n }\n } else if (focusedInput === \"endDate\") {\n if (!startDate) {\n onValueChange?.({\n startDate,\n endDate: day.date,\n });\n setFocusedInput(\"startDate\");\n startDateInputRef.current?.focus();\n } else if (isAfter(startDate, day.date)) {\n onValueChange?.({\n startDate: day.date,\n endDate: undefined,\n });\n setFocusedInput(\"endDate\");\n endDateInputRef.current?.focus();\n } else {\n onValueChange?.({\n startDate,\n endDate: day.date,\n });\n setTimeout(hideCalendar, 50);\n }\n }\n },\n [\n focusedInput,\n onValueChange,\n endDate,\n firstFocusedInput,\n setFocusedInput,\n endDateInputRef,\n hideCalendar,\n startDate,\n startDateInputRef,\n ],\n );\n\n const onClickArrowButton = useCallback(() => {\n setCurrentPanel(\"presets\");\n showCalendar();\n }, [setCurrentPanel, showCalendar]);\n\n const onClickCalendarButton = useCallback(() => {\n if (isCalendarVisible) {\n hideCalendar();\n } else {\n setFocusedInput(\"startDate\");\n setFirstFocusedInput(\"startDate\");\n startDateInputRef.current?.focus();\n setCurrentPanel(\"calendar\");\n showCalendar();\n }\n }, [\n isCalendarVisible,\n hideCalendar,\n setFocusedInput,\n setFirstFocusedInput,\n startDateInputRef,\n setCurrentPanel,\n showCalendar,\n ]);\n\n const onKeyDownHandler = useCallback(\n (ev: React.KeyboardEvent<HTMLDivElement>) => {\n if (ev.key === \"Escape\") {\n hideCalendar();\n }\n },\n [hideCalendar],\n );\n\n return {\n onFocusLeft,\n onFocusRight,\n onClickDay,\n onClickArrowButton,\n onClickCalendarButton,\n onKeyDownHandler,\n };\n};\n","import { Box, Column } from \"@stenajs-webui/core\";\nimport { stenaArrowRight } from \"@stenajs-webui/elements\";\nimport {\n TextInputProps,\n ValueAndOnValueChangeProps,\n} from \"@stenajs-webui/forms\";\nimport {\n ControlledPopover,\n ControlledPopoverProps,\n} from \"@stenajs-webui/tooltip\";\nimport { isAfter } from \"date-fns\";\nimport * as React from \"react\";\nimport { useMemo, useRef } from \"react\";\nimport { defaultPopoverPlacement } from \"../../../config/DefaultPopoverPlacement\";\nimport {\n DualTextInput,\n DualTextInputProps,\n} from \"../../../features/dual-text-input/DualTextInput\";\nimport { CalendarWithMonthSwitcher } from \"../../../features/month-switcher/CalendarWithMonthSwitcher\";\nimport { buildDayStateForSingleMonth } from \"../../../util/calendar/StateModifier\";\nimport { useDateRangeEffects } from \"./hooks/UseDateRangeEffects\";\nimport { useDateRangeHandlers } from \"./hooks/UseDateRangeHandlers\";\nimport { useInputStates } from \"./hooks/UseInputStates\";\nimport { useUserInputHandlers } from \"./hooks/UseUserInputHandlers\";\nimport { DateRangeInputCalendarProps } from \"../../calendar-types/date-range-calendar/DateRangeCalendar\";\nimport { OptionalMinMaxDatesAsString } from \"../../../types/CalendarTypes\";\nimport { DateRange } from \"../../../types/DateRange\";\nimport { defaultMaxDate } from \"../../../config/DefaultMaxDate\";\n\nexport interface DateRangeDualTextInputProps<TData = unknown>\n extends ValueAndOnValueChangeProps<DateRange>,\n OptionalMinMaxDatesAsString,\n Pick<DualTextInputProps, \"widthLeft\" | \"widthRight\" | \"variant\">,\n Pick<ControlledPopoverProps, \"zIndex\" | \"appendTo\"> {\n onEsc?: () => void;\n onEnter?: () => void;\n onBlur?: () => void;\n autoFocus?: boolean;\n calendarProps?: DateRangeInputCalendarProps<TData>;\n disabled?: boolean;\n renderBelowCalendar?: React.ReactNode;\n firstMonthInMonthPicker?: Date;\n numMonthsInMonthPicker?: number;\n}\n\nexport function DateRangeDualTextInput<TData>({\n value,\n onValueChange,\n autoFocus,\n onBlur,\n onEnter,\n onEsc,\n minDate,\n maxDate = defaultMaxDate,\n calendarProps,\n widthLeft = 128,\n widthRight = 128,\n firstMonthInMonthPicker,\n numMonthsInMonthPicker,\n variant,\n disabled,\n zIndex,\n appendTo,\n renderBelowCalendar,\n}: DateRangeDualTextInputProps<TData>) {\n const { startDate, endDate } = value || {};\n\n const startDateInputRef: TextInputProps[\"inputRef\"] = useRef(null);\n const endDateInputRef: TextInputProps[\"inputRef\"] = useRef(null);\n\n const states = useInputStates(startDate, endDate);\n\n const {\n dateInFocus,\n setDateInFocus,\n isCalendarVisible,\n currentPanel,\n setCurrentPanel,\n } = states;\n\n const {\n showCalendar,\n hideCalendar,\n inputLeftChangeHandler,\n inputRightChangeHandler,\n } = useDateRangeHandlers(startDate, endDate, onValueChange, states);\n\n const {\n onKeyDownHandler,\n onFocusRight,\n onFocusLeft,\n onClickDay,\n onClickCalendarButton,\n onClickArrowButton,\n } = useUserInputHandlers(\n startDate,\n endDate,\n onValueChange,\n startDateInputRef,\n endDateInputRef,\n showCalendar,\n hideCalendar,\n states,\n );\n\n useDateRangeEffects(\n startDate,\n endDate,\n setDateInFocus,\n startDateInputRef,\n endDateInputRef,\n );\n\n const startDateIsAfterEnd = useMemo(\n () => startDate && endDate && isAfter(startDate, endDate),\n [startDate, endDate],\n );\n\n const statePerMonth = useMemo(\n () =>\n buildDayStateForSingleMonth(\n calendarProps?.statePerMonth,\n startDate,\n endDate,\n dateInFocus,\n ),\n [calendarProps?.statePerMonth, startDate, endDate, dateInFocus],\n );\n\n return (\n <Box onKeyDown={onKeyDownHandler}>\n <ControlledPopover\n hideArrow\n restoreFocus={false}\n returnFocus={false}\n zIndex={zIndex}\n appendTo={appendTo}\n renderTrigger={(props) => (\n <Box {...props}>\n <DualTextInput\n autoFocusLeft={autoFocus}\n onEsc={onEsc}\n onEnter={onEnter}\n onBlur={onBlur}\n disabled={disabled}\n separatorIcon={stenaArrowRight}\n typeLeft={\"date\"}\n typeRight={\"date\"}\n placeholderLeft={\"Start date\"}\n placeholderRight={\"End date\"}\n onChangeLeft={inputLeftChangeHandler}\n onChangeRight={inputRightChangeHandler}\n onClickArrowDown={onClickArrowButton}\n onClickCalendar={onClickCalendarButton}\n onFocusLeft={onFocusLeft}\n onFocusRight={onFocusRight}\n onClickLeft={onFocusLeft}\n onClickRight={onFocusRight}\n inputRefLeft={startDateInputRef}\n inputRefRight={endDateInputRef}\n variant={startDateIsAfterEnd ? \"error\" : variant}\n widthLeft={widthLeft}\n widthRight={widthRight}\n minLeft={minDate}\n maxLeft={maxDate}\n minRight={minDate}\n maxRight={maxDate}\n />\n </Box>\n )}\n placement={defaultPopoverPlacement}\n onRequestClose={hideCalendar}\n open={isCalendarVisible}\n >\n <Column>\n <CalendarWithMonthSwitcher\n onClickDay={onClickDay}\n dateInFocus={dateInFocus}\n firstMonthInMonthPicker={firstMonthInMonthPicker}\n numMonthsInMonthPicker={numMonthsInMonthPicker}\n setDateInFocus={setDateInFocus}\n currentPanel={currentPanel}\n setCurrentPanel={setCurrentPanel}\n minDate={minDate}\n maxDate={maxDate}\n {...calendarProps}\n statePerMonth={statePerMonth}\n />\n {currentPanel === \"calendar\" && renderBelowCalendar}\n </Column>\n </ControlledPopover>\n </Box>\n );\n}\n","import * as React from \"react\";\nimport {\n FocusEventHandler,\n RefObject,\n useCallback,\n useRef,\n useState,\n} from \"react\";\nimport {\n LabelledTextInput,\n LabelledTextInputProps,\n TextInput,\n} from \"@stenajs-webui/forms\";\nimport {\n InputMask,\n InputMaskPipe,\n InputMaskProvider,\n useMaskedInput,\n} from \"@stenajs-webui/input-mask\";\nimport { TravelCalendarSizeVariant } from \"./TravelCalendar\";\nimport { exhaustSwitchCase } from \"@stenajs-webui/core\";\nimport { Label } from \"@stenajs-webui/elements\";\nimport { DateTextInputVariant } from \"../types\";\n\nexport interface TravelDateTextInputProps\n extends Pick<\n LabelledTextInputProps,\n | \"readOnly\"\n | \"onChange\"\n | \"onValueChange\"\n | \"value\"\n | \"onFocus\"\n | \"onBlur\"\n | \"placeholder\"\n | \"label\"\n | \"borderRadiusVariant\"\n > {\n ref?: RefObject<HTMLInputElement | null>;\n mask: InputMask | InputMaskProvider;\n pipe?: InputMaskPipe;\n guide?: boolean;\n keepCharPositions?: boolean;\n placeholderChar?: string;\n showMask?: boolean;\n calendarSize: TravelCalendarSizeVariant;\n placeholderWhenBlurred: string | undefined;\n valueWhenBlurred: string | undefined;\n variant: DateTextInputVariant;\n}\n\nexport const TravelDateTextInput: React.FC<TravelDateTextInputProps> = ({\n onChange,\n onValueChange,\n readOnly,\n mask,\n ref,\n pipe,\n value,\n guide,\n keepCharPositions,\n placeholderChar,\n showMask,\n calendarSize,\n onFocus,\n onBlur,\n placeholderWhenBlurred,\n placeholder,\n valueWhenBlurred,\n label,\n variant,\n ...inputProps\n}) => {\n const localRef = useRef(null);\n const [isFocused, setIsFocused] = useState(false);\n\n const inputRef = ref ?? localRef;\n\n const { onChange: maskedOnChange } = useMaskedInput(\n inputRef,\n onChange,\n onValueChange,\n mask,\n pipe,\n value,\n guide,\n keepCharPositions,\n placeholderChar,\n showMask,\n isFocused,\n );\n\n const onFocusHandler = useCallback<FocusEventHandler<HTMLInputElement>>(\n (ev) => {\n onFocus?.(ev);\n setIsFocused(true);\n },\n [onFocus],\n );\n\n const onBlurHandler = useCallback<FocusEventHandler<HTMLInputElement>>(\n (ev) => {\n onBlur?.(ev);\n setIsFocused(false);\n },\n [onBlur],\n );\n\n const activePlaceholder = isFocused\n ? placeholder\n : (placeholderWhenBlurred ?? placeholder);\n\n if (variant === \"standard\") {\n return (\n <Label text={label ?? \"\"}>\n <TextInput\n {...inputProps}\n readOnly={readOnly}\n inputMode={\"numeric\"}\n aria-live={\"polite\"}\n value={(!isFocused ? valueWhenBlurred : value) ?? \"\"}\n inputRef={inputRef}\n placeholder={activePlaceholder}\n onFocus={onFocusHandler}\n onBlur={onBlurHandler}\n onChange={maskedOnChange}\n width={getWidth(calendarSize)}\n alwaysShowPlaceholder\n />\n </Label>\n );\n } else {\n return (\n <LabelledTextInput\n {...inputProps}\n readOnly={readOnly}\n inputMode={\"numeric\"}\n label={label}\n aria-live={\"polite\"}\n value={(!isFocused ? valueWhenBlurred : value) ?? \"\"}\n ref={inputRef}\n placeholder={activePlaceholder}\n onFocus={onFocusHandler}\n onBlur={onBlurHandler}\n onChange={maskedOnChange}\n width={getWidth(calendarSize)}\n size={calendarSize === \"large\" ? \"large\" : \"medium\"}\n />\n );\n }\n};\n\nconst getWidth = (calenderSize: TravelCalendarSizeVariant) => {\n // For cell size = 48px, (48*7)/2 = 168px\n switch (calenderSize) {\n case \"smaller\":\n return \"140px\";\n case \"small\":\n return \"154px\";\n case \"medium\":\n return \"168px\";\n case \"large\":\n return \"196px\";\n default:\n return exhaustSwitchCase(calenderSize, \"168px\");\n }\n};\n","export const yearMask = [/[1-2]/, /\\d/, /\\d/, /\\d/];\nexport const monthMask = [/[0-1]/, /\\d/];\nexport const dayMask = [/[0-3]/, /\\d/];\n\nexport const createInputMaskForDateFormat = (\n dateFormat: string, // For example: yyyy-MM-dd\n): Array<string | RegExp> => {\n const l = splitByNewLetter(dateFormat);\n return l.flatMap(tokenToMask);\n};\n\nconst tokenToMask = (token: string): Array<string | RegExp> => {\n switch (token) {\n case \"yyyy\":\n return yearMask;\n case \"mm\":\n case \"MM\":\n return monthMask;\n case \"dd\":\n case \"DD\":\n return dayMask;\n default:\n return [token];\n }\n};\n\nconst splitByNewLetter = (str: string): Array<string> => {\n if (str.length === 0) return [];\n\n const result: Array<string> = [];\n let currentSegment = str[0];\n\n for (let i = 1; i < str.length; i++) {\n if (str[i] !== str[i - 1]) {\n result.push(currentSegment);\n currentSegment = str[i];\n } else {\n currentSegment += str[i];\n }\n }\n\n result.push(currentSegment);\n return result;\n};\n","// Define the supported locales\n\nimport { SupportedLocaleCode } from \"./LocaleMapper\";\n\nexport const getDateFormatForLocaleCode = (\n localeCode: SupportedLocaleCode,\n): string => {\n const formatter = new Intl.DateTimeFormat(localeCode, { dateStyle: \"short\" });\n const parts = formatter.formatToParts(new Date());\n const formatMap: { [key: string]: string } = {\n year: \"yyyy\",\n month: \"MM\",\n day: \"dd\",\n };\n return parts.map((part) => formatMap[part.type] || part.value).join(\"\");\n};\n","import { parse } from \"date-fns\";\nimport { getDateFormatForLocaleCode } from \"./DateFormatProvider\";\nimport {\n fallbackLocaleCode,\n getLocaleForLocaleCode,\n getSupportedLocaleCode,\n SupportedLocaleCode,\n} from \"./LocaleMapper\";\n\ninterface ParseLocalizedDateStringOptions {\n matchLanguage?: boolean;\n fallbackLocaleCode?: SupportedLocaleCode;\n referenceDate?: Date;\n}\n\nexport const parseLocalizedDateString = (\n dateString: string,\n localeCode: string,\n options?: ParseLocalizedDateStringOptions,\n): Date | undefined => {\n const supportedLocaleCode = getSupportedLocaleCode(\n localeCode,\n options?.matchLanguage ?? false,\n options?.fallbackLocaleCode ?? fallbackLocaleCode,\n );\n\n const locale = getLocaleForLocaleCode(supportedLocaleCode);\n\n if (locale == null) {\n return undefined;\n }\n\n const date = parse(\n dateString,\n getDateFormatForLocaleCode(supportedLocaleCode),\n options?.referenceDate ?? new Date(),\n {\n locale: locale,\n },\n );\n\n if (isNaN(date.getTime())) {\n return undefined;\n }\n\n return date;\n};\n","import { format } from \"date-fns\";\nimport { getDateFormatForLocaleCode } from \"./DateFormatProvider\";\nimport {\n fallbackLocaleCode,\n getLocaleForLocaleCode,\n getSupportedLocaleCode,\n SupportedLocaleCode,\n} from \"./LocaleMapper\";\n\nexport interface FormatLocalizedDateOptions {\n matchLanguage?: boolean;\n fallbackLocaleCode?: SupportedLocaleCode;\n}\n\nexport const formatLocalizedDate = (\n date: Date,\n localeCode: string,\n options?: FormatLocalizedDateOptions,\n): string => {\n const l = getSupportedLocaleCode(\n localeCode,\n options?.matchLanguage ?? false,\n options?.fallbackLocaleCode ?? fallbackLocaleCode,\n );\n return format(date, getDateFormatForLocaleCode(l), {\n locale: getLocaleForLocaleCode(l),\n });\n};\n","import { parseLocalizedDateString } from \"./LocalizedDateParser\";\nimport { formatLocalizedDate } from \"./LocalizedDateFormatter\";\n\nexport const reformatLocalizedDateString = (\n dateString: string,\n locale: string,\n): string | undefined => {\n const d = parseLocalizedDateString(dateString, locale);\n if (d == null) {\n return undefined;\n }\n return formatLocalizedDate(d, locale);\n};\n","(function(){\"use strict\";try{if(typeof document<\"u\"){var r=document.createElement(\"style\");r.appendChild(document.createTextNode(\"._navBar_kzibd_1{--swui-navbar-background-color: var(--lhds-color-ui-50);--swui-navbar-item-background-color-hover: var(--lhds-color-blue-700);--swui-navbar-item-background-color-selected: var(--lhds-color-blue-600);--swui-navbar-item-background-color-selected-hover: var( --lhds-color-blue-700 );--swui-nav-bar-height: 48px;background-color:var(--swui-navbar-background-color);height:var(--swui-nav-bar-height);min-height:var(--swui-nav-bar-height)}._navBarButton_b3x3w_1:hover{background:var(--lhds-color-ui-100)}._navBarButton_b3x3w_1:focus-visible{background:var(--lhds-color-ui-200)}._navBarButton_b3x3w_1:active{background:var(--lhds-color-ui-200)}._navBarButton_b3x3w_1._selected_b3x3w_14{background:var(--lhds-color-blue-200)}._navBarButton_b3x3w_1._selected_b3x3w_14:hover{background:var(--lhds-color-blue-100)}._navBarButton_b3x3w_1._selected_b3x3w_14:focus-visible{background:var(--lhds-color-blue-300)}._navBarButton_b3x3w_1._selected_b3x3w_14:active{background:var(--lhds-color-blue-200)}._navBarNotificationButton_1wt3y_1{--current-background-color: var(--lhds-color-ui-400);--current-outline-color: var(--modern-blue);background-color:var(--current-background-color);border-color:transparent;color:var(--lhds-color-ui-50);--swui-nav-bar-notification-shake-count: 3;transition:.5s width}._navBarNotificationButton_1wt3y_1:hover{--current-background-color: var(--lhds-color-red-500);--current-outline-color: var(--lhds-color-red-500)}._navBarNotificationButton_1wt3y_1:active{--current-background-color: var(--lhds-color-red-600);--current-outline-color: var(--lhds-color-red-600)}._navBarNotificationButton_1wt3y_1._unread_1wt3y_23 ._icon_1wt3y_23{transform-origin:top center;animation:_shake_1wt3y_1 1.5s ease-in-out var(--swui-nav-bar-notification-shake-count)}._navBarNotificationButton_1wt3y_1._unread_1wt3y_23{--current-background-color: var(--lhds-color-red-500);--current-outline-color: var(--lhds-color-red-500)}._navBarNotificationButton_1wt3y_1._unread_1wt3y_23:hover{--current-background-color: var(--lhds-color-red-600);--current-outline-color: var(--lhds-color-red-600)}._navBarNotificationButton_1wt3y_1._unread_1wt3y_23:active{--current-background-color: var(--lhds-color-red-700);--current-outline-color: var(--lhds-color-red-700)}._navBarNotificationButton_1wt3y_1:focus-visible{outline:var(--swui-focus-outline);outline-color:var(--current-outline-color);outline-offset:var(--swui-focus-outline-width)}@keyframes _shake_1wt3y_1{0%{transform:rotate(0)}7%{transform:rotate(20deg)}15%{transform:rotate(-20deg)}22%{transform:rotate(16deg)}30%{transform:rotate(-16deg)}38%{transform:rotate(6deg)}42%{transform:rotate(-6deg)}46%{transform:rotate(2deg)}to{transform:rotate(0)}}._navBarSearchFieldInput_1rp8g_1._navBarSearchFieldInput_1rp8g_1{line-height:2.7rem;color:var(--lhds-color-ui-800)}._navBarSearchFieldInput_1rp8g_1._navBarSearchFieldInput_1rp8g_1::placeholder{color:var(--lhds-color-blue-600)}._navBarSearchFieldInput_1rp8g_1._navBarSearchFieldInput_1rp8g_1{padding:0 var(--swui-metrics-indent)}._navBarSearchFieldWrapper_1rp8g_12._navBarSearchFieldWrapper_1rp8g_12{background:var(--lhds-color-ui-200);border-color:transparent}._navBarSearchFieldWrapper_1rp8g_12._navBarSearchFieldWrapper_1rp8g_12:hover{border-color:transparent}._navBarSearchFieldWrapper_1rp8g_12._navBarSearchFieldWrapper_1rp8g_12{padding:0 var(--swui-metrics-indent);border-radius:var(--swui-max-border-radius)}._navBarSearchFieldWrapper_1rp8g_12._navBarSearchFieldWrapper_1rp8g_12._withButton_1rp8g_24{padding-right:1px}._navBarSearchFieldWrapper_1rp8g_12._navBarSearchFieldWrapper_1rp8g_12:focus-within{color:var(--lhds-color-ui-800);background:var(--lhds-color-ui-50)}._navBarSearchFieldWrapper_1rp8g_12._navBarSearchFieldWrapper_1rp8g_12 ._clearButton_1rp8g_33{border-radius:var(--swui-max-border-radius)}._navBarUserButton_10f9z_1:hover{background:var(--lhds-color-ui-100)}._navBarUserButton_10f9z_1:focus-visible{background:var(--lhds-color-ui-200)}._navBarUserButton_10f9z_1:active{background:var(--lhds-color-ui-200)}._sidebarMenuCollapsibleGroupBox_ikek9_1{background:var(--lhds-color-ui-200);border-radius:var(--swui-border-radius);gap:var(--swui-metrics-space);display:flex;flex-direction:column;padding:var(--swui-metrics-space);--current-text-size: var(--swui-font-size-small)}._selectionRow_1njaw_1{display:flex;flex-direction:row;justify-content:space-between;align-items:center;gap:calc(var(--swui-metrics-space) * 2)}@media (max-width: 370px){._iconColumn_1njaw_9{display:none}}._sidebarMenu_1bx5w_1{--swui-sidebar-menu-separator-color: var(--swui-white);--swui-sidebar-menu-text-color: var(--lhds-color-ui-900);--swui-sidebar-menu-icon-color: var(--lhds-color-ui-900);--swui-sidebar-menu-background-color: transparent;--swui-sidebar-menu-background-color-hover: var(--lhds-color-ui-400);--swui-sidebar-menu-background-color-focus: var(--lhds-color-ui-400);--swui-sidebar-menu-background-color-active: var(--lhds-color-ui-300);--swui-sidebar-menu-background-selected: var(--lhds-color-blue-100);--swui-sidebar-menu-background-selected-hover: var(--lhds-color-blue-200);--swui-sidebar-menu-background-selected-focus: var(--lhds-color-blue-200);--swui-sidebar-menu-background-selected-active: var(--lhds-color-blue-100);--current-background-color: var(--swui-sidebar-menu-background-color);--current-background-color-hover: var( --swui-sidebar-menu-background-color-hover );--current-background-color-focus: var( --swui-sidebar-menu-background-color-focus );--current-background-color-active: var( --swui-sidebar-menu-background-color-active );--current-background-selected: var(--swui-sidebar-menu-background-selected);--current-background-selected-hover: var( --swui-sidebar-menu-background-selected-hover );--current-background-selected-focus: var( --swui-sidebar-menu-background-selected-focus );--current-background-selected-active: var( --swui-sidebar-menu-background-selected-active )}._sidebarMenu_1bx5w_1 ._sidebarItems_1bx5w_38{--current-separator-color: var(--swui-sidebar-menu-separator-color);--current-text-color: var(--swui-sidebar-menu-text-color);--current-icon-color: var(--swui-sidebar-menu-icon-color)}._sidebarMenu_1bx5w_1{background-color:var(--current-background-color);height:100dvh}._sidebarMenu_1bx5w_1 ._scrollContainer_1bx5w_48{background:var(--current-background-color);height:100%;overflow:auto}._stenaFlag_108h7_1{height:32px}._productCard_19x6b_1{max-width:560px}@media (max-width: 768px){._productCard_19x6b_1{max-width:unset}}.yarl__fullsize{height:100%;width:100%}.yarl__relative{position:relative}.yarl__portal{inset:0;opacity:0;overflow:hidden;position:fixed;transition:opacity var(--yarl__fade_animation_duration,.25s) var(--yarl__fade_animation_timing_function,ease);z-index:var(--yarl__portal_zindex,9999)}.yarl__portal_open{opacity:1}.yarl__container{background-color:var(--yarl__container_background_color,var(--yarl__color_backdrop,#000));inset:0;outline:none;overflow:hidden;overscroll-behavior:var(--yarl__controller_overscroll_behavior,contain);position:absolute;touch-action:var(--yarl__controller_touch_action,none);-webkit-user-select:none;user-select:none}.yarl__carousel{align-content:center;align-items:stretch;display:flex;flex:0 0 auto;height:100%;justify-content:center;opacity:var(--yarl__pull_opacity,1);transform:translate(var(--yarl__swipe_offset,0),var(--yarl__pull_offset,0));width:calc(100% + (var(--yarl__carousel_slides_count) - 1)*(100% + var(--yarl__carousel_spacing_px, 0)*1px + var(--yarl__carousel_spacing_percent, 0)*1%))}.yarl__carousel_with_slides{column-gap:calc(var(--yarl__carousel_spacing_px, 0)*1px + 100/(var(--yarl__carousel_slides_count)*100 + (var(--yarl__carousel_slides_count) - 1)*var(--yarl__carousel_spacing_percent, 0))*var(--yarl__carousel_spacing_percent, 0)*1%)}.yarl__flex_center{align-content:center;align-items:center;display:flex;justify-content:center}.yarl__slide{flex:1;overflow:hidden;padding:calc(var(--yarl__carousel_padding_px, 0)*1px + 100/(var(--yarl__carousel_slides_count)*100 + (var(--yarl__carousel_slides_count) - 1)*var(--yarl__carousel_spacing_percent, 0))*var(--yarl__carousel_padding_percent, 0)*1%);position:relative}[dir=rtl] .yarl__slide{--yarl__direction:-1}.yarl__slide_image{max-height:100%;max-width:100%;object-fit:contain;touch-action:var(--yarl__controller_touch_action,none);user-select:none;-webkit-user-select:none;-webkit-touch-callout:none}.yarl__slide_image_cover{height:100%;object-fit:cover;width:100%}.yarl__slide_image_loading{opacity:0}@media screen and (min-width:800px){.yarl__slide_wrapper:not(.yarl__slide_wrapper_interactive) .yarl__slide_image{-webkit-backface-visibility:hidden;-webkit-transform:translateZ(0);-webkit-transform-style:preserve-3d}}.yarl__slide_placeholder{left:50%;line-height:0;position:absolute;top:50%;transform:translate(-50%) translateY(-50%)}.yarl__slide_loading{animation:yarl__delayed_fadein 1s linear;color:var(--yarl__slide_icon_loading_color,var(--yarl__color_button,hsla(0,0%,100%,.8)))}.yarl__slide_loading line{animation:yarl__stroke_opacity 1s linear infinite}.yarl__slide_loading line:first-of-type{animation-delay:-1.875s}.yarl__slide_loading line:nth-of-type(2){animation-delay:-1.75s}.yarl__slide_loading line:nth-of-type(3){animation-delay:-1.625s}.yarl__slide_loading line:nth-of-type(4){animation-delay:-1.5s}.yarl__slide_loading line:nth-of-type(5){animation-delay:-1.375s}.yarl__slide_loading line:nth-of-type(6){animation-delay:-1.25s}.yarl__slide_loading line:nth-of-type(7){animation-delay:-1.125s}.yarl__slide_loading line:nth-of-type(8){animation-delay:-1s}.yarl__slide_error{color:var(--yarl__slide_icon_error_color,red);height:var(--yarl__slide_icon_error_size,48px);width:var(--yarl__slide_icon_error_size,48px)}@media (prefers-reduced-motion){.yarl__portal,.yarl__slide{transition:unset}.yarl__slide_loading,.yarl__slide_loading line{animation:unset}}.yarl__toolbar{display:flex;justify-content:flex-end;inset:0 0 auto auto;padding:var(--yarl__toolbar_padding,8px);position:absolute}[dir=rtl] .yarl__toolbar{inset:0 auto auto 0}.yarl__icon{height:var(--yarl__icon_size,32px);width:var(--yarl__icon_size,32px)}.yarl__button{-webkit-appearance:none;appearance:none;background-color:var(--yarl__button_background_color,transparent);border:var(--yarl__button_border,0);color:var(--yarl__color_button,hsla(0,0%,100%,.8));cursor:pointer;filter:var(--yarl__button_filter,drop-shadow(2px 2px 2px rgba(0,0,0,.8)));line-height:0;margin:var(--yarl__button_margin,0);outline:none;padding:var(--yarl__button_padding,8px);-webkit-tap-highlight-color:transparent}.yarl__button:focus{color:var(--yarl__color_button_active,#fff)}.yarl__button:focus:not(:focus-visible){color:var(--yarl__color_button,hsla(0,0%,100%,.8))}.yarl__button:focus-visible{color:var(--yarl__color_button_active,#fff)}@media (hover:hover){.yarl__button:focus-visible:hover,.yarl__button:focus:hover,.yarl__button:hover{color:var(--yarl__color_button_active,#fff)}}.yarl__button:disabled{color:var(--yarl__color_button_disabled,hsla(0,0%,100%,.4));cursor:default}.yarl__navigation_next,.yarl__navigation_prev{padding:var(--yarl__navigation_button_padding,24px 16px);position:absolute;top:50%;transform:translateY(-50%)}.yarl__navigation_prev{left:0}[dir=rtl] .yarl__navigation_prev{left:unset;right:0;transform:translateY(-50%) rotate(180deg)}.yarl__navigation_next{right:0}[dir=rtl] .yarl__navigation_next{left:0;right:unset;transform:translateY(-50%) rotate(180deg)}.yarl__no_scroll{height:100%;overflow:hidden;overscroll-behavior:none}@keyframes yarl__delayed_fadein{0%{opacity:0}80%{opacity:0}to{opacity:1}}@keyframes yarl__stroke_opacity{0%{stroke-opacity:1}to{stroke-opacity:.125}}.yarl__counter{bottom:var(--yarl__counter_bottom,unset);color:var(--yarl__counter_color,var(--yarl__color_button,hsla(0,0%,100%,.8)));filter:var(--yarl__counter_filter,drop-shadow(2px 2px 2px rgba(0,0,0,.8)));left:var(--yarl__counter_left,0);line-height:var(--yarl__counter_line_height,var(--yarl__icon_size,32px));margin:var(--yarl__counter_margin,var(--yarl__toolbar_padding,8px));padding:var(--yarl__counter_padding,var(--yarl__button_padding,8px));position:var(--yarl__counter_position,absolute);right:var(--yarl__counter_right,unset);top:var(--yarl__counter_top,0);-webkit-user-select:var(--yarl__counter_user_select,none);user-select:var(--yarl__counter_user_select,none)}.yarl__slide_captions_container{background:var(--yarl__slide_captions_container_background,rgba(0,0,0,.5));left:var(--yarl__slide_captions_container_left,0);padding:var(--yarl__slide_captions_container_padding,16px);position:absolute;right:var(--yarl__slide_captions_container_right,0);-webkit-transform:translateZ(0)}.yarl__slide_title{color:var(--yarl__slide_title_color,#fff);font-size:var(--yarl__slide_title_font_size,125%);font-weight:var(--yarl__slide_title_font_weight,bolder);max-width:calc(100% - var(--yarl__toolbar_width, 0px));overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.yarl__slide_title_container{top:var(--yarl__slide_title_container_top,0)}.yarl__slide_description{display:-webkit-box;-webkit-hyphens:auto;hyphens:auto;overflow:hidden;-webkit-box-orient:vertical;-webkit-line-clamp:var(--yarl__slide_description_max_lines,3);color:var(--yarl__slide_description_color,#fff);text-align:var(--yarl__slide_description_text_align,start)}.yarl__slide_description_container{bottom:var(--yarl__slide_description_container_bottom,0)}.yarl__slide_title.yarl__slide_title.yarl__slide_title{font-family:var(--swui-font-primary);font-size:var(--swui-font-size-large);font-weight:var(--swui-font-weight-text)}.yarl__slide_title_container.yarl__slide_title_container.yarl__slide_title_container{height:48px;margin:calc(var(--swui-metrics-space) * 1);padding:0;display:flex;align-items:center;padding-left:calc(var(--swui-metrics-space) * 10)}.yarl__slide_description.yarl__slide_description.yarl__slide_description{font-family:var(--swui-font-primary);font-size:var(--swui-font-size-large);font-weight:var(--swui-font-weight-text)}.yarl__slide_description_container.yarl__slide_description_container.yarl__slide_description_container{display:flex;align-items:center;padding-left:calc(var(--swui-metrics-space) * 3);padding-bottom:calc(var(--swui-metrics-space) * 4)}.yarl__counter.yarl__counter{height:48px;margin:calc(var(--swui-metrics-space) * 1);display:flex;align-items:center;padding:0;padding-left:calc(var(--swui-metrics-space) * 1);font-family:var(--swui-font-primary);font-size:var(--swui-font-size-large);font-weight:var(--swui-font-weight-text)}\")),document.head.appendChild(r)}}catch(a){console.error(\"vite-plugin-css-injected-by-js\",a)}})();\nimport { jsx as e, Fragment as A, jsxs as i } from \"react/jsx-runtime\";\nimport { ActionMenu as te, ActionMenuContext as ve, stenaAngleDown as re, PrimaryButton as oe, SecondaryButton as R, FlatButton as O, stenaHamburger as ie, BaseButton as Ce, stenaBellFilled as we, TextInputButton as Be, stenaTimes as ye, stenaUserCircle as Ie, MenuButton as U, Icon as G, stenaMail as _e, Card as Se, CardBody as ke, CircledIcon as E, stenaTripFerryXl as Re, Spinner as D, CloseButton as Me, StenaFlag as Ne, stenaAngleLeftDouble as le, stenaPin as Pe, IconMenuButton as K, IconMenuButtonLink as ze, MenuButtonLink as Fe, Tag as je, ShimmerBox as N, stenaTimesThick as Ae, stenaAngleRight as ae, stenaAngleLeft as ce, stenaSearchPlus as Le, stenaSearchMinus as Te } from \"@stenajs-webui/elements\";\nimport * as Oe from \"react\";\nimport { useRef as V, useMemo as F, forwardRef as Z, createContext as Ee, useContext as He, useState as L, useCallback as J, useEffect as We } from \"react\";\nimport { useBoolean as se, Column as d, Row as c, Indent as B, Heading as P, Box as u, Text as x, Space as w, getDataProps as H, SeparatorLine as $e, pluralFormatter as qe, selectPluralRule as Ue, Spacing as Ge, isEmptyFragment as De, useAccessibleFontSizeContext as Ke, exhaustSwitchCaseElseThrow as de, BlockKeyboardEvents as Ve } from \"@stenajs-webui/core\";\nimport { ControlledPopover as ue, Popover as he, Tooltip as pe } from \"@stenajs-webui/tooltip\";\nimport { Checkbox as me, TextInput as Ze } from \"@stenajs-webui/forms\";\nimport _ from \"classnames\";\nimport { cssColor as p } from \"@stenajs-webui/theme\";\nimport { useMediaQuery as M } from \"react-responsive\";\nimport ge from \"yet-another-react-lightbox\";\nimport Qe from \"yet-another-react-lightbox/plugins/inline\";\nimport Xe from \"yet-another-react-lightbox/plugins/zoom\";\nimport Je from \"yet-another-react-lightbox/plugins/counter\";\nimport Ye from \"yet-another-react-lightbox/plugins/captions\";\nconst Q = ({\n renderItems: n,\n placement: t = \"bottom\",\n buttonComponent: r,\n rightIcon: o = re,\n menuWidth: l,\n menuTop: a,\n onClick: s,\n disableArrow: h = !1,\n buttonRef: g,\n appendTo: b,\n zIndex: f,\n disableTrapFocus: C = !1,\n ...y\n}) => {\n const [S, I, v, k] = se(!1), m = V(null), W = g ?? m, fe = F(() => ({ open: I, close: v }), [I, v]), xe = ($) => {\n s?.($), k();\n };\n return /* @__PURE__ */ e(A, { children: /* @__PURE__ */ e(\n ue,\n {\n renderTrigger: ($) => /* @__PURE__ */ e(\n r,\n {\n rightIcon: h ? void 0 : o,\n ...y,\n ref: W,\n onClick: xe,\n ...$\n }\n ),\n hideArrow: !0,\n disablePadding: !0,\n open: S,\n onRequestClose: v,\n placement: t,\n appendTo: b,\n zIndex: f,\n children: S && /* @__PURE__ */ e(\n te,\n {\n width: l,\n top: a,\n trapFocus: !C,\n children: /* @__PURE__ */ e(ve.Provider, { value: fe, children: n(v) })\n }\n )\n }\n ) });\n}, at = (n) => /* @__PURE__ */ e(Q, { buttonComponent: oe, ...n }), ct = (n) => /* @__PURE__ */ e(Q, { buttonComponent: R, ...n }), en = (n) => /* @__PURE__ */ e(Q, { buttonComponent: O, ...n }), nn = \"1px solid var(--lhds-color-ui-300)\", st = ({\n renderMenu: n,\n ...t\n}) => /* @__PURE__ */ e(\n he,\n {\n trigger: \"click\",\n renderTrigger: (r) => /* @__PURE__ */ e(c, { children: /* @__PURE__ */ i(\n c,\n {\n spacing: 0.5,\n indent: !0,\n alignItems: \"center\",\n border: nn,\n borderRadius: \"4px\",\n children: [\n /* @__PURE__ */ e(me, { ...t }),\n /* @__PURE__ */ e(B, { num: 0.5 }),\n /* @__PURE__ */ e(O, { size: \"small\", leftIcon: re, ...r })\n ]\n }\n ) }),\n hideArrow: !0,\n disablePadding: !0,\n placement: \"bottom-start\",\n children: ({ onRequestClose: r }) => /* @__PURE__ */ e(d, { children: /* @__PURE__ */ e(te, { children: n(r) }) })\n }\n), tn = \"_navBar_kzibd_1\", rn = {\n navBar: tn\n}, on = ({\n className: n,\n onClick: t\n}) => /* @__PURE__ */ e(\n O,\n {\n leftIcon: ie,\n className: n,\n onClick: t\n }\n), dt = ({\n left: n,\n className: t,\n showMenuButton: r = !1,\n children: o,\n right: l,\n center: a,\n onClickMenuButton: s\n}) => {\n const h = a ? 1 : void 0;\n return /* @__PURE__ */ i(\n c,\n {\n justifyContent: \"space-between\",\n className: _(rn.navBar, t),\n children: [\n /* @__PURE__ */ i(\n c,\n {\n flex: h,\n justifyContent: \"flex-start\",\n alignItems: \"center\",\n children: [\n /* @__PURE__ */ i(c, { width: \"86px\", alignItems: \"center\", children: [\n /* @__PURE__ */ e(B, {}),\n r && /* @__PURE__ */ e(on, { onClick: s })\n ] }),\n n && /* @__PURE__ */ i(A, { children: [\n n,\n /* @__PURE__ */ e(B, { num: 2 })\n ] }),\n o && /* @__PURE__ */ e(A, { children: /* @__PURE__ */ e(c, { justifyContent: \"center\", alignItems: \"center\", children: Oe.Children.map(o, (g, b) => /* @__PURE__ */ i(A, { children: [\n b > 0 && /* @__PURE__ */ e(B, {}),\n g\n ] })) }) })\n ]\n }\n ),\n a && /* @__PURE__ */ e(c, { justifyContent: \"center\", alignItems: \"center\", children: a }),\n /* @__PURE__ */ i(c, { justifyContent: \"flex-end\", alignItems: \"center\", flex: h, children: [\n l,\n /* @__PURE__ */ e(B, { num: 2 })\n ] })\n ]\n }\n );\n}, ln = \"_navBarButton_b3x3w_1\", an = \"_selected_b3x3w_14\", Y = {\n navBarButton: ln,\n selected: an\n}, cn = Z(\n function({ selected: n, className: t, ...r }, o) {\n return /* @__PURE__ */ e(\n O,\n {\n ...r,\n ref: o,\n className: _(\n Y.navBarButton,\n n && Y.selected,\n t\n )\n }\n );\n }\n), ut = (n) => /* @__PURE__ */ e(P, { whiteSpace: \"nowrap\", variant: \"h4\", as: \"h1\", ...n }), ht = ({\n content: n,\n children: t,\n appendTo: r,\n zIndex: o,\n ...l\n}) => {\n const [a, , s, h] = se(!1);\n return /* @__PURE__ */ e(\n ue,\n {\n renderTrigger: (g) => /* @__PURE__ */ e(cn, { ...l, ...g, onClick: h }),\n open: a,\n onRequestClose: s,\n zIndex: o,\n appendTo: r,\n children: /* @__PURE__ */ i(u, { children: [\n n && n({ close: s }),\n t\n ] })\n }\n );\n}, sn = \"_navBarNotificationButton_1wt3y_1\", dn = \"_unread_1wt3y_23\", un = \"_icon_1wt3y_23\", z = {\n navBarNotificationButton: sn,\n unread: dn,\n icon: un\n}, pt = Z(function({\n count: n,\n unread: t = !1,\n className: r,\n labelClassName: o,\n iconClassName: l,\n icon: a = we,\n ...s\n}, h) {\n const g = n > 1;\n return /* @__PURE__ */ e(\n Ce,\n {\n ...s,\n ref: h,\n leftIcon: a,\n className: _(\n z.navBarNotificationButton,\n t && z.unread,\n g && z.hasCount,\n r\n ),\n label: g ? String(n) : void 0,\n labelClassName: _(o, z.label),\n iconClassName: _(l, z.icon)\n }\n );\n}), hn = \"_navBarSearchFieldInput_1rp8g_1\", pn = \"_navBarSearchFieldWrapper_1rp8g_12\", mn = \"_withButton_1rp8g_24\", gn = \"_clearButton_1rp8g_33\", j = {\n navBarSearchFieldInput: hn,\n navBarSearchFieldWrapper: pn,\n withButton: mn,\n clearButton: gn\n}, mt = ({\n placeholder: n = \"Search\",\n className: t,\n wrapperClassName: r,\n showClearButton: o,\n onClickClearButton: l,\n value: a,\n ...s\n}) => /* @__PURE__ */ e(\n Ze,\n {\n wrapperClassName: _(\n j.navBarSearchFieldWrapper,\n o ? j.withButton : void 0,\n r\n ),\n className: _(j.navBarSearchFieldInput, t),\n placeholder: n,\n value: a,\n buttonRight: a && o ? /* @__PURE__ */ e(\n Be,\n {\n className: j.clearButton,\n icon: ye,\n variant: \"error\",\n onClick: l\n }\n ) : void 0,\n ...s\n }\n), bn = \"_navBarUserButton_10f9z_1\", fn = {\n navBarUserButton: bn\n}, gt = ({\n className: n,\n username: t,\n initials: r,\n icon: o = Ie,\n responsiveIconOnly: l = r == null,\n ...a\n}) => /* @__PURE__ */ e(\n en,\n {\n ...a,\n className: _(fn.navBarUserButton, n),\n leftIcon: t != null ? o : void 0,\n label: r ?? t,\n forceRound: r != null,\n responsiveIconOnly: l,\n disableArrow: !0\n }\n), xn = Z(\n ({ contentLeft: n, contentRight: t, collapsed: r = !1, ...o }, l) => /* @__PURE__ */ e(\n U,\n {\n ref: l,\n expandable: !0,\n expanded: !r,\n selected: !r,\n left: n,\n right: t,\n ...o\n }\n )\n), bt = ({\n children: n\n}) => /* @__PURE__ */ e(d, { gap: 1, children: n }), ft = ({\n value: n,\n onValueChange: t,\n onChange: r,\n indeterminate: o,\n checkboxDisabled: l,\n ...a\n}) => /* @__PURE__ */ e(\n xn,\n {\n contentLeft: /* @__PURE__ */ e(\n me,\n {\n value: n,\n indeterminate: o,\n onValueChange: t,\n onChange: r,\n disabled: l,\n onClick: (s) => s.stopPropagation()\n }\n ),\n ...a\n }\n), vn = \"_sidebarMenuCollapsibleGroupBox_ikek9_1\", Cn = {\n sidebarMenuCollapsibleGroupBox: vn\n}, wn = ({ children: n }) => /* @__PURE__ */ e(\"div\", { className: Cn.sidebarMenuCollapsibleGroupBox, children: n }), xt = ({ children: n }) => /* @__PURE__ */ e(u, { spacing: !0, indent: !0, children: /* @__PURE__ */ e(x, { variant: \"overline\", size: \"smaller\", children: n }) }), vt = ({ text: n = \"No content\" }) => /* @__PURE__ */ i(d, { indent: !0, spacing: !0, flex: 1, alignItems: \"center\", children: [\n /* @__PURE__ */ e(G, { icon: _e, color: p(\"--lhds-color-ui-500\") }),\n /* @__PURE__ */ e(w, {}),\n /* @__PURE__ */ e(x, { size: \"small\", color: p(\"--lhds-color-ui-500\"), children: n })\n] }), Bn = ({\n text: n,\n heading: t,\n children: r,\n buttons: o,\n icon: l = Re,\n headingLevel: a = \"h3\",\n ...s\n}) => {\n const h = !n && !t ? \"Something unexpected happened.\" : n;\n return /* @__PURE__ */ e(Se, { ...s, children: /* @__PURE__ */ e(ke, { children: /* @__PURE__ */ i(d, { spacing: 1, gap: 3, alignItems: \"center\", children: [\n /* @__PURE__ */ i(d, { alignItems: \"center\", children: [\n /* @__PURE__ */ e(w, { num: 1 }),\n /* @__PURE__ */ e(E, { icon: l, size: \"xl\" })\n ] }),\n t && /* @__PURE__ */ e(P, { as: a, children: t }),\n h && /* @__PURE__ */ e(x, { children: h }),\n r,\n o && /* @__PURE__ */ i(u, { children: [\n /* @__PURE__ */ e(w, { num: 2 }),\n o\n ] })\n ] }) }) });\n}, Ct = (n) => /* @__PURE__ */ e(\n u,\n {\n width: \"100%\",\n height: \"100%\",\n justifyContent: \"center\",\n alignItems: \"center\",\n children: /* @__PURE__ */ e(Bn, { ...n })\n }\n), yn = ({\n text: n = \"Loading...\"\n}) => /* @__PURE__ */ i(u, { alignItems: \"center\", children: [\n /* @__PURE__ */ e(D, { size: \"small\" }),\n /* @__PURE__ */ e(w, { num: 4 }),\n /* @__PURE__ */ e(P, { variant: \"h4\", children: n })\n] }), wt = (n) => /* @__PURE__ */ e(\n u,\n {\n width: \"100%\",\n height: \"100%\",\n justifyContent: \"center\",\n alignItems: \"center\",\n children: /* @__PURE__ */ e(yn, { ...n })\n }\n), Bt = ({\n renderBreadCrumbs: n,\n renderPageHeading: t,\n renderTabs: r,\n children: o\n}) => /* @__PURE__ */ i(u, { shadow: \"bottom\", background: p(\"--lhds-color-ui-50\"), gap: 2, children: [\n /* @__PURE__ */ i(u, { indent: 3, children: [\n n && /* @__PURE__ */ i(c, { spacing: 1, alignItems: \"center\", children: [\n /* @__PURE__ */ e(c, { width: \"64px\", height: \"16px\" }),\n n()\n ] }),\n t?.(),\n r && /* @__PURE__ */ e(w, {}),\n r?.()\n ] }),\n o\n] }), yt = (n) => /* @__PURE__ */ e(c, { indent: 3, spacing: !0, ...n }), It = ({\n icon: n,\n heading: t,\n headingLevel: r = \"h2\",\n contentLeft: o,\n contentRight: l\n}) => /* @__PURE__ */ i(c, { alignItems: \"center\", gap: 2, height: \"64px\", children: [\n /* @__PURE__ */ i(c, { alignItems: \"center\", children: [\n /* @__PURE__ */ e(c, { width: \"64px\", alignItems: \"center\", children: n && /* @__PURE__ */ e(E, { icon: n }) }),\n /* @__PURE__ */ e(P, { variant: \"h3\", as: r, children: t })\n ] }),\n /* @__PURE__ */ e(c, { alignItems: \"center\", children: o }),\n /* @__PURE__ */ e(c, { style: { marginLeft: \"auto\" }, alignItems: \"center\", children: l })\n] }), In = \"_selectionRow_1njaw_1\", _n = \"_iconColumn_1njaw_9\", ee = {\n selectionRow: In,\n iconColumn: _n\n}, _t = ({\n icon: n,\n heading: t,\n description: r,\n contentRight: o,\n htmlFor: l,\n circledIconVariant: a,\n ...s\n}) => /* @__PURE__ */ i(\"div\", { className: ee.selectionRow, ...H(s), children: [\n /* @__PURE__ */ i(c, { gap: 2, children: [\n n && /* @__PURE__ */ e(\n u,\n {\n alignItems: \"center\",\n justifyContent: \"center\",\n width: \"40px\",\n className: ee.iconColumn,\n children: /* @__PURE__ */ e(E, { icon: n, variant: a })\n }\n ),\n /* @__PURE__ */ e(\"label\", { htmlFor: l, children: /* @__PURE__ */ i(d, { gap: 0.5, children: [\n /* @__PURE__ */ e(x, { variant: \"bold\", children: t }),\n typeof r == \"string\" ? /* @__PURE__ */ e(x, { color: p(\"--silver-dark\"), children: r }) : r\n ] }) })\n ] }),\n o\n] }), Sn = \"_sidebarMenu_1bx5w_1\", kn = \"_sidebarItems_1bx5w_38\", Rn = \"_scrollContainer_1bx5w_48\", q = {\n sidebarMenu: Sn,\n sidebarItems: kn,\n scrollContainer: Rn\n}, Mn = \"_stenaFlag_108h7_1\", Nn = {\n stenaFlag: Mn\n}, Pn = ({ onClick: n }) => /* @__PURE__ */ i(d, { background: p(\"--lhds-color-ui-50\"), children: [\n /* @__PURE__ */ e(w, {}),\n /* @__PURE__ */ i(\n c,\n {\n justifyContent: \"space-between\",\n alignItems: \"center\",\n flex: 1,\n indent: 1,\n minHeight: \"48px\",\n children: [\n /* @__PURE__ */ e(Me, { onClick: n }),\n /* @__PURE__ */ e(Ne, { className: Nn.stenaFlag })\n ]\n }\n )\n] }), zn = ({\n isPinned: n,\n onClick: t,\n label: r\n}) => /* @__PURE__ */ e(U, { onClick: t, label: r ?? (n ? \"Unpin menu\" : \"Pin menu\"), leftIcon: n ? le : Pe }), St = ({\n className: n,\n children: t,\n onCloseClick: r,\n pinButtonVisible: o,\n onClickPinButton: l,\n bottomItems: a,\n isPinned: s,\n ...h\n}) => /* @__PURE__ */ i(u, { ...h, className: _(q.sidebarMenu, n), children: [\n /* @__PURE__ */ e(Pn, { onClick: r }),\n /* @__PURE__ */ e(u, { className: q.scrollContainer, children: /* @__PURE__ */ i(\n d,\n {\n className: q.sidebarItems,\n justifyContent: \"space-between\",\n flex: 1,\n gap: 1,\n indent: 1,\n children: [\n /* @__PURE__ */ e(d, { gap: 1, children: t }),\n (a || o) && /* @__PURE__ */ i(d, { gap: 1, children: [\n a,\n o && /* @__PURE__ */ e(\n zn,\n {\n isPinned: s,\n onClick: l\n }\n ),\n /* @__PURE__ */ e(w, {})\n ] })\n ]\n }\n ) })\n] }), T = Ee(!1), X = () => He(T), Fn = ({\n label: n,\n ...t\n}) => /* @__PURE__ */ e(pe, { label: n, placement: \"right\", appendTo: document.body, children: /* @__PURE__ */ e(K, { ...t }) }), kt = ({\n closeButtonVisible: n,\n onClickCloseButton: t,\n onClickMenuButton: r,\n children: o,\n bottomItems: l,\n closeButtonTitle: a = \"Unpin menu\"\n}) => /* @__PURE__ */ i(\n u,\n {\n position: \"fixed\",\n left: 0,\n top: 0,\n bottom: 0,\n indent: 0.5,\n spacing: 1,\n gap: 1,\n shadow: \"popover\",\n background: p(\"--lhds-color-ui-50\"),\n children: [\n /* @__PURE__ */ e(K, { onClick: r, icon: ie }),\n /* @__PURE__ */ i(d, { justifyContent: \"space-between\", flex: 1, gap: 1, children: [\n /* @__PURE__ */ e(d, { gap: 1, children: /* @__PURE__ */ e(T.Provider, { value: !0, children: o }) }),\n /* @__PURE__ */ e(d, { gap: 1, children: (l || n) && /* @__PURE__ */ i(T.Provider, { value: !0, children: [\n l,\n n && /* @__PURE__ */ e(\n Fn,\n {\n icon: le,\n label: a,\n onClick: t\n }\n )\n ] }) })\n ] })\n ]\n }\n), jn = ({\n label: n\n}) => X() ? null : /* @__PURE__ */ i(u, { height: \"32px\", justifyContent: \"center\", indent: 1, children: [\n /* @__PURE__ */ e(w, {}),\n /* @__PURE__ */ e(x, { variant: \"overline\", size: \"smaller\", children: n })\n] }), An = ({\n label: n,\n leftIcon: t,\n ...r\n}) => t == null ? null : /* @__PURE__ */ e(pe, { label: n, placement: \"right\", children: /* @__PURE__ */ e(ze, { icon: t, ...r }) }), Rt = (n) => X() ? /* @__PURE__ */ e(An, { ...n }) : /* @__PURE__ */ e(Fe, { ...n }), Ln = ({\n children: n,\n label: t,\n icon: r,\n popupMinWidth: o = \"200px\"\n}) => /* @__PURE__ */ e(\n he,\n {\n renderTrigger: (l) => /* @__PURE__ */ e(K, { icon: r, ...l }),\n placement: \"right-start\",\n trigger: [\"hover\", \"focus\"],\n disablePadding: !0,\n children: /* @__PURE__ */ e(\n u,\n {\n minWidth: o,\n shadow: \"popover\",\n spacing: 1,\n indent: 1,\n gap: 2,\n children: /* @__PURE__ */ i(T.Provider, { value: !1, children: [\n /* @__PURE__ */ e(jn, { label: t }),\n n\n ] })\n }\n )\n }\n), Mt = ({\n children: n,\n label: t,\n leftIcon: r,\n className: o,\n initialExpand: l = !1\n}) => {\n const [a, s] = L(l);\n return X() ? r == null ? null : /* @__PURE__ */ e(Ln, { label: t, icon: r, children: n }) : /* @__PURE__ */ e(\n U,\n {\n label: t,\n onClick: () => s(!a),\n leftIcon: r,\n className: o,\n expandable: !0,\n expanded: a,\n selected: a,\n children: /* @__PURE__ */ e(wn, { children: n })\n }\n );\n}, Nt = (n) => /* @__PURE__ */ e(\n $e,\n {\n color: p(\"--lhds-color-ui-400\"),\n ...n\n }\n), Tn = (n, t, r) => n == null ? \"\" : (qe(Ue(r))(n, t) ?? \"\").replace(\"{ITEMS}\", String(n)), Pt = ({\n numItemsSelected: n,\n label: t,\n selectedLabel: r = {\n one: \"{ITEMS} item selected\",\n other: \"{ITEMS} items selected\"\n },\n afterLabelContent: o,\n rightContent: l,\n localeId: a = \"en-GB\"\n}) => {\n const s = Tn(\n n,\n r,\n a\n );\n return /* @__PURE__ */ i(\n c,\n {\n indent: 3,\n spacing: !0,\n gap: 3,\n minHeight: \"56px\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n background: p(\"--silver-lighter\"),\n flex: 1,\n borderRadius: \"var(--swui-border-radius)\",\n children: [\n /* @__PURE__ */ i(c, { alignItems: \"center\", gap: 2, children: [\n n != null || t != null ? /* @__PURE__ */ e(c, { alignItems: \"center\", children: n != null ? /* @__PURE__ */ e(x, { children: s }) : t != null ? typeof t == \"string\" ? /* @__PURE__ */ e(x, { children: t }) : t : null }) : null,\n o && /* @__PURE__ */ e(c, { children: o })\n ] }),\n /* @__PURE__ */ e(c, { gap: 2, children: l })\n ]\n }\n );\n}, zt = ({ children: n }) => /* @__PURE__ */ e(c, { spacing: 0.5, indent: 0.5, flex: 1, children: n }), On = \"_productCard_19x6b_1\", En = {\n productCard: On\n}, Ft = ({\n renderSelectedProductCard: n,\n renderEditButton: t,\n children: r,\n loading: o,\n shadow: l,\n ...a\n}) => /* @__PURE__ */ i(\n d,\n {\n \"data-comp\": \"ProductCard\",\n className: En.productCard,\n shadow: l ? \"box\" : void 0,\n background: p(\"--moln\"),\n borderRadius: \"24px\",\n overflow: \"hidden\",\n position: o ? \"relative\" : void 0,\n ...H(a),\n children: [\n n?.(),\n /* @__PURE__ */ e(d, { gap: 2, children: r }),\n t && /* @__PURE__ */ i(d, { children: [\n /* @__PURE__ */ e(c, { indent: 2, justifyContent: \"flex-end\", children: t() }),\n /* @__PURE__ */ e(Ge, {})\n ] }),\n o && /* @__PURE__ */ e(\n u,\n {\n top: 0,\n bottom: 0,\n left: 0,\n right: 0,\n position: \"absolute\",\n justifyContent: \"center\",\n alignItems: \"center\",\n background: \"rgba(255, 255, 255, 0.7)\",\n children: /* @__PURE__ */ e(D, {})\n }\n )\n ]\n }\n), Hn = ({ children: n }) => /* @__PURE__ */ e(x, { variant: \"bold\", style: { fontSize: \"2.0rem\" }, children: n }), jt = ({\n description: n,\n subDescription: t,\n descriptionTags: r,\n capacityTag: o,\n offerCodeTag: l,\n priceText: a,\n title: s,\n subTitle: h,\n renderImage: g,\n children: b,\n headingLevel: f\n}) => {\n const C = r == null ? !1 : Array.isArray(r) ? r.length > 0 : !De(r);\n return /* @__PURE__ */ i(d, { children: [\n g?.(),\n /* @__PURE__ */ i(u, { gap: 2, spacing: 4, indent: 4, background: p(\"--moln\"), children: [\n /* @__PURE__ */ i(u, { gap: 0.5, children: [\n /* @__PURE__ */ i(\n c,\n {\n justifyContent: \"space-between\",\n alignItems: \"flex-start\",\n gap: 2,\n children: [\n /* @__PURE__ */ e(P, { variant: \"h3\", as: f, children: s }),\n /* @__PURE__ */ i(c, { gap: 2, children: [\n l && /* @__PURE__ */ e(d, { justifyContent: \"center\", children: l }),\n /* @__PURE__ */ e(Hn, { children: a })\n ] })\n ]\n }\n ),\n h && /* @__PURE__ */ e(x, { variant: \"bold\", color: p(\"--silver-dark\"), children: h })\n ] }),\n (C || o) && /* @__PURE__ */ i(d, { children: [\n /* @__PURE__ */ i(c, { gap: 1, flexWrap: \"wrap\", children: [\n r,\n o && /* @__PURE__ */ e(je, { label: o, variant: \"passive\" })\n ] }),\n /* @__PURE__ */ e(w, {})\n ] }),\n n && /* @__PURE__ */ i(d, { children: [\n /* @__PURE__ */ e(x, { children: n }),\n /* @__PURE__ */ e(w, {})\n ] }),\n t && /* @__PURE__ */ i(d, { children: [\n /* @__PURE__ */ e(x, { children: t }),\n /* @__PURE__ */ e(w, {})\n ] }),\n b\n ] })\n ] });\n}, At = ({ renderImage: n }) => /* @__PURE__ */ i(d, { children: [\n n?.(),\n /* @__PURE__ */ i(u, { gap: 3, spacing: 4, indent: 4, background: p(\"--moln\"), children: [\n /* @__PURE__ */ e(u, { gap: 0.5, children: /* @__PURE__ */ e(\n c,\n {\n justifyContent: \"space-between\",\n alignItems: \"flex-start\",\n gap: 2,\n children: /* @__PURE__ */ e(\n N,\n {\n width: \"50px\",\n height: \"2.8rem\",\n borderRadius: \"8px\"\n }\n )\n }\n ) }),\n /* @__PURE__ */ e(d, { children: /* @__PURE__ */ e(N, { width: \"180px\", height: \"2.0rem\", borderRadius: \"8px\" }) }),\n /* @__PURE__ */ e(d, { children: /* @__PURE__ */ e(N, { width: \"150px\", height: \"1.4rem\", borderRadius: \"8px\" }) })\n ] })\n] }), Lt = ({\n label: n,\n children: t\n}) => /* @__PURE__ */ i(u, { background: p(\"--mussla\"), indent: 2, spacing: 2, gap: 2, children: [\n /* @__PURE__ */ e(P, { variant: \"h3\", as: \"h2\", color: \"white\", children: n }),\n t\n] }), Tt = ({\n title: n,\n variant: t = \"normal\",\n loading: r,\n iconLeft: o,\n compactIconLeft: l,\n renderButton: a,\n renderOfferCodeTag: s,\n renderMandatoryTag: h,\n renderContentLeftOfButton: g,\n children: b,\n ...f\n}) => {\n const { fontSizeRatio: C } = Ke(), y = M({\n query: \"(max-width: 460px)\"\n }), I = M({\n query: \"(max-width: 360px)\"\n }) || y && C > 1.2, v = r ? \"normal\" : t, k = $n(v), m = p(\"--moln\"), W = Wn(v);\n return /* @__PURE__ */ i(\n u,\n {\n \"data-comp\": \"ProductSummaryCard\",\n borderRadius: \"16px\",\n shadow: \"box\",\n overflow: \"hidden\",\n position: r ? \"relative\" : void 0,\n ...H(f),\n children: [\n /* @__PURE__ */ i(c, { flex: 1, children: [\n !I && /* @__PURE__ */ e(u, { flex: 2, justifyContent: \"center\", background: k, children: o && /* @__PURE__ */ e(G, { color: W, icon: o, size: 73 }) }),\n /* @__PURE__ */ e(u, { flex: 4, indent: 2, spacing: 2, background: m, children: /* @__PURE__ */ i(d, { gap: 2, children: [\n n && /* @__PURE__ */ i(c, { justifyContent: \"space-between\", children: [\n /* @__PURE__ */ i(c, { gap: 2, alignItems: \"center\", children: [\n I && l && /* @__PURE__ */ e(E, { icon: l, size: \"medium\" }),\n /* @__PURE__ */ e(x, { variant: \"bold\", size: \"large\", children: n })\n ] }),\n v == \"normal\" && s?.()\n ] }),\n /* @__PURE__ */ e(d, { style: { opacity: r ? 0 : void 0 }, children: b }),\n h && /* @__PURE__ */ e(c, { style: { opacity: r ? 0 : void 0 }, children: h() }),\n /* @__PURE__ */ e(\"div\", {}),\n /* @__PURE__ */ i(\n c,\n {\n justifyContent: \"space-between\",\n alignItems: \"center\",\n gap: 2,\n flexWrap: \"wrap\",\n children: [\n g?.() ?? /* @__PURE__ */ e(\"div\", {}),\n a?.()\n ]\n }\n )\n ] }) })\n ] }),\n r && /* @__PURE__ */ e(\n u,\n {\n top: 0,\n bottom: 0,\n left: 0,\n right: 0,\n position: \"absolute\",\n justifyContent: \"center\",\n alignItems: \"center\",\n background: \"rgba(255, 255, 255, 0.7)\",\n children: /* @__PURE__ */ e(D, {})\n }\n )\n ]\n }\n );\n}, Wn = (n) => {\n switch (n) {\n case \"edit\":\n return p(\"--moln\");\n case \"upgrade\":\n return p(\"--moln\");\n case \"normal\":\n return p(\"--mussla\");\n default:\n de(n);\n }\n}, $n = (n) => {\n switch (n) {\n case \"edit\":\n return p(\"--mussla\");\n case \"upgrade\":\n return p(\"--mussla\");\n case \"normal\":\n return p(\"--silver-lighter\");\n default:\n de(n);\n }\n}, Ot = ({ iconLeft: n, ...t }) => /* @__PURE__ */ e(\n u,\n {\n borderRadius: \"16px\",\n shadow: \"box\",\n overflow: \"hidden\",\n ...H(t),\n children: /* @__PURE__ */ i(c, { flex: 1, children: [\n /* @__PURE__ */ e(\n u,\n {\n flex: 2,\n justifyContent: \"center\",\n background: p(\"--silver-lighter\"),\n children: n && /* @__PURE__ */ e(G, { color: p(\"--mussla\"), icon: n, size: 73 })\n }\n ),\n /* @__PURE__ */ e(u, { flex: 4, indent: 2, spacing: 2, background: p(\"--moln\"), children: /* @__PURE__ */ i(d, { gap: 2, children: [\n /* @__PURE__ */ e(\n N,\n {\n width: \"180px\",\n height: \"2.8rem\",\n borderRadius: \"8px\"\n }\n ),\n /* @__PURE__ */ e(N, { width: \"50px\", height: \"2.0rem\", borderRadius: \"8px\" }),\n /* @__PURE__ */ e(\n N,\n {\n width: \"150px\",\n height: \"1.4rem\",\n borderRadius: \"8px\"\n }\n )\n ] }) })\n ] })\n }\n), ne = [\n \"small-mobile\",\n \"mobile\",\n \"tablet\",\n \"tablet-wide\",\n \"desktop\"\n], be = () => {\n const n = M({\n query: \"(max-width: 768px)\"\n }), t = M({\n query: \"(max-width: 395px)\"\n }), r = M({\n query: \"(max-width: 1024px)\"\n }), o = M({\n query: \"(max-width: 1160px)\"\n });\n return { deviceSize: t ? \"small-mobile\" : n ? \"mobile\" : r ? \"tablet\" : o ? \"tablet-wide\" : \"desktop\" };\n}, qn = (n, t) => n === t || ne.indexOf(n) > ne.indexOf(t), Et = (n) => {\n const { deviceSize: t } = be();\n return {\n visible: F(\n () => qn(t, n),\n [t, n]\n )\n };\n}, Un = ({\n isOpen: n,\n initialIndex: t,\n onUpdateIndex: r,\n altLabelPrevious: o,\n altLabelZoomIn: l,\n altLabelZoomOut: a,\n altLabelNext: s,\n altLabelClose: h,\n onRequestClose: g,\n images: b\n}) => {\n const f = V(null), { deviceSize: C } = be(), y = C !== \"mobile\", [S, I] = L(t ?? 0), v = ({ index: m }) => {\n I(m), r?.(m);\n }, k = F(() => b.map((m) => Gn(m)), [b]);\n return /* @__PURE__ */ e(\n ge,\n {\n open: n,\n close: g,\n index: S,\n plugins: [Xe, Je, Ye],\n slides: k,\n on: { view: v },\n animation: { fade: 0 },\n controller: {\n closeOnPullDown: !0,\n closeOnBackdropClick: !0,\n ref: f\n },\n counter: {\n container: {\n style: {\n filter: \"none\",\n color: \"white\",\n fontSize: \"2.0rem\",\n fontFamily: \"var(--swui-font-primary)\"\n }\n }\n },\n render: {\n buttonZoom: (m) => y && /* @__PURE__ */ i(c, { gap: 1, indent: 2, children: [\n /* @__PURE__ */ e(\n R,\n {\n \"aria-label\": l,\n leftIcon: Le,\n size: \"large\",\n onClick: () => m.zoomIn()\n }\n ),\n /* @__PURE__ */ e(\n R,\n {\n \"aria-label\": a,\n leftIcon: Te,\n size: \"large\",\n onClick: () => m.zoomOut()\n }\n )\n ] }),\n buttonPrev: () => b.length > 1 && y && /* @__PURE__ */ e(B, { num: 4, className: \"yarl__navigation_prev\", children: /* @__PURE__ */ e(\n R,\n {\n \"aria-label\": o,\n leftIcon: ce,\n size: \"large\",\n onClick: () => f.current?.prev()\n }\n ) }),\n buttonNext: () => b.length > 1 && y && /* @__PURE__ */ e(B, { num: 4, className: \"yarl__navigation_next\", children: /* @__PURE__ */ e(\n R,\n {\n \"aria-label\": s,\n leftIcon: ae,\n size: \"large\",\n onClick: () => f.current?.next()\n }\n ) }),\n buttonClose: () => /* @__PURE__ */ e(B, { children: /* @__PURE__ */ e(\n oe,\n {\n variant: \"danger\",\n \"aria-label\": h,\n leftIcon: Ae,\n size: \"large\",\n onClick: () => f.current?.close()\n }\n ) })\n }\n }\n );\n}, Gn = (n) => ({\n src: n.url,\n width: n.width,\n height: n.height,\n alt: n.alt,\n title: n.title,\n description: n.description\n}), Ht = ({\n images: n,\n initialIndex: t,\n altLabelPrevious: r,\n altLabelZoomIn: o,\n altLabelZoomOut: l,\n altLabelNext: a,\n altLabelClose: s\n}) => {\n const h = V(null), [g, b] = L(!1), [f, C] = L(t ?? 0), y = J(() => {\n b(!0);\n }, []), S = J(() => {\n b(!1);\n }, []), I = ({ index: m }) => C(m);\n We(() => {\n C(t ?? 0);\n }, [t]);\n const v = F(() => n.map(Dn), [n]), k = F(() => n.map(\n (m) => m.fullscreenImage ? {\n ...m,\n url: m.fullscreenImage.url,\n width: m.fullscreenImage.width,\n height: m.fullscreenImage.height\n } : m\n ), [n]);\n return /* @__PURE__ */ i(Ve, { blockedKeys: \"Escape\", children: [\n /* @__PURE__ */ e(\n ge,\n {\n controller: { ref: h },\n index: f,\n slides: v,\n plugins: [Qe],\n on: {\n view: I,\n click: y\n },\n carousel: {\n padding: 0,\n spacing: 0,\n imageFit: \"cover\"\n },\n render: {\n buttonPrev: () => n.length > 1 && /* @__PURE__ */ e(B, { className: \"yarl__navigation_prev\", children: /* @__PURE__ */ e(\n R,\n {\n \"aria-label\": r,\n leftIcon: ce,\n onClick: () => h.current?.prev()\n }\n ) }),\n buttonNext: () => n.length > 1 && /* @__PURE__ */ e(B, { className: \"yarl__navigation_next\", children: /* @__PURE__ */ e(\n R,\n {\n \"aria-label\": a,\n leftIcon: ae,\n onClick: () => h.current?.next()\n }\n ) })\n },\n styles: {\n button: {\n filter: \"none\"\n }\n },\n inline: {\n style: {\n width: \"100%\",\n maxWidth: \"900px\",\n aspectRatio: \"3 / 2\",\n margin: \"0 auto\"\n }\n }\n }\n ),\n g && /* @__PURE__ */ e(\n Un,\n {\n isOpen: !0,\n onRequestClose: S,\n initialIndex: f,\n onUpdateIndex: C,\n images: k,\n altLabelPrevious: r,\n altLabelNext: a,\n altLabelClose: s,\n altLabelZoomIn: o,\n altLabelZoomOut: l\n }\n )\n ] });\n}, Dn = (n) => ({\n src: n.url,\n width: n.width,\n height: n.height,\n alt: n.alt,\n title: n.title,\n description: n.description\n});\nexport {\n en as ActionMenuFlatButton,\n at as ActionMenuPrimaryButton,\n ct as ActionMenuSecondaryButton,\n st as CheckboxMenu,\n xn as Collapsible,\n vt as CollapsibleEmptyContent,\n xt as CollapsibleGroupHeading,\n bt as CollapsibleList,\n ft as CollapsibleWithCheckbox,\n Bn as ErrorPanel,\n Ct as ErrorScreen,\n Un as FullscreenImageCarousel,\n Ht as ImageCarousel,\n yn as LoadingPanel,\n wt as LoadingScreen,\n dt as NavBar,\n cn as NavBarButton,\n ut as NavBarHeading,\n pt as NavBarNotificationButton,\n ht as NavBarPopoverButton,\n mt as NavBarSearchField,\n gt as NavBarUserButton,\n Bt as PageHeader,\n yt as PageHeaderRow,\n It as PageHeading,\n Ft as ProductCard,\n jt as ProductCardContentItem,\n At as ProductCardContentItemSkeletor,\n Tt as ProductSummaryCard,\n Ot as ProductSummaryCardSkeletor,\n zt as SelectedItemsActionsPadding,\n Pt as SelectedItemsActionsPanel,\n Lt as SelectedProductCard,\n _t as SelectionRow,\n St as SidebarMenu,\n Mt as SidebarMenuCollapsible,\n wn as SidebarMenuCollapsibleGroupBox,\n jn as SidebarMenuHeading,\n Rt as SidebarMenuLink,\n Nt as SidebarMenuSeparator,\n kt as SidebarRailMenu,\n qn as isDeviceSameOrLarger,\n be as useDeviceSize,\n Et as useLayoutVisibility\n};\n//# sourceMappingURL=index.es.js.map\n","import * as React from \"react\";\nimport { RefObject, useMemo } from \"react\";\nimport { Row } from \"@stenajs-webui/core\";\nimport { TravelDateTextInput } from \"./TravelDateTextInput\";\nimport { createInputMaskForDateFormat } from \"../../localize-date-format/InputMaskProvider\";\nimport { getDateFormatForLocaleCode } from \"../../localize-date-format/DateFormatProvider\";\nimport { reformatLocalizedDateString } from \"../../localize-date-format/LocalizedDateReformatter\";\nimport { DateTextInputVariant, TravelDateRangeInputValue } from \"../types\";\nimport { TravelCalendarSizeVariant } from \"./TravelCalendar\";\nimport { SupportedLocaleCode } from \"../../localize-date-format/LocaleMapper\";\nimport { isDeviceSameOrLarger, useDeviceSize } from \"@stenajs-webui/panels\";\n\nexport type TravelDateRangeTextInputField = \"startDate\" | \"endDate\";\n\nexport interface TravelDateRangeTextInputFieldsProps {\n value: TravelDateRangeInputValue | undefined;\n onValueChange:\n | ((value: Partial<TravelDateRangeInputValue>) => void)\n | undefined;\n localeCode: SupportedLocaleCode;\n startDateLabel?: string;\n endDateLabel?: string;\n onFocus?: (field: TravelDateRangeTextInputField) => void;\n onBlur?: () => void;\n startDateRef?: RefObject<HTMLInputElement | null>;\n endDateRef?: RefObject<HTMLInputElement | null>;\n calendarSize: TravelCalendarSizeVariant;\n placeholderWhenBlurredStartDate: string | undefined;\n placeholderWhenBlurredEndDate: string | undefined;\n valueWhenBlurredStartDate: string | undefined;\n valueWhenBlurredEndDate: string | undefined;\n variant: DateTextInputVariant;\n readOnlyOnMobile: boolean;\n}\n\nexport const TravelDateRangeTextInputFields: React.FC<\n TravelDateRangeTextInputFieldsProps\n> = ({\n value,\n onValueChange,\n localeCode,\n startDateLabel = \"From\",\n endDateLabel = \"To\",\n onFocus,\n onBlur,\n calendarSize,\n startDateRef,\n endDateRef,\n placeholderWhenBlurredStartDate,\n placeholderWhenBlurredEndDate,\n valueWhenBlurredStartDate,\n valueWhenBlurredEndDate,\n variant,\n readOnlyOnMobile,\n}) => {\n const { deviceSize } = useDeviceSize();\n\n const readOnly =\n readOnlyOnMobile && !isDeviceSameOrLarger(deviceSize, \"tablet\");\n\n const { mask, placeholder } = useMemo(() => {\n const dateFormatForLocaleCode = getDateFormatForLocaleCode(localeCode);\n return {\n mask: createInputMaskForDateFormat(dateFormatForLocaleCode),\n placeholder: dateFormatForLocaleCode.toLowerCase(),\n };\n }, [localeCode]);\n\n return (\n <Row>\n <TravelDateTextInput\n mask={mask}\n ref={startDateRef}\n value={value?.startDate}\n onValueChange={(v) => {\n onValueChange?.({ startDate: v });\n }}\n onBlur={(ev) => {\n const startDate = reformatLocalizedDateString(\n ev.target.value,\n localeCode,\n );\n if (startDate && startDate !== value?.startDate) {\n onValueChange?.({ startDate });\n }\n onBlur?.();\n }}\n onFocus={() => onFocus?.(\"startDate\")}\n label={startDateLabel}\n borderRadiusVariant={\"onlyLeft\"}\n placeholder={placeholder}\n placeholderWhenBlurred={placeholderWhenBlurredStartDate}\n valueWhenBlurred={valueWhenBlurredStartDate}\n calendarSize={calendarSize}\n variant={variant}\n readOnly={readOnly}\n />\n <TravelDateTextInput\n mask={mask}\n ref={endDateRef}\n value={value?.endDate}\n onValueChange={(v) => onValueChange?.({ endDate: v })}\n onBlur={(ev) => {\n const endDate = reformatLocalizedDateString(\n ev.target.value,\n localeCode,\n );\n if (endDate && endDate !== value?.endDate) {\n onValueChange?.({ endDate });\n }\n onBlur?.();\n }}\n onFocus={() => onFocus?.(\"endDate\")}\n label={endDateLabel}\n borderRadiusVariant={\"onlyRight\"}\n placeholder={placeholder}\n placeholderWhenBlurred={placeholderWhenBlurredEndDate}\n valueWhenBlurred={valueWhenBlurredEndDate}\n calendarSize={calendarSize}\n variant={variant}\n readOnly={readOnly}\n />\n </Row>\n );\n};\n","import { format, isSameYear, Locale } from \"date-fns\";\n\nexport const formatDateDescription = (\n date: Date,\n today: Date,\n locale: Locale,\n) => {\n const year = isSameYear(date, today) ? \"\" : \" y\";\n if (locale.code.startsWith(\"en\")) {\n return format(date, \"eee MMM d\" + year, { locale }).replace(\".\", \"\");\n } else {\n return format(date, \"eee d MMM\" + year, { locale }).replace(\".\", \"\");\n }\n};\n\nexport const formatDateDescriptionLong = (\n date: Date,\n today: Date,\n locale: Locale,\n) => {\n const year = isSameYear(date, today) ? \"\" : \" y\";\n if (locale.code.startsWith(\"en\")) {\n return format(date, \"eeee MMMM d\" + year, { locale });\n } else {\n return format(date, \"eeee d MMMM\" + year, { locale });\n }\n};\n","import { isAfter, isSameDay } from \"date-fns\";\n\ntype DateParser = (value: string) => Date | null | undefined;\n\nfunction isInvalidRange(\n startDateStr?: string,\n endDateStr?: string,\n parse?: DateParser,\n): boolean {\n if (!startDateStr || !endDateStr || !parse) return false;\n\n const start = parse(startDateStr);\n const end = parse(endDateStr);\n\n // If parsing fails, don't flip\n if (\n !start ||\n !end ||\n Number.isNaN(start.getTime()) ||\n Number.isNaN(end.getTime())\n ) {\n return false;\n }\n\n if (isSameDay(start, end)) return false;\n\n return isAfter(start, end);\n}\n\n/**\n * Flip `startDate` and `endDate` string fields of an object,\n * based on parsed `Date` values using `parse`.\n */\nexport function flipStringDateRange<\n T extends { startDate?: string; endDate?: string },\n>(obj: T, parse: DateParser): T {\n const { startDate, endDate } = obj;\n\n if (!isInvalidRange(startDate, endDate, parse)) {\n return obj;\n }\n\n return {\n ...obj,\n startDate: endDate,\n endDate: startDate,\n };\n}\n\n/**\n * If the date range is invalid, it resets startDate or endDate to the same value.\n * based on parsed `Date` values using `parse`.\n */\nexport function resetDateRangeIfInvalid<\n T extends { startDate?: string; endDate?: string },\n>(obj: T, parse: DateParser, master: \"startDate\" | \"endDate\"): T {\n const { startDate, endDate } = obj;\n\n if (!isInvalidRange(startDate, endDate, parse)) {\n return obj;\n }\n\n if (master === \"startDate\") {\n return {\n ...obj,\n startDate,\n endDate: startDate,\n };\n } else {\n return {\n ...obj,\n startDate: endDate,\n endDate,\n };\n }\n}\n","import {\n getLocaleForLocaleCode,\n SupportedLocaleCode,\n} from \"../../localize-date-format/LocaleMapper\";\nimport { useCallback, useId, useMemo, useRef, useState } from \"react\";\nimport { useToday } from \"@stenajs-webui/core\";\nimport { getDateFormatForLocaleCode } from \"../../localize-date-format/DateFormatProvider\";\nimport { parseLocalizedDateString } from \"../../localize-date-format/LocalizedDateParser\";\nimport {\n intlFormat,\n isAfter,\n isBefore,\n isSameDay,\n isSameMonth,\n} from \"date-fns\";\nimport { getMonthInYear } from \"../../../util/calendar/CalendarDataFactory\";\nimport { formatLocalizedDate } from \"../../localize-date-format/LocalizedDateFormatter\";\nimport { TravelDateRangeInputValue, VisiblePanel } from \"../types\";\nimport { formatDateDescription } from \"../util/DateDescriptionFormatter\";\nimport { convertFirstCharToUpper } from \"../../../util/caseFormat/CaseFormat\";\nimport { resetDateRangeIfInvalid } from \"../util/DateRangeNormalizer\";\n\nexport const useTravelDateRangeInput = (\n value: TravelDateRangeInputValue | undefined,\n onValueChange: ((value: TravelDateRangeInputValue) => void) | undefined,\n localeCode: SupportedLocaleCode,\n languageLocaleCode: SupportedLocaleCode,\n initialMonthInFocus: Date | undefined,\n fieldLastInFocus: \"startDate\" | \"endDate\" | undefined,\n setFieldLastInFocus: (field: \"startDate\" | \"endDate\" | undefined) => void,\n moveFocusToField: (field: \"startDate\" | \"endDate\") => void,\n hideCalendar: undefined | (() => void),\n) => {\n const languageLocale = getLocaleForLocaleCode(languageLocaleCode);\n\n const calendarId = useId();\n const today = useToday();\n\n const monthPickerButtonRef = useRef<HTMLButtonElement>(null);\n\n const dateFormat = useMemo(\n () => getDateFormatForLocaleCode(localeCode),\n [localeCode],\n );\n\n const selectedStartDate = useMemo(\n () =>\n value?.startDate?.length === dateFormat.length\n ? parseLocalizedDateString(value.startDate, localeCode)\n : undefined,\n [dateFormat.length, localeCode, value?.startDate],\n );\n\n const selectedEndDate = useMemo(\n () =>\n value?.endDate?.length === dateFormat.length\n ? parseLocalizedDateString(value.endDate, localeCode)\n : undefined,\n [dateFormat.length, localeCode, value?.endDate],\n );\n\n const valueWhenBlurredStartDate = useMemo(\n () =>\n selectedStartDate != null\n ? formatDateDescription(selectedStartDate, today, languageLocale)\n : undefined,\n [languageLocale, selectedStartDate, today],\n );\n\n const valueWhenBlurredEndDate = useMemo(\n () =>\n selectedEndDate != null\n ? formatDateDescription(selectedEndDate, today, languageLocale)\n : undefined,\n [languageLocale, selectedEndDate, today],\n );\n\n const [visibleMonth, setVisibleMonth] = 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 languageLocale,\n ),\n [languageLocale, visibleMonth],\n );\n\n const monthPickerButtonLabel = useMemo(() => {\n return convertFirstCharToUpper(\n intlFormat(\n visibleMonth,\n { month: \"long\", year: \"numeric\" },\n { locale: languageLocale.code },\n ),\n );\n }, [languageLocale, visibleMonth]);\n\n const todayIsInVisibleMonth = useMemo(() => {\n return isSameMonth(today, visibleMonth);\n }, [today, visibleMonth]);\n\n const [hoverDate, setHoverDate] = useState<Date | undefined>();\n\n const [visiblePanel, setVisiblePanel] = useState<VisiblePanel>(\"calendar\");\n\n const onValueChangeByInputs = useCallback<\n (value: TravelDateRangeInputValue) => void\n >(\n (v) => {\n const startDate =\n v?.startDate?.length === dateFormat.length\n ? parseLocalizedDateString(v.startDate, localeCode)\n : undefined;\n\n const endDate =\n v?.endDate?.length === dateFormat.length\n ? parseLocalizedDateString(v.endDate, localeCode)\n : undefined;\n\n if (startDate) {\n setVisibleMonthClamped(startDate);\n } else if (endDate) {\n setVisibleMonthClamped(endDate);\n }\n\n onValueChange?.({\n ...value,\n ...v,\n });\n },\n [\n dateFormat.length,\n localeCode,\n onValueChange,\n setVisibleMonthClamped,\n value,\n ],\n );\n\n const isValidDateRange = useMemo(\n () =>\n selectedStartDate && selectedEndDate\n ? isAfter(selectedEndDate, selectedStartDate) ||\n isSameDay(selectedEndDate, selectedStartDate)\n : false,\n [selectedEndDate, selectedStartDate],\n );\n\n const hoverAnchor = useMemo(() => {\n const s =\n fieldLastInFocus === \"startDate\" ? value?.endDate : value?.startDate;\n return s ? parseLocalizedDateString(s, localeCode) : undefined;\n }, [fieldLastInFocus, localeCode, value?.endDate, value?.startDate]);\n\n const hoverHighlightDirection = useMemo<\"left\" | \"right\" | undefined>(() => {\n if (hoverDate && hoverAnchor) {\n if (fieldLastInFocus === \"endDate\") {\n return \"right\";\n }\n if (fieldLastInFocus === \"startDate\") {\n return \"left\";\n }\n }\n return undefined;\n }, [fieldLastInFocus, hoverAnchor, hoverDate]);\n\n const onClickDate = (date: Date) => {\n const isSameMonthAndYear =\n date.getFullYear() === visibleMonth.getFullYear() &&\n date.getMonth() === visibleMonth.getMonth();\n\n if (!isSameMonthAndYear) {\n // User clicked on a date in a different month. Those should not be clickable.\n return;\n }\n\n const callOnValueChange = (\n dateRange: {\n startDate: string | undefined;\n endDate: string | undefined;\n },\n master: \"startDate\" | \"endDate\",\n ) =>\n onValueChange?.(\n resetDateRangeIfInvalid(\n dateRange,\n (s: string) => parseLocalizedDateString(s, localeCode),\n master,\n ),\n );\n\n if (fieldLastInFocus === \"startDate\") {\n callOnValueChange(\n {\n startDate: formatLocalizedDate(date, localeCode),\n endDate: value?.endDate,\n },\n \"startDate\",\n );\n if (value?.endDate) {\n hideCalendar?.();\n setFieldLastInFocus(undefined);\n setHoverDate(undefined);\n } else {\n moveFocusToField(\"endDate\");\n }\n } else if (fieldLastInFocus === \"endDate\") {\n callOnValueChange(\n {\n startDate: value?.startDate,\n endDate: formatLocalizedDate(date, localeCode),\n },\n \"endDate\",\n );\n hideCalendar?.();\n setFieldLastInFocus(undefined);\n setHoverDate(undefined);\n } else if (selectedStartDate && selectedEndDate == null) {\n if (isBefore(date, selectedStartDate)) {\n onValueChange?.({\n startDate: formatLocalizedDate(date, localeCode),\n endDate: undefined,\n });\n moveFocusToField(\"endDate\");\n } else {\n onValueChange?.({\n startDate: value?.startDate,\n endDate: formatLocalizedDate(date, localeCode),\n });\n hideCalendar?.();\n setFieldLastInFocus(undefined);\n setHoverDate(undefined);\n }\n } else {\n callOnValueChange(\n {\n startDate: formatLocalizedDate(date, localeCode),\n endDate: undefined,\n },\n \"startDate\",\n );\n moveFocusToField(\"endDate\");\n }\n };\n\n return {\n onClickDate,\n onValueChangeByInputs,\n isValidDateRange,\n monthPickerButtonRef,\n calendarId,\n monthPickerButtonLabel,\n visiblePanel,\n setVisiblePanel,\n setVisibleMonth,\n visibleMonthData,\n todayIsInVisibleMonth,\n hoverDate,\n setHoverDate,\n hoverAnchor,\n hoverHighlightDirection,\n selectedStartDate,\n selectedEndDate,\n today,\n visibleMonth,\n valueWhenBlurredStartDate,\n valueWhenBlurredEndDate,\n };\n};\n","import * as React from \"react\";\nimport { Ref } from \"react\";\nimport {\n FlatButton,\n SecondaryButton,\n stenaAngleDown,\n stenaAngleUp,\n stenaArrowLeft,\n stenaArrowRight,\n} from \"@stenajs-webui/elements\";\nimport { Row } from \"@stenajs-webui/core\";\nimport { addMonths, subMonths } from \"date-fns\";\nimport { VisiblePanel } from \"../types\";\nimport { TravelCalendarSizeVariant } from \"./TravelCalendar\";\n\nexport interface MonthHeaderProps {\n monthPickerButtonLabel: string;\n nextMonthButtonAriaLabel: string;\n previousMonthButtonAriaLabel: string;\n visiblePanel: VisiblePanel;\n setVisiblePanel: (panel: VisiblePanel) => void;\n monthPickerButtonRef: Ref<HTMLButtonElement>;\n visibleMonth: Date;\n setVisibleMonth: (date: Date) => void;\n prevMonthDisabled?: (visibleMonth: Date) => boolean;\n nextMonthDisabled?: (visibleMonth: Date) => boolean;\n calendarSize: TravelCalendarSizeVariant;\n previousMonthButtonTestId?: string;\n nextMonthButtonTestId?: string;\n}\n\nexport const MonthHeader: React.FC<MonthHeaderProps> = ({\n previousMonthButtonAriaLabel,\n nextMonthButtonAriaLabel,\n monthPickerButtonLabel,\n visiblePanel,\n setVisiblePanel,\n monthPickerButtonRef,\n setVisibleMonth,\n visibleMonth,\n prevMonthDisabled,\n nextMonthDisabled,\n calendarSize,\n previousMonthButtonTestId,\n nextMonthButtonTestId,\n}) => {\n const size =\n calendarSize === \"smaller\" || calendarSize === \"small\" ? \"medium\" : \"large\";\n\n return (\n <Row alignSelf={\"center\"} justifyContent={\"space-between\"} width={\"100%\"}>\n <FlatButton\n aria-live={\"polite\"}\n label={monthPickerButtonLabel}\n rightIcon={visiblePanel === \"calendar\" ? stenaAngleDown : stenaAngleUp}\n onClick={() =>\n setVisiblePanel(\n visiblePanel === \"calendar\" ? \"month-picker\" : \"calendar\",\n )\n }\n ref={monthPickerButtonRef}\n size={size}\n />\n <Row alignItems={\"center\"} gap={2}>\n <SecondaryButton\n leftIcon={stenaArrowLeft}\n onClick={() => setVisibleMonth(subMonths(visibleMonth, 1))}\n disabled={prevMonthDisabled?.(visibleMonth)}\n aria-label={previousMonthButtonAriaLabel}\n size={size}\n data-testid={previousMonthButtonTestId}\n />\n <SecondaryButton\n leftIcon={stenaArrowRight}\n onClick={() => setVisibleMonth(addMonths(visibleMonth, 1))}\n disabled={nextMonthDisabled?.(visibleMonth)}\n aria-label={nextMonthButtonAriaLabel}\n size={size}\n data-testid={nextMonthButtonTestId}\n />\n </Row>\n </Row>\n );\n};\n","import {\n isAfter,\n isBefore,\n isSameDay,\n isWithinInterval,\n max,\n min,\n} from \"date-fns\";\n\nconst rangeBgColor = \"var(--selection-range-background-color)\";\n\nexport const getCellBackgroundColors = (\n date: Date,\n selectedStartDate: Date | undefined,\n selectedEndDate: Date | undefined,\n hoverHighlightDirection: \"left\" | \"right\" | undefined,\n hoverDate: Date | undefined,\n hoverAnchor: Date | undefined,\n dayIsInMonth: boolean,\n isValidDateRange: boolean,\n): { left: string; right: string } => {\n if (!dayIsInMonth) {\n return {\n left: \"transparent\",\n right: \"transparent\",\n };\n }\n\n if (selectedStartDate && selectedEndDate && !isValidDateRange) {\n return {\n left: \"transparent\",\n right: \"transparent\",\n };\n }\n\n if (hoverDate && hoverAnchor && hoverHighlightDirection) {\n // User is hovering over calendar, with a range, show highlight instead of selection.\n return getCellBackgroundHoverRangeHighlight(\n date,\n hoverHighlightDirection,\n hoverDate,\n hoverAnchor,\n );\n }\n\n if (hoverDate) {\n return {\n left: \"transparent\",\n right: \"transparent\",\n };\n }\n\n return getCellBackgroundHighlight(\n date,\n selectedStartDate,\n selectedEndDate,\n hoverDate,\n );\n};\n\nexport const getCellBackgroundHighlight = (\n date: Date,\n highlightStartDate: Date | undefined,\n highlightEndDate: Date | undefined,\n hoverDate: Date | undefined,\n): { left: string; right: string } => {\n if (\n highlightStartDate &&\n highlightEndDate &&\n isSameDay(highlightStartDate, highlightEndDate)\n ) {\n return {\n left: \"transparent\",\n right: \"transparent\",\n };\n }\n\n const isInHighlightRange =\n highlightStartDate && highlightEndDate\n ? isAfter(date, highlightStartDate) &&\n isBefore(date, highlightEndDate) &&\n !isSameDay(date, highlightStartDate) &&\n !isSameDay(date, highlightEndDate)\n : false;\n\n if (isInHighlightRange) {\n return {\n left: rangeBgColor,\n right: rangeBgColor,\n };\n }\n\n if (highlightStartDate && highlightEndDate) {\n if (isSameDay(date, highlightStartDate)) {\n return {\n left: \"transparent\",\n right: rangeBgColor,\n };\n }\n\n if (isSameDay(date, highlightEndDate)) {\n return {\n left: rangeBgColor,\n right: \"transparent\",\n };\n }\n\n return {\n left: \"transparent\",\n right: \"transparent\",\n };\n }\n\n if (\n highlightStartDate &&\n hoverDate &&\n isAfter(hoverDate, highlightStartDate)\n ) {\n if (isSameDay(date, highlightStartDate)) {\n return {\n left: \"transparent\",\n right: rangeBgColor,\n };\n }\n\n if (isSameDay(date, hoverDate)) {\n return {\n left: rangeBgColor,\n right: \"transparent\",\n };\n }\n }\n\n return {\n left: \"transparent\",\n right: \"transparent\",\n };\n};\n\nexport const getCellBackgroundHoverRangeHighlight = (\n date: Date,\n hoverHighlightDirection: \"left\" | \"right\",\n hoverDate: Date,\n hoverAnchor: Date,\n): { left: string; right: string } => {\n const flipLeftRight = isAfter(hoverDate, hoverAnchor);\n\n const isInHighlightRange = isWithinInterval(date, {\n start: min([hoverDate, hoverAnchor]),\n end: max([hoverDate, hoverAnchor]),\n });\n\n const dateIsHoverDate = isSameDay(date, hoverDate);\n const dateIsHoverAnchor = isSameDay(date, hoverAnchor);\n\n if (hoverHighlightDirection === \"right\" && isBefore(hoverDate, hoverAnchor)) {\n // Hovering with start date as anchor, hover range is invalid.\n return {\n left: \"transparent\",\n right: \"transparent\",\n };\n }\n\n if (hoverHighlightDirection === \"left\" && isAfter(hoverDate, hoverAnchor)) {\n // Hovering with end date as anchor, hover range is invalid.\n return {\n left: \"transparent\",\n right: \"transparent\",\n };\n }\n\n if (dateIsHoverDate && dateIsHoverAnchor) {\n return {\n left: \"transparent\",\n right: \"transparent\",\n };\n }\n\n if (dateIsHoverDate) {\n return flip(flipLeftRight, {\n left: \"transparent\",\n right: rangeBgColor,\n });\n }\n\n if (dateIsHoverAnchor) {\n return flip(flipLeftRight, {\n left: rangeBgColor,\n right: \"transparent\",\n });\n }\n\n if (isInHighlightRange) {\n return {\n left: rangeBgColor,\n right: rangeBgColor,\n };\n }\n\n return {\n left: \"transparent\",\n right: \"transparent\",\n };\n};\n\nconst flip = <T>(\n flip: boolean,\n { left, right }: { left: T; right: T },\n): { left: T; right: T } => {\n if (flip) {\n return {\n left: right,\n right: left,\n };\n } else {\n return { left, right };\n }\n};\n","import { addDays, addMonths, startOfWeek, subDays, subMonths } from \"date-fns\";\n\nexport const getDateToFocusOn = (\n currentDate: Date,\n key: string,\n): Date | undefined => {\n switch (key) {\n case \"PageUp\":\n return subMonths(currentDate, 1);\n case \"PageDown\":\n return addMonths(currentDate, 1);\n case \"Home\":\n return startOfWeek(currentDate);\n case \"End\":\n return addDays(startOfWeek(currentDate), 6);\n case \"ArrowLeft\":\n return subDays(currentDate, 1);\n case \"ArrowUp\":\n return subDays(currentDate, 7);\n case \"ArrowRight\":\n return addDays(currentDate, 1);\n case \"ArrowDown\":\n return addDays(currentDate, 7);\n default:\n return undefined;\n }\n};\n","import { addHours, format } from \"date-fns\";\nimport { DateFormats } from \"../../../util/date/DateFormats\";\n\nexport const createDayId = (date: Date, calendarId: string) => {\n return format(addHours(date, 12), DateFormats.fullDate) + calendarId;\n};\n","import * as React from \"react\";\nimport { Box, Row } from \"@stenajs-webui/core\";\nimport { TravelCalendarSizeVariant } from \"./TravelCalendar\";\nimport styles from \"./TravelDateCellBackground.module.css\";\nimport cx from \"classnames\";\n\nexport interface TravelDateCellBackgroundProps {\n calendarSize: TravelCalendarSizeVariant;\n bgColorLeft: string;\n bgColorRight: string;\n}\n\nexport const TravelDateCellBackground: React.FC<\n TravelDateCellBackgroundProps\n> = ({ calendarSize, bgColorLeft, bgColorRight }) => {\n return (\n <Row>\n <Box\n className={cx(styles.travelDateCellBackground, styles[calendarSize])}\n background={bgColorLeft}\n />\n <Box\n className={cx(styles.travelDateCellBackground, styles[calendarSize])}\n background={bgColorRight}\n />\n </Row>\n );\n};\n","import * as React from \"react\";\nimport { KeyboardEventHandler, useCallback } from \"react\";\nimport { Text } from \"@stenajs-webui/core\";\nimport { DayData } from \"../../../util/calendar/CalendarDataFactory\";\nimport styles from \"./TravelDateCell.module.css\";\nimport cx from \"classnames\";\nimport { isAfter, isSameDay, isSameMonth } from \"date-fns\";\nimport { getCellBackgroundColors } from \"../util/CellBgColors\";\nimport { getDateToFocusOn } from \"../util/KeyboardNavigation\";\nimport { createDayId } from \"../util/DayIdGenerator\";\nimport { cssColor } from \"@stenajs-webui/theme\";\nimport { TravelCalendarSizeVariant } from \"./TravelCalendar\";\nimport { TravelDateCellBackground } from \"./TravelDateCellBackground\";\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 /** Current date that the mouse is hovering over. */\n hoverDate: Date | undefined;\n /** The other date to show range highlight between, when user hovers the mouse. */\n hoverAnchor: Date | undefined;\n today: Date;\n todayIsInVisibleMonth: boolean;\n calendarId: string;\n isDateDisabled?: (date: Date) => boolean;\n dateTestId?: (date: Date) => string | undefined;\n size: TravelCalendarSizeVariant;\n /**\n * If \"left\", only hovering on earlier dates will create a highlight. If undefined, no range will be highlighted.\n */\n hoverHighlightDirection: \"left\" | \"right\" | undefined;\n}\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 hoverAnchor,\n today,\n todayIsInVisibleMonth,\n calendarId,\n isDateDisabled,\n size,\n dateTestId,\n hoverHighlightDirection,\n}) => {\n const onKeyDown = useCallback<KeyboardEventHandler<HTMLTableDataCellElement>>(\n async (e) => {\n const nextDate = getDateToFocusOn(day.date, e.key);\n const nextDateDisabled =\n (nextDate && isDateDisabled?.(nextDate)) ?? false;\n\n if (nextDate && !nextDateDisabled) {\n onStartHover(nextDate);\n 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) ?? false;\n\n const hoverLeftOfAnchor =\n hoverDate && hoverAnchor ? isAfter(hoverDate, hoverAnchor) : false;\n\n const isHoverRangeStart =\n hoverDate && hoverAnchor\n ? isSameDay(hoverLeftOfAnchor ? hoverAnchor : hoverDate, day.date)\n : false;\n\n const isHoverRangeEnd =\n hoverDate && hoverAnchor\n ? isSameDay(hoverLeftOfAnchor ? hoverDate : hoverAnchor, day.date)\n : false;\n\n const isSelectionStart =\n !hoverDate && selectedStartDate\n ? isSameDay(selectedStartDate, day.date)\n : false;\n\n const isSelectionEnd =\n !hoverDate && 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 hoverHighlightDirection,\n hoverDate,\n hoverAnchor,\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 || isHoverRangeStart) && styles.isSelectionStart,\n (isSelectionEnd || isHoverRangeEnd) && 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 { Dispatch, SetStateAction } 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 styles from \"./TravelCalendar.module.css\";\n\nexport type TravelCalendarSizeVariant =\n | \"smaller\"\n | \"small\"\n | \"medium\"\n | \"large\";\n\nexport interface TravelCalendarProps {\n visibleMonthData: MonthData;\n onClickDate: (date: Date) => void;\n visibleMonth: Date;\n setVisibleMonth: (visibleMonth: Date) => void;\n isValidDateRange: boolean;\n setHoverDate: Dispatch<SetStateAction<Date | undefined>>;\n selectedStartDate: Date | undefined;\n selectedEndDate: Date | undefined;\n /** The date that the mouse is hovering over. */\n hoverDate: Date | undefined;\n /**\n * The other date to show range highlight between, when the user hovers the mouse.\n * If not set, only hovered date will be highlighted, not range.\n * */\n hoverAnchor: Date | undefined;\n today: Date;\n isDateDisabled?: (date: Date) => boolean;\n dateTestId?: (date: Date) => string | undefined;\n calendarId: string;\n todayIsInVisibleMonth: boolean;\n size?: TravelCalendarSizeVariant;\n multiSelectable: boolean;\n /**\n * If \"left\", only hovering on earlier dates will create a highlight. If undefined, no range will be highlighted.\n */\n hoverHighlightDirection: \"left\" | \"right\" | undefined;\n}\n\nexport const TravelCalendar: React.FC<TravelCalendarProps> = ({\n visibleMonthData,\n onClickDate,\n setHoverDate,\n setVisibleMonth,\n visibleMonth,\n isValidDateRange,\n selectedStartDate,\n selectedEndDate,\n hoverDate,\n hoverAnchor,\n today,\n calendarId,\n isDateDisabled,\n todayIsInVisibleMonth,\n size = \"medium\",\n multiSelectable,\n dateTestId,\n hoverHighlightDirection,\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 hoverAnchor={hoverAnchor}\n today={today}\n todayIsInVisibleMonth={todayIsInVisibleMonth}\n calendarId={calendarId}\n isDateDisabled={isDateDisabled}\n dateTestId={dateTestId}\n hoverHighlightDirection={hoverHighlightDirection}\n />\n ))}\n </tr>\n </React.Fragment>\n ))}\n </tbody>\n </table>\n );\n};\n","import * as React from \"react\";\nimport {\n KeyboardEventHandler,\n ReactNode,\n useCallback,\n useLayoutEffect,\n useRef,\n useState,\n} from \"react\";\nimport {\n Box,\n Heading,\n HeadingVariant,\n useOnClickOutside,\n} from \"@stenajs-webui/core\";\nimport { ValueAndOnValueChangeProps } from \"@stenajs-webui/forms\";\nimport {\n TravelDateRangeTextInputField,\n TravelDateRangeTextInputFields,\n} from \"../../../features/travel-calendar/components/TravelDateRangeTextInputFields\";\nimport { CardBody } from \"@stenajs-webui/elements\";\nimport { MonthPicker } from \"../../../features/month-picker/MonthPicker\";\nimport { useTravelDateRangeInput } from \"../../../features/travel-calendar/hooks/UseTravelDateRangeInput\";\nimport { MonthHeader } from \"../../../features/travel-calendar/components/MonthHeader\";\nimport {\n TravelCalendar,\n TravelCalendarSizeVariant,\n} from \"../../../features/travel-calendar/components/TravelCalendar\";\nimport {\n DateTextInputVariant,\n TravelDateRangeInputValue,\n} from \"../../../features/travel-calendar/types\";\nimport styles from \"./TravelDateRangeInput.module.css\";\nimport cx from \"classnames\";\nimport { SupportedLocaleCode } from \"../../../features/localize-date-format/LocaleMapper\";\n\nexport interface RenderBelowCalendarArgs {\n hideCalendar: () => void;\n}\n\nexport interface TravelDateRangeInputProps\n extends ValueAndOnValueChangeProps<TravelDateRangeInputValue> {\n localeCode?: SupportedLocaleCode;\n languageLocaleCode?: SupportedLocaleCode;\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 isDateDisabled?: (date: Date) => boolean;\n prevMonthDisabled?: (visibleMonth: Date) => boolean;\n nextMonthDisabled?: (visibleMonth: Date) => boolean;\n zIndex?: number;\n zIndexWhenClosed?: number;\n onHideCalendar?: () => void;\n renderBelowCalendar?: (args: RenderBelowCalendarArgs) => ReactNode;\n size?: TravelCalendarSizeVariant;\n dateTestId?: (date: Date) => string | undefined;\n previousMonthButtonTestId?: string;\n nextMonthButtonTestId?: string;\n placeholderWhenBlurredStartDate?: string;\n placeholderWhenBlurredEndDate?: string;\n textInputVariant?: DateTextInputVariant;\n}\n\nexport const TravelDateRangeInput: React.FC<TravelDateRangeInputProps> = ({\n value,\n onValueChange,\n startDateLabel,\n endDateLabel,\n localeCode = \"sv\",\n languageLocaleCode = localeCode,\n initialMonthInFocus,\n previousMonthButtonAriaLabel = \"Previous month\",\n nextMonthButtonAriaLabel = \"Next month\",\n placeholderWhenBlurredStartDate,\n placeholderWhenBlurredEndDate,\n heading,\n headingLevel,\n numMonthsInMonthPicker = 12,\n isDateDisabled,\n prevMonthDisabled,\n nextMonthDisabled,\n firstMonthInMonthPicker = new Date(),\n zIndex = 1000,\n zIndexWhenClosed,\n onHideCalendar,\n renderBelowCalendar,\n size = \"medium\",\n dateTestId,\n previousMonthButtonTestId,\n nextMonthButtonTestId,\n textInputVariant = \"standard\",\n}) => {\n const [calendarOpen, setCalendarOpen] = useState(false);\n const [calendarInDom, setCalendarInDom] = useState(false);\n const [boxSize, setBoxSize] = useState<{ height: number; width: number }>({\n // Sane defaults, this will be updated with actual data from DOM.\n width: 336,\n height: 66,\n });\n\n const [fieldLastInFocus, setFieldLastInFocus] = useState<\n \"startDate\" | \"endDate\" | undefined\n >(undefined);\n\n const startDateRef = useRef<HTMLInputElement>(null);\n const endDateRef = useRef<HTMLInputElement>(null);\n\n const moveFocusToField = (field: \"startDate\" | \"endDate\") => {\n if (field === \"startDate\") {\n startDateRef.current?.focus();\n } else if (field === \"endDate\") {\n endDateRef.current?.focus();\n }\n };\n\n const inputFieldsHeight = size === \"large\" ? \"8.8rem\" : \"6.6rem\";\n\n const calendarOpenRef = useRef(false);\n\n const onInputFocus = useCallback((field: TravelDateRangeTextInputField) => {\n setFieldLastInFocus(field);\n calendarOpenRef.current = true;\n setCalendarInDom(true);\n setTimeout(() => {\n setCalendarOpen(true);\n }, 10);\n }, []);\n\n const hideCalendar = useCallback(() => {\n if (!calendarInDom) {\n return;\n }\n\n setCalendarOpen(false);\n calendarOpenRef.current = false;\n onHideCalendar?.();\n\n setTimeout(() => {\n if (!calendarOpenRef.current) {\n setCalendarInDom(false);\n }\n }, 120);\n }, [calendarInDom, onHideCalendar]);\n\n const ref = useRef<HTMLDivElement>(null);\n const sizeSourceRef = useRef<HTMLDivElement>(null);\n\n useOnClickOutside(ref, hideCalendar);\n\n useLayoutEffect(() => {\n const width = sizeSourceRef.current?.offsetWidth;\n const height = sizeSourceRef.current?.offsetHeight;\n if (width != null && height != null) {\n if (boxSize.height !== height || boxSize.width !== width) {\n setBoxSize({ width, height });\n }\n }\n }, [boxSize.height, boxSize.width]);\n\n const inputProps = useTravelDateRangeInput(\n value,\n onValueChange,\n localeCode,\n languageLocaleCode,\n initialMonthInFocus,\n fieldLastInFocus,\n setFieldLastInFocus,\n moveFocusToField,\n hideCalendar,\n );\n\n const {\n visiblePanel,\n visibleMonth,\n onValueChangeByInputs,\n setVisibleMonth,\n setVisiblePanel,\n monthPickerButtonRef,\n } = inputProps;\n\n const onKeyDown = useCallback<KeyboardEventHandler<HTMLDivElement>>(\n (ev) => {\n if (ev.key === \"Escape\") {\n hideCalendar();\n }\n },\n [hideCalendar],\n );\n\n return (\n <Box\n position={\"relative\"}\n className={styles.travelDateRangeInput}\n ref={ref}\n onKeyDown={onKeyDown}\n height={boxSize.height}\n width={boxSize.width}\n >\n <Box\n position={\"absolute\"}\n ref={sizeSourceRef}\n zIndex={calendarInDom ? zIndex : zIndexWhenClosed}\n >\n <TravelDateRangeTextInputFields\n {...inputProps}\n value={value}\n onValueChange={onValueChangeByInputs}\n startDateRef={startDateRef}\n endDateRef={endDateRef}\n localeCode={localeCode}\n startDateLabel={startDateLabel}\n endDateLabel={endDateLabel}\n onFocus={onInputFocus}\n calendarSize={size}\n placeholderWhenBlurredStartDate={placeholderWhenBlurredStartDate}\n placeholderWhenBlurredEndDate={placeholderWhenBlurredEndDate}\n variant={textInputVariant}\n /*\n When focusing on the input, the calendar popover appears.\n But the keyboard appears as well and covers the calendar.\n\n readOnly disables input and hides the keyboard on mobile.\n This enables the user to click on input to select it, then click in the calendar.\n\n This is not needed for TravelDate*Calendar, since the calendar is always visible.\n */\n readOnlyOnMobile={true}\n />\n </Box>\n\n {calendarInDom && (\n <Box\n position={\"absolute\"}\n zIndex={zIndex - 1}\n left={\"-2.4rem\"}\n top={heading ? \"-8.0rem\" : \"-2.4rem\"}\n className={cx(styles.overlay, calendarOpen && styles.calendarVisible)}\n >\n <Box\n background={\"white\"}\n shadow={\"popover\"}\n borderRadius={\"var(--swui-border-radius-large)\"}\n >\n <CardBody gap={3}>\n {heading && (\n <Heading variant={\"h2\"} as={headingLevel}>\n {heading}\n </Heading>\n )}\n\n <Box height={inputFieldsHeight} />\n\n <MonthHeader\n {...inputProps}\n previousMonthButtonAriaLabel={previousMonthButtonAriaLabel}\n nextMonthButtonAriaLabel={nextMonthButtonAriaLabel}\n calendarSize={size}\n prevMonthDisabled={prevMonthDisabled}\n nextMonthDisabled={nextMonthDisabled}\n previousMonthButtonTestId={previousMonthButtonTestId}\n nextMonthButtonTestId={nextMonthButtonTestId}\n />\n\n {visiblePanel === \"calendar\" && (\n <TravelCalendar\n {...inputProps}\n size={size}\n multiSelectable={true}\n isDateDisabled={isDateDisabled}\n dateTestId={dateTestId}\n />\n )}\n\n {visiblePanel === \"month-picker\" && (\n <MonthPicker\n firstMonth={firstMonthInMonthPicker}\n numMonths={numMonthsInMonthPicker}\n value={visibleMonth}\n size={size}\n localeCode={languageLocaleCode}\n onValueChange={(v) => {\n setVisibleMonth(v);\n setVisiblePanel(\"calendar\");\n monthPickerButtonRef.current?.focus();\n }}\n onCancel={() => {\n setVisiblePanel(\"calendar\");\n monthPickerButtonRef.current?.focus();\n }}\n />\n )}\n {renderBelowCalendar?.({ hideCalendar })}\n </CardBody>\n </Box>\n </Box>\n )}\n </Box>\n );\n};\n","import * as React from \"react\";\nimport { useMemo } from \"react\";\nimport { Row } from \"@stenajs-webui/core\";\nimport { TravelDateTextInput } from \"./TravelDateTextInput\";\nimport { createInputMaskForDateFormat } from \"../../localize-date-format/InputMaskProvider\";\nimport { getDateFormatForLocaleCode } from \"../../localize-date-format/DateFormatProvider\";\nimport { reformatLocalizedDateString } from \"../../localize-date-format/LocalizedDateReformatter\";\nimport { TravelCalendarSizeVariant } from \"./TravelCalendar\";\nimport { DateTextInputVariant } from \"../types\";\nimport { SupportedLocaleCode } from \"../../localize-date-format/LocaleMapper\";\nimport { isDeviceSameOrLarger, useDeviceSize } from \"@stenajs-webui/panels\";\n\nexport interface TravelDateTextInputFieldProps {\n value: string | undefined;\n onValueChange: ((value: string) => void) | undefined;\n localeCode: SupportedLocaleCode;\n label?: string;\n onFocus?: () => void;\n calendarSize: TravelCalendarSizeVariant;\n placeholderWhenBlurred: string | undefined;\n valueWhenBlurred: string | undefined;\n variant: DateTextInputVariant;\n readOnlyOnMobile: boolean;\n}\n\nexport const TravelDateTextInputField: React.FC<\n TravelDateTextInputFieldProps\n> = ({\n value,\n onValueChange,\n label = \"Date\",\n localeCode,\n onFocus,\n calendarSize,\n placeholderWhenBlurred,\n valueWhenBlurred,\n variant,\n readOnlyOnMobile,\n}) => {\n const { deviceSize } = useDeviceSize();\n\n const readOnly =\n readOnlyOnMobile && !isDeviceSameOrLarger(deviceSize, \"tablet\");\n\n const { mask, placeholder } = useMemo(() => {\n const dateFormatForLocaleCode = getDateFormatForLocaleCode(localeCode);\n return {\n mask: createInputMaskForDateFormat(dateFormatForLocaleCode),\n placeholder: dateFormatForLocaleCode.toLowerCase(),\n };\n }, [localeCode]);\n\n return (\n <Row>\n <TravelDateTextInput\n mask={mask}\n value={value}\n onValueChange={onValueChange}\n onBlur={(ev) => {\n const date = reformatLocalizedDateString(ev.target.value, localeCode);\n if (date && date !== value) {\n onValueChange?.(date);\n }\n }}\n readOnly={readOnly}\n onFocus={onFocus}\n label={label}\n placeholder={placeholder}\n calendarSize={calendarSize}\n placeholderWhenBlurred={placeholderWhenBlurred}\n valueWhenBlurred={valueWhenBlurred}\n variant={variant}\n />\n </Row>\n );\n};\n","import {\n getLocaleForLocaleCode,\n SupportedLocaleCode,\n} from \"../../localize-date-format/LocaleMapper\";\nimport { useCallback, useId, useMemo, useRef, useState } from \"react\";\nimport { useToday } from \"@stenajs-webui/core\";\nimport { getDateFormatForLocaleCode } from \"../../localize-date-format/DateFormatProvider\";\nimport { parseLocalizedDateString } from \"../../localize-date-format/LocalizedDateParser\";\nimport { intlFormat, isAfter, isSameMonth } from \"date-fns\";\nimport { getMonthInYear } from \"../../../util/calendar/CalendarDataFactory\";\nimport { formatLocalizedDate } from \"../../localize-date-format/LocalizedDateFormatter\";\nimport { VisiblePanel } from \"../types\";\nimport { formatDateDescription } from \"../util/DateDescriptionFormatter\";\nimport { convertFirstCharToUpper } from \"../../../util/caseFormat/CaseFormat\";\n\nexport const useTravelDateInput = (\n value: string | undefined,\n onValueChange: ((value: string) => void) | undefined,\n localeCode: SupportedLocaleCode,\n languageLocaleCode: SupportedLocaleCode,\n initialMonthInFocus: Date | undefined,\n onClickDate?: (date: Date) => void,\n) => {\n const languageLocale = getLocaleForLocaleCode(languageLocaleCode);\n\n const calendarId = useId();\n const today = useToday();\n\n const monthPickerButtonRef = useRef<HTMLButtonElement>(null);\n\n const dateFormat = useMemo(\n () => getDateFormatForLocaleCode(localeCode),\n [localeCode],\n );\n\n const selectedDate = useMemo(\n () =>\n value?.length === dateFormat.length\n ? parseLocalizedDateString(value, localeCode)\n : undefined,\n [dateFormat.length, localeCode, value],\n );\n\n const valueWhenBlurred = useMemo(\n () =>\n selectedDate != null\n ? formatDateDescription(selectedDate, today, languageLocale)\n : undefined,\n [languageLocale, selectedDate, today],\n );\n\n const [visibleMonth, setVisibleMonth] = 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 languageLocale,\n ),\n [languageLocale, visibleMonth],\n );\n\n const monthPickerButtonLabel = useMemo(() => {\n return convertFirstCharToUpper(\n intlFormat(\n visibleMonth,\n { month: \"long\", year: \"numeric\" },\n { locale: languageLocale.code },\n ),\n );\n }, [languageLocale, visibleMonth]);\n\n const todayIsInVisibleMonth = useMemo(() => {\n return isSameMonth(today, visibleMonth);\n }, [today, visibleMonth]);\n\n const [hoverDate, setHoverDate] = useState<Date | undefined>();\n\n const [visiblePanel, setVisiblePanel] = useState<VisiblePanel>(\"calendar\");\n\n const onValueChangeByInputs = useCallback<(value: string) => void>(\n (v) => {\n const startDate =\n v?.length === dateFormat.length\n ? parseLocalizedDateString(v, localeCode)\n : undefined;\n\n if (startDate) {\n setVisibleMonthClamped(startDate);\n }\n\n onValueChange?.(v);\n },\n [dateFormat.length, localeCode, onValueChange, setVisibleMonthClamped],\n );\n\n const onClickDate_ = (date: Date) => {\n onValueChange?.(formatLocalizedDate(date, localeCode));\n onClickDate?.(date);\n };\n\n return {\n onClickDate: onClickDate_,\n onValueChangeByInputs,\n monthPickerButtonRef,\n calendarId,\n monthPickerButtonLabel,\n visiblePanel,\n setVisiblePanel,\n setVisibleMonth,\n visibleMonthData,\n todayIsInVisibleMonth,\n hoverDate,\n hoverAnchor: undefined,\n setHoverDate,\n selectedDate,\n today,\n visibleMonth,\n valueWhenBlurred,\n };\n};\n","import * as React from \"react\";\nimport {\n KeyboardEventHandler,\n ReactNode,\n useCallback,\n useLayoutEffect,\n useRef,\n useState,\n} from \"react\";\nimport {\n Box,\n Heading,\n HeadingVariant,\n useOnClickOutside,\n} from \"@stenajs-webui/core\";\nimport { ValueAndOnValueChangeProps } from \"@stenajs-webui/forms\";\nimport { CardBody } from \"@stenajs-webui/elements\";\nimport { MonthPicker } from \"../../../features/month-picker/MonthPicker\";\nimport { MonthHeader } from \"../../../features/travel-calendar/components/MonthHeader\";\nimport {\n TravelCalendar,\n TravelCalendarSizeVariant,\n} from \"../../../features/travel-calendar/components/TravelCalendar\";\nimport styles from \"./TravelDateInput.module.css\";\nimport cx from \"classnames\";\nimport { TravelDateTextInputField } from \"../../../features/travel-calendar/components/TravelDateTextInputField\";\nimport { useTravelDateInput } from \"../../../features/travel-calendar/hooks/UseTravelDateInput\";\nimport { DateTextInputVariant } from \"../../../features/travel-calendar/types\";\nimport { SupportedLocaleCode } from \"../../../features/localize-date-format/LocaleMapper\";\n\nexport interface RenderBelowSingleDateCalendarArgs {\n hideCalendar: () => void;\n}\n\nexport interface TravelDateInputProps\n extends ValueAndOnValueChangeProps<string> {\n localeCode?: SupportedLocaleCode;\n languageLocaleCode?: SupportedLocaleCode;\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 isDateDisabled?: (date: Date) => boolean;\n prevMonthDisabled?: (visibleMonth: Date) => boolean;\n nextMonthDisabled?: (visibleMonth: Date) => boolean;\n zIndex?: number;\n zIndexWhenClosed?: number;\n onHideCalendar?: () => void;\n renderBelowCalendar?: (args: RenderBelowSingleDateCalendarArgs) => ReactNode;\n size?: TravelCalendarSizeVariant;\n dateTestId?: (date: Date) => string | undefined;\n previousMonthButtonTestId?: string;\n nextMonthButtonTestId?: string;\n placeholderWhenBlurred?: string;\n textInputVariant?: DateTextInputVariant;\n}\n\nexport const TravelDateInput: React.FC<TravelDateInputProps> = ({\n value,\n onValueChange,\n label,\n localeCode = \"sv\",\n languageLocaleCode = localeCode,\n initialMonthInFocus,\n previousMonthButtonAriaLabel = \"Previous month\",\n nextMonthButtonAriaLabel = \"Next month\",\n placeholderWhenBlurred,\n heading,\n headingLevel,\n numMonthsInMonthPicker = 12,\n isDateDisabled,\n prevMonthDisabled,\n nextMonthDisabled,\n firstMonthInMonthPicker = new Date(),\n zIndex = 1000,\n zIndexWhenClosed,\n onHideCalendar,\n renderBelowCalendar,\n size = \"medium\",\n dateTestId,\n previousMonthButtonTestId,\n nextMonthButtonTestId,\n textInputVariant = \"standard\",\n}) => {\n const [calendarOpen, setCalendarOpen] = useState(false);\n const [calendarInDom, setCalendarInDom] = useState(false);\n const [boxSize, setBoxSize] = useState<{ height: number; width: number }>({\n // Sane defaults, this will be updated with actual data from DOM.\n width: 336,\n height: 66,\n });\n\n const inputFieldsHeight = size === \"large\" ? \"8.8rem\" : \"6.6rem\";\n\n const calendarOpenRef = useRef(false);\n\n const showCalendar = useCallback(() => {\n calendarOpenRef.current = true;\n setCalendarInDom(true);\n setTimeout(() => {\n setCalendarOpen(true);\n }, 10);\n }, []);\n\n const hideCalendar = useCallback(() => {\n if (!calendarInDom) {\n return;\n }\n\n setCalendarOpen(false);\n calendarOpenRef.current = false;\n onHideCalendar?.();\n\n setTimeout(() => {\n if (!calendarOpenRef.current) {\n setCalendarInDom(false);\n }\n }, 120);\n }, [calendarInDom, onHideCalendar]);\n\n const delayedHideCalendar = useCallback(() => {\n setTimeout(() => {\n hideCalendar();\n }, 250);\n }, [hideCalendar]);\n\n const ref = useRef<HTMLDivElement>(null);\n const sizeSourceRef = useRef<HTMLDivElement>(null);\n\n useOnClickOutside(ref, hideCalendar);\n\n useLayoutEffect(() => {\n const width = sizeSourceRef.current?.offsetWidth;\n const height = sizeSourceRef.current?.offsetHeight;\n if (width != null && height != null) {\n if (boxSize.height !== height || boxSize.width !== width) {\n setBoxSize({ width, height });\n }\n }\n }, [boxSize.height, boxSize.width]);\n\n const inputProps = useTravelDateInput(\n value,\n onValueChange,\n localeCode,\n languageLocaleCode,\n initialMonthInFocus,\n delayedHideCalendar,\n );\n\n const {\n visiblePanel,\n visibleMonth,\n onValueChangeByInputs,\n selectedDate,\n setVisibleMonth,\n setVisiblePanel,\n monthPickerButtonRef,\n } = inputProps;\n\n const onKeyDown = useCallback<KeyboardEventHandler<HTMLDivElement>>(\n (ev) => {\n if (ev.key === \"Escape\") {\n hideCalendar();\n }\n },\n [hideCalendar],\n );\n\n return (\n <Box\n position={\"relative\"}\n className={styles.travelDateInput}\n ref={ref}\n onKeyDown={onKeyDown}\n height={boxSize.height}\n width={boxSize.width}\n >\n <Box\n position={\"absolute\"}\n ref={sizeSourceRef}\n zIndex={calendarInDom ? zIndex : zIndexWhenClosed}\n >\n <TravelDateTextInputField\n {...inputProps}\n value={value}\n onValueChange={onValueChangeByInputs}\n localeCode={localeCode}\n label={label}\n onFocus={showCalendar}\n calendarSize={size}\n placeholderWhenBlurred={placeholderWhenBlurred}\n variant={textInputVariant}\n readOnlyOnMobile={true}\n />\n </Box>\n\n {calendarInDom && (\n <Box\n position={\"absolute\"}\n zIndex={zIndex - 1}\n left={\"-2.4rem\"}\n top={heading ? \"-8.0rem\" : \"-2.4rem\"}\n className={cx(styles.overlay, calendarOpen && styles.calendarVisible)}\n >\n <Box\n background={\"white\"}\n shadow={\"popover\"}\n borderRadius={\"var(--swui-border-radius-large)\"}\n >\n <CardBody gap={3}>\n {heading && (\n <Heading variant={\"h2\"} as={headingLevel}>\n {heading}\n </Heading>\n )}\n\n <Box height={inputFieldsHeight} />\n\n <MonthHeader\n {...inputProps}\n previousMonthButtonAriaLabel={previousMonthButtonAriaLabel}\n nextMonthButtonAriaLabel={nextMonthButtonAriaLabel}\n calendarSize={size}\n prevMonthDisabled={prevMonthDisabled}\n nextMonthDisabled={nextMonthDisabled}\n previousMonthButtonTestId={previousMonthButtonTestId}\n nextMonthButtonTestId={nextMonthButtonTestId}\n />\n\n {visiblePanel === \"calendar\" && (\n <TravelCalendar\n {...inputProps}\n size={size}\n isValidDateRange={Boolean(selectedDate)}\n selectedStartDate={selectedDate}\n selectedEndDate={selectedDate}\n multiSelectable={false}\n isDateDisabled={isDateDisabled}\n dateTestId={dateTestId}\n hoverHighlightDirection={undefined}\n />\n )}\n\n {visiblePanel === \"month-picker\" && (\n <MonthPicker\n firstMonth={firstMonthInMonthPicker}\n numMonths={numMonthsInMonthPicker}\n value={visibleMonth}\n size={size}\n localeCode={localeCode}\n onValueChange={(v) => {\n setVisibleMonth(v);\n setVisiblePanel(\"calendar\");\n monthPickerButtonRef.current?.focus();\n }}\n onCancel={() => {\n setVisiblePanel(\"calendar\");\n monthPickerButtonRef.current?.focus();\n }}\n />\n )}\n {renderBelowCalendar?.({ hideCalendar })}\n </CardBody>\n </Box>\n </Box>\n )}\n </Box>\n );\n};\n","import * as React from \"react\";\nimport { 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\";\nimport { SupportedLocaleCode } from \"../../../features/localize-date-format/LocaleMapper\";\n\nexport interface TravelDateCalendarProps\n extends ValueAndOnValueChangeProps<string> {\n localeCode?: SupportedLocaleCode;\n languageLocaleCode?: SupportedLocaleCode;\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 isDateDisabled?: (date: Date) => boolean;\n prevMonthDisabled?: (visibleMonth: Date) => boolean;\n nextMonthDisabled?: (visibleMonth: Date) => boolean;\n size?: TravelCalendarSizeVariant;\n dateTestId?: (date: Date) => string | undefined;\n previousMonthButtonTestId?: string;\n nextMonthButtonTestId?: string;\n placeholderWhenBlurred?: string;\n textInputVariant?: DateTextInputVariant;\n}\n\nexport const TravelDateCalendar: React.FC<TravelDateCalendarProps> = ({\n value,\n onValueChange,\n label,\n localeCode = \"sv\",\n languageLocaleCode = localeCode,\n initialMonthInFocus,\n previousMonthButtonAriaLabel = \"Previous month\",\n nextMonthButtonAriaLabel = \"Next month\",\n placeholderWhenBlurred,\n heading,\n headingLevel,\n numMonthsInMonthPicker = 12,\n isDateDisabled,\n prevMonthDisabled,\n nextMonthDisabled,\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 languageLocaleCode,\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 readOnlyOnMobile={false}\n />\n\n <MonthHeader\n {...inputProps}\n previousMonthButtonAriaLabel={previousMonthButtonAriaLabel}\n nextMonthButtonAriaLabel={nextMonthButtonAriaLabel}\n calendarSize={size}\n prevMonthDisabled={prevMonthDisabled}\n nextMonthDisabled={nextMonthDisabled}\n previousMonthButtonTestId={previousMonthButtonTestId}\n nextMonthButtonTestId={nextMonthButtonTestId}\n />\n\n {visiblePanel === \"calendar\" && (\n <TravelCalendar\n {...inputProps}\n size={size}\n selectedStartDate={selectedDate}\n selectedEndDate={selectedDate}\n isValidDateRange={Boolean(selectedDate)}\n isDateDisabled={isDateDisabled}\n multiSelectable={false}\n dateTestId={dateTestId}\n hoverHighlightDirection={undefined}\n />\n )}\n\n {visiblePanel === \"month-picker\" && (\n <MonthPicker\n firstMonth={firstMonthInMonthPicker}\n numMonths={numMonthsInMonthPicker}\n value={visibleMonth}\n localeCode={languageLocaleCode}\n size={size}\n onValueChange={(v) => {\n setVisibleMonth(v);\n setVisiblePanel(\"calendar\");\n monthPickerButtonRef.current?.focus();\n }}\n onCancel={() => {\n setVisiblePanel(\"calendar\");\n monthPickerButtonRef.current?.focus();\n }}\n />\n )}\n </Column>\n );\n};\n","import * as React from \"react\";\nimport { useCallback, useRef, useState } from \"react\";\nimport { Column, Heading, HeadingVariant } from \"@stenajs-webui/core\";\nimport { ValueAndOnValueChangeProps } from \"@stenajs-webui/forms\";\nimport {\n TravelDateRangeTextInputField,\n TravelDateRangeTextInputFields,\n} from \"../../../features/travel-calendar/components/TravelDateRangeTextInputFields\";\nimport { MonthPicker } from \"../../../features/month-picker/MonthPicker\";\nimport { useTravelDateRangeInput } from \"../../../features/travel-calendar/hooks/UseTravelDateRangeInput\";\nimport { MonthHeader } from \"../../../features/travel-calendar/components/MonthHeader\";\nimport {\n TravelCalendar,\n TravelCalendarSizeVariant,\n} from \"../../../features/travel-calendar/components/TravelCalendar\";\nimport {\n DateTextInputVariant,\n TravelDateRangeInputValue,\n} from \"../../../features/travel-calendar/types\";\nimport { SupportedLocaleCode } from \"../../../features/localize-date-format/LocaleMapper\";\n\nexport interface TravelDateRangeCalendarProps\n extends ValueAndOnValueChangeProps<TravelDateRangeInputValue> {\n localeCode?: SupportedLocaleCode;\n languageLocaleCode?: SupportedLocaleCode;\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 isDateDisabled?: (date: Date) => boolean;\n prevMonthDisabled?: (visibleMonth: Date) => boolean;\n nextMonthDisabled?: (visibleMonth: Date) => boolean;\n size?: TravelCalendarSizeVariant;\n dateTestId?: (date: Date) => string | undefined;\n previousMonthButtonTestId?: string;\n nextMonthButtonTestId?: string;\n placeholderWhenBlurredStartDate?: string;\n placeholderWhenBlurredEndDate?: string;\n textInputVariant?: DateTextInputVariant;\n}\n\nexport const TravelDateRangeCalendar: React.FC<\n TravelDateRangeCalendarProps\n> = ({\n value,\n onValueChange,\n startDateLabel,\n endDateLabel,\n localeCode = \"sv\",\n languageLocaleCode = localeCode,\n initialMonthInFocus,\n previousMonthButtonAriaLabel = \"Previous month\",\n nextMonthButtonAriaLabel = \"Next month\",\n heading,\n headingLevel,\n numMonthsInMonthPicker = 12,\n isDateDisabled,\n prevMonthDisabled,\n nextMonthDisabled,\n firstMonthInMonthPicker = new Date(),\n size = \"medium\",\n dateTestId,\n previousMonthButtonTestId,\n nextMonthButtonTestId,\n placeholderWhenBlurredStartDate,\n placeholderWhenBlurredEndDate,\n textInputVariant = \"standard\",\n}) => {\n const [fieldLastInFocus, setFieldLastInFocus] = useState<\n \"startDate\" | \"endDate\" | undefined\n >(undefined);\n\n const startDateRef = useRef<HTMLInputElement>(null);\n const endDateRef = useRef<HTMLInputElement>(null);\n\n const moveFocusToField = useCallback((field: \"startDate\" | \"endDate\") => {\n if (field === \"startDate\") {\n startDateRef.current?.focus();\n } else if (field === \"endDate\") {\n endDateRef.current?.focus();\n }\n }, []);\n\n const inputProps = useTravelDateRangeInput(\n value,\n onValueChange,\n localeCode,\n languageLocaleCode,\n initialMonthInFocus,\n fieldLastInFocus,\n setFieldLastInFocus,\n moveFocusToField,\n undefined,\n );\n\n const onInputFocus = useCallback((field: TravelDateRangeTextInputField) => {\n setFieldLastInFocus(field);\n }, []);\n\n const {\n visiblePanel,\n visibleMonth,\n onValueChangeByInputs,\n setVisibleMonth,\n setVisiblePanel,\n monthPickerButtonRef,\n } = inputProps;\n\n return (\n <Column gap={3}>\n {heading && (\n <Heading variant={\"h2\"} as={headingLevel}>\n {heading}\n </Heading>\n )}\n <TravelDateRangeTextInputFields\n {...inputProps}\n value={value}\n onValueChange={onValueChangeByInputs}\n startDateRef={startDateRef}\n endDateRef={endDateRef}\n localeCode={localeCode}\n startDateLabel={startDateLabel}\n endDateLabel={endDateLabel}\n onFocus={onInputFocus}\n calendarSize={size}\n placeholderWhenBlurredStartDate={placeholderWhenBlurredStartDate}\n placeholderWhenBlurredEndDate={placeholderWhenBlurredEndDate}\n variant={textInputVariant}\n /*\n When focusing on the input, the calendar popover appears.\n But the keyboard appears as well and covers the calendar.\n\n readOnly disables input and hides the keyboard on mobile.\n This enables the user to click on input to select it, then click in the calendar.\n\n This is not needed for TravelDate*Calendar, since the calendar is always visible.\n */\n readOnlyOnMobile={false}\n />\n\n <MonthHeader\n {...inputProps}\n previousMonthButtonAriaLabel={previousMonthButtonAriaLabel}\n nextMonthButtonAriaLabel={nextMonthButtonAriaLabel}\n calendarSize={size}\n prevMonthDisabled={prevMonthDisabled}\n nextMonthDisabled={nextMonthDisabled}\n previousMonthButtonTestId={previousMonthButtonTestId}\n nextMonthButtonTestId={nextMonthButtonTestId}\n />\n\n {visiblePanel === \"calendar\" && (\n <TravelCalendar\n {...inputProps}\n size={size}\n multiSelectable={true}\n isDateDisabled={isDateDisabled}\n dateTestId={dateTestId}\n />\n )}\n\n {visiblePanel === \"month-picker\" && (\n <MonthPicker\n firstMonth={firstMonthInMonthPicker}\n numMonths={numMonthsInMonthPicker}\n value={visibleMonth}\n size={size}\n localeCode={languageLocaleCode}\n onValueChange={(v) => {\n setVisibleMonth(v);\n setVisiblePanel(\"calendar\");\n monthPickerButtonRef.current?.focus();\n }}\n onCancel={() => {\n setVisiblePanel(\"calendar\");\n monthPickerButtonRef.current?.focus();\n }}\n />\n )}\n </Column>\n );\n};\n","import { useCallback } from \"react\";\nimport { isBefore, isSameDay, isSameMonth } from \"date-fns\";\nimport { useToday } from \"@stenajs-webui/core\";\n\nexport const useDisabledBeforeToday = () => {\n const today = useToday();\n\n return useCallback<(date: Date) => boolean>(\n (date) => !isSameDay(date, today) && isBefore(date, today),\n [today],\n );\n};\n\nexport const usePrevMonthDisabledBeforeToday = () => {\n const today = useToday();\n\n return useCallback(\n (visibleMonth: Date) =>\n isSameMonth(today, visibleMonth) || isBefore(visibleMonth, today),\n [today],\n );\n};\n"],"names":["DateFormats","buildDayStateForDateRange","statePerMonth","start","end","isAfter","eachDayOfInterval","result","date","isFirstInRange","isSameDay","isLastInRange","addDayStateHighlights","state","buildDayStateForSingleMonth","dateInFocus","buildDayStateForRange","startOfMonth","endOfMonth","startLimit","endLimit","max","subDays","min","addDays","setDayStateValue","values","monthString","format","weekNumber","getISOWeek","dayInMonth","getDate","setDayStateValueFunction","setter","calendarState","highlights","month","dayState","addDayStateHighlightsOnSingleDay","addWeekStateHighlights","week","day","weekState","newHighlights","newWeekState","addWeekRangeHighlights","startDate","endDate","last","useHighlightToday","enabled","useMemo","convertFirstCharToUpper","value","Month","WeekDay","getMonthsInYear","year","startMonth","numMonths","locale","months","i","getMonthInYear","yearToUse","monthToUse","firstDayOfMonth","getWeeksForMonth","forceSixWeeks","firstDayOfFirstWeek","startOfWeek","weeks","getWeekForDate","addWeeks","firstDayOfWeek","isLastWeekOfMonth","getMonth","getWeek","getYear","getDaysForWeekForDate","createDay","dayOfWeek","getISODay","addHours","d","calculateOverflowingMonth","dayHasHighlight","defaultHighlights","highlight","dayHighlightSelect","highlightsOrBoolean","returnValues","fallbackValue","defaultWrapperStyleProvider","selectedBackground","todayBackground","rangeBackground","borderColor","_","defaultTextPropsProvider","selectedColor","disabledColor","inOtherMonthColor","rangeTextColor","isOtherMonth","defaultCalendarTheme","extranetCalendarTheme","WeekDayCell","onClickWeekDay","theme","content","jsx","Box","Text","Clickable","ev","CalendarDay","userData","onClickDay","ExtraDayContent","showDatesInOtherMonths","WrapperTd","styled","InnerWrapperDiv","CellWrapperDiv","disabled","isDisabled","jsxs","Fragment","WeekNumberCell","onClickWeek","background","backgroundColor","prefix","isDateInMinMaxRange","isBefore","DisabledDayWrapper","DayComponent","minDate","maxDate","props","activeDayState","CalendarMonth","dayComponent","statePerWeek","userDataPerWeek","onClickMonth","renderWeekNumber","renderWeekDay","headerRightContent","extraDayContent","showWeekNumber","Row","FlatButton","stenaAngleDown","CalendarPanel","monthRows","userDataPerMonth","minDateObj","parse","maxDateObj","cx","styles","monthRow","rowIndex","Spacing","Calendar","initialDate","getInitialDate","getMonthRows","enGB","now","monthsPerRow","chunk","getDomIdForMonth","position","monthPickerId","getDomIdForKeyboardKey","key","currentPosition","numColumnsPerRow","next","movePositionByKey","id","row","column","locales","enUS","enIE","deAT","nlBE","nl","de","nb","sv","da","lv","lt","it","et","fi","cs","es","fr","pl","fallbackLocaleCode","fallbackLocaleCodeForFormatting","getSupportedLocaleCode","localeCode","matchLanguage","fallback","languageCode","getSupportedLocaleCodeMatchingLanguage","getLocaleForLocaleCode","lang","localeCodes","l","getDefaultLocaleForFormatting","getLocaleCodeForLocale","MonthPickerCell","onClick","selected","autoFocus","size","label","abbr","ref","useRef","domId","tabIndex","useEffect","onKeyDown","useCallback","nextDomId","PrimaryButton","createMonths","firstMonth","currentYear","currentRow","currentColumn","currentMonth","input","addMonths","MonthPicker","onValueChange","onCancel","useId","today","useToday","clampedNumMonths","inited","setInited","useState","getNumColumns","lastMonth","Column","getWidth","yearIndex","rows","React","Heading","r","columns","isSameMonth","exhaustSwitchCase","createStandardDateRangePresets","PresetPicker","onClickPreset","pageIndex","setPageIndex","pages","currentPage","stenaAngleLeft","stenaAngleRight","Space","preset","CalendarWithMonthYearPickers","setDateInFocus","currentPanel","setCurrentPanel","renderMonthPicker","firstMonthInMonthPicker","numMonthsInMonthPicker","onChangeSelectedMonth","selectedMonth","useSelectedMonthStepperLogic","nextMonth","nextYear","addYears","prevMonth","subMonths","prevYear","subYears","WithMonthSwitcherBelow","children","Indent","SecondaryButton","stenaAngleLeftDouble","stenaArrowLeft","stenaArrowRight","stenaAngleRightDouble","noop","CalendarWithMonthSwitcher","monthSwitcherPlacement","onSelectPreset","calendarProps","fallbackIfNoPlacement","dateRangeToStrings","dateRange","stringsToDateRange","isDateRangeInvalid","toggleDatesIfEndIsEarlierThanStart","toggleDateStringsIfEndIsEarlierThanStart","useDateRangeOnClickDayHandler","focusedInput","setFocusedInput","useInternalPanelState","onChangePanel","_setCurrentPanel","useDateRangeSelection","initialDateInFocus","statePerMonthWithSelection","DateRangeCalendar","dateRangeSelectionProps","useDateRangeCalendarState","setStartDate","setEndDate","useSingleDateSelection","onChange","statePerMonthWithSelectedDate","SingleDateCalendar","singleDateSelectionProps","useMultiDateSelection","isSelected","v","stateSum","MultiDateCalendar","selectionProps","useSingleWeekSelection","getWeekDataFromWeekString","getWeekStringFromWeekData","weekData","parts","firstDateOfWeek","setWeek","SingleWeekCalendar","singleWeekSelectionProps","defaultPopoverPlacement","useDateInput","onClose","openOnMount","showingCalendar","setShowingCalendar","showCalendar","hideCalendar","onSelectDate","defaultMaxDate","DateInput","displayFormat","placeholder","calendarTheme","variant","width","portalTarget","zIndex","ControlledPopover","TextInput","TextInputButton","stenaCalendar","useDateRangeInput","startDateInputRef","endDateInputRef","showCalendarStartDate","showCalendarEndDate","startDateIsAfterEnd","DateRangeInput","placeholderStartDate","placeholderEndDate","Icon","stenaArrowWideRight","cssColor","DateTextInput","closeOnCalendarSelectDate","dateFormat","disableCalender","hideCalenderIcon","open","setOpen","toggleCalendar","onValueChangeHandler","onCalendarSelectDate","inValidInput","dateIsValid","isValid","invalid","popoverProps","formatHours","hours","h","formatMinutes","minutes","m","formatTimeString","time","validUserInput","arr","timeNumber","TimeTextInput","showPlaceholder","useIcon","valid","setValid","timeFormat","onBlur","formattedResult","onChangeHandler","validInput","stenaClock","DualTextInput","autoFocusLeft","autoFocusRight","onEsc","onEnter","onValueChangeLeft","onValueChangeRight","separatorIcon","placeholderLeft","placeholderRight","typeLeft","typeRight","onChangeLeft","onChangeRight","valueLeft","valueRight","minLeft","maxLeft","minRight","maxRight","onClickLeft","onClickRight","onClickCalendar","onClickArrowDown","onBlurLeft","onBlurRight","onFocusLeft","onFocusRight","inputRefLeft","inputRefRight","variantLeft","variantRight","showPresets","widthLeft","widthRight","focusCounter","tryTriggerOnBlur","debounce","focusLeftHandler","focusRightHandler","blurLeftHandler","blurRightHandler","TextInputBox","SeparatorLine","transformTimeStringToNumber","isValidTimeString","getHoursAndMinutesFromTimeString","p","parseIntElseUndefined","transformTimeInDateToTimeString","TimePickerCell","item","columnRef","canScrollRef","targetScroll","padStart","TimePickerColumn","items","selectedItem","range","TimePicker","hour","setHour","minute","setMinute","onClickHour","onClickMinutes","useDateRangeEffects","dateInputRef","useDateRangeHandlers","showCalendarInternal","hideCalendarInternal","setFirstFocusedInput","localTime","setLocalTime","localDate","setLocalDate","onChangeDate","incomingDate","newDate","onChangeTime","newTime","inputLeftChangeHandler","inputRightChangeHandler","useInputStates","isCalendarVisible","useBoolean","isTimePickerVisible","showTimePicker","hideTimePicker","firstFocusedInput","useUserInputHandlers","onClickArrowButton","onClickCalendarButton","onKeyDownHandler","DateTimeInput","appendTo","timeInputRef","states","dateToHighlight","hideAll","timeValue","delayedIsCalendarVisible","useDelayedFalse","delayedIsTimePickerVisible","YearPickerCell","YearPicker","initialLastYear","lastYear","setLastYear","yearRows","startYear","prev","calculateLastYearInFocus","yearRow","yearDiff","remaining","yearsToAdd","yearsToSubtract","DateRangeDualTextInput","renderBelowCalendar","TravelDateTextInput","readOnly","mask","pipe","guide","keepCharPositions","placeholderChar","showMask","calendarSize","onFocus","placeholderWhenBlurred","valueWhenBlurred","inputProps","localRef","isFocused","setIsFocused","inputRef","maskedOnChange","useMaskedInput","onFocusHandler","onBlurHandler","activePlaceholder","Label","LabelledTextInput","calenderSize","yearMask","monthMask","dayMask","createInputMaskForDateFormat","splitByNewLetter","tokenToMask","token","str","currentSegment","getDateFormatForLocaleCode","formatMap","part","parseLocalizedDateString","dateString","options","supportedLocaleCode","formatLocalizedDate","reformatLocalizedDateString","a","ln","an","Y","Z","n","o","e","O","sn","dn","un","z","we","s","g","Ce","U","Ee","ne","be","M","qn","TravelDateRangeTextInputFields","startDateLabel","endDateLabel","startDateRef","endDateRef","placeholderWhenBlurredStartDate","placeholderWhenBlurredEndDate","valueWhenBlurredStartDate","valueWhenBlurredEndDate","readOnlyOnMobile","deviceSize","useDeviceSize","isDeviceSameOrLarger","dateFormatForLocaleCode","formatDateDescription","isSameYear","isInvalidRange","startDateStr","endDateStr","resetDateRangeIfInvalid","obj","master","useTravelDateRangeInput","languageLocaleCode","initialMonthInFocus","fieldLastInFocus","setFieldLastInFocus","moveFocusToField","languageLocale","calendarId","monthPickerButtonRef","selectedStartDate","selectedEndDate","visibleMonth","setVisibleMonth","setVisibleMonthClamped","visibleMonthData","monthPickerButtonLabel","intlFormat","todayIsInVisibleMonth","hoverDate","setHoverDate","visiblePanel","setVisiblePanel","onValueChangeByInputs","isValidDateRange","hoverAnchor","hoverHighlightDirection","callOnValueChange","MonthHeader","previousMonthButtonAriaLabel","nextMonthButtonAriaLabel","prevMonthDisabled","nextMonthDisabled","previousMonthButtonTestId","nextMonthButtonTestId","stenaAngleUp","rangeBgColor","getCellBackgroundColors","dayIsInMonth","getCellBackgroundHoverRangeHighlight","getCellBackgroundHighlight","highlightStartDate","highlightEndDate","flipLeftRight","isInHighlightRange","isWithinInterval","dateIsHoverDate","dateIsHoverAnchor","flip","left","right","getDateToFocusOn","currentDate","createDayId","TravelDateCellBackground","bgColorLeft","bgColorRight","TravelDateCell","onChangeVisibleMonth","onStartHover","onEndHover","isDateDisabled","dateTestId","nextDate","nextDateDisabled","hoverLeftOfAnchor","isHoverRangeStart","isHoverRangeEnd","isSelectionStart","isSelectionEnd","isToday","bgColors","getTabIndex","selectedStartDateIsVisible","TravelCalendar","onClickDate","multiSelectable","TravelDateRangeInput","heading","headingLevel","zIndexWhenClosed","onHideCalendar","textInputVariant","calendarOpen","setCalendarOpen","calendarInDom","setCalendarInDom","boxSize","setBoxSize","field","inputFieldsHeight","calendarOpenRef","onInputFocus","sizeSourceRef","useOnClickOutside","useLayoutEffect","height","CardBody","TravelDateTextInputField","useTravelDateInput","selectedDate","TravelDateInput","delayedHideCalendar","TravelDateCalendar","TravelDateRangeCalendar","useDisabledBeforeToday","usePrevMonthDisabledBeforeToday"],"mappings":"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"}
|