@stenajs-webui/calendar 17.30.4 → 17.30.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/util/date/DateFormats.ts","../src/util/calendar/StateModifier.ts","../src/features/today-state/UseHighlightToday.ts","../src/util/calendar/CalendarDataFactory.ts","../src/util/calendar/StateHelper.ts","../src/components/calendar/CalendarTheme.tsx","../src/util/date/DateMinMaxValidator.ts","../src/components/calendar/DisabledDayWrapper.tsx","../src/components/calendar/renderers/WeekNumberCell.tsx","../src/components/calendar/CalendarWeek.tsx","../src/components/calendar/renderers/WeekDayCell.tsx","../src/components/calendar/renderers/CalendarDay.tsx","../src/components/calendar/CalendarMonth.tsx","../src/components/calendar/Calendar.tsx","../src/features/month-switcher/hooks/UseSelectedMonthStepperLogic.ts","../src/features/month-switcher/MonthSwitcherBelow.tsx","../src/features/month-picker/MonthPickerCell.tsx","../src/features/month-picker/MonthPicker.tsx","../src/features/preset-picker/PresetFactory.ts","../src/features/preset-picker/PresetPicker.tsx","../src/features/year-picker/YearPickerCell.tsx","../src/features/year-picker/YearPicker.tsx","../src/features/calendar-with-month-year-pickers/CalendarWithMonthYearPickers.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/util/date/DateListTools.ts","../src/components/calendar-types/date-range-exclusion-calendar/UseDateRangeExclusionSelection.ts","../src/components/calendar-types/date-range-exclusion-calendar/DateRangeExclusionCalendar.tsx","../src/config/DefaultPopoverPlacement.ts","../src/features/internal-panel-state/UseCalendarPopoverUpdater.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/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"],"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\";\nimport {\n CalendarState,\n CalendarUserData,\n DayState,\n DayStateHighlight,\n StateForWeek,\n} from \"../../types/CalendarTypes\";\nimport { DateFormats } from \"../date/DateFormats\";\nimport { WeekData } from \"./CalendarDataFactory\";\n\nexport const buildDayStateForDateRange = (\n statePerMonth: CalendarUserData<DayState> = {},\n start?: Date,\n end?: Date\n): CalendarUserData<DayState> | undefined => {\n if (start && end && isAfter(end, start)) {\n return eachDayOfInterval({ start, end }).reduce(\n (result: CalendarUserData<DayState>, date: Date) => {\n const isFirstInRange = isSameDay(date, start);\n const isLastInRange = isSameDay(date, end);\n const highlights = isFirstInRange\n ? [\"selected\", \"selectedStart\", \"range\"]\n : isLastInRange\n ? [\"selected\", \"selectedEnd\", \"range\"]\n : [\"range\"];\n return addDayStateHighlights(result, date, highlights);\n },\n statePerMonth\n );\n }\n\n let state = statePerMonth;\n\n if (start) {\n state = addDayStateHighlights(state, start, [\"selected\", \"singleSelected\"]);\n }\n\n if (end) {\n state = addDayStateHighlights(state, end, [\"selected\", \"singleSelected\"]);\n }\n\n return state;\n};\n\nexport const buildDayStateForSingleMonth = (\n statePerMonth: CalendarUserData<DayState> = {},\n start: Date | undefined,\n end: Date | undefined,\n dateInFocus: Date\n): CalendarUserData<DayState> | undefined =>\n buildDayStateForRange(\n statePerMonth,\n start,\n end,\n startOfMonth(dateInFocus),\n endOfMonth(dateInFocus)\n );\n\nexport const buildDayStateForRange = (\n statePerMonth: CalendarUserData<DayState> = {},\n start: Date | undefined,\n end: Date | undefined,\n startLimit: Date,\n endLimit: Date\n): CalendarUserData<DayState> | undefined => {\n if (start && end) {\n return buildDayStateForDateRange(\n statePerMonth,\n max([start, subDays(startLimit, 1)]),\n min([end, addDays(endLimit, 1)])\n );\n } else {\n return buildDayStateForDateRange(statePerMonth, start, end);\n }\n};\n\nexport const setDayStateValue = (\n state: CalendarUserData<DayState> | undefined,\n date: Date,\n values: Partial<DayState>\n): CalendarUserData<DayState> => {\n const monthString = format(date, DateFormats.yearAndMonth);\n const weekNumber = getISOWeek(date);\n const dayInMonth = getDate(date);\n return {\n ...state,\n [monthString]: {\n ...(state && state[monthString]),\n [weekNumber]: {\n ...(state && state[monthString] && state[monthString][weekNumber]),\n [dayInMonth]: {\n ...(state &&\n state[monthString] &&\n state[monthString][weekNumber] &&\n state[monthString][weekNumber][dayInMonth]),\n ...values,\n },\n },\n },\n };\n};\n\nexport const setDayStateValueFunction = (\n state: CalendarUserData<DayState> | undefined,\n date: Date,\n setter: (dayState: DayState | undefined) => Partial<DayState>\n): CalendarUserData<DayState> => {\n const monthString = format(date, DateFormats.yearAndMonth);\n const weekNumber = getISOWeek(date);\n const dayInMonth = getDate(date);\n return {\n ...state,\n [monthString]: {\n ...(state && state[monthString]),\n [weekNumber]: {\n ...(state && state[monthString] && state[monthString][weekNumber]),\n [dayInMonth]: {\n ...(state &&\n state[monthString] &&\n state[monthString][weekNumber] &&\n state[monthString][weekNumber][dayInMonth]),\n ...setter(\n state &&\n state[monthString] &&\n state[monthString][weekNumber] &&\n state[monthString][weekNumber][dayInMonth]\n ),\n },\n },\n },\n };\n};\n\nexport const addDayStateHighlights = (\n calendarState: CalendarState | undefined,\n date: Date,\n highlights: Array<DayStateHighlight>\n): CalendarUserData<DayState> => {\n const month = date.getMonth() + 1;\n const monthString = `${date.getFullYear()}-${month < 10 ? \"0\" : \"\"}${month}`;\n const weekNumber = getISOWeek(date);\n const dayInMonth = getDate(date);\n const dayState: DayState | undefined =\n calendarState &&\n calendarState[monthString] &&\n calendarState[monthString][weekNumber] &&\n calendarState[monthString][weekNumber][dayInMonth];\n\n return {\n ...calendarState,\n [monthString]: {\n ...(calendarState && calendarState[monthString]),\n [weekNumber]: {\n ...(calendarState &&\n calendarState[monthString] &&\n calendarState[monthString][weekNumber]),\n [dayInMonth]: addDayStateHighlightsOnSingleDay(dayState, highlights),\n },\n },\n };\n};\n\nexport const addDayStateHighlightsOnSingleDay = (\n dayState: DayState | undefined,\n highlights: Array<DayStateHighlight>\n): DayState => {\n return {\n ...dayState,\n highlights: [...(dayState?.highlights ?? []), ...highlights],\n };\n};\n\nexport const addWeekStateHighlights = (\n calendarState: CalendarState | undefined,\n week: WeekData,\n highlights: Array<DayStateHighlight>\n): CalendarUserData<DayState> => {\n const date = week.days[0].date;\n const month = date.getMonth() + 1;\n const monthString = `${date.getFullYear()}-${month < 10 ? \"0\" : \"\"}${month}`;\n const weekNumber = week.weekNumber;\n\n let state = calendarState;\n week.days.forEach((day) => {\n state = addDayStateHighlights(state, day.date, highlights);\n });\n\n const weekState =\n state && state[monthString] ? state[monthString][weekNumber] : undefined;\n\n const newHighlights: Array<DayStateHighlight> =\n weekState && weekState.highlights\n ? [...weekState.highlights, ...highlights]\n : highlights;\n\n const newWeekState: StateForWeek = {\n ...weekState,\n highlights: newHighlights,\n };\n\n return {\n ...state,\n [monthString]: {\n ...(calendarState && calendarState[monthString]),\n [weekNumber]: newWeekState,\n },\n };\n};\n\nexport const addWeekRangeHighlights = (\n calendarState: CalendarState | undefined,\n week: WeekData\n): CalendarUserData<DayState> => {\n if (!week.days.length) {\n return { ...calendarState };\n }\n const startDate = week.days[0].date;\n const endDate = last(week.days)?.date;\n return {\n ...buildDayStateForDateRange(calendarState, startDate, endDate),\n };\n};\n","import { useMemo } from \"react\";\nimport { CalendarState } from \"../../types/CalendarTypes\";\nimport { addDayStateHighlights } from \"../../util/calendar/StateModifier\";\n\nexport const useHighlightToday = (\n enabled: boolean | undefined,\n statePerMonth: CalendarState | undefined\n) => {\n return useMemo(() => {\n return enabled\n ? addDayStateHighlights(statePerMonth, new Date(), [\"today\"])\n : statePerMonth;\n }, [enabled, statePerMonth]);\n};\n","import {\n addDays,\n addHours,\n addWeeks,\n eachDayOfInterval,\n endOfMonth,\n format,\n getDate,\n getISODay,\n getMonth,\n getWeek,\n getYear,\n isSameDay,\n startOfMonth,\n startOfWeek,\n} from \"date-fns\";\nimport { DateFormats } from \"../date/DateFormats\";\n\nexport enum Month {\n JANUARY = 0,\n FEBRUARY,\n MARCH,\n APRIL,\n MAY,\n JUNE,\n JULY,\n AUGUST,\n SEPTEMBER,\n OCTOBER,\n NOVEMBER,\n DECEMBER,\n}\n\nexport enum WeekDay {\n SUNDAY = 0,\n MONDAY,\n TUESDAY,\n WEDNESDAY,\n THURSDAY,\n FRIDAY,\n SATURDAY,\n}\n\nexport interface DayData {\n name: string;\n 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 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: format(firstDayOfMonth, DateFormats.fullMonthName),\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 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 show?: boolean;\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 let style = {};\n\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 ...style,\n backgroundColor,\n borderTopLeftRadius: dayHighlightSelect(\n dayState,\n defaultHighlights,\n [\"selectedStart\", \"singleSelected\"],\n [\n \"var(--swui-calendar-day-border-radius)\",\n \"var(--swui-calendar-day-border-radius)\",\n ],\n borderColor\n ),\n borderBottomLeftRadius: dayHighlightSelect(\n dayState,\n defaultHighlights,\n [\"selectedStart\", \"singleSelected\"],\n [\n \"var(--swui-calendar-day-border-radius)\",\n \"var(--swui-calendar-day-border-radius)\",\n ],\n borderColor\n ),\n borderTopRightRadius: dayHighlightSelect(\n dayState,\n defaultHighlights,\n [\"selectedEnd\", \"singleSelected\"],\n [\n \"var(--swui-calendar-day-border-radius)\",\n \"var(--swui-calendar-day-border-radius)\",\n ],\n borderColor\n ),\n borderBottomRightRadius: dayHighlightSelect(\n dayState,\n defaultHighlights,\n [\"selectedEnd\", \"singleSelected\"],\n [\n \"var(--swui-calendar-day-border-radius)\",\n \"var(--swui-calendar-day-border-radius)\",\n ],\n borderColor\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 show: true,\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 { 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, Clickable, Text } from \"@stenajs-webui/core\";\nimport * as React from \"react\";\nimport { OnClickWeek } from \"../../../types/CalendarTypes\";\nimport { WeekData } from \"../../../util/calendar/CalendarDataFactory\";\nimport { CalendarTheme } from \"../CalendarTheme\";\n\nexport interface WeekNumberCellProps {\n week: WeekData;\n onClickWeek?: OnClickWeek;\n theme: CalendarTheme;\n background?: JSX.Element;\n prefix?: string;\n backgroundColor?: string;\n}\n\nexport const WeekNumberCell: React.FC<WeekNumberCellProps> = ({\n onClickWeek,\n theme,\n week,\n background,\n backgroundColor,\n prefix,\n}) => {\n const content = (\n <Box\n width={theme.width}\n height={theme.height}\n justifyContent={\"center\"}\n alignItems={\"center\"}\n >\n {background && <Box position={\"absolute\"}>{background}</Box>}\n <Box position={\"absolute\"}>\n <Text\n color={\n onClickWeek\n ? theme.WeekNumber.clickableTextColor\n : theme.WeekNumber.textColor\n }\n >\n {prefix}\n {week.weekNumber}\n </Text>\n </Box>\n </Box>\n );\n return (\n <Box\n background={backgroundColor || theme.WeekNumber.backgroundColor}\n position={\"relative\"}\n >\n {onClickWeek ? (\n <Clickable\n borderRadius={\"var(--swui-calendar-day-border-radius)\"}\n onClick={(ev) => onClickWeek(week, ev)}\n disableFocusHighlight={!onClickWeek}\n >\n {content}\n </Clickable>\n ) : (\n content\n )}\n </Box>\n );\n};\n","import * as React from \"react\";\nimport {\n CalendarDayProps,\n CalendarUserWeekData,\n DayState,\n DayStateHighlight,\n ExtraDayContentProps,\n OnClickDay,\n OnClickWeek,\n OptionalMinMaxDates,\n RenderWeekNumber,\n} from \"../../types/CalendarTypes\";\nimport { MonthData, WeekData } from \"../../util/calendar/CalendarDataFactory\";\n\nimport { CalendarTheme } from \"./CalendarTheme\";\nimport { DisabledDayWrapper } from \"./DisabledDayWrapper\";\nimport { WeekNumberCell } from \"./renderers/WeekNumberCell\";\n\nexport interface CalendarWeekProps<T> extends OptionalMinMaxDates {\n dayComponent: React.ComponentType<CalendarDayProps<T>>;\n week: WeekData;\n month: MonthData;\n statePerWeekDay?: CalendarUserWeekData<DayState>;\n userDataPerWeekDay?: CalendarUserWeekData<T>;\n onClickWeek?: OnClickWeek;\n onClickDay?: OnClickDay<T>;\n theme: CalendarTheme;\n renderWeekNumber?: RenderWeekNumber;\n extraDayContent?: React.ComponentType<ExtraDayContentProps<T>>;\n defaultHighlights?: Array<DayStateHighlight>;\n}\n\nexport function CalendarWeek<T>({\n week,\n month,\n dayComponent,\n statePerWeekDay,\n userDataPerWeekDay,\n minDate,\n maxDate,\n onClickWeek,\n onClickDay,\n theme,\n renderWeekNumber,\n extraDayContent,\n defaultHighlights,\n}: CalendarWeekProps<T>) {\n return (\n <tr key={week.weekNumber}>\n {theme.WeekNumber.show && (\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={statePerWeekDay && statePerWeekDay[day.dayOfMonth]}\n userData={userDataPerWeekDay && userDataPerWeekDay[day.dayOfMonth]}\n onClickDay={onClickDay}\n theme={theme}\n extraDayContent={extraDayContent}\n defaultHighlights={defaultHighlights}\n minDate={minDate}\n maxDate={maxDate}\n />\n ))}\n </tr>\n );\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, Clickable, Text } from \"@stenajs-webui/core\";\nimport * as React from \"react\";\nimport {\n CalendarDayProps,\n DayState,\n DayStateHighlight,\n} from \"../../../types/CalendarTypes\";\nimport { dayHighlightSelect } from \"../../../util/calendar/StateHelper\";\n\nexport const CalendarDay = function CalendarDay<T>({\n day,\n week,\n month,\n dayState,\n userData,\n onClickDay,\n theme,\n extraDayContent: ExtraDayContent,\n defaultHighlights,\n}: CalendarDayProps<T>) {\n const content = (\n <Box\n width={\"100%\"}\n height={\"100%\"}\n justifyContent={\"center\"}\n alignItems={\"center\"}\n >\n <Text\n {...(theme.CalendarDay.textProps &&\n theme.CalendarDay.textProps(\n defaultHighlights,\n dayState,\n day,\n week,\n month,\n userData\n ))}\n >\n {day.dayOfMonth}\n </Text>\n </Box>\n );\n\n const WrapperTd = styled.td({\n ...(theme.CalendarDay.tdStyle &&\n theme.CalendarDay.tdStyle(\n defaultHighlights,\n dayState,\n day,\n week,\n month,\n userData\n )),\n });\n\n const InnerWrapperDiv = styled.div({\n ...(theme.CalendarDay.innerWrapperStyle &&\n theme.CalendarDay.innerWrapperStyle(\n defaultHighlights,\n dayState,\n day,\n week,\n month,\n userData\n )),\n width: \"100%\",\n height: \"100%\",\n });\n\n const CellWrapperDiv = styled.div({\n ...(theme.CalendarDay.cellWrapperStyle &&\n theme.CalendarDay.cellWrapperStyle(\n defaultHighlights,\n dayState,\n day,\n week,\n month,\n userData\n )),\n width: \"100%\",\n height: \"100%\",\n position: \"relative\",\n });\n\n return (\n <WrapperTd>\n <InnerWrapperDiv>\n <CellWrapperDiv>\n {day.month === month.monthInYear && (\n <>\n {ExtraDayContent && (\n <ExtraDayContent\n week={week}\n month={month}\n day={day}\n dayState={dayState}\n theme={theme}\n userData={userData}\n />\n )}\n {onClickDay && isClickable(defaultHighlights, dayState) ? (\n <Clickable\n onClick={(ev) => onClickDay(day, userData, ev)}\n style={{ width: \"100%\", height: \"100%\" }}\n borderRadius={\"var(--swui-calendar-day-border-radius)\"}\n >\n {content}\n </Clickable>\n ) : (\n <>{content}</>\n )}\n </>\n )}\n </CellWrapperDiv>\n </InnerWrapperDiv>\n </WrapperTd>\n );\n};\n\nconst isClickable = (\n defaultHighlights: Array<DayStateHighlight> | undefined,\n dayState: DayState | undefined\n): boolean =>\n !!dayHighlightSelect<boolean>(\n dayState,\n defaultHighlights,\n [\"enabled\", \"disabled\"],\n [true, false],\n true\n );\n","import { Box, Row, Space, Text } from \"@stenajs-webui/core\";\nimport * as React 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 { CalendarWeek } from \"./CalendarWeek\";\nimport { WeekDayCell } from \"./renderers/WeekDayCell\";\nimport { CalendarDay } from \"./renderers/CalendarDay\";\nimport { FlatButton } from \"@stenajs-webui/elements\";\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 headerLeftContent?: React.ReactElement<{}>;\n headerRightContent?: React.ReactElement<{}>;\n extraDayContent?: React.ComponentType<ExtraDayContentProps<T>>;\n defaultHighlights?: Array<DayStateHighlight>;\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 onClickYear,\n renderWeekNumber,\n renderWeekDay,\n headerLeftContent,\n headerRightContent,\n theme = defaultCalendarTheme,\n extraDayContent,\n defaultHighlights,\n}: CalendarMonthProps<T>) {\n const showWeekNumber = theme.WeekNumber.show;\n\n return (\n <>\n <Box alignItems={\"stretch\"}>\n <Row\n justifyContent={\"space-between\"}\n alignItems={\"center\"}\n height={\"32px\"}\n >\n <Box alignItems={\"center\"}>{headerLeftContent}</Box>\n\n <Row alignItems={\"center\"}>\n <Row width={\"104px\"} justifyContent={\"center\"}>\n {onClickMonth ? (\n <FlatButton\n onClick={() => onClickMonth(month)}\n label={month.name}\n />\n ) : (\n <Text>{month.name}</Text>\n )}\n </Row>\n <Space />\n <Row width={\"64px\"} justifyContent={\"center\"}>\n {onClickYear ? (\n <FlatButton\n onClick={() => onClickYear(month.year)}\n label={String(month.year)}\n />\n ) : (\n <Text>{month.year}</Text>\n )}\n </Row>\n </Row>\n\n <Box alignItems={\"center\"}>{headerRightContent}</Box>\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 <CalendarWeek<T>\n key={week.weekNumber}\n month={month}\n week={week}\n dayComponent={dayComponent}\n statePerWeekDay={statePerWeek && statePerWeek[week.weekNumber]}\n userDataPerWeekDay={\n userDataPerWeek && userDataPerWeek[week.weekNumber]\n }\n onClickDay={onClickDay}\n onClickWeek={onClickWeek}\n theme={theme}\n renderWeekNumber={renderWeekNumber}\n extraDayContent={extraDayContent}\n defaultHighlights={defaultHighlights}\n minDate={minDate}\n maxDate={maxDate}\n />\n ))}\n </tbody>\n </table>\n </Box>\n </>\n );\n}\n","import { Row, Space, Spacing } from \"@stenajs-webui/core\";\nimport { getMonth, getYear, parse } from \"date-fns\";\nimport { enGB } from \"date-fns/locale\";\nimport { chunk } from \"lodash\";\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 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 onClickYear,\n renderWeekDay,\n renderWeekNumber,\n headerLeftContent,\n headerRightContent,\n extraDayContent,\n defaultHighlights,\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 className={styles.calendar}>\n {monthRows.map((monthRow, rowIndex) => (\n <Spacing key={rowIndex}>\n <Row>\n {monthRow.map((month, index) => (\n <React.Fragment key={month.name}>\n {index > 0 && <Space />}\n <CalendarMonth<T>\n month={month}\n dayComponent={dayComponent}\n userDataPerWeek={\n userDataPerMonth && userDataPerMonth[month.monthString]\n }\n statePerWeek={\n statePerMonth && statePerMonth[month.monthString]\n }\n onClickDay={onClickDay}\n onClickWeekDay={onClickWeekDay}\n onClickWeek={onClickWeek}\n onClickMonth={onClickMonth}\n onClickYear={onClickYear}\n theme={theme}\n renderWeekNumber={renderWeekNumber}\n renderWeekDay={renderWeekDay}\n headerLeftContent={headerLeftContent}\n headerRightContent={headerRightContent}\n extraDayContent={extraDayContent}\n defaultHighlights={defaultHighlights}\n minDate={minDateObj}\n maxDate={maxDateObj}\n />\n </React.Fragment>\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 { 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 FlatButton,\n stenaAngleLeft,\n stenaAngleRight,\n} from \"@stenajs-webui/elements\";\nimport * as React from \"react\";\nimport { CalendarTheme } from \"../../components/calendar/CalendarTheme\";\nimport { faAngleDoubleLeft } from \"@fortawesome/free-solid-svg-icons/faAngleDoubleLeft\";\nimport { faAngleDoubleRight } from \"@fortawesome/free-solid-svg-icons/faAngleDoubleRight\";\nimport { ReactNode } from \"react\";\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>\n <FlatButton onClick={prevYear} leftIcon={faAngleDoubleLeft} />\n <Space />\n <FlatButton onClick={prevMonth} leftIcon={stenaAngleLeft} />\n <Indent num={2} />\n <FlatButton onClick={nextMonth} leftIcon={stenaAngleRight} />\n <Space />\n <FlatButton onClick={nextYear} leftIcon={faAngleDoubleRight} />\n </Row>\n </Indent>\n <Space />\n </div>\n);\n","import * as React from \"react\";\nimport { useMemo } from \"react\";\nimport { Row } from \"@stenajs-webui/core\";\nimport { FlatButton, PrimaryButton } from \"@stenajs-webui/elements\";\nimport { ValueAndOnValueChangeProps } from \"@stenajs-webui/forms\";\nimport { Month } from \"../../util/calendar/CalendarDataFactory\";\nimport { format } from \"date-fns\";\n\ninterface Props extends ValueAndOnValueChangeProps<Month> {\n month: Month;\n}\n\nexport const MonthPickerCell: React.FC<Props> = ({\n value,\n onValueChange,\n month,\n}) => {\n const label = useMemo(() => {\n const now = new Date(2000, month, 1);\n return format(now, \"MMM\");\n }, [month]);\n\n return (\n <Row width={\"64px\"} justifyContent={\"center\"} spacing={0.5} indent={0.5}>\n {value === month ? (\n <PrimaryButton\n label={label}\n onClick={() => onValueChange && onValueChange(month)}\n />\n ) : (\n <FlatButton\n label={label}\n onClick={() => onValueChange && onValueChange(month)}\n />\n )}\n </Row>\n );\n};\n","import * as React from \"react\";\nimport { Month } from \"../../util/calendar/CalendarDataFactory\";\nimport { ValueAndOnValueChangeProps } from \"@stenajs-webui/forms\";\nimport { Column, Row } from \"@stenajs-webui/core\";\nimport { MonthPickerCell } from \"./MonthPickerCell\";\n\nexport interface MonthPickerProps extends ValueAndOnValueChangeProps<Month> {}\n\nconst monthMatrix = [\n [Month.JANUARY, Month.FEBRUARY, Month.MARCH],\n [Month.APRIL, Month.MAY, Month.JUNE],\n [Month.JULY, Month.AUGUST, Month.SEPTEMBER],\n [Month.OCTOBER, Month.NOVEMBER, Month.DECEMBER],\n];\n\nexport const MonthPicker: React.FC<MonthPickerProps> = ({\n value,\n onValueChange,\n}) => {\n return (\n <Column>\n {monthMatrix.map((monthRow) => (\n <Row key={monthRow[0]}>\n {monthRow.map((month) => (\n <MonthPickerCell\n key={month}\n month={month}\n onValueChange={onValueChange}\n value={value}\n />\n ))}\n </Row>\n ))}\n </Column>\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 * 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 width={\"64px\"} justifyContent={\"center\"} spacing={0.5} indent={0.5}>\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 { FlatButton } from \"@stenajs-webui/elements\";\nimport { faCaretLeft } from \"@fortawesome/free-solid-svg-icons/faCaretLeft\";\nimport { faCaretRight } from \"@fortawesome/free-solid-svg-icons/faCaretRight\";\nimport { chunk, range } from \"lodash\";\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={faCaretLeft}\n onClick={() => setLastYear(lastYear - 3)}\n />\n </Column>\n <Column>\n {yearRows.map((yearRow) => (\n <Row key={yearRow[0]}>\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={faCaretRight}\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 { Box } from \"@stenajs-webui/core\";\nimport { PrimaryButton } from \"@stenajs-webui/elements\";\nimport * as React from \"react\";\nimport { useCallback } from \"react\";\nimport { Calendar } from \"../../components/calendar/Calendar\";\nimport { CalendarProps } from \"../../types/CalendarTypes\";\nimport { Month } from \"../../util/calendar/CalendarDataFactory\";\nimport { MonthPicker } from \"../month-picker/MonthPicker\";\nimport { CalendarPreset } from \"../preset-picker/CalendarPreset\";\nimport { PresetPicker } from \"../preset-picker/PresetPicker\";\nimport { YearPicker } from \"../year-picker/YearPicker\";\nimport { CalendarPanelType } from \"./CalendarPanelType\";\n\ninterface CalendarWithMonthYearPickersProps<T>\n extends Omit<CalendarProps<T>, \"date\" | \"year\" | \"month\"> {\n dateInFocus: Date;\n setDateInFocus: (dateInFocus: Date) => void;\n currentPanel: CalendarPanelType;\n setCurrentPanel: (currentPanel: CalendarPanelType) => void;\n onSelectPreset: (preset: CalendarPreset) => void;\n}\n\nexport const CalendarWithMonthYearPickers =\n function CalendarWithMonthYearPickers<T>({\n dateInFocus,\n setDateInFocus,\n currentPanel,\n setCurrentPanel,\n ...props\n }: CalendarWithMonthYearPickersProps<T>) {\n const onChangeSelectedMonth = useCallback(\n (selectedMonth: Month) => {\n const newDate = dateInFocus ? new Date(dateInFocus) : new Date();\n newDate.setMonth(selectedMonth);\n if (setDateInFocus) {\n setDateInFocus(newDate);\n }\n setCurrentPanel(\"calendar\");\n },\n [dateInFocus, setDateInFocus, setCurrentPanel]\n );\n\n const onChangeSelectedYear = useCallback(\n (selectedYear: number) => {\n const newDate = dateInFocus ? new Date(dateInFocus) : new Date();\n newDate.setFullYear(selectedYear);\n if (setDateInFocus) {\n setDateInFocus(newDate);\n }\n setCurrentPanel(\"calendar\");\n },\n [dateInFocus, setDateInFocus, setCurrentPanel]\n );\n\n const onClickYear = useCallback(() => {\n setCurrentPanel(\"year\");\n }, [setCurrentPanel]);\n\n const onClickMonth = useCallback(() => {\n setCurrentPanel(\"month\");\n }, [setCurrentPanel]);\n\n switch (currentPanel) {\n case \"calendar\":\n return (\n <>\n <Calendar<T>\n {...props}\n date={dateInFocus}\n onClickYear={onClickYear}\n onClickMonth={onClickMonth}\n />\n </>\n );\n case \"month\":\n return (\n <MonthPicker\n value={dateInFocus.getMonth()}\n onValueChange={onChangeSelectedMonth}\n />\n );\n case \"year\":\n return (\n <YearPicker\n value={dateInFocus.getFullYear()}\n onValueChange={onChangeSelectedYear}\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 {\n FlatButton,\n stenaAngleLeft,\n stenaAngleRight,\n} from \"@stenajs-webui/elements\";\nimport * as React from \"react\";\nimport { Calendar } from \"../../components/calendar/Calendar\";\nimport { defaultCalendarTheme } from \"../../components/calendar/CalendarTheme\";\nimport { CalendarProps } from \"../../types/CalendarTypes\";\nimport { useSelectedMonthStepperLogic } from \"./hooks/UseSelectedMonthStepperLogic\";\nimport { WithMonthSwitcherBelow } from \"./MonthSwitcherBelow\";\nimport { CalendarWithMonthYearPickers } from \"../calendar-with-month-year-pickers/CalendarWithMonthYearPickers\";\nimport { Column, Row, Space } from \"@stenajs-webui/core\";\nimport { faAngleDoubleLeft } from \"@fortawesome/free-solid-svg-icons/faAngleDoubleLeft\";\nimport { faAngleDoubleRight } from \"@fortawesome/free-solid-svg-icons/faAngleDoubleRight\";\nimport { CalendarPanelType } from \"../calendar-with-month-year-pickers/CalendarPanelType\";\nimport { CalendarPreset } from \"../preset-picker/CalendarPreset\";\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 hideYearPagination?: boolean;\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 hideYearPagination = false,\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 dateInFocus={dateInFocus}\n setDateInFocus={setDateInFocus}\n currentPanel={currentPanel}\n setCurrentPanel={setCurrentPanel}\n onSelectPreset={onSelectPreset}\n headerLeftContent={\n <Row alignItems={\"center\"}>\n {!hideYearPagination && (\n <FlatButton\n size={\"small\"}\n onClick={prevYear}\n leftIcon={faAngleDoubleLeft}\n />\n )}\n <Space />\n <FlatButton\n size={\"small\"}\n onClick={prevMonth}\n leftIcon={stenaAngleLeft}\n />\n </Row>\n }\n headerRightContent={\n <Row alignItems={\"center\"}>\n <FlatButton\n size={\"small\"}\n onClick={nextMonth}\n leftIcon={stenaAngleRight}\n />\n <Space />\n {!hideYearPagination && (\n <FlatButton\n size={\"small\"}\n onClick={nextYear}\n leftIcon={faAngleDoubleRight}\n />\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}: DateRangeCalendarProps<T>): CalendarWithMonthSwitcherProps<T> => {\n const { currentPanel, setCurrentPanel } =\n useInternalPanelState(onChangePanel);\n const [dateInFocus, setDateInFocus] = useState(() => new Date());\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}\n\nexport function DateRangeCalendar<T>(props: DateRangeCalendarProps<T>) {\n const dateRangeSelectionProps = useDateRangeSelection(props);\n return (\n <CalendarWithMonthSwitcher<T> {...props} {...dateRangeSelectionProps} />\n );\n}\n\nexport type DateRangeInputCalendarProps<T> = Omit<\n DateRangeCalendarProps<T>,\n | \"startDateInFocus\"\n | \"value\"\n | \"onValueChange\"\n | \"focusedInput\"\n | \"setFocusedInput\"\n | \"theme\"\n | \"currentPanel\"\n | \"setCurrentPanel\"\n>;\n","import { useState } from \"react\";\nimport { DateRangeFocusedInput } from \"../DateRangeCalendar\";\n\nexport const useDateRangeCalendarState = () => {\n const [startDate, setStartDate] = useState<Date | undefined>();\n const [endDate, setEndDate] = useState<Date | undefined>();\n const [focusedInput, setFocusedInput] =\n useState<DateRangeFocusedInput>(\"startDate\");\n return {\n startDate,\n setStartDate,\n endDate,\n setEndDate,\n focusedInput,\n setFocusedInput,\n };\n};\n","import { useCallback, useMemo, useState } from \"react\";\nimport { OnClickDay } from \"../../../types/CalendarTypes\";\nimport { addDayStateHighlights } from \"../../../util/calendar/StateModifier\";\nimport { SingleDateCalendarProps } from \"./SingleDateCalendar\";\nimport { CalendarWithMonthSwitcherProps } from \"../../../features/month-switcher/CalendarWithMonthSwitcher\";\nimport { useInternalPanelState } from \"../../../features/internal-panel-state/UseInternalPanelState\";\n\nexport const useSingleDateSelection = <T>({\n onChange,\n value,\n statePerMonth,\n onChangePanel,\n}: SingleDateCalendarProps<T>): CalendarWithMonthSwitcherProps<T> => {\n const { currentPanel, setCurrentPanel } =\n useInternalPanelState(onChangePanel);\n\n const [dateInFocus, setDateInFocus] = useState(() => value ?? new Date());\n\n const onClickDay: OnClickDay<T> = useCallback(\n (day) => {\n if (onChange) {\n onChange(day.date);\n }\n },\n [onChange]\n );\n\n const statePerMonthWithSelectedDate = useMemo(\n () =>\n value\n ? addDayStateHighlights(statePerMonth, value, [\n \"selected\",\n \"singleSelected\",\n ])\n : statePerMonth,\n [statePerMonth, value]\n );\n\n return {\n onClickDay,\n statePerMonth: statePerMonthWithSelectedDate,\n date: value,\n currentPanel,\n setCurrentPanel,\n dateInFocus,\n setDateInFocus,\n };\n};\n","import * as React from \"react\";\nimport { CalendarWithMonthSwitcher } from \"../../../features/month-switcher/CalendarWithMonthSwitcher\";\n\nimport { useSingleDateSelection } from \"./UseSingleDateSelection\";\nimport { InternalPanelAndFocusStateProps } from \"../../../types/InternalPanelAndFocusStateProps\";\n\nexport interface SingleDateCalendarProps<T>\n extends InternalPanelAndFocusStateProps<T> {\n value: Date | undefined;\n onChange: (value: Date | undefined) => void;\n}\n\nexport function SingleDateCalendar<T>(props: SingleDateCalendarProps<T>) {\n const singleDateSelectionProps = useSingleDateSelection(props);\n return (\n <CalendarWithMonthSwitcher<T> {...props} {...singleDateSelectionProps} />\n );\n}\n","import { isSameDay } from \"date-fns\";\nimport { useCallback, useMemo, useState } from \"react\";\nimport { OnClickDay } from \"../../../types/CalendarTypes\";\nimport { addDayStateHighlights } from \"../../../util/calendar/StateModifier\";\nimport { MultiDateCalendarProps } from \"./MultiDateCalendar\";\nimport { CalendarWithMonthSwitcherProps } from \"../../../features/month-switcher/CalendarWithMonthSwitcher\";\nimport { useInternalPanelState } from \"../../../features/internal-panel-state/UseInternalPanelState\";\n\nexport const useMultiDateSelection = <T>({\n onChange,\n value,\n statePerMonth,\n onChangePanel,\n}: MultiDateCalendarProps<T>): CalendarWithMonthSwitcherProps<T> => {\n const { currentPanel, setCurrentPanel } =\n useInternalPanelState(onChangePanel);\n\n const [dateInFocus, setDateInFocus] = useState(() => new Date());\n\n const onClickDay: OnClickDay<T> = useCallback(\n (day) => {\n if (!onChange) {\n return;\n }\n const isSelected = value && value.find((d) => isSameDay(d, day.date));\n if (value && isSelected) {\n onChange(value.filter((v) => !isSameDay(v, day.date)));\n } else {\n onChange([...(value || []), day.date]);\n }\n },\n [onChange, value]\n );\n const statePerMonthWithSelectedDate = useMemo(() => {\n if (!value) {\n return statePerMonth;\n }\n return value.reduce(\n (stateSum, date) => addDayStateHighlights(stateSum, date, [\"selected\"]),\n statePerMonth\n );\n }, [statePerMonth, value]);\n\n return {\n onClickDay,\n statePerMonth: statePerMonthWithSelectedDate,\n currentPanel,\n setCurrentPanel,\n dateInFocus,\n setDateInFocus,\n };\n};\n","import * as React from \"react\";\nimport { CalendarWithMonthSwitcher } from \"../../../features/month-switcher/CalendarWithMonthSwitcher\";\nimport { useMultiDateSelection } from \"./UseMultiDateSelection\";\nimport { UseInternalPanelStateProps } from \"../../../features/internal-panel-state/UseInternalPanelState\";\nimport { InternalPanelAndFocusStateProps } from \"../../../types/InternalPanelAndFocusStateProps\";\n\nexport interface MultiDateCalendarProps<T>\n extends InternalPanelAndFocusStateProps<T>,\n UseInternalPanelStateProps {\n value?: Array<Date>;\n onChange?: (value: Array<Date>) => void;\n}\n\nexport function MultiDateCalendar<T>(props: MultiDateCalendarProps<T>) {\n const selectionProps = useMultiDateSelection(props);\n return <CalendarWithMonthSwitcher<T> {...props} {...selectionProps} />;\n}\n","import { 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","import { isSameDay } from \"date-fns\";\n\nexport const addDateIfNotExists = (\n list: Array<Date>,\n date: Date\n): Array<Date> => {\n if (list.filter((item) => isSameDay(item, date)).length >= 1) {\n return list;\n }\n return [...list, date];\n};\n\nexport const removeDateIfExist = (list: Array<Date>, date: Date): Array<Date> =>\n list.filter((item) => !isSameDay(item, date));\n\nexport const listContainsDate = (list: Array<Date>, date: Date): boolean =>\n !!list.find((item) => isSameDay(item, date));\n","import { eachDayOfInterval } from \"date-fns\";\nimport { useCallback, useMemo, useState } from \"react\";\nimport { useDateRangeOnClickDayHandler } from \"../../../features/date-range/hooks/UseDateRangeOnClickDayHandler\";\nimport { CalendarState, OnClickDay } from \"../../../types/CalendarTypes\";\nimport { addDayStateHighlights } from \"../../../util/calendar/StateModifier\";\nimport {\n listContainsDate,\n removeDateIfExist,\n} from \"../../../util/date/DateListTools\";\nimport { DateRangeFocusedInput } from \"../date-range-calendar/DateRangeCalendar\";\nimport { DateRangeExclusionCalendarProps } from \"./DateRangeExclusionCalendar\";\nimport { CalendarWithMonthSwitcherProps } from \"../../../features/month-switcher/CalendarWithMonthSwitcher\";\nimport { useInternalPanelState } from \"../../../features/internal-panel-state/UseInternalPanelState\";\nimport { DateRange } from \"../../../types/DateRange\";\n\nexport const useDateRangeExclusionSelection = <T>({\n value,\n onValueChange,\n statePerMonth,\n onChangePanel,\n}: DateRangeExclusionCalendarProps<T>): CalendarWithMonthSwitcherProps<T> => {\n const [dateRange, setDateRange] = useState<DateRange | undefined>();\n const [focusedInput, setFocusedInput] =\n useState<DateRangeFocusedInput>(\"startDate\");\n const { currentPanel, setCurrentPanel } =\n useInternalPanelState(onChangePanel);\n\n const [dateInFocus, setDateInFocus] = useState(\n () => (focusedInput && value?.[focusedInput]) ?? new Date()\n );\n\n const onChangeHandler = useCallback(\n (value: DateRange) => {\n setDateRange(value);\n const { startDate, endDate } = value;\n if (onValueChange) {\n if (startDate && endDate) {\n const dates = eachDayOfInterval({ start: startDate, end: endDate });\n onValueChange(dates);\n } else if (startDate) {\n onValueChange([startDate]);\n } else if (endDate) {\n onValueChange([endDate]);\n }\n }\n },\n [onValueChange]\n );\n\n const onClickDayRange = useDateRangeOnClickDayHandler(\n dateRange,\n onChangeHandler,\n focusedInput,\n setFocusedInput\n );\n\n const onClickDay: OnClickDay<T> = useCallback(\n (day, userData, ev) => {\n if (onValueChange) {\n if (ev.ctrlKey || ev.metaKey) {\n if (!value) {\n onValueChange([day.date]);\n } else if (listContainsDate(value, day.date)) {\n onValueChange(removeDateIfExist(value, day.date));\n } else {\n onValueChange([...value, day.date]);\n }\n } else {\n onClickDayRange(day, userData, ev);\n }\n }\n },\n [onValueChange, onClickDayRange, value]\n );\n const statePerMonthWithSelectedDate = useMemo(() => {\n return addHighlighting(statePerMonth, value);\n }, [statePerMonth, value]);\n\n return {\n onClickDay,\n statePerMonth: statePerMonthWithSelectedDate,\n currentPanel,\n setCurrentPanel,\n dateInFocus,\n setDateInFocus,\n };\n};\n\nconst addHighlighting = (\n statePerMonth: CalendarState | undefined,\n dateList: Array<Date> | undefined\n): CalendarState | undefined => {\n if (!dateList) {\n return statePerMonth;\n }\n return dateList.reduce((statePerMonth, date) => {\n return addDayStateHighlights(statePerMonth, date, [\"selected\"]);\n }, statePerMonth);\n};\n","import * as React from \"react\";\nimport { CalendarWithMonthSwitcher } from \"../../../features/month-switcher/CalendarWithMonthSwitcher\";\nimport { useDateRangeExclusionSelection } from \"./UseDateRangeExclusionSelection\";\nimport { UseInternalPanelStateProps } from \"../../../features/internal-panel-state/UseInternalPanelState\";\nimport { InternalPanelAndFocusStateProps } from \"../../../types/InternalPanelAndFocusStateProps\";\nimport { ValueAndOnValueChangeProps } from \"@stenajs-webui/forms\";\n\nexport interface DateRangeExclusionCalendarProps<T>\n extends InternalPanelAndFocusStateProps<T>,\n UseInternalPanelStateProps,\n ValueAndOnValueChangeProps<Array<Date>> {}\n\nexport function DateRangeExclusionCalendar<T>(\n props: DateRangeExclusionCalendarProps<T>\n) {\n const selectionProps = useDateRangeExclusionSelection(props);\n return <CalendarWithMonthSwitcher<T> {...props} {...selectionProps} />;\n}\n","import { PopoverPlacement } from \"@stenajs-webui/tooltip\";\n\nexport const defaultPopoverPlacement: PopoverPlacement = \"bottom\";\n","import { useTippyInstance } from \"@stenajs-webui/tooltip\";\nimport { useCallback } from \"react\";\n\nexport const useCalendarPopoverUpdater = () => {\n const [tippyRef, tippyInstanceRef] = useTippyInstance();\n\n const onChangePanel = useCallback(() => {\n tippyInstanceRef.current?.popperInstance?.update();\n }, [tippyInstanceRef]);\n\n return {\n onChangePanel,\n tippyRef,\n };\n};\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, Row } from \"@stenajs-webui/core\";\nimport { TextInput, TextInputProps } from \"@stenajs-webui/forms\";\nimport { Popover } from \"@stenajs-webui/tooltip\";\nimport { format } from \"date-fns\";\nimport * as React from \"react\";\nimport { defaultPopoverPlacement } from \"../../../config/DefaultPopoverPlacement\";\nimport { useCalendarPopoverUpdater } from \"../../../features/internal-panel-state/UseCalendarPopoverUpdater\";\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\";\nimport { FlatButton, stenaCalendar } from \"@stenajs-webui/elements\";\n\nexport interface DateInputProps<T = {}> 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, portal is not used.\n */\n portalTarget?: HTMLElement | null;\n /**\n * Z-index of the calendar overlay.\n * @default 100\n */\n zIndex?: number;\n /**\n * Width of the input element.\n * * @default 125px\n */\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 zIndex = 100,\n calendarTheme = defaultCalendarTheme,\n calendarProps,\n openOnMount,\n onClose,\n onChange,\n portalTarget,\n variant,\n width,\n minDate,\n maxDate = defaultMaxDate,\n disabled,\n}) => {\n const { hideCalendar, showingCalendar, onSelectDate, showCalendar } =\n useDateInput(onChange, onClose, openOnMount);\n\n const { tippyRef, onChangePanel } = useCalendarPopoverUpdater();\n\n return (\n <Box width={width}>\n <Popover\n arrow={false}\n lazy\n visible={showingCalendar}\n onClickOutside={hideCalendar}\n placement={defaultPopoverPlacement}\n zIndex={zIndex}\n appendTo={portalTarget ?? \"parent\"}\n tippyRef={tippyRef}\n disabled={disabled}\n content={\n <SingleDateCalendar\n {...calendarProps}\n onChange={onSelectDate}\n value={value}\n theme={calendarTheme}\n onChangePanel={onChangePanel}\n minDate={minDate}\n maxDate={maxDate}\n />\n }\n >\n <TextInput\n type={\"date\"}\n contentRight={\n <Row alignItems={\"center\"}>\n <FlatButton\n size={\"small\"}\n disabled={disabled}\n leftIcon={stenaCalendar}\n onClick={showCalendar}\n />\n </Row>\n }\n onFocus={showCalendar}\n onClickRight={showCalendar}\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 </Popover>\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 && 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 && 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 { Icon, stenaCalendar } from \"@stenajs-webui/elements\";\nimport { faLongArrowAltRight } from \"@fortawesome/free-solid-svg-icons/faLongArrowAltRight\";\nimport { CalendarWithMonthSwitcher } from \"../../../features/month-switcher/CalendarWithMonthSwitcher\";\nimport { CalendarPanelType } from \"../../../features/calendar-with-month-year-pickers/CalendarPanelType\";\nimport { Popover } 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 * Portal target, HTML element. If not set, portal is not used.\n */\n portalTarget?: HTMLElement | null;\n\n /**\n * Z-index of the calendar overlay.\n * @default 100\n */\n zIndex?: number;\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/**\n * @deprecated Please use DateRangeDualTextInput instead.\n */\nexport function DateRangeInput<T>({\n displayFormat = DateFormats.fullDate,\n placeholderStartDate = \"Start date\",\n placeholderEndDate = \"End date\",\n portalTarget,\n value,\n onValueChange,\n zIndex = 100,\n width,\n calendarTheme = defaultCalendarTheme,\n calendarProps,\n minDate,\n maxDate = defaultMaxDate,\n disabled,\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 <Popover\n arrow={false}\n lazy\n disabled={disabled}\n visible={showingCalendar}\n zIndex={zIndex}\n placement={defaultPopoverPlacement}\n appendTo={portalTarget ?? \"parent\"}\n onClickOutside={hideCalendar}\n content={\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 }\n >\n <Row alignItems={\"center\"}>\n <TextInput\n iconLeft={stenaCalendar}\n onFocus={showCalendarStartDate}\n value={value?.startDate ? format(value.startDate, displayFormat) : \"\"}\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={faLongArrowAltRight}\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 </Popover>\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 { Popover } from \"@stenajs-webui/tooltip\";\nimport { format, isValid, parse } from \"date-fns\";\nimport * as React from \"react\";\nimport { useCallback, useState } from \"react\";\nimport { defaultPopoverPlacement } from \"../../../config/DefaultPopoverPlacement\";\nimport { useCalendarPopoverUpdater } from \"../../../features/internal-panel-state/UseCalendarPopoverUpdater\";\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 /** Portal target, HTML element. If not set, portal is not used. */\n portalTarget?: HTMLElement | null;\n /** Z-index of the calendar overlay, @default 100 */\n zIndex?: number;\n /** The date text input theme to use. */\n calendarTheme?: CalendarTheme;\n}\n\nexport const DateTextInput: React.FC<DateTextInputProps<{}>> = ({\n calendarProps,\n closeOnCalendarSelectDate = true,\n dateFormat = DateFormats.fullDate,\n disableCalender = false,\n onValueChange,\n placeholder = \"yyyy-mm-dd\",\n portalTarget,\n value,\n width = \"130px\",\n zIndex = 100,\n calendarTheme = defaultCalendarTheme,\n hideCalenderIcon = false,\n minDate,\n maxDate = defaultMaxDate,\n variant,\n ...props\n}) => {\n const [open, setOpen] = useState(false);\n const { tippyRef, onChangePanel } = useCalendarPopoverUpdater();\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 [onValueChangeHandler, dateFormat, closeOnCalendarSelectDate, setOpen, open]\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 <Popover\n arrow={false}\n lazy\n visible={open}\n zIndex={zIndex}\n appendTo={portalTarget ?? \"parent\"}\n placement={defaultPopoverPlacement}\n onClickOutside={hideCalendar}\n tippyRef={tippyRef}\n content={\n <SingleDateCalendar\n {...calendarProps}\n onChange={onCalendarSelectDate}\n onChangePanel={onChangePanel}\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 }\n >\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}\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 />\n </Popover>\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 case 3:\n minutes = parseInt(time.substr(1, 2), 10);\n if (minutes >= 0 && minutes <= 59) {\n return {\n time: `0${time.substr(0, 1)}:${time.substr(1, 2)}`,\n success: true,\n };\n }\n return { time, success: false };\n case 4:\n hours = parseInt(time.substr(0, 2), 10);\n minutes = parseInt(time.substr(2, 2), 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.substr(0, 2)}:${time.substr(2, 2)}`,\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\";\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 (e) {\n return false;\n }\n};\n\nexport const getHoursAndMinutesFromTimeString = (\n value: string | undefined\n): {\n hour: number | undefined;\n minute: number | undefined;\n} => {\n if (value && isValidTimeString(value)) {\n const p = value.split(\":\");\n return {\n hour: parseIntElseUndefined(p[0]),\n minute: parseIntElseUndefined(p[1]),\n };\n }\n return {\n hour: undefined,\n minute: undefined,\n };\n};\n\nexport const transformTimeInDateToTimeString = (date: Date): string =>\n `${formatHours(String(date.getHours()))}:${formatMinutes(\n String(date.getMinutes())\n )}`;\n","import { Row } from \"@stenajs-webui/core\";\nimport { FlatButton, PrimaryButton } from \"@stenajs-webui/elements\";\nimport * as React from \"react\";\nimport { MutableRefObject, RefObject, useEffect, useRef } from \"react\";\n\nexport interface TimePickerCellProps {\n item: number;\n selected?: boolean;\n onClick: (label: number) => void;\n columnRef: RefObject<HTMLDivElement>;\n canScrollRef: MutableRefObject<boolean>;\n}\n\nexport const TimePickerCell: React.FC<TimePickerCellProps> = ({\n onClick,\n item,\n selected,\n columnRef,\n canScrollRef,\n}) => {\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(\n function scrollToSelectedItem() {\n if (\n selected &&\n columnRef.current &&\n ref.current &&\n canScrollRef.current\n ) {\n const targetScroll = ref.current.scrollHeight * Math.max(item - 2, 0);\n columnRef.current.scrollTo(0, targetScroll);\n canScrollRef.current = false;\n }\n },\n [columnRef, item, selected, canScrollRef]\n );\n\n return (\n <Row\n width={\"64px\"}\n justifyContent={\"center\"}\n spacing={0.5}\n indent={0.5}\n ref={ref}\n >\n {selected ? (\n <PrimaryButton\n label={String(item)}\n onClick={() => onClick && onClick(item)}\n />\n ) : (\n <FlatButton\n label={String(item)}\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\";\nimport * as React from \"react\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport {\n formatHours,\n formatMinutes,\n} from \"../../util/time/TimeStringFormatValidator\";\nimport { getHoursAndMinutesFromTimeString } from \"../../util/time/TimeTransformer\";\nimport styles from \"./TimePicker.module.css\";\nimport { TimePickerColumn } from \"./TimePickerColumn\";\n\nexport interface TimePickerProps extends ValueAndOnValueChangeProps<string> {}\n\nconst hours = range(0, 24);\nconst minutes = range(0, 60);\n\nexport const TimePicker: React.FC<TimePickerProps> = ({\n value,\n onValueChange,\n}) => {\n const canScrollRef = useRef(true);\n const [hour, setHour] = useState<number | undefined>(undefined);\n const [minute, setMinute] = useState<number | undefined>(undefined);\n\n useEffect(() => {\n if (value) {\n const { minute, hour } = getHoursAndMinutesFromTimeString(value);\n setHour(hour);\n setMinute(minute);\n }\n }, [value]);\n\n const onClickHour = useCallback(\n (h: number) => {\n setHour(h);\n onValueChange?.(\n `${formatHours(String(h ?? 0))}:${formatMinutes(String(minute ?? 0))}`\n );\n },\n [minute, onValueChange]\n );\n\n const onClickMinutes = useCallback(\n (m: number) => {\n setMinute(m);\n onValueChange?.(\n `${formatHours(String(hour ?? 0))}:${formatMinutes(String(m ?? 0))}`\n );\n },\n [hour, onValueChange]\n );\n\n return (\n <Row className={styles.timePicker}>\n <TimePickerColumn\n items={hours}\n onClick={onClickHour}\n selectedItem={hour}\n canScrollRef={canScrollRef}\n />\n <Indent />\n <TimePickerColumn\n items={minutes}\n onClick={onClickMinutes}\n selectedItem={minute}\n canScrollRef={canScrollRef}\n />\n </Row>\n );\n};\n","import { RefObject, useEffect } from \"react\";\n\nexport const useDateRangeEffects = (\n date: Date | undefined | null,\n setDateInFocus: (date: Date) => void,\n dateInputRef: RefObject<HTMLInputElement>\n) => {\n useEffect(\n function moveFocusedDateWhenDateChanges() {\n if (date) {\n setDateInFocus(date);\n }\n },\n [date, setDateInFocus]\n );\n\n useEffect(\n function updateDateFieldWhenValueChanges() {\n if (dateInputRef.current) {\n if (date) {\n dateInputRef.current.valueAsDate = new Date(\n Date.UTC(date.getFullYear(), date.getMonth(), date.getDate())\n );\n } else {\n dateInputRef.current.valueAsDate = null;\n }\n }\n },\n [date, dateInputRef]\n );\n};\n","import { ChangeEvent, RefObject, useCallback } from \"react\";\nimport { getHoursAndMinutesFromTimeString } from \"../../../../util/time/TimeTransformer\";\nimport { DateTimeInputProps } from \"../DateTimeInput\";\nimport { UseInputStatesResult } from \"./UseInputStates\";\n\nexport const useDateRangeHandlers = (\n date: Date | undefined | null,\n onValueChange: DateTimeInputProps[\"onValueChange\"],\n {\n setDateInFocus,\n showCalendarInternal,\n hideCalendarInternal,\n setFirstFocusedInput,\n setCurrentPanel,\n localTime,\n setLocalTime,\n localDate,\n setLocalDate,\n }: UseInputStatesResult,\n dateInputRef: RefObject<HTMLInputElement>\n) => {\n const onChangeDate = useCallback(\n (incomingDate: Date | null) => {\n if (!incomingDate) {\n return;\n }\n const newDate = new Date(incomingDate);\n\n if (date) {\n // Full date is available\n\n newDate.setHours(date.getHours());\n newDate.setMinutes(date.getMinutes());\n\n onValueChange?.(newDate);\n setLocalDate(undefined);\n } else if (localTime) {\n // Only time has been selected\n const { minute, hour } = getHoursAndMinutesFromTimeString(localTime);\n\n newDate.setHours(hour ?? 0);\n newDate.setMinutes(minute ?? 0);\n\n onValueChange?.(newDate);\n setLocalDate(undefined);\n } else {\n // Nothing has been selected\n setLocalDate(newDate);\n }\n setDateInFocus(newDate);\n if (dateInputRef.current) {\n dateInputRef.current.valueAsDate = new Date(\n Date.UTC(newDate.getFullYear(), newDate.getMonth(), newDate.getDate())\n );\n }\n },\n [date, dateInputRef, localTime, onValueChange, setDateInFocus, setLocalDate]\n );\n\n const onChangeTime = useCallback(\n (time: string) => {\n if (!time) {\n return;\n }\n\n if (date) {\n // Full date is available\n const newTime = getHoursAndMinutesFromTimeString(time);\n const newDate = new Date(date);\n\n newDate.setHours(newTime.hour || 0);\n newDate.setMinutes(newTime.minute || 0);\n\n onValueChange?.(newDate);\n setLocalTime(undefined);\n } else if (localDate) {\n // Only date has already been selected\n const newTime = getHoursAndMinutesFromTimeString(time);\n const newDate = new Date(localDate);\n\n newDate.setHours(newTime.hour || 0);\n newDate.setMinutes(newTime.minute || 0);\n\n onValueChange?.(newDate);\n setLocalTime(undefined);\n } else {\n // Nothing has been selected\n setLocalTime(time);\n }\n },\n [onValueChange, date, localDate, setLocalTime]\n );\n\n const inputLeftChangeHandler = useCallback(\n (ev: ChangeEvent<HTMLInputElement>) => {\n if (ev.target.value[0] !== \"0\") {\n onChangeDate(ev.target.valueAsDate);\n }\n },\n [onChangeDate]\n );\n\n const inputRightChangeHandler = useCallback(\n (ev: ChangeEvent<HTMLInputElement>) => onChangeTime(ev.target.value),\n [onChangeTime]\n );\n\n const showCalendar = useCallback(() => {\n if (date) {\n setDateInFocus(date);\n } else {\n setDateInFocus(new Date());\n }\n setCurrentPanel(\"calendar\");\n showCalendarInternal();\n }, [date, setCurrentPanel, showCalendarInternal, setDateInFocus]);\n\n const hideCalendar = useCallback(() => {\n setFirstFocusedInput(undefined);\n hideCalendarInternal();\n }, [setFirstFocusedInput, hideCalendarInternal]);\n\n return {\n inputLeftChangeHandler,\n inputRightChangeHandler,\n hideCalendar,\n showCalendar,\n onChangeTime,\n onChangeDate,\n };\n};\n","import { useBoolean } from \"@stenajs-webui/core\";\nimport { useState } from \"react\";\nimport { DateRangeFocusedInput } from \"../../../calendar-types/date-range-calendar/DateRangeCalendar\";\nimport { CalendarPanelType } from \"../../../../features/calendar-with-month-year-pickers/CalendarPanelType\";\n\nexport type UseInputStatesResult = ReturnType<typeof useInputStates>;\n\nexport const useInputStates = (date: Date | undefined | null) => {\n const [localDate, setLocalDate] = useState<Date | undefined>(undefined);\n const [localTime, setLocalTime] = useState<string | undefined>(undefined);\n\n const [isCalendarVisible, showCalendarInternal, hideCalendarInternal] =\n useBoolean(false);\n\n const [isTimePickerVisible, showTimePicker, hideTimePicker] =\n useBoolean(false);\n\n const [firstFocusedInput, setFirstFocusedInput] = useState<\n DateRangeFocusedInput | undefined\n >(undefined);\n\n const [dateInFocus, setDateInFocus] = useState<Date>(\n () => date ?? new Date()\n );\n\n const [currentPanel, setCurrentPanel] =\n useState<CalendarPanelType>(\"calendar\");\n\n return {\n isCalendarVisible,\n showCalendarInternal,\n hideCalendarInternal,\n firstFocusedInput,\n setFirstFocusedInput,\n dateInFocus,\n setDateInFocus,\n currentPanel,\n setCurrentPanel,\n isTimePickerVisible,\n showTimePicker,\n hideTimePicker,\n localDate,\n setLocalDate,\n localTime,\n setLocalTime,\n };\n};\n","import * as React from \"react\";\nimport { RefObject, useCallback } from \"react\";\nimport { DayData } from \"../../../../util/calendar/CalendarDataFactory\";\nimport { UseInputStatesResult } from \"./UseInputStates\";\n\nexport const useUserInputHandlers = (\n onChangeDate: (incomingDate: Date | null) => void,\n dateInputRef: RefObject<HTMLInputElement>,\n showCalendar: () => void,\n hideCalendar: () => void,\n {\n isCalendarVisible,\n setCurrentPanel,\n showTimePicker,\n hideTimePicker,\n }: UseInputStatesResult\n) => {\n const onFocusLeft = useCallback(() => {\n if (!isCalendarVisible) {\n showCalendar();\n }\n setCurrentPanel(\"calendar\");\n hideTimePicker();\n }, [hideTimePicker, isCalendarVisible, setCurrentPanel, showCalendar]);\n\n const onFocusRight = useCallback(() => {\n hideCalendar();\n showTimePicker();\n }, [hideCalendar, showTimePicker]);\n\n const onClickDay = useCallback(\n (day: DayData) => {\n onChangeDate(day.date);\n hideCalendar();\n showTimePicker();\n },\n [onChangeDate, hideCalendar, showTimePicker]\n );\n\n const onClickArrowButton = useCallback(() => {\n setCurrentPanel(\"presets\");\n showCalendar();\n }, [setCurrentPanel, showCalendar]);\n\n const onClickCalendarButton = useCallback(() => {\n if (isCalendarVisible) {\n hideCalendar();\n } else {\n dateInputRef.current?.focus();\n setCurrentPanel(\"calendar\");\n showCalendar();\n }\n }, [\n isCalendarVisible,\n hideCalendar,\n dateInputRef,\n setCurrentPanel,\n showCalendar,\n ]);\n\n const onKeyDownHandler = useCallback(\n (ev: React.KeyboardEvent<HTMLDivElement>) => {\n if (ev.key === \"Escape\") {\n hideCalendar();\n }\n },\n [hideCalendar]\n );\n\n return {\n onFocusLeft,\n onFocusRight,\n onClickDay,\n onClickArrowButton,\n onClickCalendarButton,\n onKeyDownHandler,\n };\n};\n","import { Box, Column, Row, Space, useDelayedFalse } from \"@stenajs-webui/core\";\nimport { PrimaryButton } from \"@stenajs-webui/elements\";\nimport {\n TextInputProps,\n ValueAndOnValueChangeProps,\n} from \"@stenajs-webui/forms\";\nimport { Popover } 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\";\nimport { stenaClock } from \"@stenajs-webui/elements\";\n\nexport interface DateTimeInputProps\n extends ValueAndOnValueChangeProps<Date | null>,\n OptionalMinMaxDatesAsString,\n Pick<DualTextInputProps, \"widthLeft\" | \"widthRight\" | \"variant\"> {\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}) => {\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 <Popover\n arrow={false}\n lazy\n disabled={disabled}\n placement={defaultPopoverPlacement}\n visible={isCalendarVisible || isTimePickerVisible}\n onClickOutside={hideAll}\n content={\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 }\n >\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 </Popover>\n </Box>\n );\n};\n","import { RefObject, useEffect } from \"react\";\n\nexport const useDateRangeEffects = (\n startDate: Date | undefined,\n endDate: Date | undefined,\n setDateInFocus: (date: Date) => void,\n startDateInputRef: RefObject<HTMLInputElement>,\n endDateInputRef: RefObject<HTMLInputElement>\n) => {\n useEffect(\n function moveFocusedDateWhenStartDateChanges() {\n if (startDate) {\n setDateInFocus(startDate);\n }\n },\n [startDate, setDateInFocus]\n );\n\n useEffect(\n function moveFocusedDateWhenEndDateChanges() {\n if (endDate) {\n setDateInFocus(endDate);\n }\n },\n [endDate, setDateInFocus]\n );\n\n useEffect(\n function updateStartDateFieldWhenValueChanges() {\n if (startDateInputRef.current) {\n if (startDate) {\n startDateInputRef.current.valueAsDate = new Date(\n Date.UTC(\n startDate.getFullYear(),\n startDate.getMonth(),\n startDate.getDate()\n )\n );\n } else {\n startDateInputRef.current.valueAsDate = null;\n }\n }\n },\n [startDate, startDateInputRef]\n );\n\n useEffect(\n function updateEndDateFieldWhenValueChanges() {\n if (endDateInputRef.current) {\n if (endDate) {\n endDateInputRef.current.valueAsDate = new Date(\n Date.UTC(\n endDate.getFullYear(),\n endDate.getMonth(),\n endDate.getDate()\n )\n );\n } else {\n endDateInputRef.current.valueAsDate = null;\n }\n }\n },\n [endDate, endDateInputRef]\n );\n};\n","import { ChangeEvent, useCallback } from \"react\";\nimport { DateRangeDualTextInputProps } from \"../DateRangeDualTextInput\";\nimport { UseInputStatesResult } from \"./UseInputStates\";\n\nexport const useDateRangeHandlers = (\n startDate: Date | undefined,\n endDate: Date | undefined,\n onValueChange: DateRangeDualTextInputProps[\"onValueChange\"],\n {\n setDateInFocus,\n showCalendarInternal,\n hideCalendarInternal,\n setFirstFocusedInput,\n setCurrentPanel,\n }: UseInputStatesResult\n) => {\n const inputLeftChangeHandler = useCallback(\n (ev: ChangeEvent<HTMLInputElement>) => {\n if (ev.target.value[0] !== \"0\") {\n onValueChange?.({\n startDate: ev.target.valueAsDate ?? undefined,\n endDate,\n });\n }\n },\n [onValueChange, endDate]\n );\n\n const inputRightChangeHandler = useCallback(\n (ev: ChangeEvent<HTMLInputElement>) => {\n if (ev.target.value[0] !== \"0\") {\n onValueChange?.({\n startDate,\n endDate: ev.target.valueAsDate ?? undefined,\n });\n }\n },\n [onValueChange, startDate]\n );\n\n const showCalendar = useCallback(() => {\n if (startDate) {\n setDateInFocus(startDate);\n } else if (endDate) {\n setDateInFocus(endDate);\n } else {\n setDateInFocus(new Date());\n }\n setCurrentPanel(\"calendar\");\n showCalendarInternal();\n }, [\n startDate,\n endDate,\n setCurrentPanel,\n showCalendarInternal,\n setDateInFocus,\n ]);\n\n const hideCalendar = useCallback(() => {\n setFirstFocusedInput(undefined);\n hideCalendarInternal();\n }, [setFirstFocusedInput, hideCalendarInternal]);\n\n return {\n inputLeftChangeHandler,\n inputRightChangeHandler,\n hideCalendar,\n setDateInFocus,\n setCurrentPanel,\n showCalendar,\n };\n};\n","import { useBoolean } from \"@stenajs-webui/core\";\nimport { useState } from \"react\";\nimport { DateRangeFocusedInput } from \"../../../calendar-types/date-range-calendar/DateRangeCalendar\";\nimport { CalendarPanelType } from \"../../../../features/calendar-with-month-year-pickers/CalendarPanelType\";\n\nexport type UseInputStatesResult = ReturnType<typeof useInputStates>;\n\nexport const useInputStates = (\n startDate: Date | undefined,\n endDate: Date | undefined\n) => {\n const [isCalendarVisible, showCalendarInternal, hideCalendarInternal] =\n useBoolean(false);\n\n const [firstFocusedInput, setFirstFocusedInput] = useState<\n DateRangeFocusedInput | undefined\n >(undefined);\n\n const [focusedInput, setFocusedInput] =\n useState<DateRangeFocusedInput>(\"startDate\");\n\n const [dateInFocus, setDateInFocus] = useState<Date>(() => {\n const fromValue =\n focusedInput === \"startDate\"\n ? startDate\n : focusedInput === \"endDate\"\n ? endDate\n : undefined;\n\n return fromValue ?? new Date();\n });\n\n const [currentPanel, setCurrentPanel] =\n useState<CalendarPanelType>(\"calendar\");\n\n return {\n isCalendarVisible,\n showCalendarInternal,\n hideCalendarInternal,\n firstFocusedInput,\n setFirstFocusedInput,\n focusedInput,\n setFocusedInput,\n dateInFocus,\n setDateInFocus,\n currentPanel,\n setCurrentPanel,\n };\n};\n","import { isAfter } from \"date-fns\";\nimport * as React from \"react\";\nimport { RefObject, useCallback } from \"react\";\nimport { DayData } from \"../../../../util/calendar/CalendarDataFactory\";\nimport { DateRangeDualTextInputProps } from \"../DateRangeDualTextInput\";\nimport { UseInputStatesResult } from \"./UseInputStates\";\n\nexport const useUserInputHandlers = (\n startDate: Date | undefined,\n endDate: Date | undefined,\n onValueChange: DateRangeDualTextInputProps[\"onValueChange\"],\n startDateInputRef: RefObject<HTMLInputElement>,\n endDateInputRef: RefObject<HTMLInputElement>,\n showCalendar: () => void,\n hideCalendar: () => void,\n {\n firstFocusedInput,\n setFirstFocusedInput,\n isCalendarVisible,\n setFocusedInput,\n focusedInput,\n setCurrentPanel,\n }: UseInputStatesResult\n) => {\n const onFocusLeft = useCallback(() => {\n if (firstFocusedInput == null) {\n setFirstFocusedInput(\"startDate\");\n }\n setFocusedInput(\"startDate\");\n if (!isCalendarVisible) {\n showCalendar();\n }\n }, [\n isCalendarVisible,\n setFocusedInput,\n showCalendar,\n setFirstFocusedInput,\n firstFocusedInput,\n ]);\n\n const onFocusRight = useCallback(() => {\n if (firstFocusedInput == null) {\n setFirstFocusedInput(\"endDate\");\n }\n setFocusedInput(\"endDate\");\n if (!isCalendarVisible) {\n showCalendar();\n }\n }, [\n isCalendarVisible,\n setFocusedInput,\n showCalendar,\n setFirstFocusedInput,\n firstFocusedInput,\n ]);\n\n const onClickDay = useCallback(\n (day: DayData) => {\n if (focusedInput === \"startDate\") {\n if (endDate != null && isAfter(day.date, endDate)) {\n onValueChange?.({\n startDate: day.date,\n endDate: undefined,\n });\n setFocusedInput(\"endDate\");\n endDateInputRef.current?.focus();\n } else {\n onValueChange?.({\n startDate: day.date,\n endDate,\n });\n if (firstFocusedInput === \"startDate\") {\n setFocusedInput(\"endDate\");\n endDateInputRef.current?.focus();\n } else {\n setTimeout(hideCalendar, 50);\n }\n }\n } else if (focusedInput === \"endDate\") {\n if (!startDate) {\n onValueChange?.({\n startDate,\n endDate: day.date,\n });\n setFocusedInput(\"startDate\");\n startDateInputRef.current?.focus();\n } else if (isAfter(startDate, day.date)) {\n onValueChange?.({\n startDate: day.date,\n endDate: undefined,\n });\n setFocusedInput(\"endDate\");\n endDateInputRef.current?.focus();\n } else {\n onValueChange?.({\n startDate,\n endDate: day.date,\n });\n setTimeout(hideCalendar, 50);\n }\n }\n },\n [\n focusedInput,\n onValueChange,\n endDate,\n firstFocusedInput,\n setFocusedInput,\n endDateInputRef,\n hideCalendar,\n startDate,\n startDateInputRef,\n ]\n );\n\n const onClickArrowButton = useCallback(() => {\n setCurrentPanel(\"presets\");\n showCalendar();\n }, [setCurrentPanel, showCalendar]);\n\n const onClickCalendarButton = useCallback(() => {\n if (isCalendarVisible) {\n hideCalendar();\n } else {\n setFocusedInput(\"startDate\");\n setFirstFocusedInput(\"startDate\");\n startDateInputRef.current?.focus();\n setCurrentPanel(\"calendar\");\n showCalendar();\n }\n }, [\n isCalendarVisible,\n hideCalendar,\n setFocusedInput,\n setFirstFocusedInput,\n startDateInputRef,\n setCurrentPanel,\n showCalendar,\n ]);\n\n const onKeyDownHandler = useCallback(\n (ev: React.KeyboardEvent<HTMLDivElement>) => {\n if (ev.key === \"Escape\") {\n hideCalendar();\n }\n },\n [hideCalendar]\n );\n\n return {\n onFocusLeft,\n onFocusRight,\n onClickDay,\n onClickArrowButton,\n onClickCalendarButton,\n onKeyDownHandler,\n };\n};\n","import { Box, useDelayedFalse } from \"@stenajs-webui/core\";\nimport { stenaArrowRight } from \"@stenajs-webui/elements\";\nimport {\n TextInputProps,\n ValueAndOnValueChangeProps,\n} from \"@stenajs-webui/forms\";\nimport { Popover } 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 onEsc?: () => void;\n onEnter?: () => void;\n onBlur?: () => void;\n autoFocus?: boolean;\n calendarProps?: DateRangeInputCalendarProps<TData>;\n disabled?: boolean;\n}\n\nexport function DateRangeDualTextInput<TData>({\n value,\n onValueChange,\n autoFocus,\n onBlur,\n onEnter,\n onEsc,\n minDate,\n maxDate = defaultMaxDate,\n calendarProps,\n widthLeft = 128,\n widthRight = 128,\n variant,\n disabled,\n}: 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 const delayedIsCalendarVisible = useDelayedFalse(isCalendarVisible, 300);\n\n return (\n <Box onKeyDown={onKeyDownHandler}>\n <Popover\n arrow={false}\n lazy\n disabled={disabled}\n placement={defaultPopoverPlacement}\n onClickOutside={hideCalendar}\n visible={isCalendarVisible}\n content={\n delayedIsCalendarVisible && (\n <CalendarWithMonthSwitcher\n onClickDay={onClickDay}\n dateInFocus={dateInFocus}\n setDateInFocus={setDateInFocus}\n currentPanel={currentPanel}\n setCurrentPanel={setCurrentPanel}\n minDate={minDate}\n maxDate={maxDate}\n {...calendarProps}\n statePerMonth={statePerMonth}\n />\n )\n }\n >\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 </Popover>\n </Box>\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","_a","addWeekStateHighlights","week","day","weekState","newHighlights","newWeekState","addWeekRangeHighlights","startDate","endDate","last","useHighlightToday","enabled","useMemo","Month","Month2","WeekDay","WeekDay2","getMonthsInYear","year","startMonth","numMonths","locale","months","getMonthInYear","yearToUse","monthToUse","firstDayOfMonth","getWeeksForMonth","forceSixWeeks","firstDayOfFirstWeek","startOfWeek","weeks","i","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","_","style","backgroundColor","monthInYear","borderTopLeftRadius","borderBottomLeftRadius","borderTopRightRadius","borderBottomRightRadius","boxSizing","defaultTextPropsProvider","selectedColor","disabledColor","inOtherMonthColor","rangeTextColor","isOtherMonth","color","undefined","defaultCalendarTheme","width","height","WeekNumber","textColor","clickableTextColor","show","CalendarDay","tdStyle","textProps","CalendarMonth","headerTextColor","extranetCalendarTheme","isDateInMinMaxRange","isBefore","DisabledDayWrapper","dayComponent","DayComponent","minDate","maxDate","props","activeDayState","WeekNumberCell","onClickWeek","theme","background","prefix","content","Box","_jsx","Text","Clickable","ev","CalendarWeek","statePerWeekDay","userDataPerWeekDay","onClickDay","renderWeekNumber","extraDayContent","days","map","dayOfMonth","dateString","WeekDayCell","onClickWeekDay","name","userData","ExtraDayContent","WrapperTd","styled","td","InnerWrapperDiv","div","innerWrapperStyle","CellWrapperDiv","cellWrapperStyle","position","_Fragment","isClickable","statePerWeek","userDataPerWeek","onClickMonth","onClickYear","renderWeekDay","headerLeftContent","headerRightContent","showWeekNumber","_jsxs","Row","FlatButton","Space","String","CalendarPanel","monthRows","userDataPerMonth","minDateObj","parse","Date","maxDateObj","styles","calendar","monthRow","rowIndex","Spacing","index","React","Calendar","initialDate","getInitialDate","getMonthRows","enGB","monthsPerRow","highlightToday","now","chunk","useSelectedMonthStepperLogic","setDateInFocus","nextMonth","useCallback","addMonths","nextYear","addYears","prevMonth","subMonths","prevYear","subYears","WithMonthSwitcherBelow","children","Indent","faAngleDoubleLeft","stenaAngleLeft","stenaAngleRight","faAngleDoubleRight","MonthPickerCell","value","onValueChange","label","PrimaryButton","monthMatrix","JANUARY","FEBRUARY","MARCH","APRIL","MAY","JUNE","JULY","AUGUST","SEPTEMBER","OCTOBER","NOVEMBER","DECEMBER","MonthPicker","Column","createStandardDateRangePresets","PresetPicker","onClickPreset","pageIndex","setPageIndex","useState","pages","currentPage","length","presets","preset","YearPickerCell","YearPicker","initialLastYear","lastYear","setLastYear","getFullYear","yearRows","startYear","range","useEffect","calculateLastYearInFocus","prev","faCaretLeft","yearRow","faCaretRight","yearDiff","remaining","yearsToAdd","yearsToSubtract","CalendarWithMonthYearPickers","currentPanel","setCurrentPanel","onChangeSelectedMonth","selectedMonth","newDate","setMonth","onChangeSelectedYear","selectedYear","setFullYear","noop","CalendarWithMonthSwitcher","monthSwitcherPlacement","onSelectPreset","hideYearPagination","calendarProps","placement","fallbackIfNoPlacement","dateRangeToStrings","dateRange","stringsToDateRange","isDateRangeInvalid","toggleDatesIfEndIsEarlierThanStart","toggleDateStringsIfEndIsEarlierThanStart","useDateRangeOnClickDayHandler","focusedInput","setFocusedInput","useInternalPanelState","onChangePanel","_setCurrentPanel","useDateRangeSelection","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","removeDateIfExist","list","item","listContainsDate","useDateRangeExclusionSelection","setDateRange","onChangeHandler","dates","onClickDayRange","addHighlighting","dateList","DateRangeExclusionCalendar","defaultPopoverPlacement","useCalendarPopoverUpdater","tippyRef","tippyInstanceRef","useTippyInstance","_b","useDateInput","onClose","openOnMount","showingCalendar","setShowingCalendar","showCalendar","hideCalendar","onSelectDate","setTimeout","defaultMaxDate","DateInput","displayFormat","fullDate","placeholder","zIndex","calendarTheme","portalTarget","variant","disabled","Popover","TextInput","stenaCalendar","useDateRangeInput","startDateInputRef","useRef","endDateInputRef","showCalendarStartDate","showCalendarEndDate","current","focus","startDateIsAfterEnd","DateRangeInput","placeholderStartDate","placeholderEndDate","Icon","faLongArrowAltRight","cssColor","DateTextInput","closeOnCalendarSelectDate","dateFormat","disableCalender","hideCalenderIcon","open","setOpen","toggleCalendar","onValueChangeHandler","onCalendarSelectDate","inValidInput","test","dateIsValid","isValid","invalid","formatHours","hours","h","formatMinutes","minutes","m","formatTimeString","time","validUserInput","arr","timeNumber","input","TimeTextInput","showPlaceholder","useIcon","valid","setValid","timeFormat","onBlur","formattedResult","success","target","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","stenaAngleDown","transformTimeStringToNumber","isValidTimeString","getHoursAndMinutesFromTimeString","p","parseIntElseUndefined","transformTimeInDateToTimeString","TimePickerCell","onClick","selected","columnRef","canScrollRef","ref","targetScroll","scrollHeight","Math","scrollTo","TimePickerColumn","items","selectedItem","timePickerColumn","TimePicker","hour","setHour","minute","setMinute","onClickHour","onClickMinutes","timePicker","useDateRangeEffects","dateInputRef","useDateRangeHandlers","showCalendarInternal","hideCalendarInternal","setFirstFocusedInput","localTime","setLocalTime","localDate","setLocalDate","onChangeDate","incomingDate","onChangeTime","newTime","inputLeftChangeHandler","inputRightChangeHandler","useInputStates","isCalendarVisible","useBoolean","isTimePickerVisible","showTimePicker","hideTimePicker","firstFocusedInput","useUserInputHandlers","onClickArrowButton","onClickCalendarButton","onKeyDownHandler","DateTimeInput","autoFocus","timeInputRef","states","dateToHighlight","hideAll","timeValue","delayedIsCalendarVisible","useDelayedFalse","delayedIsTimePickerVisible","fromValue","_d","_c","DateRangeDualTextInput","stenaArrowRight"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/util/date/DateFormats.ts","../src/util/calendar/StateModifier.ts","../src/features/today-state/UseHighlightToday.ts","../src/util/calendar/CalendarDataFactory.ts","../src/util/calendar/StateHelper.ts","../src/components/calendar/CalendarTheme.tsx","../src/util/date/DateMinMaxValidator.ts","../src/components/calendar/DisabledDayWrapper.tsx","../src/components/calendar/renderers/WeekNumberCell.tsx","../src/components/calendar/CalendarWeek.tsx","../src/components/calendar/renderers/WeekDayCell.tsx","../src/components/calendar/renderers/CalendarDay.tsx","../src/components/calendar/CalendarMonth.tsx","../src/components/calendar/Calendar.tsx","../src/features/month-switcher/hooks/UseSelectedMonthStepperLogic.ts","../src/features/month-switcher/MonthSwitcherBelow.tsx","../src/features/month-picker/MonthPickerCell.tsx","../src/features/month-picker/MonthPicker.tsx","../src/features/preset-picker/PresetFactory.ts","../src/features/preset-picker/PresetPicker.tsx","../src/features/year-picker/YearPickerCell.tsx","../src/features/year-picker/YearPicker.tsx","../src/features/calendar-with-month-year-pickers/CalendarWithMonthYearPickers.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/util/date/DateListTools.ts","../src/components/calendar-types/date-range-exclusion-calendar/UseDateRangeExclusionSelection.ts","../src/components/calendar-types/date-range-exclusion-calendar/DateRangeExclusionCalendar.tsx","../src/config/DefaultPopoverPlacement.ts","../src/features/internal-panel-state/UseCalendarPopoverUpdater.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/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"],"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\";\nimport {\n CalendarState,\n CalendarUserData,\n DayState,\n DayStateHighlight,\n StateForWeek,\n} from \"../../types/CalendarTypes\";\nimport { DateFormats } from \"../date/DateFormats\";\nimport { WeekData } from \"./CalendarDataFactory\";\n\nexport const buildDayStateForDateRange = (\n statePerMonth: CalendarUserData<DayState> = {},\n start?: Date,\n end?: Date\n): CalendarUserData<DayState> | undefined => {\n if (start && end && isAfter(end, start)) {\n return eachDayOfInterval({ start, end }).reduce(\n (result: CalendarUserData<DayState>, date: Date) => {\n const isFirstInRange = isSameDay(date, start);\n const isLastInRange = isSameDay(date, end);\n const highlights = isFirstInRange\n ? [\"selected\", \"selectedStart\", \"range\"]\n : isLastInRange\n ? [\"selected\", \"selectedEnd\", \"range\"]\n : [\"range\"];\n return addDayStateHighlights(result, date, highlights);\n },\n statePerMonth\n );\n }\n\n let state = statePerMonth;\n\n if (start) {\n state = addDayStateHighlights(state, start, [\"selected\", \"singleSelected\"]);\n }\n\n if (end) {\n state = addDayStateHighlights(state, end, [\"selected\", \"singleSelected\"]);\n }\n\n return state;\n};\n\nexport const buildDayStateForSingleMonth = (\n statePerMonth: CalendarUserData<DayState> = {},\n start: Date | undefined,\n end: Date | undefined,\n dateInFocus: Date\n): CalendarUserData<DayState> | undefined =>\n buildDayStateForRange(\n statePerMonth,\n start,\n end,\n startOfMonth(dateInFocus),\n endOfMonth(dateInFocus)\n );\n\nexport const buildDayStateForRange = (\n statePerMonth: CalendarUserData<DayState> = {},\n start: Date | undefined,\n end: Date | undefined,\n startLimit: Date,\n endLimit: Date\n): CalendarUserData<DayState> | undefined => {\n if (start && end) {\n return buildDayStateForDateRange(\n statePerMonth,\n max([start, subDays(startLimit, 1)]),\n min([end, addDays(endLimit, 1)])\n );\n } else {\n return buildDayStateForDateRange(statePerMonth, start, end);\n }\n};\n\nexport const setDayStateValue = (\n state: CalendarUserData<DayState> | undefined,\n date: Date,\n values: Partial<DayState>\n): CalendarUserData<DayState> => {\n const monthString = format(date, DateFormats.yearAndMonth);\n const weekNumber = getISOWeek(date);\n const dayInMonth = getDate(date);\n return {\n ...state,\n [monthString]: {\n ...(state && state[monthString]),\n [weekNumber]: {\n ...(state && state[monthString] && state[monthString][weekNumber]),\n [dayInMonth]: {\n ...(state &&\n state[monthString] &&\n state[monthString][weekNumber] &&\n state[monthString][weekNumber][dayInMonth]),\n ...values,\n },\n },\n },\n };\n};\n\nexport const setDayStateValueFunction = (\n state: CalendarUserData<DayState> | undefined,\n date: Date,\n setter: (dayState: DayState | undefined) => Partial<DayState>\n): CalendarUserData<DayState> => {\n const monthString = format(date, DateFormats.yearAndMonth);\n const weekNumber = getISOWeek(date);\n const dayInMonth = getDate(date);\n return {\n ...state,\n [monthString]: {\n ...(state && state[monthString]),\n [weekNumber]: {\n ...(state && state[monthString] && state[monthString][weekNumber]),\n [dayInMonth]: {\n ...(state &&\n state[monthString] &&\n state[monthString][weekNumber] &&\n state[monthString][weekNumber][dayInMonth]),\n ...setter(\n state &&\n state[monthString] &&\n state[monthString][weekNumber] &&\n state[monthString][weekNumber][dayInMonth]\n ),\n },\n },\n },\n };\n};\n\nexport const addDayStateHighlights = (\n calendarState: CalendarState | undefined,\n date: Date,\n highlights: Array<DayStateHighlight>\n): CalendarUserData<DayState> => {\n const month = date.getMonth() + 1;\n const monthString = `${date.getFullYear()}-${month < 10 ? \"0\" : \"\"}${month}`;\n const weekNumber = getISOWeek(date);\n const dayInMonth = getDate(date);\n const dayState: DayState | undefined =\n calendarState &&\n calendarState[monthString] &&\n calendarState[monthString][weekNumber] &&\n calendarState[monthString][weekNumber][dayInMonth];\n\n return {\n ...calendarState,\n [monthString]: {\n ...(calendarState && calendarState[monthString]),\n [weekNumber]: {\n ...(calendarState &&\n calendarState[monthString] &&\n calendarState[monthString][weekNumber]),\n [dayInMonth]: addDayStateHighlightsOnSingleDay(dayState, highlights),\n },\n },\n };\n};\n\nexport const addDayStateHighlightsOnSingleDay = (\n dayState: DayState | undefined,\n highlights: Array<DayStateHighlight>\n): DayState => {\n return {\n ...dayState,\n highlights: [...(dayState?.highlights ?? []), ...highlights],\n };\n};\n\nexport const addWeekStateHighlights = (\n calendarState: CalendarState | undefined,\n week: WeekData,\n highlights: Array<DayStateHighlight>\n): CalendarUserData<DayState> => {\n const date = week.days[0].date;\n const month = date.getMonth() + 1;\n const monthString = `${date.getFullYear()}-${month < 10 ? \"0\" : \"\"}${month}`;\n const weekNumber = week.weekNumber;\n\n let state = calendarState;\n week.days.forEach((day) => {\n state = addDayStateHighlights(state, day.date, highlights);\n });\n\n const weekState =\n state && state[monthString] ? state[monthString][weekNumber] : undefined;\n\n const newHighlights: Array<DayStateHighlight> =\n weekState && weekState.highlights\n ? [...weekState.highlights, ...highlights]\n : highlights;\n\n const newWeekState: StateForWeek = {\n ...weekState,\n highlights: newHighlights,\n };\n\n return {\n ...state,\n [monthString]: {\n ...(calendarState && calendarState[monthString]),\n [weekNumber]: newWeekState,\n },\n };\n};\n\nexport const addWeekRangeHighlights = (\n calendarState: CalendarState | undefined,\n week: WeekData\n): CalendarUserData<DayState> => {\n if (!week.days.length) {\n return { ...calendarState };\n }\n const startDate = week.days[0].date;\n const endDate = last(week.days)?.date;\n return {\n ...buildDayStateForDateRange(calendarState, startDate, endDate),\n };\n};\n","import { useMemo } from \"react\";\nimport { CalendarState } from \"../../types/CalendarTypes\";\nimport { addDayStateHighlights } from \"../../util/calendar/StateModifier\";\n\nexport const useHighlightToday = (\n enabled: boolean | undefined,\n statePerMonth: CalendarState | undefined\n) => {\n return useMemo(() => {\n return enabled\n ? addDayStateHighlights(statePerMonth, new Date(), [\"today\"])\n : statePerMonth;\n }, [enabled, statePerMonth]);\n};\n","import {\n addDays,\n addHours,\n addWeeks,\n eachDayOfInterval,\n endOfMonth,\n format,\n getDate,\n getISODay,\n getMonth,\n getWeek,\n getYear,\n isSameDay,\n startOfMonth,\n startOfWeek,\n} from \"date-fns\";\nimport { startCase } from \"lodash\";\nimport { DateFormats } from \"../date/DateFormats\";\n\nexport enum Month {\n JANUARY = 0,\n FEBRUARY,\n MARCH,\n APRIL,\n MAY,\n JUNE,\n JULY,\n AUGUST,\n SEPTEMBER,\n OCTOBER,\n NOVEMBER,\n DECEMBER,\n}\n\nexport enum WeekDay {\n SUNDAY = 0,\n MONDAY,\n TUESDAY,\n WEDNESDAY,\n THURSDAY,\n FRIDAY,\n SATURDAY,\n}\n\nexport interface DayData {\n name: string;\n 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 const yearToUse = year + Math.floor(month / 12);\n const monthToUse = month % 12;\n const firstDayOfMonth = new Date(yearToUse, monthToUse, 1);\n return {\n monthString: format(firstDayOfMonth, DateFormats.yearAndMonth),\n name: startCase(\n format(firstDayOfMonth, DateFormats.fullMonthName, { locale })\n ),\n year: yearToUse,\n monthInYear: monthToUse,\n weeks: getWeeksForMonth(yearToUse, monthToUse, locale),\n };\n};\n\nexport const getWeeksForMonth = (\n year: number,\n month: number,\n locale: Locale,\n forceSixWeeks: boolean = true\n): Array<WeekData> => {\n const firstDayOfMonth = new Date(year, month, 1);\n const firstDayOfFirstWeek = startOfWeek(firstDayOfMonth, { locale });\n\n const weeks = [];\n\n for (let i = 0; i < 6; i++) {\n const week = getWeekForDate(addWeeks(firstDayOfFirstWeek, i), locale);\n if (i > 0 && week.startMonth !== month && !forceSixWeeks) {\n return weeks;\n }\n weeks.push(week);\n }\n return weeks;\n};\n\nexport const getWeekForDate = (\n firstDayOfWeek: Date,\n locale: Locale\n): WeekData => {\n const isLastWeekOfMonth =\n getMonth(addDays(firstDayOfWeek, 7)) !== getMonth(firstDayOfWeek);\n return {\n weekNumber: getWeek(firstDayOfWeek, { locale }),\n startMonth: getMonth(firstDayOfWeek),\n startYear: getYear(firstDayOfWeek),\n endMonth: getMonth(addDays(firstDayOfWeek, 6)),\n endYear: getYear(addDays(firstDayOfWeek, 6)),\n days: getDaysForWeekForDate(firstDayOfWeek, locale),\n isLastWeekOfMonth,\n };\n};\n\nexport const createDay = (date: Date, locale: Locale): DayData => {\n const dayOfWeek = getISODay(date);\n return {\n date,\n name: format(date, \"EEE\", locale ? { locale } : undefined),\n 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 show?: boolean;\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 let style = {};\n\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 ...style,\n backgroundColor,\n borderTopLeftRadius: dayHighlightSelect(\n dayState,\n defaultHighlights,\n [\"selectedStart\", \"singleSelected\"],\n [\n \"var(--swui-calendar-day-border-radius)\",\n \"var(--swui-calendar-day-border-radius)\",\n ],\n borderColor\n ),\n borderBottomLeftRadius: dayHighlightSelect(\n dayState,\n defaultHighlights,\n [\"selectedStart\", \"singleSelected\"],\n [\n \"var(--swui-calendar-day-border-radius)\",\n \"var(--swui-calendar-day-border-radius)\",\n ],\n borderColor\n ),\n borderTopRightRadius: dayHighlightSelect(\n dayState,\n defaultHighlights,\n [\"selectedEnd\", \"singleSelected\"],\n [\n \"var(--swui-calendar-day-border-radius)\",\n \"var(--swui-calendar-day-border-radius)\",\n ],\n borderColor\n ),\n borderBottomRightRadius: dayHighlightSelect(\n dayState,\n defaultHighlights,\n [\"selectedEnd\", \"singleSelected\"],\n [\n \"var(--swui-calendar-day-border-radius)\",\n \"var(--swui-calendar-day-border-radius)\",\n ],\n borderColor\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 show: true,\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 { 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, Clickable, Text } from \"@stenajs-webui/core\";\nimport * as React from \"react\";\nimport { OnClickWeek } from \"../../../types/CalendarTypes\";\nimport { WeekData } from \"../../../util/calendar/CalendarDataFactory\";\nimport { CalendarTheme } from \"../CalendarTheme\";\n\nexport interface WeekNumberCellProps {\n week: WeekData;\n onClickWeek?: OnClickWeek;\n theme: CalendarTheme;\n background?: JSX.Element;\n prefix?: string;\n backgroundColor?: string;\n}\n\nexport const WeekNumberCell: React.FC<WeekNumberCellProps> = ({\n onClickWeek,\n theme,\n week,\n background,\n backgroundColor,\n prefix,\n}) => {\n const content = (\n <Box\n width={theme.width}\n height={theme.height}\n justifyContent={\"center\"}\n alignItems={\"center\"}\n >\n {background && <Box position={\"absolute\"}>{background}</Box>}\n <Box position={\"absolute\"}>\n <Text\n color={\n onClickWeek\n ? theme.WeekNumber.clickableTextColor\n : theme.WeekNumber.textColor\n }\n >\n {prefix}\n {week.weekNumber}\n </Text>\n </Box>\n </Box>\n );\n return (\n <Box\n background={backgroundColor || theme.WeekNumber.backgroundColor}\n position={\"relative\"}\n >\n {onClickWeek ? (\n <Clickable\n borderRadius={\"var(--swui-calendar-day-border-radius)\"}\n onClick={(ev) => onClickWeek(week, ev)}\n disableFocusHighlight={!onClickWeek}\n >\n {content}\n </Clickable>\n ) : (\n content\n )}\n </Box>\n );\n};\n","import * as React from \"react\";\nimport {\n CalendarDayProps,\n CalendarUserWeekData,\n DayState,\n DayStateHighlight,\n ExtraDayContentProps,\n OnClickDay,\n OnClickWeek,\n OptionalMinMaxDates,\n RenderWeekNumber,\n} from \"../../types/CalendarTypes\";\nimport { MonthData, WeekData } from \"../../util/calendar/CalendarDataFactory\";\n\nimport { CalendarTheme } from \"./CalendarTheme\";\nimport { DisabledDayWrapper } from \"./DisabledDayWrapper\";\nimport { WeekNumberCell } from \"./renderers/WeekNumberCell\";\n\nexport interface CalendarWeekProps<T> extends OptionalMinMaxDates {\n dayComponent: React.ComponentType<CalendarDayProps<T>>;\n week: WeekData;\n month: MonthData;\n statePerWeekDay?: CalendarUserWeekData<DayState>;\n userDataPerWeekDay?: CalendarUserWeekData<T>;\n onClickWeek?: OnClickWeek;\n onClickDay?: OnClickDay<T>;\n theme: CalendarTheme;\n renderWeekNumber?: RenderWeekNumber;\n extraDayContent?: React.ComponentType<ExtraDayContentProps<T>>;\n defaultHighlights?: Array<DayStateHighlight>;\n}\n\nexport function CalendarWeek<T>({\n week,\n month,\n dayComponent,\n statePerWeekDay,\n userDataPerWeekDay,\n minDate,\n maxDate,\n onClickWeek,\n onClickDay,\n theme,\n renderWeekNumber,\n extraDayContent,\n defaultHighlights,\n}: CalendarWeekProps<T>) {\n return (\n <tr key={week.weekNumber}>\n {theme.WeekNumber.show && (\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={statePerWeekDay && statePerWeekDay[day.dayOfMonth]}\n userData={userDataPerWeekDay && userDataPerWeekDay[day.dayOfMonth]}\n onClickDay={onClickDay}\n theme={theme}\n extraDayContent={extraDayContent}\n defaultHighlights={defaultHighlights}\n minDate={minDate}\n maxDate={maxDate}\n />\n ))}\n </tr>\n );\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, Clickable, Text } from \"@stenajs-webui/core\";\nimport * as React from \"react\";\nimport {\n CalendarDayProps,\n DayState,\n DayStateHighlight,\n} from \"../../../types/CalendarTypes\";\nimport { dayHighlightSelect } from \"../../../util/calendar/StateHelper\";\n\nexport const CalendarDay = function CalendarDay<T>({\n day,\n week,\n month,\n dayState,\n userData,\n onClickDay,\n theme,\n extraDayContent: ExtraDayContent,\n defaultHighlights,\n}: CalendarDayProps<T>) {\n const content = (\n <Box\n width={\"100%\"}\n height={\"100%\"}\n justifyContent={\"center\"}\n alignItems={\"center\"}\n >\n <Text\n {...(theme.CalendarDay.textProps &&\n theme.CalendarDay.textProps(\n defaultHighlights,\n dayState,\n day,\n week,\n month,\n userData\n ))}\n >\n {day.dayOfMonth}\n </Text>\n </Box>\n );\n\n const WrapperTd = styled.td({\n ...(theme.CalendarDay.tdStyle &&\n theme.CalendarDay.tdStyle(\n defaultHighlights,\n dayState,\n day,\n week,\n month,\n userData\n )),\n });\n\n const InnerWrapperDiv = styled.div({\n ...(theme.CalendarDay.innerWrapperStyle &&\n theme.CalendarDay.innerWrapperStyle(\n defaultHighlights,\n dayState,\n day,\n week,\n month,\n userData\n )),\n width: \"100%\",\n height: \"100%\",\n });\n\n const CellWrapperDiv = styled.div({\n ...(theme.CalendarDay.cellWrapperStyle &&\n theme.CalendarDay.cellWrapperStyle(\n defaultHighlights,\n dayState,\n day,\n week,\n month,\n userData\n )),\n width: \"100%\",\n height: \"100%\",\n position: \"relative\",\n });\n\n return (\n <WrapperTd>\n <InnerWrapperDiv>\n <CellWrapperDiv>\n {day.month === month.monthInYear && (\n <>\n {ExtraDayContent && (\n <ExtraDayContent\n week={week}\n month={month}\n day={day}\n dayState={dayState}\n theme={theme}\n userData={userData}\n />\n )}\n {onClickDay && isClickable(defaultHighlights, dayState) ? (\n <Clickable\n onClick={(ev) => onClickDay(day, userData, ev)}\n style={{ width: \"100%\", height: \"100%\" }}\n borderRadius={\"var(--swui-calendar-day-border-radius)\"}\n >\n {content}\n </Clickable>\n ) : (\n <>{content}</>\n )}\n </>\n )}\n </CellWrapperDiv>\n </InnerWrapperDiv>\n </WrapperTd>\n );\n};\n\nconst isClickable = (\n defaultHighlights: Array<DayStateHighlight> | undefined,\n dayState: DayState | undefined\n): boolean =>\n !!dayHighlightSelect<boolean>(\n dayState,\n defaultHighlights,\n [\"enabled\", \"disabled\"],\n [true, false],\n true\n );\n","import { Box, Row, Space, Text } from \"@stenajs-webui/core\";\nimport * as React 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 { CalendarWeek } from \"./CalendarWeek\";\nimport { WeekDayCell } from \"./renderers/WeekDayCell\";\nimport { CalendarDay } from \"./renderers/CalendarDay\";\nimport { FlatButton } from \"@stenajs-webui/elements\";\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 headerLeftContent?: React.ReactElement<{}>;\n headerRightContent?: React.ReactElement<{}>;\n extraDayContent?: React.ComponentType<ExtraDayContentProps<T>>;\n defaultHighlights?: Array<DayStateHighlight>;\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 onClickYear,\n renderWeekNumber,\n renderWeekDay,\n headerLeftContent,\n headerRightContent,\n theme = defaultCalendarTheme,\n extraDayContent,\n defaultHighlights,\n}: CalendarMonthProps<T>) {\n const showWeekNumber = theme.WeekNumber.show;\n\n return (\n <>\n <Box alignItems={\"stretch\"}>\n <Row\n justifyContent={\"space-between\"}\n alignItems={\"center\"}\n height={\"32px\"}\n >\n <Box alignItems={\"center\"}>{headerLeftContent}</Box>\n\n <Row alignItems={\"center\"}>\n <Row width={\"104px\"} justifyContent={\"center\"}>\n {onClickMonth ? (\n <FlatButton\n onClick={() => onClickMonth(month)}\n label={month.name}\n />\n ) : (\n <Text>{month.name}</Text>\n )}\n </Row>\n <Space />\n <Row width={\"64px\"} justifyContent={\"center\"}>\n {onClickYear ? (\n <FlatButton\n onClick={() => onClickYear(month.year)}\n label={String(month.year)}\n />\n ) : (\n <Text>{month.year}</Text>\n )}\n </Row>\n </Row>\n\n <Box alignItems={\"center\"}>{headerRightContent}</Box>\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 <CalendarWeek<T>\n key={week.weekNumber}\n month={month}\n week={week}\n dayComponent={dayComponent}\n statePerWeekDay={statePerWeek && statePerWeek[week.weekNumber]}\n userDataPerWeekDay={\n userDataPerWeek && userDataPerWeek[week.weekNumber]\n }\n onClickDay={onClickDay}\n onClickWeek={onClickWeek}\n theme={theme}\n renderWeekNumber={renderWeekNumber}\n extraDayContent={extraDayContent}\n defaultHighlights={defaultHighlights}\n minDate={minDate}\n maxDate={maxDate}\n />\n ))}\n </tbody>\n </table>\n </Box>\n </>\n );\n}\n","import { Row, Space, Spacing } from \"@stenajs-webui/core\";\nimport { getMonth, getYear, parse } from \"date-fns\";\nimport { enGB } from \"date-fns/locale\";\nimport { chunk } from \"lodash\";\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 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 onClickYear,\n renderWeekDay,\n renderWeekNumber,\n headerLeftContent,\n headerRightContent,\n extraDayContent,\n defaultHighlights,\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 className={styles.calendar}>\n {monthRows.map((monthRow, rowIndex) => (\n <Spacing key={rowIndex}>\n <Row>\n {monthRow.map((month, index) => (\n <React.Fragment key={month.name}>\n {index > 0 && <Space />}\n <CalendarMonth<T>\n month={month}\n dayComponent={dayComponent}\n userDataPerWeek={\n userDataPerMonth && userDataPerMonth[month.monthString]\n }\n statePerWeek={\n statePerMonth && statePerMonth[month.monthString]\n }\n onClickDay={onClickDay}\n onClickWeekDay={onClickWeekDay}\n onClickWeek={onClickWeek}\n onClickMonth={onClickMonth}\n onClickYear={onClickYear}\n theme={theme}\n renderWeekNumber={renderWeekNumber}\n renderWeekDay={renderWeekDay}\n headerLeftContent={headerLeftContent}\n headerRightContent={headerRightContent}\n extraDayContent={extraDayContent}\n defaultHighlights={defaultHighlights}\n minDate={minDateObj}\n maxDate={maxDateObj}\n />\n </React.Fragment>\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 { 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 FlatButton,\n stenaAngleLeft,\n stenaAngleRight,\n} from \"@stenajs-webui/elements\";\nimport * as React from \"react\";\nimport { CalendarTheme } from \"../../components/calendar/CalendarTheme\";\nimport { faAngleDoubleLeft } from \"@fortawesome/free-solid-svg-icons/faAngleDoubleLeft\";\nimport { faAngleDoubleRight } from \"@fortawesome/free-solid-svg-icons/faAngleDoubleRight\";\nimport { ReactNode } from \"react\";\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>\n <FlatButton onClick={prevYear} leftIcon={faAngleDoubleLeft} />\n <Space />\n <FlatButton onClick={prevMonth} leftIcon={stenaAngleLeft} />\n <Indent num={2} />\n <FlatButton onClick={nextMonth} leftIcon={stenaAngleRight} />\n <Space />\n <FlatButton onClick={nextYear} leftIcon={faAngleDoubleRight} />\n </Row>\n </Indent>\n <Space />\n </div>\n);\n","import { startCase } from \"lodash\";\nimport * as React from \"react\";\nimport { useMemo } from \"react\";\nimport { Row } from \"@stenajs-webui/core\";\nimport { FlatButton, PrimaryButton } from \"@stenajs-webui/elements\";\nimport { ValueAndOnValueChangeProps } from \"@stenajs-webui/forms\";\nimport { Month } from \"../../util/calendar/CalendarDataFactory\";\nimport { format } from \"date-fns\";\n\ninterface Props extends ValueAndOnValueChangeProps<Month> {\n month: Month;\n locale: Locale;\n}\n\nexport const MonthPickerCell: React.FC<Props> = ({\n value,\n onValueChange,\n month,\n locale,\n}) => {\n const label = useMemo(() => {\n const now = new Date(2000, month, 1);\n return startCase(format(now, \"MMM\", { locale }));\n }, [locale, month]);\n\n return (\n <Row width={\"64px\"} justifyContent={\"center\"} spacing={0.5} indent={0.5}>\n {value === month ? (\n <PrimaryButton\n label={label}\n onClick={() => onValueChange && onValueChange(month)}\n />\n ) : (\n <FlatButton\n label={label}\n onClick={() => onValueChange && onValueChange(month)}\n />\n )}\n </Row>\n );\n};\n","import { enGB } from \"date-fns/locale\";\nimport * as React from \"react\";\nimport { Month } from \"../../util/calendar/CalendarDataFactory\";\nimport { ValueAndOnValueChangeProps } from \"@stenajs-webui/forms\";\nimport { Column, Row } from \"@stenajs-webui/core\";\nimport { MonthPickerCell } from \"./MonthPickerCell\";\n\nexport interface MonthPickerProps extends ValueAndOnValueChangeProps<Month> {\n locale?: Locale;\n}\n\nconst monthMatrix = [\n [Month.JANUARY, Month.FEBRUARY, Month.MARCH],\n [Month.APRIL, Month.MAY, Month.JUNE],\n [Month.JULY, Month.AUGUST, Month.SEPTEMBER],\n [Month.OCTOBER, Month.NOVEMBER, Month.DECEMBER],\n];\n\nexport const MonthPicker: React.FC<MonthPickerProps> = ({\n value,\n onValueChange,\n locale = enGB,\n}) => {\n return (\n <Column>\n {monthMatrix.map((monthRow) => (\n <Row key={monthRow[0]}>\n {monthRow.map((month) => (\n <MonthPickerCell\n key={month}\n month={month}\n onValueChange={onValueChange}\n value={value}\n locale={locale}\n />\n ))}\n </Row>\n ))}\n </Column>\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 * 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 width={\"64px\"} justifyContent={\"center\"} spacing={0.5} indent={0.5}>\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 { FlatButton } from \"@stenajs-webui/elements\";\nimport { faCaretLeft } from \"@fortawesome/free-solid-svg-icons/faCaretLeft\";\nimport { faCaretRight } from \"@fortawesome/free-solid-svg-icons/faCaretRight\";\nimport { chunk, range } from \"lodash\";\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={faCaretLeft}\n onClick={() => setLastYear(lastYear - 3)}\n />\n </Column>\n <Column>\n {yearRows.map((yearRow) => (\n <Row key={yearRow[0]}>\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={faCaretRight}\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 { Box } from \"@stenajs-webui/core\";\nimport { PrimaryButton } from \"@stenajs-webui/elements\";\nimport * as React from \"react\";\nimport { useCallback } from \"react\";\nimport { Calendar } from \"../../components/calendar/Calendar\";\nimport { CalendarProps } from \"../../types/CalendarTypes\";\nimport { Month } from \"../../util/calendar/CalendarDataFactory\";\nimport { MonthPicker } from \"../month-picker/MonthPicker\";\nimport { CalendarPreset } from \"../preset-picker/CalendarPreset\";\nimport { PresetPicker } from \"../preset-picker/PresetPicker\";\nimport { YearPicker } from \"../year-picker/YearPicker\";\nimport { CalendarPanelType } from \"./CalendarPanelType\";\n\ninterface CalendarWithMonthYearPickersProps<T>\n extends Omit<CalendarProps<T>, \"date\" | \"year\" | \"month\"> {\n dateInFocus: Date;\n setDateInFocus: (dateInFocus: Date) => void;\n currentPanel: CalendarPanelType;\n setCurrentPanel: (currentPanel: CalendarPanelType) => void;\n onSelectPreset: (preset: CalendarPreset) => void;\n}\n\nexport const CalendarWithMonthYearPickers =\n function CalendarWithMonthYearPickers<T>({\n locale,\n dateInFocus,\n setDateInFocus,\n currentPanel,\n setCurrentPanel,\n ...props\n }: CalendarWithMonthYearPickersProps<T>) {\n const onChangeSelectedMonth = useCallback(\n (selectedMonth: Month) => {\n const newDate = dateInFocus ? new Date(dateInFocus) : new Date();\n newDate.setMonth(selectedMonth);\n if (setDateInFocus) {\n setDateInFocus(newDate);\n }\n setCurrentPanel(\"calendar\");\n },\n [dateInFocus, setDateInFocus, setCurrentPanel]\n );\n\n const onChangeSelectedYear = useCallback(\n (selectedYear: number) => {\n const newDate = dateInFocus ? new Date(dateInFocus) : new Date();\n newDate.setFullYear(selectedYear);\n if (setDateInFocus) {\n setDateInFocus(newDate);\n }\n setCurrentPanel(\"calendar\");\n },\n [dateInFocus, setDateInFocus, setCurrentPanel]\n );\n\n const onClickYear = useCallback(() => {\n setCurrentPanel(\"year\");\n }, [setCurrentPanel]);\n\n const onClickMonth = useCallback(() => {\n setCurrentPanel(\"month\");\n }, [setCurrentPanel]);\n\n switch (currentPanel) {\n case \"calendar\":\n return (\n <>\n <Calendar<T>\n {...props}\n date={dateInFocus}\n onClickYear={onClickYear}\n onClickMonth={onClickMonth}\n locale={locale}\n />\n </>\n );\n case \"month\":\n return (\n <MonthPicker\n value={dateInFocus.getMonth()}\n onValueChange={onChangeSelectedMonth}\n locale={locale}\n />\n );\n case \"year\":\n return (\n <YearPicker\n value={dateInFocus.getFullYear()}\n onValueChange={onChangeSelectedYear}\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 {\n FlatButton,\n stenaAngleLeft,\n stenaAngleRight,\n} from \"@stenajs-webui/elements\";\nimport * as React from \"react\";\nimport { Calendar } from \"../../components/calendar/Calendar\";\nimport { defaultCalendarTheme } from \"../../components/calendar/CalendarTheme\";\nimport { CalendarProps } from \"../../types/CalendarTypes\";\nimport { useSelectedMonthStepperLogic } from \"./hooks/UseSelectedMonthStepperLogic\";\nimport { WithMonthSwitcherBelow } from \"./MonthSwitcherBelow\";\nimport { CalendarWithMonthYearPickers } from \"../calendar-with-month-year-pickers/CalendarWithMonthYearPickers\";\nimport { Column, Row, Space } from \"@stenajs-webui/core\";\nimport { faAngleDoubleLeft } from \"@fortawesome/free-solid-svg-icons/faAngleDoubleLeft\";\nimport { faAngleDoubleRight } from \"@fortawesome/free-solid-svg-icons/faAngleDoubleRight\";\nimport { CalendarPanelType } from \"../calendar-with-month-year-pickers/CalendarPanelType\";\nimport { CalendarPreset } from \"../preset-picker/CalendarPreset\";\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 hideYearPagination?: boolean;\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 hideYearPagination = false,\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 dateInFocus={dateInFocus}\n setDateInFocus={setDateInFocus}\n currentPanel={currentPanel}\n setCurrentPanel={setCurrentPanel}\n onSelectPreset={onSelectPreset}\n headerLeftContent={\n <Row alignItems={\"center\"}>\n {!hideYearPagination && (\n <FlatButton\n size={\"small\"}\n onClick={prevYear}\n leftIcon={faAngleDoubleLeft}\n />\n )}\n <Space />\n <FlatButton\n size={\"small\"}\n onClick={prevMonth}\n leftIcon={stenaAngleLeft}\n />\n </Row>\n }\n headerRightContent={\n <Row alignItems={\"center\"}>\n <FlatButton\n size={\"small\"}\n onClick={nextMonth}\n leftIcon={stenaAngleRight}\n />\n <Space />\n {!hideYearPagination && (\n <FlatButton\n size={\"small\"}\n onClick={nextYear}\n leftIcon={faAngleDoubleRight}\n />\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}: DateRangeCalendarProps<T>): CalendarWithMonthSwitcherProps<T> => {\n const { currentPanel, setCurrentPanel } =\n useInternalPanelState(onChangePanel);\n const [dateInFocus, setDateInFocus] = useState(() => new Date());\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}\n\nexport function DateRangeCalendar<T>(props: DateRangeCalendarProps<T>) {\n const dateRangeSelectionProps = useDateRangeSelection(props);\n return (\n <CalendarWithMonthSwitcher<T> {...props} {...dateRangeSelectionProps} />\n );\n}\n\nexport type DateRangeInputCalendarProps<T> = Omit<\n DateRangeCalendarProps<T>,\n | \"startDateInFocus\"\n | \"value\"\n | \"onValueChange\"\n | \"focusedInput\"\n | \"setFocusedInput\"\n | \"theme\"\n | \"currentPanel\"\n | \"setCurrentPanel\"\n>;\n","import { useState } from \"react\";\nimport { DateRangeFocusedInput } from \"../DateRangeCalendar\";\n\nexport const useDateRangeCalendarState = () => {\n const [startDate, setStartDate] = useState<Date | undefined>();\n const [endDate, setEndDate] = useState<Date | undefined>();\n const [focusedInput, setFocusedInput] =\n useState<DateRangeFocusedInput>(\"startDate\");\n return {\n startDate,\n setStartDate,\n endDate,\n setEndDate,\n focusedInput,\n setFocusedInput,\n };\n};\n","import { useCallback, useMemo, useState } from \"react\";\nimport { OnClickDay } from \"../../../types/CalendarTypes\";\nimport { addDayStateHighlights } from \"../../../util/calendar/StateModifier\";\nimport { SingleDateCalendarProps } from \"./SingleDateCalendar\";\nimport { CalendarWithMonthSwitcherProps } from \"../../../features/month-switcher/CalendarWithMonthSwitcher\";\nimport { useInternalPanelState } from \"../../../features/internal-panel-state/UseInternalPanelState\";\n\nexport const useSingleDateSelection = <T>({\n onChange,\n value,\n statePerMonth,\n onChangePanel,\n}: SingleDateCalendarProps<T>): CalendarWithMonthSwitcherProps<T> => {\n const { currentPanel, setCurrentPanel } =\n useInternalPanelState(onChangePanel);\n\n const [dateInFocus, setDateInFocus] = useState(() => value ?? new Date());\n\n const onClickDay: OnClickDay<T> = useCallback(\n (day) => {\n if (onChange) {\n onChange(day.date);\n }\n },\n [onChange]\n );\n\n const statePerMonthWithSelectedDate = useMemo(\n () =>\n value\n ? addDayStateHighlights(statePerMonth, value, [\n \"selected\",\n \"singleSelected\",\n ])\n : statePerMonth,\n [statePerMonth, value]\n );\n\n return {\n onClickDay,\n statePerMonth: statePerMonthWithSelectedDate,\n date: value,\n currentPanel,\n setCurrentPanel,\n dateInFocus,\n setDateInFocus,\n };\n};\n","import * as React from \"react\";\nimport { CalendarWithMonthSwitcher } from \"../../../features/month-switcher/CalendarWithMonthSwitcher\";\n\nimport { useSingleDateSelection } from \"./UseSingleDateSelection\";\nimport { InternalPanelAndFocusStateProps } from \"../../../types/InternalPanelAndFocusStateProps\";\n\nexport interface SingleDateCalendarProps<T>\n extends InternalPanelAndFocusStateProps<T> {\n value: Date | undefined;\n onChange: (value: Date | undefined) => void;\n}\n\nexport function SingleDateCalendar<T>(props: SingleDateCalendarProps<T>) {\n const singleDateSelectionProps = useSingleDateSelection(props);\n return (\n <CalendarWithMonthSwitcher<T> {...props} {...singleDateSelectionProps} />\n );\n}\n","import { isSameDay } from \"date-fns\";\nimport { useCallback, useMemo, useState } from \"react\";\nimport { OnClickDay } from \"../../../types/CalendarTypes\";\nimport { addDayStateHighlights } from \"../../../util/calendar/StateModifier\";\nimport { MultiDateCalendarProps } from \"./MultiDateCalendar\";\nimport { CalendarWithMonthSwitcherProps } from \"../../../features/month-switcher/CalendarWithMonthSwitcher\";\nimport { useInternalPanelState } from \"../../../features/internal-panel-state/UseInternalPanelState\";\n\nexport const useMultiDateSelection = <T>({\n onChange,\n value,\n statePerMonth,\n onChangePanel,\n}: MultiDateCalendarProps<T>): CalendarWithMonthSwitcherProps<T> => {\n const { currentPanel, setCurrentPanel } =\n useInternalPanelState(onChangePanel);\n\n const [dateInFocus, setDateInFocus] = useState(() => new Date());\n\n const onClickDay: OnClickDay<T> = useCallback(\n (day) => {\n if (!onChange) {\n return;\n }\n const isSelected = value && value.find((d) => isSameDay(d, day.date));\n if (value && isSelected) {\n onChange(value.filter((v) => !isSameDay(v, day.date)));\n } else {\n onChange([...(value || []), day.date]);\n }\n },\n [onChange, value]\n );\n const statePerMonthWithSelectedDate = useMemo(() => {\n if (!value) {\n return statePerMonth;\n }\n return value.reduce(\n (stateSum, date) => addDayStateHighlights(stateSum, date, [\"selected\"]),\n statePerMonth\n );\n }, [statePerMonth, value]);\n\n return {\n onClickDay,\n statePerMonth: statePerMonthWithSelectedDate,\n currentPanel,\n setCurrentPanel,\n dateInFocus,\n setDateInFocus,\n };\n};\n","import * as React from \"react\";\nimport { CalendarWithMonthSwitcher } from \"../../../features/month-switcher/CalendarWithMonthSwitcher\";\nimport { useMultiDateSelection } from \"./UseMultiDateSelection\";\nimport { UseInternalPanelStateProps } from \"../../../features/internal-panel-state/UseInternalPanelState\";\nimport { InternalPanelAndFocusStateProps } from \"../../../types/InternalPanelAndFocusStateProps\";\n\nexport interface MultiDateCalendarProps<T>\n extends InternalPanelAndFocusStateProps<T>,\n UseInternalPanelStateProps {\n value?: Array<Date>;\n onChange?: (value: Array<Date>) => void;\n}\n\nexport function MultiDateCalendar<T>(props: MultiDateCalendarProps<T>) {\n const selectionProps = useMultiDateSelection(props);\n return <CalendarWithMonthSwitcher<T> {...props} {...selectionProps} />;\n}\n","import { 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","import { isSameDay } from \"date-fns\";\n\nexport const addDateIfNotExists = (\n list: Array<Date>,\n date: Date\n): Array<Date> => {\n if (list.filter((item) => isSameDay(item, date)).length >= 1) {\n return list;\n }\n return [...list, date];\n};\n\nexport const removeDateIfExist = (list: Array<Date>, date: Date): Array<Date> =>\n list.filter((item) => !isSameDay(item, date));\n\nexport const listContainsDate = (list: Array<Date>, date: Date): boolean =>\n !!list.find((item) => isSameDay(item, date));\n","import { eachDayOfInterval } from \"date-fns\";\nimport { useCallback, useMemo, useState } from \"react\";\nimport { useDateRangeOnClickDayHandler } from \"../../../features/date-range/hooks/UseDateRangeOnClickDayHandler\";\nimport { CalendarState, OnClickDay } from \"../../../types/CalendarTypes\";\nimport { addDayStateHighlights } from \"../../../util/calendar/StateModifier\";\nimport {\n listContainsDate,\n removeDateIfExist,\n} from \"../../../util/date/DateListTools\";\nimport { DateRangeFocusedInput } from \"../date-range-calendar/DateRangeCalendar\";\nimport { DateRangeExclusionCalendarProps } from \"./DateRangeExclusionCalendar\";\nimport { CalendarWithMonthSwitcherProps } from \"../../../features/month-switcher/CalendarWithMonthSwitcher\";\nimport { useInternalPanelState } from \"../../../features/internal-panel-state/UseInternalPanelState\";\nimport { DateRange } from \"../../../types/DateRange\";\n\nexport const useDateRangeExclusionSelection = <T>({\n value,\n onValueChange,\n statePerMonth,\n onChangePanel,\n}: DateRangeExclusionCalendarProps<T>): CalendarWithMonthSwitcherProps<T> => {\n const [dateRange, setDateRange] = useState<DateRange | undefined>();\n const [focusedInput, setFocusedInput] =\n useState<DateRangeFocusedInput>(\"startDate\");\n const { currentPanel, setCurrentPanel } =\n useInternalPanelState(onChangePanel);\n\n const [dateInFocus, setDateInFocus] = useState(\n () => (focusedInput && value?.[focusedInput]) ?? new Date()\n );\n\n const onChangeHandler = useCallback(\n (value: DateRange) => {\n setDateRange(value);\n const { startDate, endDate } = value;\n if (onValueChange) {\n if (startDate && endDate) {\n const dates = eachDayOfInterval({ start: startDate, end: endDate });\n onValueChange(dates);\n } else if (startDate) {\n onValueChange([startDate]);\n } else if (endDate) {\n onValueChange([endDate]);\n }\n }\n },\n [onValueChange]\n );\n\n const onClickDayRange = useDateRangeOnClickDayHandler(\n dateRange,\n onChangeHandler,\n focusedInput,\n setFocusedInput\n );\n\n const onClickDay: OnClickDay<T> = useCallback(\n (day, userData, ev) => {\n if (onValueChange) {\n if (ev.ctrlKey || ev.metaKey) {\n if (!value) {\n onValueChange([day.date]);\n } else if (listContainsDate(value, day.date)) {\n onValueChange(removeDateIfExist(value, day.date));\n } else {\n onValueChange([...value, day.date]);\n }\n } else {\n onClickDayRange(day, userData, ev);\n }\n }\n },\n [onValueChange, onClickDayRange, value]\n );\n const statePerMonthWithSelectedDate = useMemo(() => {\n return addHighlighting(statePerMonth, value);\n }, [statePerMonth, value]);\n\n return {\n onClickDay,\n statePerMonth: statePerMonthWithSelectedDate,\n currentPanel,\n setCurrentPanel,\n dateInFocus,\n setDateInFocus,\n };\n};\n\nconst addHighlighting = (\n statePerMonth: CalendarState | undefined,\n dateList: Array<Date> | undefined\n): CalendarState | undefined => {\n if (!dateList) {\n return statePerMonth;\n }\n return dateList.reduce((statePerMonth, date) => {\n return addDayStateHighlights(statePerMonth, date, [\"selected\"]);\n }, statePerMonth);\n};\n","import * as React from \"react\";\nimport { CalendarWithMonthSwitcher } from \"../../../features/month-switcher/CalendarWithMonthSwitcher\";\nimport { useDateRangeExclusionSelection } from \"./UseDateRangeExclusionSelection\";\nimport { UseInternalPanelStateProps } from \"../../../features/internal-panel-state/UseInternalPanelState\";\nimport { InternalPanelAndFocusStateProps } from \"../../../types/InternalPanelAndFocusStateProps\";\nimport { ValueAndOnValueChangeProps } from \"@stenajs-webui/forms\";\n\nexport interface DateRangeExclusionCalendarProps<T>\n extends InternalPanelAndFocusStateProps<T>,\n UseInternalPanelStateProps,\n ValueAndOnValueChangeProps<Array<Date>> {}\n\nexport function DateRangeExclusionCalendar<T>(\n props: DateRangeExclusionCalendarProps<T>\n) {\n const selectionProps = useDateRangeExclusionSelection(props);\n return <CalendarWithMonthSwitcher<T> {...props} {...selectionProps} />;\n}\n","import { PopoverPlacement } from \"@stenajs-webui/tooltip\";\n\nexport const defaultPopoverPlacement: PopoverPlacement = \"bottom\";\n","import { useTippyInstance } from \"@stenajs-webui/tooltip\";\nimport { useCallback } from \"react\";\n\nexport const useCalendarPopoverUpdater = () => {\n const [tippyRef, tippyInstanceRef] = useTippyInstance();\n\n const onChangePanel = useCallback(() => {\n tippyInstanceRef.current?.popperInstance?.update();\n }, [tippyInstanceRef]);\n\n return {\n onChangePanel,\n tippyRef,\n };\n};\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, Row } from \"@stenajs-webui/core\";\nimport { TextInput, TextInputProps } from \"@stenajs-webui/forms\";\nimport { Popover } from \"@stenajs-webui/tooltip\";\nimport { format } from \"date-fns\";\nimport * as React from \"react\";\nimport { defaultPopoverPlacement } from \"../../../config/DefaultPopoverPlacement\";\nimport { useCalendarPopoverUpdater } from \"../../../features/internal-panel-state/UseCalendarPopoverUpdater\";\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\";\nimport { FlatButton, stenaCalendar } from \"@stenajs-webui/elements\";\n\nexport interface DateInputProps<T = {}> 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, portal is not used.\n */\n portalTarget?: HTMLElement | null;\n /**\n * Z-index of the calendar overlay.\n * @default 100\n */\n zIndex?: number;\n /**\n * Width of the input element.\n * * @default 125px\n */\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 zIndex = 100,\n calendarTheme = defaultCalendarTheme,\n calendarProps,\n openOnMount,\n onClose,\n onChange,\n portalTarget,\n variant,\n width,\n minDate,\n maxDate = defaultMaxDate,\n disabled,\n}) => {\n const { hideCalendar, showingCalendar, onSelectDate, showCalendar } =\n useDateInput(onChange, onClose, openOnMount);\n\n const { tippyRef, onChangePanel } = useCalendarPopoverUpdater();\n\n return (\n <Box width={width}>\n <Popover\n arrow={false}\n lazy\n visible={showingCalendar}\n onClickOutside={hideCalendar}\n placement={defaultPopoverPlacement}\n zIndex={zIndex}\n appendTo={portalTarget ?? \"parent\"}\n tippyRef={tippyRef}\n disabled={disabled}\n content={\n <SingleDateCalendar\n {...calendarProps}\n onChange={onSelectDate}\n value={value}\n theme={calendarTheme}\n onChangePanel={onChangePanel}\n minDate={minDate}\n maxDate={maxDate}\n />\n }\n >\n <TextInput\n type={\"date\"}\n contentRight={\n <Row alignItems={\"center\"}>\n <FlatButton\n size={\"small\"}\n disabled={disabled}\n leftIcon={stenaCalendar}\n onClick={showCalendar}\n />\n </Row>\n }\n onFocus={showCalendar}\n onClickRight={showCalendar}\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 </Popover>\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 && 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 && 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 { Icon, stenaCalendar } from \"@stenajs-webui/elements\";\nimport { faLongArrowAltRight } from \"@fortawesome/free-solid-svg-icons/faLongArrowAltRight\";\nimport { CalendarWithMonthSwitcher } from \"../../../features/month-switcher/CalendarWithMonthSwitcher\";\nimport { CalendarPanelType } from \"../../../features/calendar-with-month-year-pickers/CalendarPanelType\";\nimport { Popover } 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 * Portal target, HTML element. If not set, portal is not used.\n */\n portalTarget?: HTMLElement | null;\n\n /**\n * Z-index of the calendar overlay.\n * @default 100\n */\n zIndex?: number;\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/**\n * @deprecated Please use DateRangeDualTextInput instead.\n */\nexport function DateRangeInput<T>({\n displayFormat = DateFormats.fullDate,\n placeholderStartDate = \"Start date\",\n placeholderEndDate = \"End date\",\n portalTarget,\n value,\n onValueChange,\n zIndex = 100,\n width,\n calendarTheme = defaultCalendarTheme,\n calendarProps,\n minDate,\n maxDate = defaultMaxDate,\n disabled,\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 <Popover\n arrow={false}\n lazy\n disabled={disabled}\n visible={showingCalendar}\n zIndex={zIndex}\n placement={defaultPopoverPlacement}\n appendTo={portalTarget ?? \"parent\"}\n onClickOutside={hideCalendar}\n content={\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 }\n >\n <Row alignItems={\"center\"}>\n <TextInput\n iconLeft={stenaCalendar}\n onFocus={showCalendarStartDate}\n value={value?.startDate ? format(value.startDate, displayFormat) : \"\"}\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={faLongArrowAltRight}\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 </Popover>\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 { Popover } from \"@stenajs-webui/tooltip\";\nimport { format, isValid, parse } from \"date-fns\";\nimport * as React from \"react\";\nimport { useCallback, useState } from \"react\";\nimport { defaultPopoverPlacement } from \"../../../config/DefaultPopoverPlacement\";\nimport { useCalendarPopoverUpdater } from \"../../../features/internal-panel-state/UseCalendarPopoverUpdater\";\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 /** Portal target, HTML element. If not set, portal is not used. */\n portalTarget?: HTMLElement | null;\n /** Z-index of the calendar overlay, @default 100 */\n zIndex?: number;\n /** The date text input theme to use. */\n calendarTheme?: CalendarTheme;\n}\n\nexport const DateTextInput: React.FC<DateTextInputProps<{}>> = ({\n calendarProps,\n closeOnCalendarSelectDate = true,\n dateFormat = DateFormats.fullDate,\n disableCalender = false,\n onValueChange,\n placeholder = \"yyyy-mm-dd\",\n portalTarget,\n value,\n width = \"130px\",\n zIndex = 100,\n calendarTheme = defaultCalendarTheme,\n hideCalenderIcon = false,\n minDate,\n maxDate = defaultMaxDate,\n variant,\n ...props\n}) => {\n const [open, setOpen] = useState(false);\n const { tippyRef, onChangePanel } = useCalendarPopoverUpdater();\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 [onValueChangeHandler, dateFormat, closeOnCalendarSelectDate, setOpen, open]\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 <Popover\n arrow={false}\n lazy\n visible={open}\n zIndex={zIndex}\n appendTo={portalTarget ?? \"parent\"}\n placement={defaultPopoverPlacement}\n onClickOutside={hideCalendar}\n tippyRef={tippyRef}\n content={\n <SingleDateCalendar\n {...calendarProps}\n onChange={onCalendarSelectDate}\n onChangePanel={onChangePanel}\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 }\n >\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}\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 />\n </Popover>\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 case 3:\n minutes = parseInt(time.substr(1, 2), 10);\n if (minutes >= 0 && minutes <= 59) {\n return {\n time: `0${time.substr(0, 1)}:${time.substr(1, 2)}`,\n success: true,\n };\n }\n return { time, success: false };\n case 4:\n hours = parseInt(time.substr(0, 2), 10);\n minutes = parseInt(time.substr(2, 2), 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.substr(0, 2)}:${time.substr(2, 2)}`,\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\";\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 (e) {\n return false;\n }\n};\n\nexport const getHoursAndMinutesFromTimeString = (\n value: string | undefined\n): {\n hour: number | undefined;\n minute: number | undefined;\n} => {\n if (value && isValidTimeString(value)) {\n const p = value.split(\":\");\n return {\n hour: parseIntElseUndefined(p[0]),\n minute: parseIntElseUndefined(p[1]),\n };\n }\n return {\n hour: undefined,\n minute: undefined,\n };\n};\n\nexport const transformTimeInDateToTimeString = (date: Date): string =>\n `${formatHours(String(date.getHours()))}:${formatMinutes(\n String(date.getMinutes())\n )}`;\n","import { Row } from \"@stenajs-webui/core\";\nimport { FlatButton, PrimaryButton } from \"@stenajs-webui/elements\";\nimport * as React from \"react\";\nimport { MutableRefObject, RefObject, useEffect, useRef } from \"react\";\n\nexport interface TimePickerCellProps {\n item: number;\n selected?: boolean;\n onClick: (label: number) => void;\n columnRef: RefObject<HTMLDivElement>;\n canScrollRef: MutableRefObject<boolean>;\n}\n\nexport const TimePickerCell: React.FC<TimePickerCellProps> = ({\n onClick,\n item,\n selected,\n columnRef,\n canScrollRef,\n}) => {\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(\n function scrollToSelectedItem() {\n if (\n selected &&\n columnRef.current &&\n ref.current &&\n canScrollRef.current\n ) {\n const targetScroll = ref.current.scrollHeight * Math.max(item - 2, 0);\n columnRef.current.scrollTo(0, targetScroll);\n canScrollRef.current = false;\n }\n },\n [columnRef, item, selected, canScrollRef]\n );\n\n return (\n <Row\n width={\"64px\"}\n justifyContent={\"center\"}\n spacing={0.5}\n indent={0.5}\n ref={ref}\n >\n {selected ? (\n <PrimaryButton\n label={String(item)}\n onClick={() => onClick && onClick(item)}\n />\n ) : (\n <FlatButton\n label={String(item)}\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\";\nimport * as React from \"react\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport {\n formatHours,\n formatMinutes,\n} from \"../../util/time/TimeStringFormatValidator\";\nimport { getHoursAndMinutesFromTimeString } from \"../../util/time/TimeTransformer\";\nimport styles from \"./TimePicker.module.css\";\nimport { TimePickerColumn } from \"./TimePickerColumn\";\n\nexport interface TimePickerProps extends ValueAndOnValueChangeProps<string> {}\n\nconst hours = range(0, 24);\nconst minutes = range(0, 60);\n\nexport const TimePicker: React.FC<TimePickerProps> = ({\n value,\n onValueChange,\n}) => {\n const canScrollRef = useRef(true);\n const [hour, setHour] = useState<number | undefined>(undefined);\n const [minute, setMinute] = useState<number | undefined>(undefined);\n\n useEffect(() => {\n if (value) {\n const { minute, hour } = getHoursAndMinutesFromTimeString(value);\n setHour(hour);\n setMinute(minute);\n }\n }, [value]);\n\n const onClickHour = useCallback(\n (h: number) => {\n setHour(h);\n onValueChange?.(\n `${formatHours(String(h ?? 0))}:${formatMinutes(String(minute ?? 0))}`\n );\n },\n [minute, onValueChange]\n );\n\n const onClickMinutes = useCallback(\n (m: number) => {\n setMinute(m);\n onValueChange?.(\n `${formatHours(String(hour ?? 0))}:${formatMinutes(String(m ?? 0))}`\n );\n },\n [hour, onValueChange]\n );\n\n return (\n <Row className={styles.timePicker}>\n <TimePickerColumn\n items={hours}\n onClick={onClickHour}\n selectedItem={hour}\n canScrollRef={canScrollRef}\n />\n <Indent />\n <TimePickerColumn\n items={minutes}\n onClick={onClickMinutes}\n selectedItem={minute}\n canScrollRef={canScrollRef}\n />\n </Row>\n );\n};\n","import { RefObject, useEffect } from \"react\";\n\nexport const useDateRangeEffects = (\n date: Date | undefined | null,\n setDateInFocus: (date: Date) => void,\n dateInputRef: RefObject<HTMLInputElement>\n) => {\n useEffect(\n function moveFocusedDateWhenDateChanges() {\n if (date) {\n setDateInFocus(date);\n }\n },\n [date, setDateInFocus]\n );\n\n useEffect(\n function updateDateFieldWhenValueChanges() {\n if (dateInputRef.current) {\n if (date) {\n dateInputRef.current.valueAsDate = new Date(\n Date.UTC(date.getFullYear(), date.getMonth(), date.getDate())\n );\n } else {\n dateInputRef.current.valueAsDate = null;\n }\n }\n },\n [date, dateInputRef]\n );\n};\n","import { ChangeEvent, RefObject, useCallback } from \"react\";\nimport { getHoursAndMinutesFromTimeString } from \"../../../../util/time/TimeTransformer\";\nimport { DateTimeInputProps } from \"../DateTimeInput\";\nimport { UseInputStatesResult } from \"./UseInputStates\";\n\nexport const useDateRangeHandlers = (\n date: Date | undefined | null,\n onValueChange: DateTimeInputProps[\"onValueChange\"],\n {\n setDateInFocus,\n showCalendarInternal,\n hideCalendarInternal,\n setFirstFocusedInput,\n setCurrentPanel,\n localTime,\n setLocalTime,\n localDate,\n setLocalDate,\n }: UseInputStatesResult,\n dateInputRef: RefObject<HTMLInputElement>\n) => {\n const onChangeDate = useCallback(\n (incomingDate: Date | null) => {\n if (!incomingDate) {\n return;\n }\n const newDate = new Date(incomingDate);\n\n if (date) {\n // Full date is available\n\n newDate.setHours(date.getHours());\n newDate.setMinutes(date.getMinutes());\n\n onValueChange?.(newDate);\n setLocalDate(undefined);\n } else if (localTime) {\n // Only time has been selected\n const { minute, hour } = getHoursAndMinutesFromTimeString(localTime);\n\n newDate.setHours(hour ?? 0);\n newDate.setMinutes(minute ?? 0);\n\n onValueChange?.(newDate);\n setLocalDate(undefined);\n } else {\n // Nothing has been selected\n setLocalDate(newDate);\n }\n setDateInFocus(newDate);\n if (dateInputRef.current) {\n dateInputRef.current.valueAsDate = new Date(\n Date.UTC(newDate.getFullYear(), newDate.getMonth(), newDate.getDate())\n );\n }\n },\n [date, dateInputRef, localTime, onValueChange, setDateInFocus, setLocalDate]\n );\n\n const onChangeTime = useCallback(\n (time: string) => {\n if (!time) {\n return;\n }\n\n if (date) {\n // Full date is available\n const newTime = getHoursAndMinutesFromTimeString(time);\n const newDate = new Date(date);\n\n newDate.setHours(newTime.hour || 0);\n newDate.setMinutes(newTime.minute || 0);\n\n onValueChange?.(newDate);\n setLocalTime(undefined);\n } else if (localDate) {\n // Only date has already been selected\n const newTime = getHoursAndMinutesFromTimeString(time);\n const newDate = new Date(localDate);\n\n newDate.setHours(newTime.hour || 0);\n newDate.setMinutes(newTime.minute || 0);\n\n onValueChange?.(newDate);\n setLocalTime(undefined);\n } else {\n // Nothing has been selected\n setLocalTime(time);\n }\n },\n [onValueChange, date, localDate, setLocalTime]\n );\n\n const inputLeftChangeHandler = useCallback(\n (ev: ChangeEvent<HTMLInputElement>) => {\n if (ev.target.value[0] !== \"0\") {\n onChangeDate(ev.target.valueAsDate);\n }\n },\n [onChangeDate]\n );\n\n const inputRightChangeHandler = useCallback(\n (ev: ChangeEvent<HTMLInputElement>) => onChangeTime(ev.target.value),\n [onChangeTime]\n );\n\n const showCalendar = useCallback(() => {\n if (date) {\n setDateInFocus(date);\n } else {\n setDateInFocus(new Date());\n }\n setCurrentPanel(\"calendar\");\n showCalendarInternal();\n }, [date, setCurrentPanel, showCalendarInternal, setDateInFocus]);\n\n const hideCalendar = useCallback(() => {\n setFirstFocusedInput(undefined);\n hideCalendarInternal();\n }, [setFirstFocusedInput, hideCalendarInternal]);\n\n return {\n inputLeftChangeHandler,\n inputRightChangeHandler,\n hideCalendar,\n showCalendar,\n onChangeTime,\n onChangeDate,\n };\n};\n","import { useBoolean } from \"@stenajs-webui/core\";\nimport { useState } from \"react\";\nimport { DateRangeFocusedInput } from \"../../../calendar-types/date-range-calendar/DateRangeCalendar\";\nimport { CalendarPanelType } from \"../../../../features/calendar-with-month-year-pickers/CalendarPanelType\";\n\nexport type UseInputStatesResult = ReturnType<typeof useInputStates>;\n\nexport const useInputStates = (date: Date | undefined | null) => {\n const [localDate, setLocalDate] = useState<Date | undefined>(undefined);\n const [localTime, setLocalTime] = useState<string | undefined>(undefined);\n\n const [isCalendarVisible, showCalendarInternal, hideCalendarInternal] =\n useBoolean(false);\n\n const [isTimePickerVisible, showTimePicker, hideTimePicker] =\n useBoolean(false);\n\n const [firstFocusedInput, setFirstFocusedInput] = useState<\n DateRangeFocusedInput | undefined\n >(undefined);\n\n const [dateInFocus, setDateInFocus] = useState<Date>(\n () => date ?? new Date()\n );\n\n const [currentPanel, setCurrentPanel] =\n useState<CalendarPanelType>(\"calendar\");\n\n return {\n isCalendarVisible,\n showCalendarInternal,\n hideCalendarInternal,\n firstFocusedInput,\n setFirstFocusedInput,\n dateInFocus,\n setDateInFocus,\n currentPanel,\n setCurrentPanel,\n isTimePickerVisible,\n showTimePicker,\n hideTimePicker,\n localDate,\n setLocalDate,\n localTime,\n setLocalTime,\n };\n};\n","import * as React from \"react\";\nimport { RefObject, useCallback } from \"react\";\nimport { DayData } from \"../../../../util/calendar/CalendarDataFactory\";\nimport { UseInputStatesResult } from \"./UseInputStates\";\n\nexport const useUserInputHandlers = (\n onChangeDate: (incomingDate: Date | null) => void,\n dateInputRef: RefObject<HTMLInputElement>,\n showCalendar: () => void,\n hideCalendar: () => void,\n {\n isCalendarVisible,\n setCurrentPanel,\n showTimePicker,\n hideTimePicker,\n }: UseInputStatesResult\n) => {\n const onFocusLeft = useCallback(() => {\n if (!isCalendarVisible) {\n showCalendar();\n }\n setCurrentPanel(\"calendar\");\n hideTimePicker();\n }, [hideTimePicker, isCalendarVisible, setCurrentPanel, showCalendar]);\n\n const onFocusRight = useCallback(() => {\n hideCalendar();\n showTimePicker();\n }, [hideCalendar, showTimePicker]);\n\n const onClickDay = useCallback(\n (day: DayData) => {\n onChangeDate(day.date);\n hideCalendar();\n showTimePicker();\n },\n [onChangeDate, hideCalendar, showTimePicker]\n );\n\n const onClickArrowButton = useCallback(() => {\n setCurrentPanel(\"presets\");\n showCalendar();\n }, [setCurrentPanel, showCalendar]);\n\n const onClickCalendarButton = useCallback(() => {\n if (isCalendarVisible) {\n hideCalendar();\n } else {\n dateInputRef.current?.focus();\n setCurrentPanel(\"calendar\");\n showCalendar();\n }\n }, [\n isCalendarVisible,\n hideCalendar,\n dateInputRef,\n setCurrentPanel,\n showCalendar,\n ]);\n\n const onKeyDownHandler = useCallback(\n (ev: React.KeyboardEvent<HTMLDivElement>) => {\n if (ev.key === \"Escape\") {\n hideCalendar();\n }\n },\n [hideCalendar]\n );\n\n return {\n onFocusLeft,\n onFocusRight,\n onClickDay,\n onClickArrowButton,\n onClickCalendarButton,\n onKeyDownHandler,\n };\n};\n","import { Box, Column, Row, Space, useDelayedFalse } from \"@stenajs-webui/core\";\nimport { PrimaryButton } from \"@stenajs-webui/elements\";\nimport {\n TextInputProps,\n ValueAndOnValueChangeProps,\n} from \"@stenajs-webui/forms\";\nimport { Popover } 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\";\nimport { stenaClock } from \"@stenajs-webui/elements\";\n\nexport interface DateTimeInputProps\n extends ValueAndOnValueChangeProps<Date | null>,\n OptionalMinMaxDatesAsString,\n Pick<DualTextInputProps, \"widthLeft\" | \"widthRight\" | \"variant\"> {\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}) => {\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 <Popover\n arrow={false}\n lazy\n disabled={disabled}\n placement={defaultPopoverPlacement}\n visible={isCalendarVisible || isTimePickerVisible}\n onClickOutside={hideAll}\n content={\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 }\n >\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 </Popover>\n </Box>\n );\n};\n","import { RefObject, useEffect } from \"react\";\n\nexport const useDateRangeEffects = (\n startDate: Date | undefined,\n endDate: Date | undefined,\n setDateInFocus: (date: Date) => void,\n startDateInputRef: RefObject<HTMLInputElement>,\n endDateInputRef: RefObject<HTMLInputElement>\n) => {\n useEffect(\n function moveFocusedDateWhenStartDateChanges() {\n if (startDate) {\n setDateInFocus(startDate);\n }\n },\n [startDate, setDateInFocus]\n );\n\n useEffect(\n function moveFocusedDateWhenEndDateChanges() {\n if (endDate) {\n setDateInFocus(endDate);\n }\n },\n [endDate, setDateInFocus]\n );\n\n useEffect(\n function updateStartDateFieldWhenValueChanges() {\n if (startDateInputRef.current) {\n if (startDate) {\n startDateInputRef.current.valueAsDate = new Date(\n Date.UTC(\n startDate.getFullYear(),\n startDate.getMonth(),\n startDate.getDate()\n )\n );\n } else {\n startDateInputRef.current.valueAsDate = null;\n }\n }\n },\n [startDate, startDateInputRef]\n );\n\n useEffect(\n function updateEndDateFieldWhenValueChanges() {\n if (endDateInputRef.current) {\n if (endDate) {\n endDateInputRef.current.valueAsDate = new Date(\n Date.UTC(\n endDate.getFullYear(),\n endDate.getMonth(),\n endDate.getDate()\n )\n );\n } else {\n endDateInputRef.current.valueAsDate = null;\n }\n }\n },\n [endDate, endDateInputRef]\n );\n};\n","import { ChangeEvent, useCallback } from \"react\";\nimport { DateRangeDualTextInputProps } from \"../DateRangeDualTextInput\";\nimport { UseInputStatesResult } from \"./UseInputStates\";\n\nexport const useDateRangeHandlers = (\n startDate: Date | undefined,\n endDate: Date | undefined,\n onValueChange: DateRangeDualTextInputProps[\"onValueChange\"],\n {\n setDateInFocus,\n showCalendarInternal,\n hideCalendarInternal,\n setFirstFocusedInput,\n setCurrentPanel,\n }: UseInputStatesResult\n) => {\n const inputLeftChangeHandler = useCallback(\n (ev: ChangeEvent<HTMLInputElement>) => {\n if (ev.target.value[0] !== \"0\") {\n onValueChange?.({\n startDate: ev.target.valueAsDate ?? undefined,\n endDate,\n });\n }\n },\n [onValueChange, endDate]\n );\n\n const inputRightChangeHandler = useCallback(\n (ev: ChangeEvent<HTMLInputElement>) => {\n if (ev.target.value[0] !== \"0\") {\n onValueChange?.({\n startDate,\n endDate: ev.target.valueAsDate ?? undefined,\n });\n }\n },\n [onValueChange, startDate]\n );\n\n const showCalendar = useCallback(() => {\n if (startDate) {\n setDateInFocus(startDate);\n } else if (endDate) {\n setDateInFocus(endDate);\n } else {\n setDateInFocus(new Date());\n }\n setCurrentPanel(\"calendar\");\n showCalendarInternal();\n }, [\n startDate,\n endDate,\n setCurrentPanel,\n showCalendarInternal,\n setDateInFocus,\n ]);\n\n const hideCalendar = useCallback(() => {\n setFirstFocusedInput(undefined);\n hideCalendarInternal();\n }, [setFirstFocusedInput, hideCalendarInternal]);\n\n return {\n inputLeftChangeHandler,\n inputRightChangeHandler,\n hideCalendar,\n setDateInFocus,\n setCurrentPanel,\n showCalendar,\n };\n};\n","import { useBoolean } from \"@stenajs-webui/core\";\nimport { useState } from \"react\";\nimport { DateRangeFocusedInput } from \"../../../calendar-types/date-range-calendar/DateRangeCalendar\";\nimport { CalendarPanelType } from \"../../../../features/calendar-with-month-year-pickers/CalendarPanelType\";\n\nexport type UseInputStatesResult = ReturnType<typeof useInputStates>;\n\nexport const useInputStates = (\n startDate: Date | undefined,\n endDate: Date | undefined\n) => {\n const [isCalendarVisible, showCalendarInternal, hideCalendarInternal] =\n useBoolean(false);\n\n const [firstFocusedInput, setFirstFocusedInput] = useState<\n DateRangeFocusedInput | undefined\n >(undefined);\n\n const [focusedInput, setFocusedInput] =\n useState<DateRangeFocusedInput>(\"startDate\");\n\n const [dateInFocus, setDateInFocus] = useState<Date>(() => {\n const fromValue =\n focusedInput === \"startDate\"\n ? startDate\n : focusedInput === \"endDate\"\n ? endDate\n : undefined;\n\n return fromValue ?? new Date();\n });\n\n const [currentPanel, setCurrentPanel] =\n useState<CalendarPanelType>(\"calendar\");\n\n return {\n isCalendarVisible,\n showCalendarInternal,\n hideCalendarInternal,\n firstFocusedInput,\n setFirstFocusedInput,\n focusedInput,\n setFocusedInput,\n dateInFocus,\n setDateInFocus,\n currentPanel,\n setCurrentPanel,\n };\n};\n","import { isAfter } from \"date-fns\";\nimport * as React from \"react\";\nimport { RefObject, useCallback } from \"react\";\nimport { DayData } from \"../../../../util/calendar/CalendarDataFactory\";\nimport { DateRangeDualTextInputProps } from \"../DateRangeDualTextInput\";\nimport { UseInputStatesResult } from \"./UseInputStates\";\n\nexport const useUserInputHandlers = (\n startDate: Date | undefined,\n endDate: Date | undefined,\n onValueChange: DateRangeDualTextInputProps[\"onValueChange\"],\n startDateInputRef: RefObject<HTMLInputElement>,\n endDateInputRef: RefObject<HTMLInputElement>,\n showCalendar: () => void,\n hideCalendar: () => void,\n {\n firstFocusedInput,\n setFirstFocusedInput,\n isCalendarVisible,\n setFocusedInput,\n focusedInput,\n setCurrentPanel,\n }: UseInputStatesResult\n) => {\n const onFocusLeft = useCallback(() => {\n if (firstFocusedInput == null) {\n setFirstFocusedInput(\"startDate\");\n }\n setFocusedInput(\"startDate\");\n if (!isCalendarVisible) {\n showCalendar();\n }\n }, [\n isCalendarVisible,\n setFocusedInput,\n showCalendar,\n setFirstFocusedInput,\n firstFocusedInput,\n ]);\n\n const onFocusRight = useCallback(() => {\n if (firstFocusedInput == null) {\n setFirstFocusedInput(\"endDate\");\n }\n setFocusedInput(\"endDate\");\n if (!isCalendarVisible) {\n showCalendar();\n }\n }, [\n isCalendarVisible,\n setFocusedInput,\n showCalendar,\n setFirstFocusedInput,\n firstFocusedInput,\n ]);\n\n const onClickDay = useCallback(\n (day: DayData) => {\n if (focusedInput === \"startDate\") {\n if (endDate != null && isAfter(day.date, endDate)) {\n onValueChange?.({\n startDate: day.date,\n endDate: undefined,\n });\n setFocusedInput(\"endDate\");\n endDateInputRef.current?.focus();\n } else {\n onValueChange?.({\n startDate: day.date,\n endDate,\n });\n if (firstFocusedInput === \"startDate\") {\n setFocusedInput(\"endDate\");\n endDateInputRef.current?.focus();\n } else {\n setTimeout(hideCalendar, 50);\n }\n }\n } else if (focusedInput === \"endDate\") {\n if (!startDate) {\n onValueChange?.({\n startDate,\n endDate: day.date,\n });\n setFocusedInput(\"startDate\");\n startDateInputRef.current?.focus();\n } else if (isAfter(startDate, day.date)) {\n onValueChange?.({\n startDate: day.date,\n endDate: undefined,\n });\n setFocusedInput(\"endDate\");\n endDateInputRef.current?.focus();\n } else {\n onValueChange?.({\n startDate,\n endDate: day.date,\n });\n setTimeout(hideCalendar, 50);\n }\n }\n },\n [\n focusedInput,\n onValueChange,\n endDate,\n firstFocusedInput,\n setFocusedInput,\n endDateInputRef,\n hideCalendar,\n startDate,\n startDateInputRef,\n ]\n );\n\n const onClickArrowButton = useCallback(() => {\n setCurrentPanel(\"presets\");\n showCalendar();\n }, [setCurrentPanel, showCalendar]);\n\n const onClickCalendarButton = useCallback(() => {\n if (isCalendarVisible) {\n hideCalendar();\n } else {\n setFocusedInput(\"startDate\");\n setFirstFocusedInput(\"startDate\");\n startDateInputRef.current?.focus();\n setCurrentPanel(\"calendar\");\n showCalendar();\n }\n }, [\n isCalendarVisible,\n hideCalendar,\n setFocusedInput,\n setFirstFocusedInput,\n startDateInputRef,\n setCurrentPanel,\n showCalendar,\n ]);\n\n const onKeyDownHandler = useCallback(\n (ev: React.KeyboardEvent<HTMLDivElement>) => {\n if (ev.key === \"Escape\") {\n hideCalendar();\n }\n },\n [hideCalendar]\n );\n\n return {\n onFocusLeft,\n onFocusRight,\n onClickDay,\n onClickArrowButton,\n onClickCalendarButton,\n onKeyDownHandler,\n };\n};\n","import { Box, useDelayedFalse } from \"@stenajs-webui/core\";\nimport { stenaArrowRight } from \"@stenajs-webui/elements\";\nimport {\n TextInputProps,\n ValueAndOnValueChangeProps,\n} from \"@stenajs-webui/forms\";\nimport { Popover } 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 onEsc?: () => void;\n onEnter?: () => void;\n onBlur?: () => void;\n autoFocus?: boolean;\n calendarProps?: DateRangeInputCalendarProps<TData>;\n disabled?: boolean;\n}\n\nexport function DateRangeDualTextInput<TData>({\n value,\n onValueChange,\n autoFocus,\n onBlur,\n onEnter,\n onEsc,\n minDate,\n maxDate = defaultMaxDate,\n calendarProps,\n widthLeft = 128,\n widthRight = 128,\n variant,\n disabled,\n}: 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 const delayedIsCalendarVisible = useDelayedFalse(isCalendarVisible, 300);\n\n return (\n <Box onKeyDown={onKeyDownHandler}>\n <Popover\n arrow={false}\n lazy\n disabled={disabled}\n placement={defaultPopoverPlacement}\n onClickOutside={hideCalendar}\n visible={isCalendarVisible}\n content={\n delayedIsCalendarVisible && (\n <CalendarWithMonthSwitcher\n onClickDay={onClickDay}\n dateInFocus={dateInFocus}\n setDateInFocus={setDateInFocus}\n currentPanel={currentPanel}\n setCurrentPanel={setCurrentPanel}\n minDate={minDate}\n maxDate={maxDate}\n {...calendarProps}\n statePerMonth={statePerMonth}\n />\n )\n }\n >\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 </Popover>\n </Box>\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","_a","addWeekStateHighlights","week","day","weekState","newHighlights","newWeekState","addWeekRangeHighlights","startDate","endDate","last","useHighlightToday","enabled","useMemo","Month","Month2","WeekDay","WeekDay2","getMonthsInYear","year","startMonth","numMonths","locale","months","getMonthInYear","yearToUse","monthToUse","firstDayOfMonth","startCase","getWeeksForMonth","forceSixWeeks","firstDayOfFirstWeek","startOfWeek","weeks","i","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","_","style","backgroundColor","monthInYear","borderTopLeftRadius","borderBottomLeftRadius","borderTopRightRadius","borderBottomRightRadius","boxSizing","defaultTextPropsProvider","selectedColor","disabledColor","inOtherMonthColor","rangeTextColor","isOtherMonth","color","undefined","defaultCalendarTheme","width","height","WeekNumber","textColor","clickableTextColor","show","CalendarDay","tdStyle","textProps","CalendarMonth","headerTextColor","extranetCalendarTheme","isDateInMinMaxRange","isBefore","DisabledDayWrapper","dayComponent","DayComponent","minDate","maxDate","props","activeDayState","WeekNumberCell","onClickWeek","theme","background","prefix","content","Box","_jsx","Text","Clickable","ev","CalendarWeek","statePerWeekDay","userDataPerWeekDay","onClickDay","renderWeekNumber","extraDayContent","days","map","dayOfMonth","dateString","WeekDayCell","onClickWeekDay","name","userData","ExtraDayContent","WrapperTd","styled","td","InnerWrapperDiv","div","innerWrapperStyle","CellWrapperDiv","cellWrapperStyle","position","_Fragment","isClickable","statePerWeek","userDataPerWeek","onClickMonth","onClickYear","renderWeekDay","headerLeftContent","headerRightContent","showWeekNumber","_jsxs","Row","FlatButton","Space","String","CalendarPanel","monthRows","userDataPerMonth","minDateObj","parse","Date","maxDateObj","styles","calendar","monthRow","rowIndex","Spacing","index","React","Calendar","initialDate","getInitialDate","getMonthRows","enGB","monthsPerRow","highlightToday","now","chunk","useSelectedMonthStepperLogic","setDateInFocus","nextMonth","useCallback","addMonths","nextYear","addYears","prevMonth","subMonths","prevYear","subYears","WithMonthSwitcherBelow","children","Indent","faAngleDoubleLeft","stenaAngleLeft","stenaAngleRight","faAngleDoubleRight","MonthPickerCell","value","onValueChange","label","PrimaryButton","monthMatrix","JANUARY","FEBRUARY","MARCH","APRIL","MAY","JUNE","JULY","AUGUST","SEPTEMBER","OCTOBER","NOVEMBER","DECEMBER","MonthPicker","Column","createStandardDateRangePresets","PresetPicker","onClickPreset","pageIndex","setPageIndex","useState","pages","currentPage","length","presets","preset","YearPickerCell","YearPicker","initialLastYear","lastYear","setLastYear","getFullYear","yearRows","startYear","range","useEffect","calculateLastYearInFocus","prev","faCaretLeft","yearRow","faCaretRight","yearDiff","remaining","yearsToAdd","yearsToSubtract","CalendarWithMonthYearPickers","currentPanel","setCurrentPanel","onChangeSelectedMonth","selectedMonth","newDate","setMonth","onChangeSelectedYear","selectedYear","setFullYear","noop","CalendarWithMonthSwitcher","monthSwitcherPlacement","onSelectPreset","hideYearPagination","calendarProps","placement","fallbackIfNoPlacement","dateRangeToStrings","dateRange","stringsToDateRange","isDateRangeInvalid","toggleDatesIfEndIsEarlierThanStart","toggleDateStringsIfEndIsEarlierThanStart","useDateRangeOnClickDayHandler","focusedInput","setFocusedInput","useInternalPanelState","onChangePanel","_setCurrentPanel","useDateRangeSelection","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","removeDateIfExist","list","item","listContainsDate","useDateRangeExclusionSelection","setDateRange","onChangeHandler","dates","onClickDayRange","addHighlighting","dateList","DateRangeExclusionCalendar","defaultPopoverPlacement","useCalendarPopoverUpdater","tippyRef","tippyInstanceRef","useTippyInstance","_b","useDateInput","onClose","openOnMount","showingCalendar","setShowingCalendar","showCalendar","hideCalendar","onSelectDate","setTimeout","defaultMaxDate","DateInput","displayFormat","fullDate","placeholder","zIndex","calendarTheme","portalTarget","variant","disabled","Popover","TextInput","stenaCalendar","useDateRangeInput","startDateInputRef","useRef","endDateInputRef","showCalendarStartDate","showCalendarEndDate","current","focus","startDateIsAfterEnd","DateRangeInput","placeholderStartDate","placeholderEndDate","Icon","faLongArrowAltRight","cssColor","DateTextInput","closeOnCalendarSelectDate","dateFormat","disableCalender","hideCalenderIcon","open","setOpen","toggleCalendar","onValueChangeHandler","onCalendarSelectDate","inValidInput","test","dateIsValid","isValid","invalid","formatHours","hours","h","formatMinutes","minutes","m","formatTimeString","time","validUserInput","arr","timeNumber","input","TimeTextInput","showPlaceholder","useIcon","valid","setValid","timeFormat","onBlur","formattedResult","success","target","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","stenaAngleDown","transformTimeStringToNumber","isValidTimeString","getHoursAndMinutesFromTimeString","p","parseIntElseUndefined","transformTimeInDateToTimeString","TimePickerCell","onClick","selected","columnRef","canScrollRef","ref","targetScroll","scrollHeight","Math","scrollTo","TimePickerColumn","items","selectedItem","timePickerColumn","TimePicker","hour","setHour","minute","setMinute","onClickHour","onClickMinutes","timePicker","useDateRangeEffects","dateInputRef","useDateRangeHandlers","showCalendarInternal","hideCalendarInternal","setFirstFocusedInput","localTime","setLocalTime","localDate","setLocalDate","onChangeDate","incomingDate","onChangeTime","newTime","inputLeftChangeHandler","inputRightChangeHandler","useInputStates","isCalendarVisible","useBoolean","isTimePickerVisible","showTimePicker","hideTimePicker","firstFocusedInput","useUserInputHandlers","onClickArrowButton","onClickCalendarButton","onKeyDownHandler","DateTimeInput","autoFocus","timeInputRef","states","dateToHighlight","hideAll","timeValue","delayedIsCalendarVisible","useDelayedFalse","delayedIsTimePickerVisible","fromValue","_d","_c","DateRangeDualTextInput","stenaArrowRight"],"mappings":"unCAAaA,EAAc,CACzB,aAAc,UACd,SAAU,aACV,cAAe,OACf,gBAAiB,mBACjB,sBAAuB,mBACvB,YAAa,OACb,iBAAkB,MAClB,aAAc,QACd,aAAc,QAChB,ECeaC,EAA4B,CACvCC,EAA4C,GAC5CC,EACAC,IAC2C,CAC3C,GAAID,GAASC,GAAOC,EAAQ,QAAAD,EAAKD,CAAK,EACpC,OAAOG,EAAkB,kBAAA,CAAE,MAAAH,EAAO,IAAAC,CAAA,CAAK,EAAE,OACvC,CAACG,EAAoCC,IAAe,CAC5C,MAAAC,EAAiBC,EAAAA,UAAUF,EAAML,CAAK,EACtCQ,EAAgBD,EAAAA,UAAUF,EAAMJ,CAAG,EAMlC,OAAAQ,EAAsBL,EAAQC,EALlBC,EACf,CAAC,WAAY,gBAAiB,OAAO,EACrCE,EACA,CAAC,WAAY,cAAe,OAAO,EACnC,CAAC,OAAO,CACyC,CACvD,EACAT,CAAA,EAIJ,IAAIW,EAAQX,EAEZ,OAAIC,IACFU,EAAQD,EAAsBC,EAAOV,EAAO,CAAC,WAAY,gBAAgB,CAAC,GAGxEC,IACFS,EAAQD,EAAsBC,EAAOT,EAAK,CAAC,WAAY,gBAAgB,CAAC,GAGnES,CACT,EAEaC,GAA8B,CACzCZ,EAA4C,CAAA,EAC5CC,EACAC,EACAW,IAEAC,GACEd,EACAC,EACAC,EACAa,EAAAA,aAAaF,CAAW,EACxBG,EAAAA,WAAWH,CAAW,CACxB,EAEWC,GAAwB,CACnCd,EAA4C,GAC5CC,EACAC,EACAe,EACAC,IAEIjB,GAASC,EACJH,EACLC,EACAmB,MAAI,CAAClB,EAAOmB,EAAAA,QAAQH,EAAY,CAAC,CAAC,CAAC,EACnCI,MAAI,CAACnB,EAAKoB,EAAAA,QAAQJ,EAAU,CAAC,CAAC,CAAC,CAAA,EAG1BnB,EAA0BC,EAAeC,EAAOC,CAAG,EAIjDqB,GAAmB,CAC9BZ,EACAL,EACAkB,IAC+B,CAC/B,MAAMC,EAAcC,EAAA,OAAOpB,EAAMR,EAAY,YAAY,EACnD6B,EAAaC,aAAWtB,CAAI,EAC5BuB,EAAaC,UAAQxB,CAAI,EACxB,MAAA,CACL,GAAGK,EACH,CAACc,GAAc,CACb,GAAId,GAASA,EAAMc,GACnB,CAACE,GAAa,CACZ,GAAIhB,GAASA,EAAMc,IAAgBd,EAAMc,GAAaE,GACtD,CAACE,GAAa,CACZ,GAAIlB,GACFA,EAAMc,IACNd,EAAMc,GAAaE,IACnBhB,EAAMc,GAAaE,GAAYE,GACjC,GAAGL,CACL,CACF,CACF,CAAA,CAEJ,EAEaO,GAA2B,CACtCpB,EACAL,EACA0B,IAC+B,CAC/B,MAAMP,EAAcC,EAAA,OAAOpB,EAAMR,EAAY,YAAY,EACnD6B,EAAaC,aAAWtB,CAAI,EAC5BuB,EAAaC,UAAQxB,CAAI,EACxB,MAAA,CACL,GAAGK,EACH,CAACc,GAAc,CACb,GAAId,GAASA,EAAMc,GACnB,CAACE,GAAa,CACZ,GAAIhB,GAASA,EAAMc,IAAgBd,EAAMc,GAAaE,GACtD,CAACE,GAAa,CACZ,GAAIlB,GACFA,EAAMc,IACNd,EAAMc,GAAaE,IACnBhB,EAAMc,GAAaE,GAAYE,GACjC,GAAGG,EACDrB,GACEA,EAAMc,IACNd,EAAMc,GAAaE,IACnBhB,EAAMc,GAAaE,GAAYE,EACnC,CACF,CACF,CACF,CAAA,CAEJ,EAEanB,EAAwB,CACnCuB,EACA3B,EACA4B,IAC+B,CACzB,MAAAC,EAAQ7B,EAAK,SAAA,EAAa,EAC1BmB,EAAc,GAAGnB,EAAK,iBAAiB6B,EAAQ,GAAK,IAAM,KAAKA,IAC/DR,EAAaC,aAAWtB,CAAI,EAC5BuB,EAAaC,UAAQxB,CAAI,EACzB8B,EACJH,GACAA,EAAcR,IACdQ,EAAcR,GAAaE,IAC3BM,EAAcR,GAAaE,GAAYE,GAElC,MAAA,CACL,GAAGI,EACH,CAACR,GAAc,CACb,GAAIQ,GAAiBA,EAAcR,GACnC,CAACE,GAAa,CACZ,GAAIM,GACFA,EAAcR,IACdQ,EAAcR,GAAaE,GAC7B,CAACE,GAAaQ,GAAiCD,EAAUF,CAAU,CACrE,CACF,CAAA,CAEJ,EAEaG,GAAmC,CAC9CD,EACAF,IACa,OACN,MAAA,CACL,GAAGE,EACH,WAAY,CAAC,IAAIE,EAAAF,GAAA,YAAAA,EAAU,aAAV,KAAAE,EAAwB,CAAC,EAAI,GAAGJ,CAAU,CAAA,CAE/D,EAEaK,GAAyB,CACpCN,EACAO,EACAN,IAC+B,CACzB,MAAA5B,EAAOkC,EAAK,KAAK,GAAG,KACpBL,EAAQ7B,EAAK,SAAA,EAAa,EAC1BmB,EAAc,GAAGnB,EAAK,iBAAiB6B,EAAQ,GAAK,IAAM,KAAKA,IAC/DR,EAAaa,EAAK,WAExB,IAAI7B,EAAQsB,EACPO,EAAA,KAAK,QAASC,GAAQ,CACzB9B,EAAQD,EAAsBC,EAAO8B,EAAI,KAAMP,CAAU,CAAA,CAC1D,EAED,MAAMQ,EACJ/B,GAASA,EAAMc,GAAed,EAAMc,GAAaE,GAAc,OAE3DgB,EACJD,GAAaA,EAAU,WACnB,CAAC,GAAGA,EAAU,WAAY,GAAGR,CAAU,EACvCA,EAEAU,EAA6B,CACjC,GAAGF,EACH,WAAYC,CAAA,EAGP,MAAA,CACL,GAAGhC,EACH,CAACc,GAAc,CACb,GAAIQ,GAAiBA,EAAcR,GACnC,CAACE,GAAaiB,CAChB,CAAA,CAEJ,EAEaC,GAAyB,CACpCZ,EACAO,IAC+B,OAC3B,GAAA,CAACA,EAAK,KAAK,OACN,MAAA,CAAE,GAAGP,GAER,MAAAa,EAAYN,EAAK,KAAK,GAAG,KACzBO,GAAUC,EAAAA,EAAA,KAAKR,EAAK,IAAI,IAAdQ,YAAAA,EAAiB,KAC1B,MAAA,CACL,GAAGjD,EAA0BkC,EAAea,EAAWC,CAAO,CAAA,CAElE,ECxOaE,GAAoB,CAC/BC,EACAlD,IAEOmD,UAAQ,IACND,EACHxC,EAAsBV,EAAe,IAAI,KAAQ,CAAC,OAAO,CAAC,EAC1DA,EACH,CAACkD,EAASlD,CAAa,CAAC,ECOjB,IAAAoD,GAAAA,IACVA,EAAAA,EAAA,QAAU,GAAV,UACAA,EAAAC,EAAA,SAAA,GAAA,WACAD,EAAAC,EAAA,MAAA,GAAA,QACAD,EAAAC,EAAA,MAAA,GAAA,QACAD,EAAAC,EAAA,IAAA,GAAA,MACAD,EAAAC,EAAA,KAAA,GAAA,OACAD,EAAAC,EAAA,KAAA,GAAA,OACAD,EAAAC,EAAA,OAAA,GAAA,SACAD,EAAAC,EAAA,UAAA,GAAA,YACAD,EAAAC,EAAA,QAAA,GAAA,UACAD,EAAAC,EAAA,SAAA,IAAA,WACAD,EAAAC,EAAA,SAAA,IAAA,WAZUD,IAAAA,GAAA,CAAA,CAAA,EAeAE,IAAAA,IACVA,EAAAA,EAAA,OAAS,GAAT,SACAA,EAAAC,EAAA,OAAA,GAAA,SACAD,EAAAC,EAAA,QAAA,GAAA,UACAD,EAAAC,EAAA,UAAA,GAAA,YACAD,EAAAC,EAAA,SAAA,GAAA,WACAD,EAAAC,EAAA,OAAA,GAAA,SACAD,EAAAC,EAAA,SAAA,GAAA,WAPUD,IAAAA,IAAA,CAAA,CAAA,EA2CL,MAAME,GAAkB,CAC7BC,EACAC,EACAC,EACAC,IACqB,CACrB,MAAMC,EAAS,CAAA,EACf,QAAS,EAAI,EAAG,EAAIF,EAAW,IAC7BE,EAAO,KAAKC,GAAeL,EAAMC,EAAa,EAAGE,CAAM,CAAC,EAEnD,OAAAC,CACT,EAEaC,GAAiB,CAC5BL,EACAtB,EACAyB,IACc,CACd,MAAMG,EAAYN,EAAO,KAAK,MAAMtB,EAAQ,EAAE,EACxC6B,EAAa7B,EAAQ,GACrB8B,EAAkB,IAAI,KAAKF,EAAWC,EAAY,CAAC,EAClD,MAAA,CACL,YAAatC,EAAA,OAAOuC,EAAiBnE,EAAY,YAAY,EAC7D,KAAMoE,EAAA,UACJxC,EAAAA,OAAOuC,EAAiBnE,EAAY,cAAe,CAAE,OAAA8D,EAAQ,CAC/D,EACA,KAAMG,EACN,YAAaC,EACb,MAAOG,GAAiBJ,EAAWC,EAAYJ,CAAM,CAAA,CAEzD,EAEaO,GAAmB,CAC9BV,EACAtB,EACAyB,EACAQ,EAAyB,KACL,CACpB,MAAMH,EAAkB,IAAI,KAAKR,EAAMtB,EAAO,CAAC,EACzCkC,EAAsBC,EAAA,YAAYL,EAAiB,CAAE,OAAAL,CAAQ,CAAA,EAE7DW,EAAQ,CAAA,EAEd,QAASC,EAAI,EAAGA,EAAI,EAAGA,IAAK,CAC1B,MAAMhC,EAAOiC,GAAeC,EAAA,SAASL,EAAqBG,CAAC,EAAGZ,CAAM,EACpE,GAAIY,EAAI,GAAKhC,EAAK,aAAeL,GAAS,CAACiC,EAClC,OAAAG,EAETA,EAAM,KAAK/B,CAAI,CACjB,CACO,OAAA+B,CACT,EAEaE,GAAiB,CAC5BE,EACAf,IACa,CACP,MAAAgB,EACJC,WAASvD,UAAQqD,EAAgB,CAAC,CAAC,IAAME,WAASF,CAAc,EAC3D,MAAA,CACL,WAAYG,EAAA,QAAQH,EAAgB,CAAE,OAAAf,EAAQ,EAC9C,WAAYiB,WAASF,CAAc,EACnC,UAAWI,UAAQJ,CAAc,EACjC,SAAUE,EAAAA,SAASvD,EAAAA,QAAQqD,EAAgB,CAAC,CAAC,EAC7C,QAASI,EAAAA,QAAQzD,EAAAA,QAAQqD,EAAgB,CAAC,CAAC,EAC3C,KAAMK,GAAsBL,EAAgBf,CAAM,EAClD,kBAAAgB,CAAA,CAEJ,EAEaK,GAAY,CAAC3E,EAAYsD,IAA4B,CAC1D,MAAAsB,EAAYC,YAAU7E,CAAI,EACzB,MAAA,CACL,KAAAA,EACA,KAAMoB,EAAAA,OAAOpB,EAAM,MAAOsD,EAAS,CAAE,OAAAA,CAAA,EAAW,MAAS,EACzD,WAAYlC,EAAO,OAAA0D,WAAS9E,EAAM,EAAE,EAAGR,EAAY,QAAQ,EAC3D,WAAYgF,EAAA,QAAQxE,EAAM,CAAE,OAAAsD,EAAQ,EACpC,KAAMmB,UAAQzE,CAAI,EAClB,MAAOuE,WAASvE,CAAI,EACpB,WAAYwB,UAAQxB,CAAI,EACxB,UAAA4E,EACA,iBAAkBA,IAAc,EAChC,gBAAiBA,IAAc,EAC/B,kBAAmB1E,EAAAA,UAAUO,EAAAA,aAAaT,CAAI,EAAGA,CAAI,EACrD,iBAAkBE,EAAAA,UAAUQ,EAAAA,WAAWV,CAAI,EAAGA,CAAI,CAAA,CAEtD,EAEa0E,GAAwB,CACnCL,EACAf,IAEOxD,oBAAkB,CACvB,MAAOuE,EACP,IAAKrD,EAAAA,QAAQqD,EAAgB,CAAC,CAAA,CAC/B,EAAE,IAAKU,GAAMJ,GAAUI,EAAGzB,CAAM,CAAC,EAGvB0B,GAA4B,CACvC7B,EACAtB,IAEIA,EAAQ,GACH,CAAE,KAAMsB,EAAO,KAAK,MAAMtB,EAAQ,EAAE,EAAG,MAAOA,EAAQ,EAAG,EAE9DA,EAAQ,EACH,CAAE,KAAMsB,EAAO,KAAK,MAAMtB,EAAQ,EAAE,EAAG,MAAO,GAAMA,EAAQ,EAAI,EAElE,CAAE,KAAAsB,EAAM,MAAAtB,2CCvLJoD,GAAkB,CAC7BnD,EACAoD,EACAC,IAEI,GAAAD,GAAqBA,EAAkB,QAAQC,CAAS,GAAK,GAI/DrD,GACAA,EAAS,YACTA,EAAS,WAAW,QAAQqD,CAAS,GAAK,GAOjCC,EAAqB,CAChCtD,EACAoD,EACAG,EACAC,EACAC,IACkB,CACd,GAAAF,EAAoB,SAAWC,EAAa,OAC9C,MAAM,IAAI,MACR,8EAAA,EAGA,GAAAD,EAAoB,SAAW,EAC1B,OAAAE,EAET,QAAS,EAAI,EAAG,EAAIF,EAAoB,OAAQ,IAK5C,GAJE,OAAOA,EAAoB,IAAO,WAAaA,EAAoB,IAIrE,OAAOA,EAAoB,IAAO,UAClCJ,GACEnD,EACAoD,EACAG,EAAoB,EAAA,EAGtB,OAAOC,EAAa,GAGjB,OAAAC,CACT,ECwBaC,GACX,CAAC,CACCC,mBAAAA,EACAC,gBAAAA,EACAC,gBAAAA,EACAC,YAAAA,EAAc,aAJf,IAMD,CAACV,EAAmBpD,EAAUK,EAAK0D,EAAGhE,IAAU,CAC9C,IAAIiE,EAAQ,CAAA,EAEZ,MAAMC,EAAkBX,EACtBtD,EACAoD,EACA,CAAC,WAAY,QAAS,QAAS/C,EAAIN,QAAUA,EAAMmE,WAAnD,EACA,CAACP,EAAoBE,EAAiBD,EAAiB,MAAvD,EACA,aALwC,EAQnC,MAAA,CACL,GAAGI,EACHC,gBAAAA,EACAE,oBAAqBb,EACnBtD,EACAoD,EACA,CAAC,gBAAiB,gBAAlB,EACA,CACE,yCACA,wCAFF,EAIAU,CARqC,EAUvCM,uBAAwBd,EACtBtD,EACAoD,EACA,CAAC,gBAAiB,gBAAlB,EACA,CACE,yCACA,wCAFF,EAIAU,CARwC,EAU1CO,qBAAsBf,EACpBtD,EACAoD,EACA,CAAC,cAAe,gBAAhB,EACA,CACE,yCACA,wCAFF,EAIAU,CARsC,EAUxCQ,wBAAyBhB,EACvBtD,EACAoD,EACA,CAAC,cAAe,gBAAhB,EACA,CACE,yCACA,wCAFF,EAIAU,CARyC,EAU3CS,UAAW,YAAA,CAEd,EASUC,GAA2B,CAAC,CACvCC,cAAAA,EACAC,cAAAA,EACAC,kBAAAA,EACAC,eAAAA,CAJuC,IAMhC,CAACxB,EAAmBpD,EAAUK,EAAK0D,EAAGhE,IAAU,CAC/C8E,MAAAA,EAAexE,EAAIN,QAAUA,EAAMmE,YAalC,MAAA,CACLY,MAbYxB,EACZtD,EACAoD,EACA,CAACyB,EAAc,WAAY,QAAS,UAAW,UAA/C,EACA,CACEF,EACAF,EACAG,EACAG,OACAL,CALF,CAJ8B,CAa9BI,CADK,EAMEE,EAAsC,CACjDC,MAAO,iCACPC,OAAQ,kCACRC,WAAY,CACVlB,gBAAiB,4CACjBmB,UAAW,8CACXC,mBAAoB,wDACpBC,KAAM,EAJI,EAMZpE,QAAS,CACPkE,UAAW,2CACXC,mBAAoB,oDAFb,EAITE,YAAa,CACXC,QAAS9B,GAA4B,CACnCC,mBAAoB,mDACpBE,gBAAiB,gDACjBD,gBAAiB,+CAAA,CAHiB,EAKpC6B,UAAWjB,GAAyB,CAClCC,cAAe,2CACfC,cAAe,2CACfC,kBAAmB,gDAAA,CAHc,CANxB,EAYbe,cAAe,CACbC,gBAAiB,0CADJ,CAzBkC,EA8BtCC,GAAuC,CAClD,GAAGZ,EACHC,MAAO,OACPC,OAAQ,MAH0C,ECzMvCW,GAAsB,CACjC3H,EACAe,EACAF,IAEIE,GAAO6G,EAAAA,SAAS5H,EAAMe,CAAG,EACpBb,EAAA,UAAUF,EAAMe,CAAG,EAExBF,GAAOhB,EAAAA,QAAQG,EAAMa,CAAG,EACnBX,EAAA,UAAUF,EAAMa,CAAG,EAErB,GCEIgH,GAAqB,SAA+B,CAC/DC,aAAcC,EACdC,QAAAA,EACAC,QAAAA,EACAnG,SAAAA,EACAK,IAAAA,KACG+F,CAN4D,EAOlC,CACvBC,MAAAA,EAAiBtF,UACrB,IACG8E,GAAoBxF,EAAInC,KAAMgI,EAASC,CAApB,EAEhBnG,EADAC,GAAiCD,EAAU,CAAC,UAAD,CAAX,EAEtC,CAACK,EAAInC,KAAM8B,EAAUmG,EAASD,CAA9B,CAL4B,EAQ9B,aAAQD,EAAD,CAAc,IAAA5F,EAAd,GAA4B+F,EAAO,SAAUC,CAAAA,CAApD,CACD,ECjBYC,GAAgD,CAAC,CAC5DC,YAAAA,EACAC,MAAAA,EACApG,KAAAA,EACAqG,WAAAA,EACAxC,gBAAAA,EACAyC,OAAAA,CAN4D,IAOxD,CACEC,MAAAA,SACHC,MAAD,CACE,MAAOJ,EAAMvB,MACb,OAAQuB,EAAMtB,OACd,eAAgB,SAChB,WAAY,SAJd,SAMGuB,CAAAA,GAAcI,EAAA,IAACD,MAAD,CAAK,SAAU,WAAf,SAA4BH,CAAAA,CAN7C,EAOEI,EAAA,IAACD,MAAD,CAAK,SAAU,WAAf,gBACGE,OAAD,CACE,MACEP,EACIC,EAAMrB,WAAWE,mBACjBmB,EAAMrB,WAAWC,UAJzB,SAAA,CAOGsB,EACAtG,EAAKb,UARR,CAAA,CAAA,CAAA,CARJ,CAAA,CAAA,CADF,EAsBA,aACGqH,EAAAA,IAAD,CACE,WAAY3C,GAAmBuC,EAAMrB,WAAWlB,gBAChD,SAAU,WAFZ,SAIGsC,EACCM,EAAA,IAACE,YAAD,CACE,aAAc,yCACd,QAAUC,GAAOT,EAAYnG,EAAM4G,CAAP,EAC5B,sBAAuB,CAACT,EAH1B,SAKGI,CALH,CAAA,EAQAA,CAAAA,CAdN,CAkBD,EC/BM,SAASM,GAAgB,CAC9B7G,KAAAA,EACAL,MAAAA,EACAiG,aAAAA,EACAkB,gBAAAA,EACAC,mBAAAA,EACAjB,QAAAA,EACAC,QAAAA,EACAI,YAAAA,EACAa,WAAAA,EACAZ,MAAAA,EACAa,iBAAAA,EACAC,gBAAAA,EACAlE,kBAAAA,CAb8B,EAcP,CACvB,cACE,KAAA,CAAA,SAAA,CACGoD,EAAMrB,WAAWG,YAChB,KAAA,CAAA,SACG+B,EACCA,EAAiBjH,EAAMoG,EAAOD,CAAd,QAEfD,GAAD,CACE,KAAAlG,EACA,YAAAmG,EACA,MAAAC,CAAA,CAHF,CAAA,CANR,EAcGpG,EAAKmH,KAAKC,IAAKnH,SACb0F,GAAD,CACE,aAAAC,EAEA,IAAA3F,EACA,KAAAD,EACA,MAAAL,EACA,SAAUmH,GAAmBA,EAAgB7G,EAAIoH,YACjD,SAAUN,GAAsBA,EAAmB9G,EAAIoH,YACvD,WAAAL,EACA,MAAAZ,EACA,gBAAAc,EACA,kBAAAlE,EACA,QAAA8C,EACA,QAAAC,CAAA,EAXK9F,EAAIqH,UAFX,CADD,CAdH,CAAA,EAAStH,EAAKb,UAAd,CAiCH,CCrEM,MAAMoI,GAAc,CAAC,CAC1BC,eAAAA,EACAvH,IAAAA,EACAmG,MAAAA,CAH0B,IAIJ,CAChBG,MAAAA,QACHC,MAAD,CACE,MAAOJ,EAAMvB,MACb,OAAQuB,EAAMtB,OACd,eAAgB,SAChB,WAAY,SAJd,eAMG4B,OAAD,CACE,KAAM,QACN,MACEc,EACIpB,EAAMtF,QAAQmE,mBACdmB,EAAMtF,QAAQkE,UALtB,SAQG/E,EAAIwH,IAAAA,CARP,CAAA,CAPJ,EAoBA,OAAID,QAECb,EAAAA,UAAD,CACE,aAAc,yCACd,QAAUC,GAAOY,EAAevH,EAAIyC,UAAWkE,CAAhB,EAC/B,sBAAuB,CAACY,EAH1B,SAKGjB,CAAAA,CANL,EAWKA,CACR,ECxCYpB,GAAc,SAAwB,CACjDlF,IAAAA,EACAD,KAAAA,EACAL,MAAAA,EACAC,SAAAA,EACA8H,SAAAA,EACAV,WAAAA,EACAZ,MAAAA,EACAc,gBAAiBS,EACjB3E,kBAAAA,CATiD,EAU3B,CAChBuD,MAAAA,QACHC,MAAD,CACE,MAAO,OACP,OAAQ,OACR,eAAgB,SAChB,WAAY,SAJd,eAMGE,OAAD,CAAA,GACON,EAAMjB,YAAYE,WACrBe,EAAMjB,YAAYE,UAChBrC,EACApD,EACAK,EACAD,EACAL,EACA+H,CANF,EAFJ,SAWGzH,EAAIoH,UAAAA,CAXP,CAAA,CAPJ,EAuBMO,EAAYC,WAAOC,GAAG,CAC1B,GAAI1B,EAAMjB,YAAYC,SACpBgB,EAAMjB,YAAYC,QAChBpC,EACApD,EACAK,EACAD,EACAL,EACA+H,CANF,CAAA,CAFc,EAYZK,EAAkBF,WAAOG,IAAI,CACjC,GAAI5B,EAAMjB,YAAY8C,mBACpB7B,EAAMjB,YAAY8C,kBAChBjF,EACApD,EACAK,EACAD,EACAL,EACA+H,CANF,EAQF7C,MAAO,OACPC,OAAQ,MAAA,CAXc,EAclBoD,EAAiBL,WAAOG,IAAI,CAChC,GAAI5B,EAAMjB,YAAYgD,kBACpB/B,EAAMjB,YAAYgD,iBAChBnF,EACApD,EACAK,EACAD,EACAL,EACA+H,CANF,EAQF7C,MAAO,OACPC,OAAQ,OACRsD,SAAU,UAAA,CAZW,EAevB,aACGR,EAAD,CAAA,eACGG,EAAD,CAAA,eACGG,EAAD,CAAA,SACGjI,EAAIN,QAAUA,EAAMmE,oBACnBuE,WAAA,CAAA,SACGV,CAAAA,GACClB,EAAA,IAACkB,EAAD,CACE,KAAA3H,EACA,MAAAL,EACA,IAAAM,EACA,SAAAL,EACA,MAAAwG,EACA,SAAAsB,CAAA,CARN,EAWGV,GAAcsB,GAAYtF,EAAmBpD,CAApB,QACvB+G,YAAD,CACE,QAAUC,GAAOI,EAAW/G,EAAKyH,EAAUd,CAAhB,EAC3B,MAAO,CAAE/B,MAAO,OAAQC,OAAQ,MAAzB,EACP,aAAc,yCAHhB,SAKGyB,CAAAA,CALH,EAQAE,EAAA,IAAA4B,WAAA,CAAA,SAAG9B,CAAAA,CApBP,CAAA,CAAA,CAAA,CAAA,CAFJ,CAAA,CADF,CAAA,CAFJ,CAiCD,EAEK+B,GAAc,CAClBtF,EACApD,IAEA,CAAC,CAACsD,EACAtD,EACAoD,EACA,CAAC,UAAW,UAAZ,EACA,CAAC,GAAM,EAAP,EACA,EALkB,ECtFf,SAASsC,GAAiB,CAC/B3F,MAAAA,EACAiG,aAAAA,EAAeT,GACfoD,aAAAA,EACAC,gBAAAA,EACA1C,QAAAA,EACAC,QAAAA,EACAiB,WAAAA,EACAb,YAAAA,EACAqB,eAAAA,EACAiB,aAAAA,EACAC,YAAAA,EACAzB,iBAAAA,EACA0B,cAAAA,EACAC,kBAAAA,EACAC,mBAAAA,EACAzC,MAAAA,EAAQxB,EACRsC,gBAAAA,EACAlE,kBAAAA,CAlB+B,EAmBP,CAClB8F,MAAAA,EAAiB1C,EAAMrB,WAAWG,KAExC,aACEmD,EAAAA,SAAA,CAAA,gBACG7B,MAAD,CAAK,WAAY,UAAjB,SAAA,CACEuC,EAAA,KAACC,MAAD,CACE,eAAgB,gBAChB,WAAY,SACZ,OAAQ,OAHV,SAAA,CAKEvC,EAAA,IAACD,MAAD,CAAK,WAAY,SAAjB,SAA4BoC,CAAAA,CAL9B,EAOEG,EAAA,KAACC,MAAD,CAAK,WAAY,SAAjB,SAAA,CACEvC,EAAA,IAACuC,MAAD,CAAK,MAAO,QAAS,eAAgB,SAArC,SACGP,EACChC,EAAA,IAACwC,aAAD,CACE,QAAS,IAAMR,EAAa9I,CAAD,EAC3B,MAAOA,EAAM8H,IAAAA,CAHJ,EAMXhB,EAAA,IAACC,OAAD,CAAA,SAAO/G,EAAM8H,IAAAA,CAAb,CAAA,CAPJ,EAUChB,EAAA,IAAAyC,EAAA,MAXH,CAAA,CAAA,QAYGF,EAAAA,IAAD,CAAK,MAAO,OAAQ,eAAgB,SAApC,SACGN,EACCjC,EAAA,IAACwC,aAAD,CACE,QAAS,IAAMP,EAAY/I,EAAMsB,IAAP,EAC1B,MAAOkI,OAAOxJ,EAAMsB,IAAP,CAAA,CAHL,EAMVwF,EAAA,IAACC,OAAD,CAAA,SAAO/G,EAAMsB,IAAAA,CAAb,CAAA,CAnBN,CAAA,CAAA,CAPF,EA+BEwF,EAAA,IAACD,MAAD,CAAK,WAAY,SAAjB,SAA4BqC,CAAAA,CA/B9B,CAAA,CAAA,CAAA,EAkCApC,EAAA,IAAA,QAAA,CAAA,gBACE,QAAA,CAAA,SACE,CAAAsC,EAAA,KAAA,KAAA,CAAA,SAAA,CACGD,GACCrC,EAAA,IAAA,KAAA,CAAA,eACGD,MAAD,CAAK,MAAOJ,EAAMvB,MAAO,OAAQuB,EAAMtB,MAAAA,CAAvC,CAAA,CADF,EAIDnF,EAAMoC,MAAM,GAAGoF,KAAKC,IAAKnH,GACxBwG,EAAA,IAAA,KAAA,CAAA,SACGkC,EACCA,EAAc1I,EAAIwH,KAAMrB,EAAOoB,CAAlB,EAEbf,EAAA,IAACc,GAAD,CACE,IAAAtH,EACA,eAAAuH,EACA,MAAApB,CAAA,CAHF,CAAA,EAJKnG,EAAIwH,IAAb,CADD,CANH,CAAA,CAAA,EAoBC9H,EAAMoC,MAAMqF,IAAKpH,SACf6G,GAAD,CAEE,MAAAlH,EACA,KAAAK,EACA,aAAA4F,EACA,gBAAiB2C,GAAgBA,EAAavI,EAAKb,YACnD,mBACEqJ,GAAmBA,EAAgBxI,EAAKb,YAE1C,WAAA6H,EACA,YAAAb,EACA,MAAAC,EACA,iBAAAa,EACA,gBAAAC,EACA,kBAAAlE,EACA,QAAA8C,EACA,QAAAC,CAAA,EAfK/F,EAAKb,UADZ,CADD,CArBH,CAAA,CAAA,CAAA,CApCJ,CAAA,CAAA,CAAA,CAAA,CAFJ,CAoFD,CCxGD,SAASiK,GAAiB,CACxBC,UAAAA,EACAzD,aAAAA,EAAeT,GACfmE,iBAAAA,EACA9L,cAAAA,EACAsI,QAAAA,EACAC,QAAAA,EACAiB,WAAAA,EACAQ,eAAAA,EACArB,YAAAA,EACAsC,aAAAA,EACAC,YAAAA,EACAC,cAAAA,EACA1B,iBAAAA,EACA2B,kBAAAA,EACAC,mBAAAA,EACA3B,gBAAAA,EACAlE,kBAAAA,EACAoD,MAAAA,EAAQxB,CAlBgB,EAmBA,CACxB,MAAM2E,EAAa5I,EAAAA,QACjB,IAAOmF,EAAU0D,EAAAA,MAAM1D,EAAS,aAAc,IAAI2D,IAA5B,EAAsC9E,OAC5D,CAACmB,CAAD,CAFwB,EAKpB4D,EAAa/I,EAAAA,QACjB,IAAOoF,EAAUyD,EAAAA,MAAMzD,EAAS,aAAc,IAAI0D,IAA5B,EAAsC9E,OAC5D,CAACoB,CAAD,CAFwB,EAK1B,aACE,MAAA,CAAK,UAAW4D,GAAOC,SAAvB,SACGP,EAAUjC,IAAI,CAACyC,EAAUC,UACvBC,UAAD,CAAA,eACGf,MAAD,CAAA,SACGa,EAASzC,IAAI,CAACzH,EAAOqK,IACpBjB,EAAA,KAACkB,GAAM,SAAP,CAAA,SACGD,CAAAA,EAAQ,GAAKvD,EAAAA,IAACyC,EAAAA,MAAD,CAAA,CAAA,EACdzC,EAAA,IAACnB,GAAD,CACE,MAAA3F,EACA,aAAAiG,EACA,gBACE0D,GAAoBA,EAAiB3J,EAAMV,aAE7C,aACEzB,GAAiBA,EAAcmC,EAAMV,aAEvC,WAAA+H,EACA,eAAAQ,EACA,YAAArB,EACA,aAAAsC,EACA,YAAAC,EACA,MAAAtC,EACA,iBAAAa,EACA,cAAA0B,EACA,kBAAAC,EACA,mBAAAC,EACA,gBAAA3B,EACA,kBAAAlE,EACA,QAASuG,EACT,QAASG,CAAAA,CAxBb,CAAA,CAAA,EAAqB/J,EAAM8H,IAA3B,CADD,CAAA,CADH,CADF,EAAcqC,CAAd,CADD,CAAA,CAFL,CAuCD,CAEM,SAASI,GAAYlE,EAAyB,OACnD,MAAMmE,EAAcC,GAAepE,EAAM/E,KAAM+E,EAAMrG,MAAOqG,EAAMlI,IAAhC,EAC5B,CAAEmD,KAAAA,EAAMtB,MAAAA,CAAUmD,EAAAA,GACtBqH,EAAYlJ,KACZkJ,EAAYxK,KAFmC,EAI3C0J,EAAYgB,GAChBpJ,EACAtB,GACAqG,EAAAA,EAAM5E,SAAN4E,KAAAA,EAAgBsE,GAAAA,KAChBtE,EAAM7E,UACN6E,EAAMuE,YALsB,EAQxB/M,EAAgBiD,GACpBuF,EAAMwE,eACNxE,EAAMxI,aAF+B,EAKvC,aACG4L,GAAD,CACE,KAAAnI,EACA,MAAAtB,EACA,UAAA0J,EAHF,GAIMrD,EACJ,cAAAxI,CAAA,CANJ,CASD,CAED,MAAM4M,GAAiB,CAACnJ,EAAetB,EAAgB7B,IAAgB,CACrE,GAAI6B,GAASsB,EACJ,MAAA,CACLtB,MAAAA,EACAsB,KAAAA,CAAAA,EAGJ,GAAInD,EACK,MAAA,CACL6B,MAAO0C,WAASvE,CAAD,EACfmD,KAAMsB,UAAQzE,CAAD,CAAA,EAGX2M,MAAAA,EAAM,IAAIhB,KACT,MAAA,CACL9J,MAAO0C,WAASoI,CAAD,EACfxJ,KAAMsB,UAAQkI,CAAD,CAAA,CAEhB,EAEKJ,GAAe,CACnBpJ,EACAtB,EACAyB,EACAD,EACAoJ,IAEIpJ,GAAa,KACR,CAAC,CAACG,GAAeL,EAAMtB,EAAOyB,CAAd,CAAf,CAAD,EAELmJ,GAAgB,KACX,CAACvJ,GAAgBC,EAAMtB,EAAOwB,EAAWC,CAAzB,CAAhB,EAEFsJ,QAAM1J,GAAgBC,EAAMtB,EAAOwB,EAAWC,CAAzB,EAAkCmJ,CAAlD,EC3KDI,GAA+B,CAC1CtM,EACAuM,EACAL,EACApJ,IACG,CACG,MAAA0J,EAAYC,EAAAA,YAAY,IAAM,OAClC,MAAM,EAAIC,EAAAA,UAAU1M,GAAayB,EAAAyK,GAAA,KAAAA,EAAgBpJ,IAAhB,KAAArB,EAA6B,CAAC,EAC/D8K,GAAA,MAAAA,EAAiB,IAChB,CAACA,EAAgBvM,EAAakM,EAAcpJ,CAAS,CAAC,EAEnD6J,EAAWF,EAAAA,YAAY,IAAM,CAC3B,MAAA,EAAIG,EAAAA,SAAS5M,EAAa,CAAC,EACjCuM,GAAA,MAAAA,EAAiB,EAAC,EACjB,CAACA,EAAgBvM,CAAW,CAAC,EAE1B6M,EAAYJ,EAAAA,YAAY,IAAM,OAClC,MAAM,EAAIK,EAAAA,UAAU9M,GAAayB,EAAAyK,GAAA,KAAAA,EAAgBpJ,IAAhB,KAAArB,EAA6B,CAAC,EAC/D8K,GAAA,MAAAA,EAAiB,IAChB,CAACA,EAAgBvM,EAAakM,EAAcpJ,CAAS,CAAC,EAEnDiK,EAAWN,EAAAA,YAAY,IAAM,CAC3B,MAAA,EAAIO,EAAAA,SAAShN,EAAa,CAAC,EACjCuM,GAAA,MAAAA,EAAiB,EAAC,EACjB,CAACA,EAAgBvM,CAAW,CAAC,EAEzB,MAAA,CACL,UAAAwM,EACA,UAAAK,EACA,SAAAF,EACA,SAAAI,CAAA,CAEJ,ECdaE,GAAgE,CAAC,CAC5EC,SAAAA,EACAL,UAAAA,EACAL,UAAAA,EACAO,SAAAA,EACAJ,SAAAA,CAL4E,WAO5E,MAAA,CAAA,SACGO,CAAAA,EACD9E,EAAA,IAAC+E,SAAD,CAAA,gBACGxC,MAAD,CAAA,SAAA,CACEvC,EAAA,IAACwC,aAAD,CAAY,QAASmC,EAAU,SAAUK,GAAAA,iBAAAA,CAAzC,EACChF,EAAA,IAAAyC,EAAA,MAFH,CAAA,CAAA,QAGGD,EAAAA,WAAD,CAAY,QAASiC,EAAW,SAAUQ,EAAAA,cAAAA,CAH5C,EAIEjF,EAAA,IAAC+E,SAAD,CAAQ,IAAK,CAAA,CAJf,EAKE/E,EAAA,IAACwC,aAAD,CAAY,QAAS4B,EAAW,SAAUc,EAAAA,eAAAA,CAA1C,EACClF,EAAA,IAAAyC,EAAA,MANH,CAAA,CAAA,QAOGD,EAAAA,WAAD,CAAY,QAAS+B,EAAU,SAAUY,GAAAA,kBAAAA,CAP3C,CAAA,CAAA,CAAA,CAHJ,CAAA,EAaEnF,EAAA,IAACyC,QAbH,CAAA,CAAA,CAAA,CAAA,CAPK,ECPM2C,GAAmC,CAAC,CAC/CC,MAAAA,EACAC,cAAAA,EACApM,MAAAA,EACAyB,OAAAA,CAJ+C,IAK3C,CACE4K,MAAAA,EAAQrL,EAAAA,QAAQ,IAAM,CAC1B,MAAM8J,EAAM,IAAIhB,KAAK,IAAM9J,EAAO,CAAtB,EACL+B,OAAAA,YAAUxC,EAAAA,OAAOuL,EAAK,MAAO,CAAErJ,OAAAA,CAAf,CAAA,CAAP,CAAA,EACf,CAACA,EAAQzB,CAAT,CAHkB,EAKrB,aACGqJ,EAAAA,IAAD,CAAK,MAAO,OAAQ,eAAgB,SAAU,QAAS,GAAK,OAAQ,GAApE,SACG8C,IAAUnM,EACT8G,EAAAA,IAACwF,EAAAA,cAAD,CACE,MAAAD,EACA,QAAS,IAAMD,GAAiBA,EAAcpM,CAAD,CAAA,CAHhD,EAMC8G,EAAA,IAACwC,aAAD,CACE,MAAA+C,EACA,QAAS,IAAMD,GAAiBA,EAAcpM,CAAD,CAAA,CAF/C,CAAA,CARN,CAeD,EC7BKuM,GAAc,CAClB,CAACtL,EAAMuL,QAASvL,EAAMwL,SAAUxL,EAAMyL,KAAtC,EACA,CAACzL,EAAM0L,MAAO1L,EAAM2L,IAAK3L,EAAM4L,IAA/B,EACA,CAAC5L,EAAM6L,KAAM7L,EAAM8L,OAAQ9L,EAAM+L,SAAjC,EACA,CAAC/L,EAAMgM,QAAShM,EAAMiM,SAAUjM,EAAMkM,QAAtC,CAJkB,EAOPC,GAA0C,CAAC,CACtDjB,MAAAA,EACAC,cAAAA,EACA3K,OAAAA,EAASkJ,GAAAA,IAH6C,UAMnD0C,EAAAA,OAAD,CAAA,SACGd,GAAY9E,IAAKyC,SACfb,EAAAA,IAAD,CAAA,SACGa,EAASzC,IAAKzH,SACZkM,GAAD,CAEE,MAAAlM,EACA,cAAAoM,EACA,MAAAD,EAAA,OACA1K,CALF,EACOzB,CADP,CADD,CAAA,EADOkK,EAAS,EAAnB,CADD,CAAA,CAFL,ECpBWoD,GACXxC,GACsB,CACtB,CACE,MAAO,OACP,QAAS,CACP,CAAE,MAAO,cAAe,UAAWA,EAAK,QAAS7L,EAAA,QAAQ6L,EAAK,CAAC,CAAE,EACjE,CAAE,MAAO,cAAe,UAAWA,EAAK,QAAS7L,EAAA,QAAQ6L,EAAK,CAAC,CAAE,EACjE,CAAE,MAAO,eAAgB,UAAWA,EAAK,QAAS7L,EAAA,QAAQ6L,EAAK,EAAE,CAAE,EACnE,CAAE,MAAO,eAAgB,UAAWA,EAAK,QAAS7L,EAAA,QAAQ6L,EAAK,EAAE,CAAE,CACrE,CACF,EACA,CACE,MAAO,SACP,QAAS,CACP,CAAE,MAAO,cAAe,UAAWA,EAAK,QAAS3L,EAAA,QAAQ2L,EAAK,CAAC,CAAE,EACjE,CAAE,MAAO,cAAe,UAAWA,EAAK,QAAS3L,EAAA,QAAQ2L,EAAK,CAAC,CAAE,EACjE,CAAE,MAAO,eAAgB,UAAWA,EAAK,QAAS3L,EAAA,QAAQ2L,EAAK,EAAE,CAAE,EACnE,CAAE,MAAO,eAAgB,UAAWA,EAAK,QAAS3L,EAAA,QAAQ2L,EAAK,EAAE,CAAE,CACrE,CACF,CACF,ECRayC,GAA4C,CAAC,CACxDC,cAAAA,CADwD,IAEpD,OACJ,KAAM,CAACC,EAAWC,CAAZ,EAA4BC,WAAS,CAAD,EACpCC,EAAQ5M,EAAAA,QAAQ,IAAMsM,GAA+B,IAAIxD,IAAL,EAAc,CAAA,CAAnD,EAEf+D,GAAcD,EAAAA,EAAMH,KAANG,KAAAA,EAAoBA,EAAM,GAE9C,cACGP,EAAAA,OAAD,CAAA,SAAA,CACEjE,EAAA,KAACC,MAAD,CACE,eAAgB,gBAChB,WAAY,SACZ,MAAO,QAHT,SAAA,CAKEvC,EAAA,IAACwC,aAAD,CACE,KAAM,QACN,SAAUyC,EAAAA,eACV,SAAU0B,IAAc,EACxB,QAAS,IAAMC,EAAaD,EAAY,CAAb,CAAA,CAT/B,EAWE3G,EAAA,IAACC,OAAD,CAAA,SAAO8G,EAAYxB,KAAAA,CAXrB,EAYEvF,EAAA,IAACwC,aAAD,CACE,KAAM,QACN,SAAU0C,EAAAA,gBACV,SAAUyB,IAAcG,EAAME,OAAS,EACvC,QAAS,IAAMJ,EAAaD,EAAY,CAAb,CAAA,CAhB/B,CAAA,CAAA,CAAA,EAmBC3G,EAAA,IAAAyC,EAAA,MApBH,CAAA,CAAA,QAqBG8D,EAAAA,OAAD,CAAQ,WAAY,SAApB,SACGQ,EAAYE,QAAQtG,IACnBuG,GAAA5E,EAAA,KAACkB,GAAM,SAAP,CAAA,SAAA,CACExD,EAAA,IAACwF,gBAAD,CACE,MAAO0B,EAAO3B,MACd,QAAS,IAAMmB,EAAcQ,CAAD,CAHhC,CAAA,EAKElH,EAAA,IAACyC,QALH,CAAA,CAAA,CAAA,CAAA,EAAqByE,EAAO3B,KAA5B,CADD,CAAA,CAtBL,CAAA,CAAA,CADF,CAmCD,EClDY4B,GAAkC,CAAC,CAC9C9B,MAAAA,EACAC,cAAAA,EACA9K,KAAAA,CAH8C,IAI1C,CACE+K,MAAAA,EAAQ7C,OAAOlI,CAAD,EACpB,aACG+H,EAAAA,IAAD,CAAK,MAAO,OAAQ,eAAgB,SAAU,QAAS,GAAK,OAAQ,GAApE,SACG8C,IAAU7K,EACTwF,EAAAA,IAACwF,EAAAA,cAAD,CAAe,MAAAD,EAAc,QAAS,IAAMD,GAAAA,YAAAA,EAAgB9K,EAAH,CAD1D,EAGCwF,EAAA,IAACwC,aAAD,CAAY,MAAA+C,EAAc,QAAS,IAAMD,GAAAA,YAAAA,EAAgB9K,EAAH,CAAtD,CAAA,CALN,CASD,ECVY4M,GAAwC,CAAC,CACpD/B,MAAAA,EACAC,cAAAA,EACA+B,gBAAAA,CAHoD,IAIhD,CACJ,KAAM,CAACC,EAAUC,CAAX,EAA0BV,WAAS,IACnCxB,EACKA,EAAQ,EAEVgC,GAAAA,KAAAA,EAAmB,IAAIrE,KAAOwE,EAAAA,cAAgB,CAJf,EAOlCC,EAAWvN,EAAAA,QAAQ,IAAM,CAC7B,MAAMwN,EAAYJ,EAAW,GAC7B,OAAOrD,EAAAA,MAAM0D,EAAAA,MAAMD,EAAWJ,EAAW,CAAvB,EAA2B,CAAjC,CAAA,EACX,CAACA,CAAD,CAHqB,EAKxBM,OAAAA,EAAAA,UAAU,IAAM,CACdL,EAAsBM,GAAAA,GAAyBxC,EAAOyC,CAAR,CAAnC,CAAA,EACV,CAACzC,CAAD,CAFM,SAKN9C,EAAAA,IAAD,CAAA,SAAA,CACEvC,EAAA,IAACuG,SAAD,CAAQ,eAAgB,SAAxB,eACG/D,aAAD,CACE,SAAUuF,GAAAA,YACV,QAAS,IAAMR,EAAYD,EAAW,CAAZ,CAAA,CAF5B,CAAA,CAFJ,EAOEtH,EAAA,IAACuG,SAAD,CAAA,SACGkB,EAAS9G,IAAKqH,SACZzF,EAAAA,IAAD,CAAA,SACGyF,EAAQrH,IAAKnG,SACX2M,GAAD,CAEE,KAAA3M,EACA,cAAA8K,EACA,MAAAD,CAJF,EACO7K,CADP,CADD,CAAA,EADOwN,EAAQ,EAAlB,CADD,CAAA,CARL,EAqBEhI,EAAA,IAACuG,SAAD,CAAQ,eAAgB,SAAxB,eACG/D,aAAD,CACE,SAAUyF,GAAAA,aACV,QAAS,IAAMV,EAAYD,EAAW,CAAZ,CAAA,CAF5B,CAAA,CAtBJ,CAAA,CAAA,CADF,CA8BD,EAEKO,GAA2B,CAC/BxC,EACAiC,IACW,CACX,GAAIjC,GAAS,KACJiC,OAAAA,EAET,GAAIjC,EAAQiC,EAAU,CACpB,MAAMY,EAAW7C,EAAQiC,EACnBa,EAAYD,EAAW,EACvBE,EAAaF,EAAWC,EAAY,EAC1C,OAAOb,EAAWc,CACnB,CACD,MAAMV,EAAYJ,EAAW,GAC7B,GAAIjC,EAAQqC,EAAW,CACrB,MAAMQ,EAAWR,EAAYrC,EACvB8C,EAAYD,EAAW,EACvBG,EAAkBH,EAAWC,EAAY,EAC/C,OAAOb,EAAWe,CACnB,CAEMf,OAAAA,CACR,ECnEYgB,GACX,SAAyC,CACvC3N,OAAAA,EACA/C,YAAAA,EACAuM,eAAAA,EACAoE,aAAAA,EACAC,gBAAAA,KACGjJ,CANoC,EAOA,CACjCkJ,MAAAA,EAAwBpE,cAC3BqE,GAAyB,CACxB,MAAMC,EAAU/Q,EAAc,IAAIoL,KAAKpL,CAAT,EAAwB,IAAIoL,KAC1D2F,EAAQC,SAASF,CAAjB,EACIvE,GACFA,EAAewE,CAAD,EAEhBH,EAAgB,UAAD,CAEjB,EAAA,CAAC5Q,EAAauM,EAAgBqE,CAA9B,CATuC,EAYnCK,EAAuBxE,cAC1ByE,GAAyB,CACxB,MAAMH,EAAU/Q,EAAc,IAAIoL,KAAKpL,CAAT,EAAwB,IAAIoL,KAC1D2F,EAAQI,YAAYD,CAApB,EACI3E,GACFA,EAAewE,CAAD,EAEhBH,EAAgB,UAAD,CAEjB,EAAA,CAAC5Q,EAAauM,EAAgBqE,CAA9B,CATsC,EAYlCvG,EAAcoC,EAAAA,YAAY,IAAM,CACpCmE,EAAgB,MAAD,CAAA,EACd,CAACA,CAAD,CAF4B,EAIzBxG,EAAeqC,EAAAA,YAAY,IAAM,CACrCmE,EAAgB,OAAD,CAAA,EACd,CAACA,CAAD,CAF6B,EAIxBD,OAAAA,OACD,WACH,aACE3G,EAAAA,SAAA,CAAA,eACG6B,GAAD,CAAA,GACMlE,EACJ,KAAM3H,EACN,YAAAqK,EACA,aAAAD,EACA,OAAArH,CAAA,CALF,CAAA,CAFJ,MAWG,QACH,aACG2L,GAAD,CACE,MAAO1O,EAAYgE,SADrB,EAEE,cAAe6M,EACf,OAAA9N,CAAA,CAJJ,MAOG,OACH,aACGyM,GAAD,CACE,MAAOxP,EAAY4P,YADrB,EAEE,cAAeqB,CAAAA,CAHnB,MAMG,UACH,aAAQpC,GAAD,CAAc,cAAe,IAAM,CAAE,CAAA,CAA5C,UAGA,aACG1G,EAAAA,IAAD,CAAA,eACGyF,gBAAD,CACE,MAAO,gBACP,QAAS,IAAMgD,EAAgB,UAAD,CAAA,CAFhC,CAAA,CAFJ,EASL,EC1EGQ,GAAO,IAAM,CAAE,EAEd,SAASC,EAA6B,CAC3CC,uBAAAA,EACAvJ,MAAAA,EAAQxB,EACRvG,YAAAA,EACAuM,eAAAA,EACAoE,aAAAA,EACAC,gBAAAA,EACAW,eAAAA,EAAiBH,GACjBI,mBAAAA,EAAqB,MAClBC,CATwC,EAUP,CAC9B,KAAA,CAAEjF,UAAAA,EAAWK,UAAAA,EAAWF,SAAAA,EAAUI,SAAAA,CAAAA,EACtCT,GACEtM,EACAuM,EACAkF,EAAcvF,aACduF,EAAc3O,SAJY,EAYtB4O,OALUC,GAChBL,EACAG,EAAc3O,SAFuB,OAMhC,QACH,aACGmK,GAAD,CACE,MAAAlF,EACA,UAAAyE,EACA,UAAAK,EACA,SAAAF,EACA,SAAAI,EALF,eAOGlB,GAAD,CAAA,GAAiB4F,EAAe,MAAA1J,EAAc,KAAM/H,CAAAA,CAApD,CAAA,CARJ,MAYG,SACH,aACG2O,EAAAA,OAAD,CAAA,eACG+B,GAAD,CAAA,GACMe,EACJ,MAAA1J,EACA,YAAA/H,EACA,eAAAuM,EACA,aAAAoE,EACA,gBAAAC,EACA,eAAAW,EACA,yBACG5G,MAAD,CAAK,WAAY,SAAjB,SAAA,CACG,CAAC6G,SACC5G,EAAAA,WAAD,CACE,KAAM,QACN,QAASmC,EACT,SAAUK,GAAAA,iBAAAA,CAHZ,EAMDhF,EAAA,IAAAyC,EAAA,MARH,CAAA,CAAA,QASGD,EAAAA,WAAD,CACE,KAAM,QACN,QAASiC,EACT,SAAUQ,EAAAA,cAAAA,CAZd,CAAA,CAAA,CATJ,EAyBE,0BACG1C,MAAD,CAAK,WAAY,SAAjB,SAAA,CACEvC,EAAA,IAACwC,aAAD,CACE,KAAM,QACN,QAAS4B,EACT,SAAUc,EAAAA,eAAAA,CAJd,EAMElF,EAAA,IAACyC,QAAD,CAAA,CAAA,EACC,CAAC2G,GACApJ,EAAA,IAACwC,aAAD,CACE,KAAM,QACN,QAAS+B,EACT,SAAUY,GAAAA,kBAAAA,CAXhB,CAAA,CAAA,CAAA,CAAA,CA1BJ,CAAA,CAFJ,UAiDA,aACG1B,GAAD,CAAA,GAAiB4F,EAAe,MAAA1J,EAAc,KAAM/H,CAAAA,CADtD,EAKL,CAED,MAAM2R,GAAwB,CAC5BL,EACAxO,IAEOwO,IAA2BxO,GAAa,GAAK,EAAI,QAAU,SChIvD8O,GAAsBC,IAA2C,CAC5E,UAAWA,EAAU,UACjBhR,SAAOgR,EAAU,UAAW,YAAY,EACxC,OACJ,QAASA,EAAU,QACfhR,SAAOgR,EAAU,QAAS,YAAY,EACtC,MACN,GAEaC,GAAqB,CAAC,CACjC,UAAA7P,EACA,QAAAC,CACF,IAAkC,CAC1B,MAAAkK,EAAM,IAAI,KACT,MAAA,CACL,UAAWnK,EAAYkJ,QAAMlJ,EAAW,aAAcmK,CAAG,EAAI,OAC7D,QAASlK,EAAUiJ,QAAMjJ,EAAS,aAAckK,CAAG,EAAI,MAAA,CAE3D,ECjBa2F,GAAqB,CAAC,CACjC,UAAA9P,EACA,QAAAC,CACF,IACE,QACED,GACEC,GACA,CAACvC,YAAUsC,EAAWC,CAAO,GAC7B5C,EAAAA,QAAQ2C,EAAWC,CAAO,CAC9B,EAEW8P,GACXH,GAEIE,GAAmBF,CAAS,EACvB,CACL,UAAWA,EAAU,QACrB,QAASA,EAAU,SAAA,EAGhBA,EAGII,GACXJ,GAEIA,EAAU,WAAaA,EAAU,QAC5BD,GACLI,GAAmCF,GAAmBD,CAAS,CAAC,CAAA,EAG7DA,ECzBIK,GAAgC,CAC3CzE,EACAC,EACAyE,EACAC,IAEO3F,EAAA,YACJ7K,GAAiB,CAChB,MAAMiQ,EAAY,CAChB,UAAWM,IAAiB,YAAcvQ,EAAI,KAAO6L,GAAA,YAAAA,EAAO,UAC5D,QAAS0E,IAAiB,UAAYvQ,EAAI,KAAO6L,GAAA,YAAAA,EAAO,OAAA,EAGrDsE,GAAmBF,CAAS,GACfO,EAAAD,IAAiB,YAAc,UAAY,WAAW,EAExDzE,GAAA,MAAAA,EAAAsE,GAAmCH,CAAS,EAC9D,EACA,CACEM,EACAzE,EACA0E,EACA3E,GAAA,YAAAA,EAAO,QACPA,GAAA,YAAAA,EAAO,SACT,CAAA,ECzBS4E,GACXC,GACG,CACH,KAAM,CAAC3B,EAAc4B,CAAf,EACJtD,WAA4B,UAApB,EAEJ2B,EAAkBnE,cACrBkE,GAAoC,CACnC4B,EAAiB5B,CAAD,EAChB2B,GAAAA,MAAAA,EAAgB3B,EAAH,EAEf,CAAC2B,CAAD,CALiC,EAQ5B,MAAA,CACL3B,aAAAA,EACAC,gBAAAA,CAAAA,CAEH,ECpBY4B,GAAwB,CAAI,CACvC,aAAAL,EACA,MAAA1E,EACA,cAAAC,EACA,gBAAA0E,EACA,cAAAjT,EACA,cAAAmT,CACF,IAAoE,CAClE,KAAM,CAAE,aAAA3B,EAAc,gBAAAC,CAAgB,EACpCyB,GAAsBC,CAAa,EAC/B,CAACtS,EAAauM,CAAc,EAAI0C,WAAS,IAAM,IAAI,IAAM,EAEzDtG,EAAauJ,GACjBzE,EACAC,EACAyE,EACAC,CAAA,EAGIK,EAA6BnQ,EAAA,QACjC,IACEpD,EACEC,EACAsO,GAAA,YAAAA,EAAO,UACPA,GAAA,YAAAA,EAAO,OACT,EACF,CAACtO,EAAesO,GAAA,YAAAA,EAAO,QAASA,GAAA,YAAAA,EAAO,SAAS,CAAA,EAG3C,MAAA,CACL,WAAA9E,EACA,cAAe8J,EACf,aAAA9B,EACA,gBAAAC,EACA,eAAArE,EACA,YAAAvM,CAAA,CAEJ,EC5BO,SAAS0S,GAAqB/K,EAAkC,CAC/DgL,MAAAA,EAA0BH,GAAsB7K,CAAD,EACrD,aACG0J,EAAD,CAAA,GAAkC1J,EAAlC,GAA6CgL,CAAAA,CAD/C,CAGD,CClBM,MAAMC,GAA4B,IAAM,CAC7C,KAAM,CAAC3Q,EAAW4Q,CAAY,EAAI5D,EAA2B,SAAA,EACvD,CAAC/M,EAAS4Q,CAAU,EAAI7D,EAA2B,SAAA,EACnD,CAACkD,EAAcC,CAAe,EAClCnD,WAAgC,WAAW,EACtC,MAAA,CACL,UAAAhN,EACA,aAAA4Q,EACA,QAAA3Q,EACA,WAAA4Q,EACA,aAAAX,EACA,gBAAAC,CAAA,CAEJ,ECTaW,GAAyB,CAAI,CACxC,SAAAC,EACA,MAAAvF,EACA,cAAAtO,EACA,cAAAmT,CACF,IAAqE,CACnE,KAAM,CAAE,aAAA3B,EAAc,gBAAAC,CAAgB,EACpCyB,GAAsBC,CAAa,EAE/B,CAACtS,EAAauM,CAAc,EAAI0C,EAAAA,SAAS,IAAMxB,GAAA,KAAAA,EAAS,IAAI,IAAM,EAElE9E,EAA4B8D,EAAA,YAC/B7K,GAAQ,CACHoR,GACFA,EAASpR,EAAI,IAAI,CAErB,EACA,CAACoR,CAAQ,CAAA,EAGLC,EAAgC3Q,EAAA,QACpC,IACEmL,EACI5N,EAAsBV,EAAesO,EAAO,CAC1C,WACA,gBACD,CAAA,EACDtO,EACN,CAACA,EAAesO,CAAK,CAAA,EAGhB,MAAA,CACL,WAAA9E,EACA,cAAesK,EACf,KAAMxF,EACN,aAAAkD,EACA,gBAAAC,EACA,YAAA5Q,EACA,eAAAuM,CAAA,CAEJ,ECnCO,SAAS2G,GAAsBvL,EAAmC,CACjEwL,MAAAA,EAA2BJ,GAAuBpL,CAAD,EACvD,aACG0J,EAAD,CAAA,GAAkC1J,EAAlC,GAA6CwL,CAAAA,CAD/C,CAGD,CCTM,MAAMC,GAAwB,CAAI,CACvC,SAAAJ,EACA,MAAAvF,EACA,cAAAtO,EACA,cAAAmT,CACF,IAAoE,CAClE,KAAM,CAAE,aAAA3B,EAAc,gBAAAC,CAAgB,EACpCyB,GAAsBC,CAAa,EAE/B,CAACtS,EAAauM,CAAc,EAAI0C,WAAS,IAAM,IAAI,IAAM,EAEzDtG,EAA4B8D,EAAA,YAC/B7K,GAAQ,CACP,GAAI,CAACoR,EACH,OAEI,MAAAK,EAAa5F,GAASA,EAAM,KAAMjJ,GAAM7E,EAAAA,UAAU6E,EAAG5C,EAAI,IAAI,CAAC,EAEzDoR,EADPvF,GAAS4F,EACF5F,EAAM,OAAQ6F,GAAM,CAAC3T,YAAU2T,EAAG1R,EAAI,IAAI,CAAC,EAE3C,CAAC,GAAI6L,GAAS,CAAK,EAAA7L,EAAI,IAAI,CAFiB,CAIzD,EACA,CAACoR,EAAUvF,CAAK,CAAA,EAEZwF,EAAgC3Q,EAAAA,QAAQ,IACvCmL,EAGEA,EAAM,OACX,CAAC8F,EAAU9T,IAASI,EAAsB0T,EAAU9T,EAAM,CAAC,UAAU,CAAC,EACtEN,CAAA,EAJOA,EAMR,CAACA,EAAesO,CAAK,CAAC,EAElB,MAAA,CACL,WAAA9E,EACA,cAAesK,EACf,aAAAtC,EACA,gBAAAC,EACA,YAAA5Q,EACA,eAAAuM,CAAA,CAEJ,ECtCO,SAASiH,GAAqB7L,EAAkC,CAC/D8L,MAAAA,EAAiBL,GAAsBzL,CAAD,EAC5C,aAAQ0J,EAAD,CAAA,GAAkC1J,EAAlC,GAA6C8L,CAAAA,CAApD,CACD,CCHM,MAAMC,GAAyB,CAAI,CACxC,SAAAV,EACA,MAAAvF,EACA,cAAAtO,EACA,cAAAmT,EACAvP,OAAAA,EAASkJ,GAAA,IACX,IAAqE,CACnE,KAAM,CAACjM,EAAauM,CAAc,EAAI0C,WAAS,IAAM,CAC7C,MAAAtN,EAAOgS,GAA0BlG,EAAO1K,CAAM,EACpD,OAAKpB,EAGEA,EAAK,KAAK,GAAG,KAFX,IAAI,IAEO,CACrB,EACK,CAAE,aAAAgP,EAAc,gBAAAC,CAAgB,EACpCyB,GAAsBC,CAAa,EAE/B3J,EAAa8D,EAAA,YAChB7K,GAAQ,CACHoR,GACFA,EAASY,GAA0BhQ,GAAehC,EAAI,KAAMmB,CAAM,CAAC,CAAC,CAExE,EACA,CAACA,EAAQiQ,CAAQ,CAAA,EAEblL,EAAc2E,EAAA,YACjB9K,GAAS,CACJqR,GACOA,EAAAY,GAA0BjS,CAAI,CAAC,CAE5C,EACA,CAACqR,CAAQ,CAAA,EAGLP,EAA6BnQ,EAAAA,QAAQ,IAAM,CACzC,MAAAuR,EAAWF,GAA0BlG,EAAO1K,CAAM,EACxD,OAAO8Q,EACH7R,GAAuB7C,EAAe0U,CAAQ,EAC9C1U,CACH,EAAA,CAACsO,EAAO1K,EAAQ5D,CAAa,CAAC,EAE3BM,EAAO6C,EAAAA,QAAQ,IAAM,CACnB,MAAAX,EAAOgS,GAA0BlG,EAAO1K,CAAM,EACpD,OAAKpB,EAGEA,EAAK,KAAK,GAAG,KAFX,IAAI,IAEO,EACnB,CAACoB,EAAQ0K,CAAK,CAAC,EAEX,MAAA,CACL,cAAegF,EACf,KAAAhT,EACA,YAAAO,EACA,eAAAuM,EACA,WAAA5D,EACA,YAAAb,EACA,aAAA6I,EACA,gBAAAC,CAAA,CAEJ,EAEMgD,GACJjS,GACuB,CACvB,GAAI,EAACA,EAGE,MAAA,GAAGA,EAAK,WAAWA,EAAK,YACjC,EAEMgS,GAA4B,CAChChS,EACAoB,IACyB,CACzB,GAAI,CAACpB,EACI,OAEH,MAAAmS,EAAQnS,EAAK,MAAM,GAAG,EACtBb,EAAa,SAASgT,EAAM,GAAI,EAAE,EAClClR,EAAO,SAASkR,EAAM,GAAI,EAAE,EAC5BrU,EAAO,IAAI,KACjBA,EAAK,YAAYmD,CAAI,EACf,MAAAmR,EAAkBtQ,cAAYuQ,UAAQvU,EAAMqB,CAAU,EAAG,CAAE,OAAAiC,EAAQ,EAClE,OAAAa,GAAemQ,EAAiBhR,CAAM,CAC/C,ECpFO,SAASkR,GAAsBtM,EAAmC,CACjEuM,MAAAA,EAA2BR,GAAuB/L,CAAD,EACvD,aACG0J,EAAD,CAAA,GAAkC1J,EAAlC,GAA6CuM,CAAAA,CAD/C,CAGD,CCNM,MAAMC,GAAoB,CAACC,EAAmB3U,IACnD2U,EAAK,OAAQC,GAAS,CAAC1U,EAAA,UAAU0U,EAAM5U,CAAI,CAAC,EAEjC6U,GAAmB,CAACF,EAAmB3U,IAClD,CAAC,CAAC2U,EAAK,KAAMC,GAAS1U,EAAAA,UAAU0U,EAAM5U,CAAI,CAAC,ECDhC8U,GAAiC,CAAI,CAChD,MAAA9G,EACA,cAAAC,EACA,cAAAvO,EACA,cAAAmT,CACF,IAA6E,CAC3E,KAAM,CAACT,EAAW2C,CAAY,EAAIvF,EAAgC,SAAA,EAC5D,CAACkD,EAAcC,CAAe,EAClCnD,WAAgC,WAAW,EACvC,CAAE,aAAA0B,EAAc,gBAAAC,CAAgB,EACpCyB,GAAsBC,CAAa,EAE/B,CAACtS,EAAauM,CAAc,EAAI0C,EAAA,SACpC,IAAA,OAAO,OAAAxN,EAAA0Q,IAAgB1E,GAAA,YAAAA,EAAQ0E,MAAxB,KAAA1Q,EAA0C,IAAI,KAAK,EAGtDgT,EAAkBhI,EAAA,YACrBgB,GAAqB,CACpB+G,EAAa/G,CAAK,EACZ,KAAA,CAAE,UAAAxL,EAAW,QAAAC,CAAYuL,EAAAA,EAC/B,GAAIC,EACF,GAAIzL,GAAaC,EAAS,CACxB,MAAMwS,EAAQnV,EAAAA,kBAAkB,CAAE,MAAO0C,EAAW,IAAKC,EAAS,EAClEwL,EAAcgH,CAAK,OACVzS,EACKyL,EAAA,CAACzL,CAAS,CAAC,EAChBC,GACKwL,EAAA,CAACxL,CAAO,CAAC,CAG7B,EACA,CAACwL,CAAa,CAAA,EAGViH,EAAkBzC,GACtBL,EACA4C,EACAtC,EACAC,CAAA,EAGIzJ,EAA4B8D,EAAA,YAChC,CAAC7K,EAAKyH,EAAUd,IAAO,CACjBmF,IACEnF,EAAG,SAAWA,EAAG,QACdkF,EAEM6G,GAAiB7G,EAAO7L,EAAI,IAAI,EACzC8L,EAAcyG,GAAkB1G,EAAO7L,EAAI,IAAI,CAAC,EAEhD8L,EAAc,CAAC,GAAGD,EAAO7L,EAAI,IAAI,CAAC,EAJpB8L,EAAA,CAAC9L,EAAI,IAAI,CAAC,EAOV+S,EAAA/S,EAAKyH,EAAUd,CAAE,EAGvC,EACA,CAACmF,EAAeiH,EAAiBlH,CAAK,CAAA,EAElCwF,EAAgC3Q,EAAAA,QAAQ,IACrCsS,GAAgBzV,EAAesO,CAAK,EAC1C,CAACtO,EAAesO,CAAK,CAAC,EAElB,MAAA,CACL,WAAA9E,EACA,cAAesK,EACf,aAAAtC,EACA,gBAAAC,EACA,YAAA5Q,EACA,eAAAuM,CAAA,CAEJ,EAEMqI,GAAkB,CACtBzV,EACA0V,IAEKA,EAGEA,EAAS,OAAO,CAAC1V,EAAeM,IAC9BI,EAAsBV,EAAeM,EAAM,CAAC,UAAU,CAAC,EAC7DN,CAAa,EAJPA,ECjFJ,SAAS2V,GACdnN,EACA,CACM8L,MAAAA,EAAiBc,GAA+B5M,CAAD,EACrD,aAAQ0J,EAAD,CAAA,GAAkC1J,EAAlC,GAA6C8L,CAAAA,CAApD,CACD,CCfM,MAAMsB,GAA4C,SCC5CC,GAA4B,IAAM,CAC7C,KAAM,CAACC,EAAUC,CAAgB,EAAIC,EAAiB,iBAAA,EAM/C,MAAA,CACL,cALoB1I,EAAAA,YAAY,IAAM,UACrB2I,GAAA3T,EAAAyT,EAAA,UAAA,YAAAzT,EAAS,iBAAT,MAAA2T,EAAyB,QAAO,EAChD,CAACF,CAAgB,CAAC,EAInB,SAAAD,CAAA,CAEJ,ECZaI,GAAe,CAC1BrC,EACAsC,EACAC,IACG,CACH,KAAM,CAACC,EAAiBC,CAAlB,EAAwCxG,EAAAA,SAASsG,GAAe,EAAhB,EAEhDG,EAAejJ,EAAAA,YAAY,KAC/BgJ,EAAmB,EAAD,EACX,IACN,CAACA,CAAD,CAH6B,EAK1BE,EAAelJ,EAAAA,YAAY,IAAM,CACrCgJ,EAAmB,EAAD,EACdH,GACKA,GACR,EACA,CAACG,EAAoBH,CAArB,CAL6B,EAO1BM,EAAenJ,cAClBhN,GAA2B,CACtBuT,GACFA,EAASvT,CAAD,EAEVoW,WAAWF,EAAc,GAAf,CAAA,EAEZ,CAAC3C,EAAU2C,CAAX,CAP8B,EAUzB,MAAA,CACLD,aAAAA,EACAC,aAAAA,EACAH,gBAAAA,EACAI,aAAAA,CAAAA,CAEH,ECrCYE,GAAiB,aCkEjBC,GAAsC,CAAC,CAClDC,cAAAA,EAAgB/W,EAAYgX,SAC5BC,YAAAA,EAAc,aACdzI,MAAAA,EACA0I,OAAAA,EAAS,IACTC,cAAAA,EAAgB7P,EAChBkL,cAAAA,EACA8D,YAAAA,EACAD,QAAAA,EACAtC,SAAAA,EACAqD,aAAAA,EACAC,QAAAA,EACA9P,MAAAA,EACAiB,QAAAA,EACAC,QAAAA,EAAUoO,GACVS,SAAAA,CAfkD,IAgB9C,CACE,KAAA,CAAEZ,aAAAA,EAAcH,gBAAAA,EAAiBI,aAAAA,EAAcF,aAAAA,CACnDL,EAAAA,GAAarC,EAAUsC,EAASC,CAApB,EAER,CAAEN,SAAAA,EAAU3C,cAAAA,GAAkB0C,GAApC,EAEA,aACG7M,EAAAA,IAAD,CAAK,MAAA3B,EAAL,eACGgQ,UAAD,CACE,MAAO,GACP,KAFF,GAGE,QAAShB,EACT,eAAgBG,EAChB,UAAWZ,GACX,OAAAoB,EACA,SAAUE,GAAAA,KAAAA,EAAgB,SAC1B,SAAApB,EACA,SAAAsB,EACA,cACGrD,GAAD,CAAA,GACMzB,EACJ,SAAUmE,EACV,MAAAnI,EACA,MAAO2I,EACP,cAAA9D,EACA,QAAA7K,EACA,QAAAC,CAAA,CAlBN,EAAA,eAsBG+O,YAAD,CACE,KAAM,OACN,mBACG9L,MAAD,CAAK,WAAY,SAAjB,eACGC,aAAD,CACE,KAAM,QACN,SAAA2L,EACA,SAAUG,EAAAA,cACV,QAAShB,CAAAA,CAJX,CAAA,CAJN,EAYE,QAASA,EACT,aAAcA,EACd,MAAOjI,EAAQ5M,EAAAA,OAAO4M,EAAOuI,CAAR,EAAyB,GAC9C,YAAAE,EACA,KAAM,EACN,SAAAK,EACA,UAAWhB,EACX,QAAAe,EACA,IAAK7O,EACL,IAAKC,CAAAA,CArBP,CAAA,CAtBF,CAAA,CAFJ,CAkDD,ECpIYiP,GAAoB,CAC/BlJ,EACAC,IACG,CACGkJ,MAAAA,EAAoBC,SAAyB,IAAnB,EAC1BC,EAAkBD,SAAyB,IAAnB,EAExB,CAACrB,EAAiBC,CAAlB,EAAwCxG,WAAS,EAAD,EAChD,CAACkD,EAAcC,CAAf,EAAkCnD,EAAAA,SAEtC3I,MAF8C,EAI1CyQ,EAAwBtK,EAAAA,YAAY,KACxC2F,EAAgB,WAAD,EACfqD,EAAmB,EAAD,EACX,IACN,CAACrD,EAAiBqD,CAAlB,CAJsC,EAMnCuB,EAAsBvK,EAAAA,YAAY,KACtC2F,EAAgB,SAAD,EACfqD,EAAmB,EAAD,EACX,IACN,CAACrD,EAAiBqD,CAAlB,CAJoC,EAMjCE,EAAelJ,EAAAA,YAAY,IAAM,CACrCgJ,EAAmB,EAAD,CAAA,EACjB,CAACA,CAAD,CAF6B,EAI1B9M,EAAa8D,cAChB7K,GAAiB,CACZuQ,IAAiB,aACHzE,GAAA,MAAAA,EAAA,CACdzL,UAAWL,EAAInC,KACfyC,QAASuL,GAAAA,YAAAA,EAAOvL,OAAAA,GAEbuL,GAAAA,MAAAA,EAAOvL,QAIV2T,WAAWF,EAAc,GAAf,GAHVvD,EAAgB,SAAD,EACC6E,EAAAA,SAAWH,EAAgBG,QAAQC,MAAnD,IAIO/E,IAAiB,YACVzE,GAAA,MAAAA,EAAA,CACdzL,UAAWwL,GAAAA,YAAAA,EAAOxL,UAClBC,QAASN,EAAInC,IAAAA,GAEVgO,GAAAA,MAAAA,EAAOxL,UAIV4T,WAAWF,EAAc,GAAf,GAHVvD,EAAgB,WAAD,EACG6E,EAAAA,SAAWL,EAAkBK,QAAQC,MAAvD,GAIH,EAEH,CAAC/E,EAAczE,EAAe0E,EAAiBuD,EAAclI,CAA7D,CA1B4B,EA6BxB0J,EAAsB7U,EAAAA,QAC1B,KACEmL,GAAAA,YAAAA,EAAOxL,aACPwL,GAAAA,YAAAA,EAAOvL,UACP5C,UAAQmO,EAAMxL,UAAWwL,EAAMvL,OAAxB,EACT,CAACuL,GAAAA,YAAAA,EAAOxL,UAAWwL,GAAAA,YAAAA,EAAOvL,OAA1B,CALiC,EAQ5B,MAAA,CACLsT,gBAAAA,EACAG,aAAAA,EACAqB,oBAAAA,EACAD,sBAAAA,EACA5E,aAAAA,EACAC,gBAAAA,EACAwE,kBAAAA,EACAE,gBAAAA,EACAnO,WAAAA,EACAwO,oBAAAA,CAAAA,CAEH,ECLM,SAASC,GAAkB,CAChCpB,cAAAA,EAAgB/W,EAAYgX,SAC5BoB,qBAAAA,EAAuB,aACvBC,mBAAAA,EAAqB,WACrBjB,aAAAA,EACA5I,MAAAA,EACAC,cAAAA,EACAyI,OAAAA,EAAS,IACT3P,MAAAA,EACA4P,cAAAA,EAAgB7P,EAChBkL,cAAAA,EACAhK,QAAAA,EACAC,QAAAA,EAAUoO,GACVS,SAAAA,CAbgC,EAcqC,CACrE,KAAM,CAAC5F,EAAcC,CAAf,EACJ3B,WAA4B,UAApB,EAEJ,CACJ0G,aAAAA,EACAqB,oBAAAA,EACAD,sBAAAA,EACAvB,gBAAAA,EACArD,aAAAA,EACAyE,kBAAAA,EACAE,gBAAAA,EACAnO,WAAAA,EACAwO,oBAAAA,CAAAA,EACER,GAAkBlJ,EAAOC,CAAR,EAEf,CAAC1N,EAAauM,CAAd,EAAgC0C,EAAAA,SACpC,IAAOkD,OAAAA,OAAAA,EAAAA,IAAgB1E,GAAAA,YAAAA,EAAQ0E,MAAxBA,KAAAA,EAA0C,IAAI/G,KADT,EAGxCjM,EAAgBmD,EAAAA,QACpB,IACEpD,EAA0BoH,OAAWmH,GAAAA,YAAAA,EAAOxL,UAAWwL,GAAAA,YAAAA,EAAOvL,OAArC,EAC3B,CAACuL,CAAD,CAH2B,EAM7B,aACG+I,EAAAA,QAAD,CACE,MAAO,GACP,KAFF,GAGE,SAAAD,EACA,QAASf,EACT,OAAAW,EACA,UAAWpB,GACX,SAAUsB,GAAAA,KAAAA,EAAgB,SAC1B,eAAgBV,EAChB,cACGtE,EAAD,CAAA,GACMI,EACJ,YAAAzR,EACA,eAAAuM,EACA,cAAApN,EACA,MAAOiX,EACP,WAAAzN,EACA,aAAAgI,EACA,gBAAAC,EACA,QAAAnJ,EACA,QAAAC,CAAA,CApBN,EAAA,gBAwBGiD,MAAD,CAAK,WAAY,SAAjB,SAAA,CACEvC,EAAA,IAACqO,YAAD,CACE,SAAUC,EAAAA,cACV,QAASK,EACT,MAAOtJ,GAAAA,MAAAA,EAAOxL,UAAYpB,EAAAA,OAAO4M,EAAMxL,UAAW+T,CAAlB,EAAmC,GACnE,YAAaqB,EACb,MAAA7Q,EACA,SAAA+P,EACA,SAAUK,EACV,KAAM,EACN,QAASO,EAAsB,QAAU7Q,MAAAA,CAT3C,EAWC8B,EAAA,IAAAyC,EAAA,MAZH,CAAA,CAAA,QAaG0M,EAAAA,KAAD,CACE,KAAMC,GAAAA,oBACN,MAAOC,YAAS,qBAAD,EACf,KAAM,EAAA,CAHR,EAKCrP,EAAA,IAAAyC,EAAA,MAlBH,CAAA,CAAA,QAmBG4L,EAAAA,UAAD,CACE,SAAUC,EAAAA,cACV,QAASM,EACT,MAAOvJ,GAAAA,MAAAA,EAAOvL,QAAUrB,EAAAA,OAAO4M,EAAMvL,QAAS8T,CAAhB,EAAiC,GAC/D,YAAasB,EACb,MAAA9Q,EACA,SAAA+P,EACA,SAAUO,EACV,KAAM,EACN,QAASK,EAAsB,QAAU7Q,MAAAA,CA5B7C,CAAA,CAAA,CAAA,CAAA,CAzBJ,CA0DD,CC9HM,MAAMoR,GAAkD,CAAC,CAC9DjG,cAAAA,EACAkG,0BAAAA,EAA4B,GAC5BC,WAAAA,EAAa3Y,EAAYgX,SACzB4B,gBAAAA,EAAkB,GAClBnK,cAAAA,EACAwI,YAAAA,EAAc,aACdG,aAAAA,EACA5I,MAAAA,EACAjH,MAAAA,EAAQ,QACR2P,OAAAA,EAAS,IACTC,cAAAA,EAAgB7P,EAChBuR,iBAAAA,EAAmB,GACnBrQ,QAAAA,EACAC,QAAAA,EAAUoO,GACVQ,QAAAA,KACG3O,CAhB2D,IAiB1D,CACJ,KAAM,CAACoQ,EAAMC,CAAP,EAAkB/I,WAAS,EAAD,EAC1B,CAAEgG,SAAAA,EAAU3C,cAAAA,GAAkB0C,GAApC,EAEMiD,EAAiBxL,EAAAA,YAAY,IAAM,CACvCuL,EAAQ,CAACD,CAAF,CAAA,EACN,CAACC,EAASD,CAAV,CAF+B,EAI5BpC,EAAelJ,EAAAA,YAAY,IAAM,CACrCuL,EAAQ,EAAD,CAAA,EACN,CAACA,CAAD,CAF6B,EAI1BE,EAAuBzL,cAC1BgB,GAAkB,CACbC,GACFA,EAAcD,CAAD,CACd,EAEH,CAACC,CAAD,CANsC,EASlCyK,EAAuB1L,cAC1BhN,GAA2B,CACtBA,IACmBoB,EAAAA,EAAAA,OAAOpB,EAAMmY,CAAP,CAAP,EAChBD,GACF9B,WAAW,IAAMmC,EAAQ,CAACD,CAAF,EAAS,GAAvB,EAEb,EAEH,CAACG,EAAsBN,EAAYD,EAA2BK,EAASD,CAAvE,CATsC,EAYlCK,EAAe,CAAC,CAAC3K,GAAS,CAAC,gBAAgB4K,KAAK5K,CAArB,EAE3B6K,EAAc,CAAC,CAAC7K,GAAS8K,UAAQpN,EAAAA,MAAMsC,EAAOmK,EAAY,IAAIxM,IAAxB,CAAN,EAIhCoN,EAFyB,CAAC,CAAC/K,GAASA,EAAM2B,QAAUwI,EAAWxI,QAGxC,CAACkJ,GAAgBF,EAE9C,aACGjQ,EAAAA,IAAD,CAAK,MAAA3B,EAAL,eACGgQ,UAAD,CACE,MAAO,GACP,KAFF,GAGE,QAASuB,EACT,OAAA5B,EACA,SAAUE,GAAAA,KAAAA,EAAgB,SAC1B,UAAWtB,GACX,eAAgBY,EAChB,SAAAV,EACA,cACG/B,GAAD,CAAA,GACMzB,EACJ,SAAU0G,EACV,cAAA7F,EACA,MACE7E,GAAS6K,EACLnN,QAAMsC,EAAOmK,EAAY,IAAIxM,IAAxB,EACL9E,OAEN,QAAAmB,EACA,QAAAC,EACA,MAAO0O,CAAAA,CArBb,EAAA,eAyBGK,YAAD,CAAA,GACM9O,EACJ,QAAS6Q,EAAU,QAAUlC,EAC7B,2BAHF,GAIE,aACGwB,EASGxR,OARF8B,EAAA,IAACuC,MAAD,CAAK,WAAY,SAAU,OAAQ,GAAnC,eACGC,aAAD,CACE,KAAM,QACN,SAAUjD,EAAM4O,SAChB,SAAUG,EAAAA,cACV,QAASuB,CAAAA,CAJX,CADF,CAAA,EAUJ,cAAeC,EACf,YAAAhC,EACA,MAAOzI,GAAS,GAChB,IAAKhG,EACL,IAAKC,EACL,KAAM,EAAA,CArBR,CAAA,CAzBF,CAAA,CAFJ,CAqDD,EC5JY+Q,GAAeC,GAA0B,CACpD,GAAIA,IAAU,GACL,MAAA,KAGH,MAAAC,EAAI,SAASD,EAAO,EAAE,EAExB,GAAA,MAAMC,CAAC,EACH,MAAA,IAAI,MAAM,uBAAuB,EAGrC,GAAAA,EAAI,GAAKA,EAAI,GACT,MAAA,IAAI,MAAM,4BAA4B,EAG9C,OAAQD,EAAM,YACP,GACH,MAAO,IAAIC,QACR,GACI,OAAAD,UAED,MAAA,IAAI,MAAM,qBAAqB,EAE3C,EAEaE,GAAiBC,GAA4B,CACxD,GAAIA,IAAY,GACP,MAAA,KAGH,MAAAC,EAAI,SAASD,EAAS,EAAE,EAE1B,GAAA,MAAMC,CAAC,EACH,MAAA,IAAI,MAAM,yBAAyB,EAGvC,GAAAA,EAAI,GAAKA,EAAI,GACT,MAAA,IAAI,MAAM,8BAA8B,EAGhD,OAAQD,EAAQ,YACT,GACH,MAAO,IAAIC,QACR,GACI,OAAAD,UAED,MAAA,IAAI,MAAM,uBAAuB,EAE7C,EAEaE,GAAoBC,GAAyC,CACpE,GAAA,CAACC,GAAeD,CAAI,EACf,MAAA,CAAE,KAAAA,EAAM,QAAS,IAG1B,MAAME,EAAMF,GAAQA,EAAK,MAAM,mBAAmB,EAC9C,GAAAE,GAAOA,EAAI,SAAW,EACpB,GAAA,CACI,MAAAR,EAAQD,GAAYS,EAAI,EAAE,EAC1BL,EAAUD,GAAcM,EAAI,EAAE,EACpC,MAAO,CAAE,KAAM,GAAGR,KAASG,IAAW,QAAS,GAAK,MACpD,CACO,MAAA,CAAE,KAAAG,EAAM,QAAS,GAC1B,SACSE,GAAOA,EAAI,SAAW,EAAG,CAClC,IAAIR,EAAQ,EACRG,EAAU,EACd,OAAQG,EAAK,YACN,GACH,MAAO,CAAE,KAAM,IAAIA,OAAW,QAAS,QACpC,GACH,MAAMG,EAAa,SAASD,EAAI,GAAI,EAAE,EAClC,OAAAC,GAAc,GAAKA,EAAa,GAC3B,CAAE,KAAM,GAAGH,OAAW,QAAS,IAC7BG,GAAc,IAAMA,EAAa,GACnC,CAAE,KAAM,MAAMH,IAAQ,QAAS,IAEjC,CAAE,KAAAA,EAAM,QAAS,QACrB,GAEC,OADJH,EAAU,SAASG,EAAK,OAAO,EAAG,CAAC,EAAG,EAAE,EACpCH,GAAW,GAAKA,GAAW,GACtB,CACL,KAAM,IAAIG,EAAK,OAAO,EAAG,CAAC,KAAKA,EAAK,OAAO,EAAG,CAAC,IAC/C,QAAS,EAAA,EAGN,CAAE,KAAAA,EAAM,QAAS,QACrB,GAGC,OAFJN,EAAQ,SAASM,EAAK,OAAO,EAAG,CAAC,EAAG,EAAE,EACtCH,EAAU,SAASG,EAAK,OAAO,EAAG,CAAC,EAAG,EAAE,EACpCN,EAAQ,GAAKA,EAAQ,GAChB,CAAE,KAAAM,EAAM,QAAS,IAEtBH,EAAU,GAAKA,EAAU,GACpB,CAAE,KAAAG,EAAM,QAAS,IAEnB,CACL,KAAM,GAAGA,EAAK,OAAO,EAAG,CAAC,KAAKA,EAAK,OAAO,EAAG,CAAC,IAC9C,QAAS,EAAA,UAGJ,MAAA,CAAE,KAAAA,EAAM,QAAS,IAE9B,CAEO,MAAA,CAAE,KAAAA,EAAM,QAAS,GAC1B,EAEaC,GAAkBG,GACzBA,EACK,kBAAkB,KAAKA,CAAK,EAG9B,GC/FIC,GAA8C,CAAC,CAC1D3L,cAAAA,EACA4L,gBAAAA,EAAkB,GAClBC,QAAAA,EAAU,GACV9L,MAAAA,EACAjH,MAAAA,EAAQ,OACR8P,QAAAA,KACG3O,CAPuD,IAQtD,CACE,KAAA,CAAC6R,EAAOC,CAAR,EAAoBxK,WAAS,IAAMgK,GAAexL,CAAD,CAArB,EAE5BiM,EAAa,QAEbC,EAASlN,EAAAA,YAAY,IAAM,CAC/B,GAAIgB,EAAO,CACHmM,MAAAA,EAAkBb,GAAiBtL,CAAD,EACxCgM,EAASG,EAAgBC,OAAjB,EACJD,EAAgBC,SACdnM,GACFA,EAAckM,EAAgBZ,IAAjB,CAGlB,CACA,EAAA,CAACvL,EAAOC,EAAe+L,CAAvB,CAVuB,EAYpBhF,EAAkBhI,cACdlE,GAAA,CACAyQ,MAAAA,EAAOzQ,EAAGuR,OAAOrM,MACjBsM,EAAad,GAAeD,CAAD,EAEjCS,EAASM,GAAcf,EAAK5J,QAAUsK,EAAWtK,MAAzC,EAEJ1B,GACFA,EAAcsL,CAAD,CACd,EAEH,CAACtL,EAAe+L,CAAhB,CAXiC,EAcnC,aACGhD,EAAAA,UAAD,CAAA,GACM9O,EACJ,KAAM,OACN,QAAU6R,EAAkBlD,EAAV,QAClB,SAAUiD,EAAUS,EAAa1T,WAAAA,OACjC,MAAAmH,EACA,YAAa6L,EAAkBI,EAAapT,OAC5C,SAAUmO,EACV,OAAAkF,EACA,MAAAnT,CAAA,CAVJ,CAaD,ECTYyT,GAA8C,CAAC,CAC1DC,cAAAA,EACAC,eAAAA,EACAC,MAAAA,EACAC,QAAAA,EACAC,kBAAAA,EACAC,mBAAAA,EACAC,cAAAA,EACAC,gBAAAA,EACAC,iBAAAA,EACAC,SAAAA,EACAC,UAAAA,EACAC,aAAAA,EACAC,cAAAA,EACAC,UAAAA,EACAC,WAAAA,EACAC,QAAAA,EACAC,QAAAA,EACAC,SAAAA,EACAC,SAAAA,EACAC,YAAAA,EACAC,aAAAA,EACAC,gBAAAA,EACAC,iBAAAA,EACAC,WAAAA,EACAC,YAAAA,EACAC,YAAAA,EACAC,aAAAA,EACAC,aAAAA,EACAC,cAAAA,EACAxF,QAAAA,EACAyF,YAAAA,EACAC,aAAAA,EACArC,OAAAA,EACAsC,YAAAA,EACAC,UAAAA,EACAC,WAAAA,GACA5F,SAAAA,CArC0D,IAsCtD,CACE6F,MAAAA,EAAevF,SAAO,CAAD,EAErBwF,EAAmB/Z,EAAAA,QACvB,IACEga,EAAAA,SAAUF,GAAyB,CAC7BA,IAAiB,IACbzC,GAAA,MAAAA,IAEP,EAAA,EAJK,EAKV,CAACA,CAAD,CAP8B,EAU1B4C,GAAmB9P,cACflE,GAAA,CACO0O,EAAAA,UACboF,EAAiBD,EAAanF,OAAd,EACZ0E,GACFA,EAAYpT,CAAD,CAGf,EAAA,CAACoT,EAAaS,EAAcC,CAA5B,CARkC,EAW9BG,GAAoB/P,cAChBlE,GAAA,CACO0O,EAAAA,UACboF,EAAiBD,EAAanF,OAAd,EACZ2E,GACFA,EAAarT,CAAD,CAGhB,EAAA,CAACqT,EAAcQ,EAAcC,CAA7B,CARmC,EAW/BI,GAAkBhQ,cACdlE,GAAA,CACO0O,EAAAA,UACboF,EAAiBD,EAAanF,OAAd,EACZwE,GACFA,EAAWlT,CAAD,CAGd,EAAA,CAACkT,EAAYW,EAAcC,CAA3B,CARiC,EAW7BK,GAAmBjQ,cACflE,GAAA,CACO0O,EAAAA,UACboF,EAAiBD,EAAanF,OAAd,EACZyE,GACFA,EAAYnT,CAAD,CAGf,EAAA,CAACmT,EAAaU,EAAcC,CAA5B,CARkC,EAWpC,aACGlU,EAAAA,IAAD,CAAA,gBACGwU,eAAD,CACE,2BADF,GAEE,SAAApG,EACA,QAAAD,EACA,oBACG3L,MAAD,CAAK,WAAY,SAAjB,SAAA,CACEvC,EAAA,IAAC+E,SAAD,CAAQ,IAAK,GAAb,eACGvC,aAAD,CACE,SAAU8L,EAAAA,cACV,QAAS6E,EACT,SAAAhF,EACA,KAAM,OAAA,CAJR,CAAA,CAFJ,EAUG0F,EACCvR,EAAA,KAAAV,WAAA,CAAA,SAAA,CACE5B,EAAA,IAACuC,MAAD,CAAK,OAAQ,OAAb,eACGiS,gBAAD,CAAe,SAAQ,EAAA,CAAvB,CAAA,CAFJ,EAKExU,EAAA,IAAC+E,SAAD,CAAQ,IAAK,GAAb,eACGvC,aAAD,CACE,SAAUiS,EAAAA,eACV,QAASrB,EACT,SAAAjF,EACA,KAAM,OAAA,CAJR,CAAA,CANJ,CAAA,CAAA,CAAA,EAcE,IAzBN,CAAA,CALJ,EAAA,SAAA,CAkCEnO,EAAA,IAACD,MAAD,CAAK,MAAO+T,EAAZ,eACGzF,YAAD,CACE,MAAA2D,EACA,QAAAC,EACA,QAASgB,EACT,SAAA9E,EACA,WALF,GAME,YAAakE,EACb,MAAOM,EACP,cAAeT,EACf,SAAUO,EACV,OAAQ4B,GACR,QAASF,GACT,SAAUV,EACV,QAASE,EACT,KAAMpB,EACN,UAAWT,EACX,IAAKe,EACL,IAAKC,CAAAA,CAjBP,CAAA,CAnCJ,EAuDE9S,EAAA,IAACuC,MAAD,CAAK,OAAQ,GAAK,WAAY,SAAU,eAAgB,SAAxD,eACG4M,OAAD,CACE,KAAMiD,EACN,KAAM,GACN,MAAO/C,YAAS,qBAAD,CAAA,CAHjB,CAAA,CAxDJ,EA8DErP,EAAA,IAACD,MAAD,CAAK,MAAOgU,GAAZ,eACG1F,YAAD,CACE,MAAA2D,EACA,QAAAC,EACA,QAASiB,EACT,SAAA/E,EACA,WALF,GAME,YAAamE,EACb,MAAOM,EACP,cAAeT,EACf,SAAUO,EACV,OAAQ4B,GACR,QAASF,GACT,SAAUV,EACV,QAASE,EACT,KAAMpB,EACN,UAAWT,EACX,IAAKgB,EACL,IAAKC,CAAAA,CAjBP,CAAA,CA/DJ,CAAA,CAAA,CAAA,CAAA,CAFJ,CAwFD,EChOY0B,GACX9D,GACkB,CAClB,GAAIA,GAAQ,KACJ,MAAA,IAAI,MAAM,kBAAkB,EAEpC,GAAIA,IAAS,GACL,MAAA,IAAI,MAAM,gBAAgB,EAE5B,MAAAlF,EAAQkF,EAAK,MAAM,GAAG,EACxB,GAAAlF,EAAM,SAAW,EACb,MAAA,IAAI,MAAM,eAAe,EAG7B,GAAAA,EAAM,GAAG,SAAW,EAChB,MAAA,IAAI,MAAM,eAAe,EAGjC,GAAIA,EAAM,GAAG,OAAS,GAAKA,EAAM,GAAG,OAAS,EACrC,MAAA,IAAI,MAAM,eAAe,EAGjC,MAAM4E,EAAQ,SAAS5E,EAAM,GAAI,EAAE,EAC7B+E,EAAU,SAAS/E,EAAM,GAAI,EAAE,EAEjC,GAAA,MAAM4E,CAAK,EACP,MAAA,IAAI,MAAM,eAAe,EAE7B,GAAA,MAAMG,CAAO,EACT,MAAA,IAAI,MAAM,eAAe,EAE7B,GAAAH,EAAQ,GAAKA,EAAQ,GACjB,MAAA,IAAI,MAAM,eAAe,EAE7B,GAAAG,EAAU,GAAKA,EAAU,GACrB,MAAA,IAAI,MAAM,eAAe,EAEjC,OAAOH,EAAQ,IAAMG,CACvB,EAEakE,GAAqB/D,GAAsC,CAClE,GAAA,CACF,OAAA8D,GAA4B9D,CAAI,EACzB,SAEA,MAAA,EACT,CACF,EAEagE,GACXvP,GAIG,CACC,GAAAA,GAASsP,GAAkBtP,CAAK,EAAG,CAC/B,MAAAwP,EAAIxP,EAAM,MAAM,GAAG,EAClB,MAAA,CACL,KAAMyP,EAAsB,sBAAAD,EAAE,EAAE,EAChC,OAAQC,EAAsB,sBAAAD,EAAE,EAAE,CAAA,CAEtC,CACO,MAAA,CACL,KAAM,OACN,OAAQ,MAAA,CAEZ,EAEaE,GAAmC1d,GAC9C,GAAGgZ,GAAY,OAAOhZ,EAAK,SAAU,CAAA,CAAC,KAAKmZ,GACzC,OAAOnZ,EAAK,YAAY,CAC1B,mGCnFW2d,GAAgD,CAAC,CAC5DC,QAAAA,EACAhJ,KAAAA,EACAiJ,SAAAA,EACAC,UAAAA,EACAC,aAAAA,CAL4D,IAMxD,CACEC,MAAAA,EAAM5G,SAAuB,IAAjB,EAElB7G,OAAAA,EAAAA,UACE,UAAgC,CAC9B,GACEsN,GACAC,EAAUtG,SACVwG,EAAIxG,SACJuG,EAAavG,QACb,CACMyG,MAAAA,EAAeD,EAAIxG,QAAQ0G,aAAeC,KAAKtd,IAAI+T,EAAO,EAAG,CAAnB,EACtC4C,EAAAA,QAAQ4G,SAAS,EAAGH,CAA9B,EACAF,EAAavG,QAAU,EACxB,GAEH,CAACsG,EAAWlJ,EAAMiJ,EAAUE,CAA5B,CAbO,QAiBN7S,EAAAA,IAAD,CACE,MAAO,OACP,eAAgB,SAChB,QAAS,GACT,OAAQ,GACR,IAAA8S,EALF,SAOGH,EACClV,EAAA,IAACwF,gBAAD,CACE,MAAO9C,OAAOuJ,CAAD,EACb,QAAS,IAAMgJ,GAAWA,EAAQhJ,CAAD,CAAA,CAH5B,EAMPjM,EAAA,IAACwC,aAAD,CACE,MAAOE,OAAOuJ,CAAD,EACb,QAAS,IAAMgJ,GAAWA,EAAQhJ,CAAD,CAAA,CAFnC,CAAA,CAdN,CAqBD,EC9CYyJ,GAAoC,CAAC,CAChDT,QAAAA,EACAU,MAAAA,EACAC,aAAAA,EACAR,aAAAA,CAJgD,IAK5C,CACED,MAAAA,EAAY1G,SAAuB,IAAjB,EAExB,aACGlI,EAAAA,OAAD,CAAQ,UAAWrD,GAAO2S,iBAAkB,IAAKV,EAAjD,SACGQ,EAAMhV,IAAKsL,SACT+I,GAAD,CAEE,KAAA/I,EACA,QAAAgJ,EACA,SAAUhJ,IAAS2J,EACnB,UAAAT,EACA,aAAAC,CANF,EACOnJ,CADP,CADD,CAAA,CAFL,CAcD,ECpBKqE,GAAQ3I,EAAM,MAAA,EAAG,EAAJ,EACb8I,GAAU9I,EAAM,MAAA,EAAG,EAAJ,EAERmO,GAAwC,CAAC,CACpDzQ,MAAAA,EACAC,cAAAA,CAFoD,IAGhD,CACE8P,MAAAA,EAAe3G,SAAO,EAAD,EACrB,CAACsH,EAAMC,CAAP,EAAkBnP,EAAAA,SAA6B3I,MAArB,EAC1B,CAAC+X,EAAQC,CAAT,EAAsBrP,EAAAA,SAA6B3I,MAArB,EAEpC0J,EAAAA,UAAU,IAAM,CACd,GAAIvC,EAAO,CACH,KAAA,CAAE4Q,OAAAA,EAAQF,KAAAA,CAAAA,EAASnB,GAAiCvP,CAAD,EACzD2Q,EAAQD,CAAD,EACPG,EAAUD,CAAD,CACV,CAAA,EACA,CAAC5Q,CAAD,CANM,EAQH8Q,MAAAA,EAAc9R,cACjBkM,GAAc,CACbyF,EAAQzF,CAAD,EACPjL,GAAAA,MAAAA,EACG,GAAE+K,GAAY3N,OAAO6N,GAAAA,KAAAA,EAAK,CAAN,CAAP,KAAoBC,GAAc9N,OAAOuT,GAAAA,KAAAA,EAAU,CAAX,CAAP,IADpC,EAIf,CAACA,EAAQ3Q,CAAT,CAP6B,EAUzB8Q,EAAiB/R,cACpBqM,GAAc,CACbwF,EAAUxF,CAAD,EACTpL,GAAAA,MAAAA,EACG,GAAE+K,GAAY3N,OAAOqT,GAAAA,KAAAA,EAAQ,CAAT,CAAP,KAAuBvF,GAAc9N,OAAOgO,GAAAA,KAAAA,EAAK,CAAN,CAAP,IADvC,EAIf,CAACqF,EAAMzQ,CAAP,CAPgC,EAUlC,cACG/C,EAAAA,IAAD,CAAK,UAAWW,GAAOmT,WAAvB,SAAA,CACErW,EAAA,IAAC0V,GAAD,CACE,MAAOpF,GACP,QAAS6F,EACT,aAAcJ,EACd,aAAAX,CAAA,CAJF,EAMCpV,EAAA,IAAA+E,EAAA,OAPH,CAAA,CAAA,QAQG2Q,GAAD,CACE,MAAOjF,GACP,QAAS2F,EACT,aAAcH,EACd,aAAAb,CAAA,CAZJ,CAAA,CAAA,CADF,CAiBD,ECrEYkB,GAAsB,CACjCjf,EACA8M,EACAoS,IACG,CACH3O,EAAA,UACE,UAA0C,CACpCvQ,GACF8M,EAAe9M,CAAI,CAEvB,EACA,CAACA,EAAM8M,CAAc,CAAA,EAGvByD,EAAA,UACE,UAA2C,CACrC2O,EAAa,UACXlf,EACWkf,EAAA,QAAQ,YAAc,IAAI,KACrC,KAAK,IAAIlf,EAAK,YAAY,EAAGA,EAAK,SAAS,EAAGA,EAAK,SAAS,CAAA,EAG9Dkf,EAAa,QAAQ,YAAc,KAGzC,EACA,CAAClf,EAAMkf,CAAY,CAAA,CAEvB,ECzBaC,GAAuB,CAClCnf,EACAiO,EACA,CACE,eAAAnB,EACA,qBAAAsS,EACA,qBAAAC,EACA,qBAAAC,EACA,gBAAAnO,EACA,UAAAoO,EACA,aAAAC,EACA,UAAAC,EACA,aAAAC,CACF,EACAR,IACG,CACH,MAAMS,EAAe3S,EAAA,YAClB4S,GAA8B,CAC7B,GAAI,CAACA,EACH,OAEI,MAAAtO,EAAU,IAAI,KAAKsO,CAAY,EAErC,GAAI5f,EAGMsR,EAAA,SAAStR,EAAK,SAAU,CAAA,EACxBsR,EAAA,WAAWtR,EAAK,WAAY,CAAA,EAEpCiO,GAAA,MAAAA,EAAgBqD,GAChBoO,EAAa,MAAS,UACbH,EAAW,CAEpB,KAAM,CAAE,OAAAX,EAAQ,KAAAF,CAAK,EAAInB,GAAiCgC,CAAS,EAE3DjO,EAAA,SAASoN,GAAA,KAAAA,EAAQ,CAAC,EAClBpN,EAAA,WAAWsN,GAAA,KAAAA,EAAU,CAAC,EAE9B3Q,GAAA,MAAAA,EAAgBqD,GAChBoO,EAAa,MAAS,CAAA,MAGtBA,EAAapO,CAAO,EAEtBxE,EAAewE,CAAO,EAClB4N,EAAa,UACFA,EAAA,QAAQ,YAAc,IAAI,KACrC,KAAK,IAAI5N,EAAQ,YAAY,EAAGA,EAAQ,SAAS,EAAGA,EAAQ,SAAS,CAAA,EAG3E,EACA,CAACtR,EAAMkf,EAAcK,EAAWtR,EAAenB,EAAgB4S,CAAY,CAAA,EAGvEG,EAAe7S,EAAA,YAClBuM,GAAiB,CAChB,GAAI,EAACA,EAIL,GAAIvZ,EAAM,CAEF,MAAA8f,EAAUvC,GAAiChE,CAAI,EAC/CjI,EAAU,IAAI,KAAKtR,CAAI,EAErBsR,EAAA,SAASwO,EAAQ,MAAQ,CAAC,EAC1BxO,EAAA,WAAWwO,EAAQ,QAAU,CAAC,EAEtC7R,GAAA,MAAAA,EAAgBqD,GAChBkO,EAAa,MAAS,UACbC,EAAW,CAEd,MAAAK,EAAUvC,GAAiChE,CAAI,EAC/CjI,EAAU,IAAI,KAAKmO,CAAS,EAE1BnO,EAAA,SAASwO,EAAQ,MAAQ,CAAC,EAC1BxO,EAAA,WAAWwO,EAAQ,QAAU,CAAC,EAEtC7R,GAAA,MAAAA,EAAgBqD,GAChBkO,EAAa,MAAS,CAAA,MAGtBA,EAAajG,CAAI,CAErB,EACA,CAACtL,EAAejO,EAAMyf,EAAWD,CAAY,CAAA,EAGzCO,EAAyB/S,EAAA,YAC5BlE,GAAsC,CACjCA,EAAG,OAAO,MAAM,KAAO,KACZ6W,EAAA7W,EAAG,OAAO,WAAW,CAEtC,EACA,CAAC6W,CAAY,CAAA,EAGTK,EAA0BhT,EAAA,YAC7BlE,GAAsC+W,EAAa/W,EAAG,OAAO,KAAK,EACnE,CAAC+W,CAAY,CAAA,EAGT5J,EAAejJ,EAAAA,YAAY,IAAM,CAEnCF,EADE9M,GAGa,IAAI,IAFA,EAIrBmR,EAAgB,UAAU,EACLiO,KACpB,CAACpf,EAAMmR,EAAiBiO,EAAsBtS,CAAc,CAAC,EAE1DoJ,EAAelJ,EAAAA,YAAY,IAAM,CACrCsS,EAAqB,MAAS,EACTD,GAAA,EACpB,CAACC,EAAsBD,CAAoB,CAAC,EAExC,MAAA,CACL,uBAAAU,EACA,wBAAAC,EACA,aAAA9J,EACA,aAAAD,EACA,aAAA4J,EACA,aAAAF,CAAA,CAEJ,EC3HaM,GAAkBjgB,GAAkC,CAC/D,KAAM,CAACyf,EAAWC,CAAY,EAAIlQ,EAAAA,SAA2B,MAAS,EAChE,CAAC+P,EAAWC,CAAY,EAAIhQ,EAAAA,SAA6B,MAAS,EAElE,CAAC0Q,EAAmBd,EAAsBC,CAAoB,EAClEc,EAAAA,WAAW,EAAK,EAEZ,CAACC,EAAqBC,EAAgBC,CAAc,EACxDH,EAAAA,WAAW,EAAK,EAEZ,CAACI,EAAmBjB,CAAoB,EAAI9P,EAAAA,SAEhD,MAAS,EAEL,CAACjP,EAAauM,CAAc,EAAI0C,EAAA,SACpC,IAAMxP,GAAA,KAAAA,EAAQ,IAAI,IAAK,EAGnB,CAACkR,EAAcC,CAAe,EAClC3B,WAA4B,UAAU,EAEjC,MAAA,CACL,kBAAA0Q,EACA,qBAAAd,EACA,qBAAAC,EACA,kBAAAkB,EACA,qBAAAjB,EACA,YAAA/e,EACA,eAAAuM,EACA,aAAAoE,EACA,gBAAAC,EACA,oBAAAiP,EACA,eAAAC,EACA,eAAAC,EACA,UAAAb,EACA,aAAAC,EACA,UAAAH,EACA,aAAAC,CAAA,CAEJ,ECzCagB,GAAuB,CAClCb,EACAT,EACAjJ,EACAC,EACA,CACE,kBAAAgK,EACA,gBAAA/O,EACA,eAAAkP,EACA,eAAAC,CACF,IACG,CACG,MAAApE,EAAclP,EAAAA,YAAY,IAAM,CAC/BkT,GACUjK,IAEf9E,EAAgB,UAAU,EACXmP,KACd,CAACA,EAAgBJ,EAAmB/O,EAAiB8E,CAAY,CAAC,EAE/DkG,EAAenP,EAAAA,YAAY,IAAM,CACxBkJ,IACEmK,GAAA,EACd,CAACnK,EAAcmK,CAAc,CAAC,EAE3BnX,EAAa8D,EAAA,YAChB7K,GAAiB,CAChBwd,EAAaxd,EAAI,IAAI,EACR+T,IACEmK,GACjB,EACA,CAACV,EAAczJ,EAAcmK,CAAc,CAAA,EAGvCI,EAAqBzT,EAAAA,YAAY,IAAM,CAC3CmE,EAAgB,SAAS,EACZ8E,GAAA,EACZ,CAAC9E,EAAiB8E,CAAY,CAAC,EAE5ByK,EAAwB1T,EAAAA,YAAY,IAAM,OAC1CkT,EACWhK,MAEblU,EAAAkd,EAAa,UAAb,MAAAld,EAAsB,QACtBmP,EAAgB,UAAU,EACb8E,IACf,EACC,CACDiK,EACAhK,EACAgJ,EACA/N,EACA8E,CAAA,CACD,EAEK0K,EAAmB3T,EAAA,YACtBlE,GAA4C,CACvCA,EAAG,MAAQ,UACAoN,GAEjB,EACA,CAACA,CAAY,CAAA,EAGR,MAAA,CACL,YAAAgG,EACA,aAAAC,EACA,WAAAjT,EACA,mBAAAuX,EACA,sBAAAC,EACA,iBAAAC,CAAA,CAEJ,ECxCaC,GAA8C,CAAC,CAC1D5S,MAAAA,EACAC,cAAAA,EACA2M,QAAAA,EACAD,MAAAA,EACAT,OAAAA,EACA2G,UAAAA,EACA7Y,QAAAA,EACAyU,UAAAA,EAAY,IACZC,WAAAA,EAAa,GACbzU,QAAAA,EAAUoO,GACVQ,QAAAA,EACAC,SAAAA,CAZ0D,IAatD,CACEoI,MAAAA,EAA2C9H,SAAO,IAAD,EACjD0J,EAA2C1J,SAAO,IAAD,EAEjD2J,EAASd,GAAejS,CAAD,EAEvB,CACJmD,gBAAAA,EACAD,aAAAA,EACAgP,kBAAAA,EACA3f,YAAAA,EACAuM,eAAAA,EACAsT,oBAAAA,EACAE,eAAAA,EACAf,UAAAA,EACAE,UAAAA,CACEsB,EAAAA,EAEE,CACJ9K,aAAAA,EACAC,aAAAA,EACA6J,uBAAAA,EACAC,wBAAAA,EACAH,aAAAA,EACAF,aAAAA,CACER,EAAAA,GAAqBnR,EAAOC,EAAe8S,EAAQ7B,CAA/B,EAElB,CACJyB,iBAAAA,EACAxE,aAAAA,EACAD,YAAAA,EACAhT,WAAAA,EACAwX,sBAAAA,EACAD,mBAAAA,EAAAA,EACED,GACFb,EACAT,EACAjJ,EACAC,EACA6K,CALsB,EAQJ/S,GAAAA,EAAOlB,EAAgBoS,CAAxB,EAEbxf,MAAAA,EAAgBmD,EAAAA,QAAQ,IAAM,CAClC,MAAMme,GAAkBhT,GAASyR,EACjC,OAAKuB,GAGE5gB,EAAsByG,OAAWma,GAAiB,CACvD,iBACA,UAFuD,CAA7B,EAFnB,EAEmB,EAI3B,CAACvB,EAAWzR,CAAZ,CAT0B,EAWvBiT,EAAUjU,EAAAA,YAAY,IAAM,CACpBkJ,IACEoK,GAAA,EACb,CAACpK,EAAcoK,CAAf,CAHwB,EAKrBY,EAAYre,EAAAA,QAChB,IAAOmL,EAAQ0P,GAAgC1P,CAAD,EAAUuR,EACxD,CAACvR,EAAOuR,CAAR,CAFuB,EAKnB4B,GAA2BC,EAAAA,gBAAgBlB,EAAmB,GAApB,EAC1CmB,GAA6BD,EAAAA,gBAAgBhB,EAAqB,GAAtB,EAElD,aACG1X,EAAAA,IAAD,CAAK,UAAWiY,EAAhB,eACG5J,UAAD,CACE,MAAO,GACP,KAFF,GAGE,SAAAD,EACA,UAAWxB,GACX,QAAS4K,GAAqBE,EAC9B,eAAgBa,EAChB,SACGE,IAA4BE,KAC3B1Y,EAAAA,IAACuG,EAAAA,OAAD,CAAA,SACGiS,GACCxY,EAAA,IAACiJ,EAAD,CACE,cAAAlS,EACA,WAAAwJ,EACA,YAAA3I,EACA,eAAAuM,EACA,aAAAoE,EACA,gBAAAC,EACA,QAAAnJ,EACA,QAAAC,CAAA,CARF,EAUEoZ,GACFpW,EAAA,KAACiE,SAAD,CAAA,SAAA,CACEvG,EAAA,IAACuG,SAAD,CAAQ,SAAU,SAAU,OAAQ,QAApC,eACGuP,GAAD,CACE,MAAOyC,GAAAA,KAAAA,EAAa,GACpB,cAAerB,CAAAA,CAFjB,CAAA,CADF,EAMClX,EAAA,IAAAyC,EAAA,MAPH,CAAA,CAAA,QAQGF,EAAAA,IAAD,CAAK,eAAgB,WAArB,eACGiD,gBAAD,CAAe,MAAO,OAAQ,QAASmS,CAAAA,CAAvC,CAAA,CATJ,CAAA,CAAA,CAAA,EAYE,IAAA,CAlCZ,EAAA,eAuCG9F,GAAD,CACE,cAAeqG,EACf,MAAAlG,EACA,QAAAC,EACA,OAAAV,EACA,SAAApD,EACA,cAAeyD,EAAAA,WACf,SAAU,OACV,UAAW,OACX,gBAAiB,aACjB,iBAAkB,QAClB,aAAcwF,EACd,cAAeC,EACf,iBAAkBS,GAClB,gBAAiBC,EACjB,YAAAxE,EACA,aAAAC,EACA,YAAaD,EACb,aAAcC,EACd,aAAc+C,EACd,cAAe4B,EACf,WAAYI,GAAAA,KAAAA,EAAa,GACzB,UAAAzE,EACA,WAAAC,EACA,QAAS1U,EACT,QAASC,EACT,QAAA4O,CAAA,CA1BF,CAAA,CAvCF,CAAA,CAFJ,CAwED,EC5LYoI,GAAsB,CACjCzc,EACAC,EACAqK,EACAqK,EACAE,IACG,CACH9G,EAAA,UACE,UAA+C,CACzC/N,GACFsK,EAAetK,CAAS,CAE5B,EACA,CAACA,EAAWsK,CAAc,CAAA,EAG5ByD,EAAA,UACE,UAA6C,CACvC9N,GACFqK,EAAerK,CAAO,CAE1B,EACA,CAACA,EAASqK,CAAc,CAAA,EAG1ByD,EAAA,UACE,UAAgD,CAC1C4G,EAAkB,UAChB3U,EACgB2U,EAAA,QAAQ,YAAc,IAAI,KAC1C,KAAK,IACH3U,EAAU,YAAY,EACtBA,EAAU,SAAS,EACnBA,EAAU,QAAQ,CACpB,CAAA,EAGF2U,EAAkB,QAAQ,YAAc,KAG9C,EACA,CAAC3U,EAAW2U,CAAiB,CAAA,EAG/B5G,EAAA,UACE,UAA8C,CACxC8G,EAAgB,UACd5U,EACc4U,EAAA,QAAQ,YAAc,IAAI,KACxC,KAAK,IACH5U,EAAQ,YAAY,EACpBA,EAAQ,SAAS,EACjBA,EAAQ,QAAQ,CAClB,CAAA,EAGF4U,EAAgB,QAAQ,YAAc,KAG5C,EACA,CAAC5U,EAAS4U,CAAe,CAAA,CAE7B,EC5Da8H,GAAuB,CAClC3c,EACAC,EACAwL,EACA,CACE,eAAAnB,EACA,qBAAAsS,EACA,qBAAAC,EACA,qBAAAC,EACA,gBAAAnO,CACF,IACG,CACH,MAAM4O,EAAyB/S,EAAA,YAC5BlE,GAAsC,OACjCA,EAAG,OAAO,MAAM,KAAO,MACTmF,GAAA,MAAAA,EAAA,CACd,WAAWjM,EAAA8G,EAAG,OAAO,cAAV,KAAA9G,EAAyB,OACpC,QAAAS,CAAA,GAGN,EACA,CAACwL,EAAexL,CAAO,CAAA,EAGnBud,EAA0BhT,EAAA,YAC7BlE,GAAsC,OACjCA,EAAG,OAAO,MAAM,KAAO,MACTmF,GAAA,MAAAA,EAAA,CACd,UAAAzL,EACA,SAASR,EAAA8G,EAAG,OAAO,cAAV,KAAA9G,EAAyB,MAAA,GAGxC,EACA,CAACiM,EAAezL,CAAS,CAAA,EAGrByT,EAAejJ,EAAAA,YAAY,IAAM,CAEnCF,EADEtK,GAEOC,GAGM,IAAI,IAJK,EAM1B0O,EAAgB,UAAU,EACLiO,GAAA,EACpB,CACD5c,EACAC,EACA0O,EACAiO,EACAtS,CAAA,CACD,EAEKoJ,EAAelJ,EAAAA,YAAY,IAAM,CACrCsS,EAAqB,MAAS,EACTD,GAAA,EACpB,CAACC,EAAsBD,CAAoB,CAAC,EAExC,MAAA,CACL,uBAAAU,EACA,wBAAAC,EACA,aAAA9J,EACA,eAAApJ,EACA,gBAAAqE,EACA,aAAA8E,CAAA,CAEJ,EChEagK,GAAiB,CAC5Bzd,EACAC,IACG,CACH,KAAM,CAACyd,EAAmBd,EAAsBC,CAAoB,EAClEc,EAAAA,WAAW,EAAK,EAEZ,CAACI,EAAmBjB,CAAoB,EAAI9P,EAAAA,SAEhD,MAAS,EAEL,CAACkD,EAAcC,CAAe,EAClCnD,WAAgC,WAAW,EAEvC,CAACjP,EAAauM,CAAc,EAAI0C,WAAe,IAAM,CACzD,MAAM8R,EACJ5O,IAAiB,YACblQ,EACAkQ,IAAiB,UACjBjQ,EACA,OAEC,OAAA6e,GAAA,KAAAA,EAAa,IAAI,IAAK,CAC9B,EAEK,CAACpQ,EAAcC,CAAe,EAClC3B,WAA4B,UAAU,EAEjC,MAAA,CACL,kBAAA0Q,EACA,qBAAAd,EACA,qBAAAC,EACA,kBAAAkB,EACA,qBAAAjB,EACA,aAAA5M,EACA,gBAAAC,EACA,YAAApS,EACA,eAAAuM,EACA,aAAAoE,EACA,gBAAAC,CAAA,CAEJ,ECzCaqP,GAAuB,CAClChe,EACAC,EACAwL,EACAkJ,EACAE,EACApB,EACAC,EACA,CACE,kBAAAqK,EACA,qBAAAjB,EACA,kBAAAY,EACA,gBAAAvN,EACA,aAAAD,EACA,gBAAAvB,CACF,IACG,CACG,MAAA+K,EAAclP,EAAAA,YAAY,IAAM,CAChCuT,GAAqB,MACvBjB,EAAqB,WAAW,EAElC3M,EAAgB,WAAW,EACtBuN,GACUjK,GACf,EACC,CACDiK,EACAvN,EACAsD,EACAqJ,EACAiB,CAAA,CACD,EAEKpE,EAAenP,EAAAA,YAAY,IAAM,CACjCuT,GAAqB,MACvBjB,EAAqB,SAAS,EAEhC3M,EAAgB,SAAS,EACpBuN,GACUjK,GACf,EACC,CACDiK,EACAvN,EACAsD,EACAqJ,EACAiB,CAAA,CACD,EAEKrX,EAAa8D,EAAA,YAChB7K,GAAiB,aACZuQ,IAAiB,YACfjQ,GAAW,MAAQ5C,EAAAA,QAAQsC,EAAI,KAAMM,CAAO,GAC9BwL,GAAA,MAAAA,EAAA,CACd,UAAW9L,EAAI,KACf,QAAS,MAAA,GAEXwQ,EAAgB,SAAS,GACzB3Q,EAAAqV,EAAgB,UAAhB,MAAArV,EAAyB,UAETiM,GAAA,MAAAA,EAAA,CACd,UAAW9L,EAAI,KACf,QAAAM,CAAA,GAEE8d,IAAsB,aACxB5N,EAAgB,SAAS,GACzBgD,EAAA0B,EAAgB,UAAhB,MAAA1B,EAAyB,SAEzB,WAAWO,EAAc,EAAE,GAGtBxD,IAAiB,YACrBlQ,EAOM3C,EAAAA,QAAQ2C,EAAWL,EAAI,IAAI,GACpB8L,GAAA,MAAAA,EAAA,CACd,UAAW9L,EAAI,KACf,QAAS,MAAA,GAEXwQ,EAAgB,SAAS,GACzB4O,EAAAlK,EAAgB,UAAhB,MAAAkK,EAAyB,UAETtT,GAAA,MAAAA,EAAA,CACd,UAAAzL,EACA,QAASL,EAAI,IAAA,GAEf,WAAW+T,EAAc,EAAE,IAlBXjI,GAAA,MAAAA,EAAA,CACd,UAAAzL,EACA,QAASL,EAAI,IAAA,GAEfwQ,EAAgB,WAAW,GAC3B6O,EAAArK,EAAkB,UAAlB,MAAAqK,EAA2B,SAgBjC,EACA,CACE9O,EACAzE,EACAxL,EACA8d,EACA5N,EACA0E,EACAnB,EACA1T,EACA2U,CACF,CAAA,EAGIsJ,EAAqBzT,EAAAA,YAAY,IAAM,CAC3CmE,EAAgB,SAAS,EACZ8E,GAAA,EACZ,CAAC9E,EAAiB8E,CAAY,CAAC,EAE5ByK,EAAwB1T,EAAAA,YAAY,IAAM,OAC1CkT,EACWhK,KAEbvD,EAAgB,WAAW,EAC3B2M,EAAqB,WAAW,GAChCtd,EAAAmV,EAAkB,UAAlB,MAAAnV,EAA2B,QAC3BmP,EAAgB,UAAU,EACb8E,IACf,EACC,CACDiK,EACAhK,EACAvD,EACA2M,EACAnI,EACAhG,EACA8E,CAAA,CACD,EAEK0K,EAAmB3T,EAAA,YACtBlE,GAA4C,CACvCA,EAAG,MAAQ,UACAoN,GAEjB,EACA,CAACA,CAAY,CAAA,EAGR,MAAA,CACL,YAAAgG,EACA,aAAAC,EACA,WAAAjT,EACA,mBAAAuX,EACA,sBAAAC,EACA,iBAAAC,CAAA,CAEJ,ECvHO,SAASc,GAA8B,CAC5CzT,MAAAA,EACAC,cAAAA,EACA4S,UAAAA,EACA3G,OAAAA,EACAU,QAAAA,EACAD,MAAAA,EACA3S,QAAAA,EACAC,QAAAA,EAAUoO,GACVrE,cAAAA,EACAyK,UAAAA,EAAY,IACZC,WAAAA,EAAa,IACb7F,QAAAA,EACAC,SAAAA,CAb4C,EAcP,CAC/B,KAAA,CAAEtU,UAAAA,EAAWC,QAAAA,CAAAA,EAAYuL,GAAS,CAAA,EAElCmJ,EAAgDC,SAAO,IAAD,EACtDC,EAA8CD,SAAO,IAAD,EAEpD2J,EAASd,GAAezd,EAAWC,CAAZ,EAEvB,CACJlC,YAAAA,EACAuM,eAAAA,EACAoT,kBAAAA,EACAhP,aAAAA,EACAC,gBAAAA,CACE4P,EAAAA,EAEE,CACJ9K,aAAAA,EACAC,aAAAA,EACA6J,uBAAAA,EACAC,wBAAAA,CACEb,EAAAA,GAAqB3c,EAAWC,EAASwL,EAAe8S,CAApC,EAElB,CACJJ,iBAAAA,EACAxE,aAAAA,EACAD,YAAAA,EACAhT,WAAAA,EACAwX,sBAAAA,EACAD,mBAAAA,CAAAA,EACED,GACFhe,EACAC,EACAwL,EACAkJ,EACAE,EACApB,EACAC,EACA6K,CARsB,EAWxB9B,GACEzc,EACAC,EACAqK,EACAqK,EACAE,CALiB,EAQnB,MAAMK,EAAsB7U,EAAAA,QAC1B,IAAML,GAAaC,GAAW5C,EAAAA,QAAQ2C,EAAWC,CAAZ,EACrC,CAACD,EAAWC,CAAZ,CAFiC,EAK7B/C,EAAgBmD,EAAAA,QACpB,IACEvC,GACE0R,GAAAA,YAAAA,EAAetS,cACf8C,EACAC,EACAlC,CAJyB,EAM7B,CAACyR,GAAAA,YAAAA,EAAetS,cAAe8C,EAAWC,EAASlC,CAAnD,CAR2B,EAWvB4gB,GAA2BC,EAAAA,gBAAgBlB,EAAmB,GAApB,EAEhD,aACGxX,EAAAA,IAAD,CAAK,UAAWiY,EAAhB,eACG5J,UAAD,CACE,MAAO,GACP,KAFF,GAGE,SAAAD,EACA,UAAWxB,GACX,eAAgBY,EAChB,QAASgK,EACT,QACEiB,IACExY,EAAA,IAACiJ,EAAD,CACE,WAAA1I,EACA,YAAA3I,EACA,eAAAuM,EACA,aAAAoE,EACA,gBAAAC,EACA,QAAAnJ,EACA,QAAAC,EAPF,GAQM+J,EACJ,cAAAtS,CAAA,CAlBR,EAAA,eAuBG8a,GAAD,CACE,cAAeqG,EACf,MAAAlG,EACA,QAAAC,EACA,OAAAV,EACA,SAAApD,EACA,cAAe4K,EAAAA,gBACf,SAAU,OACV,UAAW,OACX,gBAAiB,aACjB,iBAAkB,WAClB,aAAc3B,EACd,cAAeC,EACf,iBAAkBS,EAClB,gBAAiBC,EACjB,YAAAxE,EACA,aAAAC,EACA,YAAaD,EACb,aAAcC,EACd,aAAchF,EACd,cAAeE,EACf,QAASK,EAAsB,QAAUb,EACzC,UAAA4F,EACA,WAAAC,EACA,QAAS1U,EACT,QAASC,EACT,SAAUD,EACV,SAAUC,CAAAA,CA3BZ,CAAA,CAvBF,CAAA,CAFJ,CAyDD"}