@stenajs-webui/calendar 23.5.0 → 23.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.es.js +507 -507
- 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.es.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.es.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={localeCode}\n onValueChange={(v) => {\n setVisibleMonth(v);\n setVisiblePanel(\"calendar\");\n monthPickerButtonRef.current?.focus();\n }}\n onCancel={() => {\n setVisiblePanel(\"calendar\");\n monthPickerButtonRef.current?.focus();\n }}\n />\n )}\n {renderBelowCalendar?.({ hideCalendar })}\n </CardBody>\n </Box>\n </Box>\n )}\n </Box>\n );\n};\n","import * as React from \"react\";\nimport { useMemo } from \"react\";\nimport { Row } from \"@stenajs-webui/core\";\nimport { TravelDateTextInput } from \"./TravelDateTextInput\";\nimport { createInputMaskForDateFormat } from \"../../localize-date-format/InputMaskProvider\";\nimport { getDateFormatForLocaleCode } from \"../../localize-date-format/DateFormatProvider\";\nimport { reformatLocalizedDateString } from \"../../localize-date-format/LocalizedDateReformatter\";\nimport { TravelCalendarSizeVariant } from \"./TravelCalendar\";\nimport { DateTextInputVariant } from \"../types\";\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.es.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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"}
|