@servicetitan/anvil2 1.45.1 → 1.45.2

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.
Files changed (106) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/dist/{Calendar-Dq_of5A3.js → Calendar-BK861SAW.js} +1173 -166
  3. package/dist/Calendar-BK861SAW.js.map +1 -0
  4. package/dist/Calendar.css +83 -47
  5. package/dist/Calendar.js +1 -1
  6. package/dist/{Checkbox-BiOzGpgJ.js → Checkbox-CYNjFdtO.js} +2 -2
  7. package/dist/{Checkbox-BiOzGpgJ.js.map → Checkbox-CYNjFdtO.js.map} +1 -1
  8. package/dist/{Checkbox-3y2d9mBd.js → Checkbox-ZphVb1l0.js} +2 -2
  9. package/dist/{Checkbox-3y2d9mBd.js.map → Checkbox-ZphVb1l0.js.map} +1 -1
  10. package/dist/Checkbox.js +2 -2
  11. package/dist/Combobox.js +1 -1
  12. package/dist/{DateField-B2mnasH5.js → DateField-DnasO2rB.js} +4 -4
  13. package/dist/{DateField-B2mnasH5.js.map → DateField-DnasO2rB.js.map} +1 -1
  14. package/dist/DateField.js +1 -1
  15. package/dist/{DateFieldRange-DPbyzuHb.js → DateFieldRange-Ba-8T-Nz.js} +31 -25
  16. package/dist/DateFieldRange-Ba-8T-Nz.js.map +1 -0
  17. package/dist/DateFieldRange.js +1 -1
  18. package/dist/{DateFieldSingle-CfAJDcx9.js → DateFieldSingle-BBu5Hi9c.js} +26 -26
  19. package/dist/DateFieldSingle-BBu5Hi9c.js.map +1 -0
  20. package/dist/DateFieldSingle.js +1 -1
  21. package/dist/{DateFieldYearless-ydxcsmRV.js → DateFieldYearless-Ba7HiTiI.js} +2 -2
  22. package/dist/{DateFieldYearless-ydxcsmRV.js.map → DateFieldYearless-Ba7HiTiI.js.map} +1 -1
  23. package/dist/DateFieldYearless.js +1 -1
  24. package/dist/{DaysOfTheWeek-BYvE9QK5.js → DaysOfTheWeek-BYSYZySH.js} +2 -2
  25. package/dist/{DaysOfTheWeek-BYvE9QK5.js.map → DaysOfTheWeek-BYSYZySH.js.map} +1 -1
  26. package/dist/DaysOfTheWeek.js +1 -1
  27. package/dist/{Dialog-DpH2Qvbd.js → Dialog-CgkrvrQu.js} +2 -2
  28. package/dist/{Dialog-DpH2Qvbd.js.map → Dialog-CgkrvrQu.js.map} +1 -1
  29. package/dist/Dialog.js +1 -1
  30. package/dist/{Drawer-DI_k6W2k.js → Drawer-CM4ZbAro.js} +2 -2
  31. package/dist/{Drawer-DI_k6W2k.js.map → Drawer-CM4ZbAro.js.map} +1 -1
  32. package/dist/Drawer.js +1 -1
  33. package/dist/{FieldLabel-BfnCXung.js → FieldLabel-BsbTTyom.js} +3 -14
  34. package/dist/FieldLabel-BsbTTyom.js.map +1 -0
  35. package/dist/FieldLabel.js +1 -1
  36. package/dist/{InputMask-O_qi1p_3.js → InputMask-_F139qFu.js} +2 -2
  37. package/dist/{InputMask-O_qi1p_3.js.map → InputMask-_F139qFu.js.map} +1 -1
  38. package/dist/InputMask.js +1 -1
  39. package/dist/{ListView-jR2ZkBB7.js → ListView-DEAMQopB.js} +2 -2
  40. package/dist/{ListView-jR2ZkBB7.js.map → ListView-DEAMQopB.js.map} +1 -1
  41. package/dist/ListView.js +1 -1
  42. package/dist/{NumberField-1_gRsWT4.js → NumberField-CkZZrkYC.js} +5 -5
  43. package/dist/{NumberField-1_gRsWT4.js.map → NumberField-CkZZrkYC.js.map} +1 -1
  44. package/dist/NumberField.js +1 -1
  45. package/dist/{Page-CY6QRlvb.js → Page-cKXkjMmd.js} +2 -2
  46. package/dist/{Page-CY6QRlvb.js.map → Page-cKXkjMmd.js.map} +1 -1
  47. package/dist/Page.js +1 -1
  48. package/dist/{ProgressBar-BnXuQ6Bx.js → ProgressBar-DXcXZEJ2.js} +2 -2
  49. package/dist/{ProgressBar-BnXuQ6Bx.js.map → ProgressBar-DXcXZEJ2.js.map} +1 -1
  50. package/dist/ProgressBar.js +1 -1
  51. package/dist/{Radio-CwmRUIzo.js → Radio-C89VCMXd.js} +2 -2
  52. package/dist/{Radio-CwmRUIzo.js.map → Radio-C89VCMXd.js.map} +1 -1
  53. package/dist/Radio.js +2 -2
  54. package/dist/{RadioGroup-BNCWIHOG.js → RadioGroup-C_4buUtG.js} +2 -2
  55. package/dist/{RadioGroup-BNCWIHOG.js.map → RadioGroup-C_4buUtG.js.map} +1 -1
  56. package/dist/{SelectCard-DOGCG0zr.js → SelectCard-BWh8Yp7T.js} +3 -3
  57. package/dist/{SelectCard-DOGCG0zr.js.map → SelectCard-BWh8Yp7T.js.map} +1 -1
  58. package/dist/SelectCard.js +1 -1
  59. package/dist/{SelectTrigger-BMo0e-F7.js → SelectTrigger-f1hvRrSC.js} +2 -2
  60. package/dist/{SelectTrigger-BMo0e-F7.js.map → SelectTrigger-f1hvRrSC.js.map} +1 -1
  61. package/dist/SelectTrigger.js +1 -1
  62. package/dist/{SelectTriggerBase-BMMxnXrw.js → SelectTriggerBase-DP9fmRSo.js} +2 -2
  63. package/dist/{SelectTriggerBase-BMMxnXrw.js.map → SelectTriggerBase-DP9fmRSo.js.map} +1 -1
  64. package/dist/{TextField-CwgE_JJU.js → TextField-BiHxlzE3.js} +2 -2
  65. package/dist/{TextField-CwgE_JJU.js.map → TextField-BiHxlzE3.js.map} +1 -1
  66. package/dist/{TextField-DlsZEkS0.js → TextField-D8fow9j7.js} +2 -2
  67. package/dist/{TextField-DlsZEkS0.js.map → TextField-D8fow9j7.js.map} +1 -1
  68. package/dist/TextField.js +1 -1
  69. package/dist/{Textarea-DU-SpoDL.js → Textarea-BdVJJlbP.js} +2 -2
  70. package/dist/{Textarea-DU-SpoDL.js.map → Textarea-BdVJJlbP.js.map} +1 -1
  71. package/dist/Textarea.js +1 -1
  72. package/dist/{TimeField-CfhyRfX9.js → TimeField-CmbErrsZ.js} +2 -2
  73. package/dist/{TimeField-CfhyRfX9.js.map → TimeField-CmbErrsZ.js.map} +1 -1
  74. package/dist/TimeField.js +1 -1
  75. package/dist/Toast.js +2 -2
  76. package/dist/{Toaster-BgjT0p8b.js → Toaster-9cpG_tWR.js} +2 -2
  77. package/dist/{Toaster-BgjT0p8b.js.map → Toaster-9cpG_tWR.js.map} +1 -1
  78. package/dist/{Toaster-CfC9wod0.js → Toaster-B7zUwJOt.js} +2 -2
  79. package/dist/{Toaster-CfC9wod0.js.map → Toaster-B7zUwJOt.js.map} +1 -1
  80. package/dist/components/DateFieldRange/DateFieldRange.d.ts +2 -2
  81. package/dist/components/DateFieldRange/internal/useDateFieldRangeState.d.ts +2 -7
  82. package/dist/components/DateFieldSingle/DateFieldSingle.d.ts +2 -2
  83. package/dist/components/DateFieldSingle/internal/useDateFieldSingleState.d.ts +2 -7
  84. package/dist/components/NumberField/NumberField.d.ts +4 -4
  85. package/dist/index.js +26 -26
  86. package/dist/internal/components/YearSelector/YearSelector.d.ts +67 -0
  87. package/dist/internal/components/YearSelector/index.d.ts +1 -0
  88. package/dist/internal/components/YearSelector/internal/YearItem.d.ts +10 -0
  89. package/dist/internal/components/YearSelector/internal/useYearSelectorKeys.d.ts +19 -0
  90. package/dist/internal/hooks/useFocusWithin/useFocusWithin.d.ts +11 -16
  91. package/dist/types/PassThroughProps.d.ts +4 -0
  92. package/dist/types/index.d.ts +1 -0
  93. package/dist/{useDateFieldOrchestration-Cqa7dxtr.js → useDateFieldOrchestration-DPLftOxu.js} +2 -2
  94. package/dist/{useDateFieldOrchestration-Cqa7dxtr.js.map → useDateFieldOrchestration-DPLftOxu.js.map} +1 -1
  95. package/dist/useFocusWithin-BhhgRXdZ.js +32 -0
  96. package/dist/useFocusWithin-BhhgRXdZ.js.map +1 -0
  97. package/dist/{useInfiniteCombobox-BN2uGhBh.js → useInfiniteCombobox-BaYWUxjg.js} +2 -2
  98. package/dist/{useInfiniteCombobox-BN2uGhBh.js.map → useInfiniteCombobox-BaYWUxjg.js.map} +1 -1
  99. package/package.json +2 -1
  100. package/dist/Calendar-Dq_of5A3.js.map +0 -1
  101. package/dist/DateFieldRange-DPbyzuHb.js.map +0 -1
  102. package/dist/DateFieldSingle-CfAJDcx9.js.map +0 -1
  103. package/dist/FieldLabel-BfnCXung.js.map +0 -1
  104. package/dist/components/Calendar/internal/CalendarYearSelection.d.ts +0 -25
  105. package/dist/useFocusWithin-BhU7hoAD.js +0 -56
  106. package/dist/useFocusWithin-BhU7hoAD.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"DateFieldRange-DPbyzuHb.js","sources":["../src/components/DateFieldRange/internal/maskito/dateRangePlaceholderMask.ts","../src/components/DateFieldRange/internal/MaskedDateRangeInput.tsx","../src/components/DateFieldRange/internal/DateFieldRangeCalendar.tsx","../src/components/DateFieldRange/internal/useDateFieldRangeConversion.ts","../src/components/DateFieldRange/internal/useDateFieldRangeState.ts","../src/components/DateFieldRange/internal/utils.ts","../src/components/DateFieldRange/DateFieldRange.tsx"],"sourcesContent":["import type { MaskitoOptions } from \"@maskito/core\";\nimport {\n MaskitoDateMode,\n maskitoDateRangeOptionsGenerator,\n maskitoWithPlaceholder,\n} from \"@maskito/kit\";\nimport { makeZeroShortcutPreprocessor } from \"../../../DateFieldSingle/internal/maskito/makeZeroShortcutPreprocessor\";\n\nexport type DateMode = Extract<\n MaskitoDateMode,\n \"dd/mm/yyyy\" | \"mm/dd/yyyy\" | \"yyyy/mm/dd\"\n>;\n\nconst datePlaceholderMask = ({\n mode,\n dateSeparator = \"/\",\n rangeSeparator = \" - \",\n placeholder,\n}: {\n mode: DateMode;\n dateSeparator?: string;\n rangeSeparator?: string;\n placeholder: string;\n}) => {\n const dateRangeOptions = maskitoDateRangeOptionsGenerator({\n mode,\n dateSeparator,\n rangeSeparator,\n });\n\n const { plugins, removePlaceholder, ...placeholderOptions } =\n maskitoWithPlaceholder(placeholder);\n\n const datePlaceholderMask = {\n ...dateRangeOptions,\n plugins: plugins.concat(dateRangeOptions.plugins || []),\n preprocessors: [\n ...placeholderOptions.preprocessors,\n ...dateRangeOptions.preprocessors,\n makeZeroShortcutPreprocessor(placeholder, dateSeparator),\n ],\n postprocessors: [\n // NOTE this is super fragile. If Maskito maintainers change the order of the post-processors, this will break.\n // The last postprocessor is the date swap postprocessor, which we don't want to run.\n // A unit test is added to ensure this doesn't break on a dependency update.\n ...dateRangeOptions.postprocessors.slice(0, -1),\n ...placeholderOptions.postprocessors,\n ],\n } satisfies Required<MaskitoOptions>;\n\n return { options: datePlaceholderMask, removePlaceholder };\n};\n\nexport default datePlaceholderMask;\n","import { maskitoParseDate } from \"@maskito/kit\";\nimport { useMaskito } from \"@maskito/react\";\nimport { TextField, TextFieldProps } from \"../../TextField/internal/TextField\";\nimport {\n forwardRef,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { useMergeRefs } from \"@floating-ui/react\";\nimport { DateTime } from \"luxon\";\nimport { Icon } from \"../../Icon\";\nimport Event from \"@servicetitan/hammer-icon/mdi/round/event.svg\";\nimport dateRangePlaceholderMask from \"./maskito/dateRangePlaceholderMask\";\nimport {\n DateModeToFormatMap,\n DateModeToPlaceholderMap,\n} from \"../../DateFieldSingle/internal/constants\";\nimport { DateMode } from \"../../DateFieldSingle/types\";\nimport { usePrevious } from \"../../../internal/hooks\";\n\nconst RANGE_SEPARATOR = \" - \";\n\nexport type MaskedDateRangeInputChange = {\n startDate: DateTime | null;\n endDate: DateTime | null;\n isInputValid: boolean;\n isInputEmpty: boolean;\n};\n\nexport type MaskedDateRangeInputChangeHandler = (\n change: MaskedDateRangeInputChange,\n) => void;\n\nexport type MaskedDateRangeInputProps = Omit<\n TextFieldProps,\n \"onChange\" | \"value\" | \"ref\" | \"showCounter\" | \"hint\" | \"prefix\"\n> & {\n onChange: MaskedDateRangeInputChangeHandler;\n mode?: DateMode;\n startDate: DateTime | null;\n endDate: DateTime | null;\n disableHint?: boolean;\n};\n\nexport type MaskedDateRangeInputRef = HTMLInputElement & {\n setDateRange: (startDate: DateTime | null, endDate: DateTime | null) => void;\n};\n\n/**\n * A masked date input component that allows for the input of a date in a specific format.\n *\n * Provides a `setDates` method that can be used to set the date from outside the component (e.g from a calendar).\n *\n * @internal This component is not intended to be used directly in consumer code.\n *\n * @param props - The props for the MaskedDateRangeInput component.\n * @param props.onChange - The function to call when the date changes.\n * @param props.mode - The mode of the date input.\n * @param props.startDate - The start date.\n * @param props.endDate - The end date.\n * @param props.disableHint - Whether to disable the hint.\n */\nexport const MaskedDateRangeInput = forwardRef<\n MaskedDateRangeInputRef,\n MaskedDateRangeInputProps\n>(\n (\n {\n onChange,\n mode = \"mm/dd/yyyy\",\n startDate,\n endDate,\n disableHint = false,\n ...props\n },\n ref,\n ) => {\n const halfPlaceholder = DateModeToPlaceholderMap[mode];\n const fullPlaceholder = `${halfPlaceholder}${RANGE_SEPARATOR}${halfPlaceholder}`;\n\n // Tracks the value of the input as it is being typed.\n const [inputValue, setInputValue] = useState(fullPlaceholder);\n\n const { options, removePlaceholder } = dateRangePlaceholderMask({\n mode,\n placeholder: fullPlaceholder,\n dateSeparator: \"/\",\n rangeSeparator: RANGE_SEPARATOR,\n });\n const maskedInputRef = useMaskito({ options });\n const inputRef = useRef<HTMLInputElement>(null);\n const combinedRef = useMergeRefs([maskedInputRef, inputRef, ref]);\n const previousStartDate = usePrevious(startDate);\n const previousEndDate = usePrevious(endDate);\n const previousMode = usePrevious(mode);\n\n // Update the input value when the mode changes.\n useEffect(() => {\n if (mode !== previousMode) {\n setInputValue((previousInputValue) =>\n swapMode(previousInputValue, previousMode ?? mode, mode),\n );\n }\n }, [mode, fullPlaceholder, previousMode]);\n\n // Update the input value when the parent's start date or end date changes.\n useEffect(() => {\n if (startDate === undefined || endDate === undefined) return;\n // Return early if the values haven't actually changed.\n if (startDate === previousStartDate && endDate === previousEndDate)\n return;\n if (\n // plus one just represents a date that is guaranteed to be different.\n startDate?.equals(previousStartDate ?? startDate?.plus({ days: 1 })) &&\n (endDate?.equals(previousEndDate ?? endDate?.plus({ days: 1 })) ||\n endDate === previousEndDate)\n )\n return;\n const startDateString =\n startDate?.toFormat(DateModeToFormatMap[mode]) ?? halfPlaceholder;\n const endDateString =\n endDate?.toFormat(DateModeToFormatMap[mode]) ?? halfPlaceholder;\n const newInputValue = `${startDateString}${RANGE_SEPARATOR}${endDateString}`;\n setInputValue(newInputValue);\n }, [\n startDate,\n endDate,\n mode,\n halfPlaceholder,\n previousStartDate,\n previousEndDate,\n ]);\n\n const currentParsedData = useMemo(() => {\n return parseRangeInputValue(inputValue, mode, removePlaceholder);\n }, [inputValue, mode, removePlaceholder]);\n\n const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n setInputValue(event.target.value);\n const {\n startDate: parsedStartDate,\n endDate: parsedEndDate,\n isInputValid,\n isInputEmpty,\n isHalfEmpty,\n } = parseRangeInputValue(event.target.value, mode, removePlaceholder);\n\n // We only want to call onChange for substantive changes.\n // This is to avoid unnecessary re-renders of upstream components.\n const isValueDifferent =\n isInputValid !== currentParsedData.isInputValid || // The input has changed validity\n isInputEmpty !== currentParsedData.isInputEmpty || // The input has changed emptiness\n (parsedStartDate === null) !== (startDate === null) || // The start date has changed from empty to non-empty or vice versa\n (parsedEndDate === null) !== (endDate === null) || // The end date has changed from empty to non-empty or vice versa\n (parsedStartDate !== null &&\n startDate !== null &&\n !parsedStartDate.equals(startDate)) || // The start date has changed\n (parsedEndDate !== null &&\n endDate !== null &&\n !parsedEndDate.equals(endDate)); // The end date has changed\n\n // If the value has not changed, we do not need to call onChange.\n if (!isValueDifferent) return;\n\n onChange?.({\n startDate: isInputEmpty ? null : (parsedStartDate ?? startDate ?? null),\n endDate:\n isInputEmpty || isHalfEmpty\n ? null\n : (parsedEndDate ?? endDate ?? null),\n isInputValid,\n isInputEmpty,\n });\n };\n\n // Extend the input ref with additional methods.\n // This provides a way to set the input value from outside the component.\n useImperativeHandle(ref, () => {\n const input = inputRef.current;\n if (!input) return null as unknown as MaskedDateRangeInputRef;\n return Object.assign(input, {\n setDateRange: (\n startDate: DateTime | null,\n endDate: DateTime | null,\n ) => {\n const startDateString = startDate?.toFormat(\n DateModeToFormatMap[mode],\n );\n const endDateString = endDate?.toFormat(DateModeToFormatMap[mode]);\n const newInputValue = `${startDateString ?? halfPlaceholder}${RANGE_SEPARATOR}${endDateString ?? halfPlaceholder}`;\n setInputValue(newInputValue);\n },\n });\n }, [mode, halfPlaceholder]);\n\n return (\n <TextField\n ref={combinedRef}\n data-start-date={startDate?.toISODate() ?? \"\"}\n data-end-date={endDate?.toISODate() ?? \"\"}\n data-input-valid={currentParsedData.isInputValid}\n data-input-empty={currentParsedData.isInputEmpty}\n {...props}\n showCounter={false}\n value={inputValue}\n onChange={handleChange}\n prefix={<Icon svg={Event} />}\n hint={disableHint ? undefined : `Format: ${mode}`}\n />\n );\n },\n);\n\nMaskedDateRangeInput.displayName = \"MaskedDateRangeInput\";\n\nfunction parseRangeInputValue(\n value: string,\n mode: DateMode,\n removePlaceholder: (value: string) => string,\n) {\n const valueMinusPlaceholder = removePlaceholder(value);\n const [startDate, endDate] = valueMinusPlaceholder.split(RANGE_SEPARATOR);\n const startJsDate = maskitoParseDate(startDate, { mode });\n const endJsDate = endDate ? maskitoParseDate(endDate, { mode }) : null;\n const startLuxonDate = startJsDate\n ? DateTime.fromJSDate(startJsDate, { zone: \"utc\" })\n : null;\n const endLuxonDate = endJsDate\n ? DateTime.fromJSDate(endJsDate, { zone: \"utc\" })\n : null;\n return {\n startDate: startLuxonDate,\n endDate: endLuxonDate,\n isInputValid: !!(startLuxonDate && endLuxonDate), // input valid if both dates are filled\n isInputEmpty: valueMinusPlaceholder === \"\", // input empty if nothing is typed\n isHalfEmpty: endDate === undefined,\n };\n}\n\nfunction swapMode(inputString: string, previousMode: DateMode, mode: DateMode) {\n const halves = inputString.split(RANGE_SEPARATOR);\n const segments = halves.map((half) => half.split(\"/\"));\n\n let startDay, startMonth, startYear, endDay, endMonth, endYear;\n if (previousMode === \"mm/dd/yyyy\") {\n startDay = segments[0][1];\n startMonth = segments[0][0];\n startYear = segments[0][2];\n endDay = segments[1][1];\n endMonth = segments[1][0];\n endYear = segments[1][2];\n }\n if (previousMode === \"dd/mm/yyyy\") {\n startDay = segments[0][0];\n startMonth = segments[0][1];\n startYear = segments[0][2];\n endDay = segments[1][0];\n endMonth = segments[1][1];\n endYear = segments[1][2];\n }\n if (previousMode === \"yyyy/mm/dd\") {\n startDay = segments[0][2];\n startMonth = segments[0][1];\n startYear = segments[0][0];\n endDay = segments[1][2];\n endMonth = segments[1][1];\n endYear = segments[1][0];\n }\n\n if (mode === \"mm/dd/yyyy\") {\n return `${startMonth}/${startDay}/${startYear}${RANGE_SEPARATOR}${endMonth}/${endDay}/${endYear}`;\n }\n if (mode === \"dd/mm/yyyy\") {\n return `${startDay}/${startMonth}/${startYear}${RANGE_SEPARATOR}${endDay}/${endMonth}/${endYear}`;\n }\n if (mode === \"yyyy/mm/dd\") {\n return `${startYear}/${startMonth}/${startDay}${RANGE_SEPARATOR}${endYear}/${endMonth}/${endDay}`;\n }\n\n return inputString;\n}\n","import { DateTime, WeekdayNumbers } from \"luxon\";\nimport { Calendar, CalendarRangeValue } from \"../../Calendar/Calendar\";\nimport { useMemo } from \"react\";\nimport { usePrevious } from \"../../../internal/hooks\";\n\nexport type DateFieldRangeCalendarProps = {\n startDate: DateTime | null;\n endDate: DateTime | null;\n onKeyDown: (event: React.KeyboardEvent<HTMLDivElement>) => void;\n onSelection: ({\n startDate,\n endDate,\n }: {\n startDate: DateTime | null;\n endDate: DateTime | null;\n }) => void;\n minDate?: DateTime | null;\n maxDate?: DateTime | null;\n unavailable?: {\n dates?: DateTime[];\n daysOfWeek?: WeekdayNumbers[];\n };\n};\n\nexport const DateFieldRangeCalendar = ({\n startDate,\n endDate,\n onKeyDown,\n onSelection,\n minDate,\n maxDate,\n unavailable,\n}: DateFieldRangeCalendarProps) => {\n const previousStartDate = usePrevious(startDate);\n const previousEndDate = usePrevious(endDate);\n\n const handleCalendarSelection = (data: { value: CalendarRangeValue }) => {\n if (!data.value) return;\n const calStartDate = data.value.start\n ? DateTime.fromISO(data.value.start, { zone: \"utc\" })\n : null;\n const calEndDate = data.value.end\n ? DateTime.fromISO(data.value.end, { zone: \"utc\" })\n : null;\n onSelection({\n startDate: calStartDate,\n endDate: calEndDate,\n });\n };\n\n const defaultFocusedDate = useMemo(() => {\n // Nothing selected, focus today\n if (!startDate && !endDate) return DateTime.now().toISODate();\n if (!startDate) return endDate?.toISODate();\n if (!endDate) return startDate?.toISODate();\n if (endDate && !previousEndDate?.equals(endDate)) {\n return endDate.toISODate();\n } else if (startDate && !previousStartDate?.equals(startDate)) {\n return startDate.toISODate();\n }\n\n if (endDate) return endDate.toISODate();\n if (startDate) return startDate.toISODate();\n return DateTime.now().toISODate();\n }, [previousStartDate, previousEndDate, startDate, endDate]);\n\n return (\n <Calendar\n // Crappy hack because the Calendar does not update when the value changes.\n key={`${startDate?.toISODate()}-${endDate?.toISODate()}`}\n range={true}\n onKeyDown={onKeyDown}\n defaultFocusedDate={defaultFocusedDate}\n value={{\n start: startDate?.toISODate() || undefined,\n end: endDate?.toISODate() || undefined,\n }}\n onSelection={handleCalendarSelection}\n defaultTimeZone=\"UTC\"\n minDate={minDate?.toISODate() ?? undefined}\n maxDate={maxDate?.toISODate() ?? undefined}\n unavailable={\n unavailable\n ? {\n dates: unavailable.dates?.map((d) => d.toISODate() ?? \"\"),\n daysOfWeek: unavailable.daysOfWeek,\n }\n : undefined\n }\n _disableAutofocus\n />\n );\n};\n","import { useCallback, useMemo } from \"react\";\nimport { DateFieldRangeChange, DateFieldRangeProps } from \"../DateFieldRange\";\nimport { convertStringToDate } from \"../../DateFieldSingle/internal/utils\";\nimport { DateTime } from \"luxon\";\n\n/**\n * This hook is used to convert the string props of a DateFieldRange component to a DateTime format.\n *\n * @param props - The props of the DateFieldRange component.\n * @returns The normalized value, defaultValue, minDate, maxDate, and unavailable dates in DateTime format.\n * @internal This hook is not intended to be used directly in consumer code.\n */\nexport const useDateFieldRangeConversion = (props: DateFieldRangeProps) => {\n const { value, defaultValue, minDate, maxDate, unavailable, onChange } =\n props;\n\n const normalizedValue = useMemo(() => {\n if (value === null || value === undefined) return value;\n return {\n startDate: convertStringToDate(value.startDate) ?? null,\n endDate: convertStringToDate(value.endDate) ?? null,\n };\n }, [value]);\n\n const normalizedDefaultValue = useMemo(() => {\n if (defaultValue === null || defaultValue === undefined)\n return defaultValue;\n return {\n startDate: convertStringToDate(defaultValue.startDate) ?? null,\n endDate: convertStringToDate(defaultValue.endDate) ?? null,\n };\n }, [defaultValue]);\n\n const normalizedMinDate = useMemo(\n () => convertStringToDate(minDate),\n [minDate],\n );\n const normalizedMaxDate = useMemo(\n () => convertStringToDate(maxDate),\n [maxDate],\n );\n\n const normalizedUnavailableDates = useMemo(() => {\n return unavailable?.dates\n ?.map((date) => convertStringToDate(date))\n .filter((date) => date !== null && date !== undefined);\n }, [unavailable?.dates]);\n\n const handleChange = useCallback(\n (\n change: Omit<DateFieldRangeChange, \"startDate\" | \"endDate\"> & {\n startDate: DateTime | null;\n endDate: DateTime | null;\n },\n ) => {\n onChange?.({\n ...change,\n startDate: change.startDate?.toISODate() ?? null,\n endDate: change.endDate?.toISODate() ?? null,\n });\n },\n [onChange],\n );\n\n return {\n value: normalizedValue,\n defaultValue: normalizedDefaultValue,\n minDate: normalizedMinDate,\n maxDate: normalizedMaxDate,\n unavailable: {\n dates: normalizedUnavailableDates,\n daysOfWeek: unavailable?.daysOfWeek,\n },\n onChange: handleChange,\n };\n};\n","import { DateTime } from \"luxon\";\nimport { useOptionallyControlledState } from \"../../../internal/hooks\";\nimport { RefObject } from \"react\";\nimport {\n MaskedDateRangeInputChange,\n MaskedDateRangeInputRef,\n} from \"./MaskedDateRangeInput\";\n\nexport type DateFieldRangeStateChange = {\n startDate: DateTime | null;\n endDate: DateTime | null;\n isInputValid: boolean;\n isInputEmpty: boolean;\n};\n\nexport type DateFieldRangeStateChangeHandler = (\n change: DateFieldRangeStateChange,\n) => void;\n\nexport type DateFieldRangeStateParam = {\n /**\n * The controlled value of the start date.\n */\n valueProp?: {\n startDate: DateTime | null;\n endDate: DateTime | null;\n } | null;\n /**\n * The default value of the start date.\n */\n defaultValueProp?: {\n startDate: DateTime | null;\n endDate: DateTime | null;\n } | null;\n /**\n * The ref to the input component.\n */\n inputRef: RefObject<MaskedDateRangeInputRef>;\n /**\n * The function to call when the state changes.\n */\n onChange: DateFieldRangeStateChangeHandler;\n};\n\n/**\n * This hook is used to keep the state of a DateFieldRange component in sync with the input and calendar.\n */\nexport type DateFieldRangeState = {\n /**\n * The start date.\n */\n startDate: DateTime | null;\n /**\n * The end date.\n */\n endDate: DateTime | null;\n /**\n * The function to set the start date.\n */\n setStartDate: (date: DateTime | null) => void;\n /**\n * The function to set the end date.\n */\n setEndDate: (date: DateTime | null) => void;\n /**\n * The function to handle the input change.\n */\n handleInputChange: (change: MaskedDateRangeInputChange) => void;\n /**\n * The function to handle the calendar selection.\n */\n handleCalendarSelection: ({\n startDate,\n endDate,\n }: {\n startDate: DateTime | null;\n endDate: DateTime | null;\n }) => void;\n};\n\n/**\n * This is a hook for keeping state in sync between a date input and calendar.\n */\nexport function useDateFieldRangeState({\n valueProp,\n defaultValueProp,\n inputRef,\n onChange,\n}: DateFieldRangeStateParam): DateFieldRangeState {\n const [startDate, setStartDate] =\n useOptionallyControlledState<DateTime | null>({\n controlledValue:\n valueProp !== undefined ? valueProp?.startDate : undefined,\n defaultValue:\n defaultValueProp !== undefined\n ? defaultValueProp?.startDate\n : undefined,\n });\n const [endDate, setEndDate] = useOptionallyControlledState<DateTime | null>({\n controlledValue: valueProp !== undefined ? valueProp?.endDate : undefined,\n defaultValue:\n defaultValueProp !== undefined ? defaultValueProp?.endDate : undefined,\n });\n\n const setSharedValue = (value: {\n startDate: DateTime | null;\n endDate: DateTime | null;\n }) => {\n inputRef.current?.setDateRange(value.startDate, value.endDate);\n setStartDate(value.startDate);\n setEndDate(value.endDate);\n };\n\n const handleInputChange = (change: MaskedDateRangeInputChange) => {\n const range = change.isInputEmpty\n ? null\n : {\n startDate: change.startDate?.startOf(\"day\") ?? null,\n endDate: change.endDate?.startOf(\"day\") ?? null,\n };\n setStartDate(range?.startDate ?? null);\n setEndDate(range?.endDate ?? null);\n onChange?.({\n startDate: range?.startDate ?? null,\n endDate: range?.endDate ?? null,\n isInputValid: change.isInputValid,\n isInputEmpty: change.isInputEmpty,\n });\n };\n\n const handleCalendarSelection = ({\n startDate,\n endDate,\n }: {\n startDate: DateTime | null;\n endDate: DateTime | null;\n }) => {\n setSharedValue({ startDate, endDate });\n onChange?.({\n startDate,\n endDate,\n isInputValid: true,\n isInputEmpty: false,\n });\n };\n\n return {\n startDate,\n endDate,\n setStartDate,\n setEndDate,\n handleInputChange,\n handleCalendarSelection,\n };\n}\n","import { DateTime } from \"luxon\";\nimport { validateDate } from \"../../DateFieldSingle/internal/utils\";\n\ntype DateConstraints = {\n unavailable?: {\n dates?: DateTime[];\n daysOfWeek?: number[];\n };\n minDate?: DateTime;\n maxDate?: DateTime;\n};\n\nexport function validateDateRange({\n required,\n startDate,\n endDate,\n startDateConstraints,\n endDateConstraints,\n}: {\n required?: boolean;\n startDate: DateTime | null;\n endDate: DateTime | null;\n startDateConstraints: DateConstraints;\n endDateConstraints: DateConstraints;\n}) {\n if (!required && !startDate && !endDate) return true;\n return (\n validateDate({\n date: startDate,\n constraints: { ...startDateConstraints, required: true },\n }) &&\n validateDate({\n date: endDate,\n constraints: { ...endDateConstraints, required: true },\n }) &&\n (!startDate || !endDate || startDate <= endDate)\n );\n}\n","import { childrenToString } from \"../../internal/functions\";\nimport { useTrackingId, useMergeRefs } from \"../../hooks\";\nimport { DataTrackingId } from \"../../types\";\nimport {\n MaskedDateRangeInput,\n MaskedDateRangeInputProps,\n MaskedDateRangeInputRef,\n} from \"./internal/MaskedDateRangeInput\";\nimport { DateMode } from \"../DateFieldSingle/types\";\nimport { DateFieldRangeCalendar } from \"./internal/DateFieldRangeCalendar\";\nimport { RefObject, useMemo, useRef, useState } from \"react\";\nimport { useDateFieldRangeConversion } from \"./internal/useDateFieldRangeConversion\";\nimport {\n DateFieldRangeStateChange,\n useDateFieldRangeState,\n} from \"./internal/useDateFieldRangeState\";\nimport {\n useFocusWithin,\n usePopoverCloseDelayWorkaround,\n usePopoverSupport,\n} from \"../../internal/hooks\";\nimport { validateDateRange } from \"./internal/utils\";\nimport { useDateFieldOrchestration } from \"../DateFieldSingle/internal/useDateFieldOrchestration\";\nimport Popover from \"../Popover\";\n\nexport type DateFieldRangeChange = {\n /**\n * The start date in ISO 8601 format.\n * @example \"2025-03-22\"\n */\n startDate: string | null;\n /**\n * The end date in ISO 8601 format.\n * @example \"2025-07-02\"\n */\n endDate: string | null;\n /**\n * Whether the input field contains two parsable dates.\n * This is not the same as the date range being valid.\n *\n */\n isInputValid: boolean;\n /**\n * Whether the input field is empty.\n */\n isInputEmpty: boolean;\n /**\n * Whether the start and end dates are valid according to the constraints.\n * Constraints include:\n * - Required\n * - Unavailable dates\n * - Unavailable days of the week\n * - Min date\n * - Max date\n */\n isDateRangeValid: boolean;\n};\n\nexport type DateFieldRangeChangeHandler = (\n change: DateFieldRangeChange,\n) => void;\n\nexport type DateFieldRangeValue = {\n startDate: string | null;\n endDate: string | null;\n} | null;\n\nexport type DateFieldRangeProps = Omit<\n MaskedDateRangeInputProps,\n | \"onChange\"\n | \"value\"\n | \"autoComplete\"\n | \"onClick\"\n | \"onKeyDown\"\n | \"ref\"\n | \"required\"\n | \"startDate\"\n | \"endDate\"\n | \"defaultValue\"\n | \"onFocus\"\n | \"onBlur\"\n> & {\n value?: DateFieldRangeValue;\n defaultValue?: DateFieldRangeValue;\n onChange?: DateFieldRangeChangeHandler;\n mode?: Extract<DateMode, \"mm/dd/yyyy\" | \"dd/mm/yyyy\">;\n disableHint?: boolean;\n disableCalendar?: boolean;\n unavailable?: {\n dates?: string[];\n daysOfWeek?: (1 | 2 | 3 | 4 | 5 | 6 | 7)[];\n };\n minDate?: string;\n maxDate?: string;\n required?: boolean;\n onFocus?: (event: FocusEvent) => void;\n onBlur?: (event: FocusEvent) => void;\n} & DataTrackingId;\n\nexport const DateFieldRange = (props: DateFieldRangeProps) => {\n const data = {\n label: childrenToString(props.label),\n labelProps: props.labelProps,\n description: childrenToString(props.description),\n };\n\n const trackingId = useTrackingId({\n name: \"DateFieldRange\",\n data,\n hasOverride: !!props[\"data-tracking-id\"],\n });\n\n const {\n onFocus,\n onBlur,\n disableCalendar,\n required,\n mode,\n value: valueProp,\n defaultValue: defaultValueProp,\n minDate: minDateProp,\n maxDate: maxDateProp,\n unavailable: unavailableProp,\n onChange: onChangeProp,\n ...rest\n } = props;\n\n const { ref: wrapperRef } = useFocusWithin({\n onBlur: onBlur,\n onFocus: onFocus,\n });\n\n const { value, defaultValue, minDate, maxDate, unavailable, onChange } =\n useDateFieldRangeConversion({\n value: valueProp,\n defaultValue: defaultValueProp,\n minDate: minDateProp,\n maxDate: maxDateProp,\n unavailable: unavailableProp,\n onChange: onChangeProp,\n });\n\n const inputRef = useRef<MaskedDateRangeInputRef>(null);\n const [popoverTriggerRef, setPopoverTriggerRef] =\n useState<RefObject<HTMLInputElement>>();\n const popoverContentRef = useRef<HTMLDivElement>(null);\n const combinedRef = useMergeRefs([popoverTriggerRef, inputRef]);\n const popoverSupported = usePopoverSupport();\n\n const handleChange = (change: DateFieldRangeStateChange) => {\n const sharedConstraints = {\n unavailable,\n minDate: minDate ?? undefined,\n maxDate: maxDate ?? undefined,\n };\n\n onChange?.({\n startDate: change.startDate?.startOf(\"day\") ?? null,\n endDate: change.endDate?.startOf(\"day\") ?? null,\n isInputValid: change.isInputValid,\n isInputEmpty: change.isInputEmpty,\n isDateRangeValid: validateDateRange({\n required: required,\n startDate: change.startDate?.startOf(\"day\") ?? null,\n endDate: change.endDate?.startOf(\"day\") ?? null,\n startDateConstraints: sharedConstraints,\n endDateConstraints: sharedConstraints,\n }),\n });\n };\n\n const { startDate, endDate, handleInputChange, handleCalendarSelection } =\n useDateFieldRangeState({\n valueProp: value,\n defaultValueProp: defaultValue,\n inputRef,\n onChange: handleChange,\n });\n\n const {\n calendarOpen,\n setCalendarOpen,\n handleCalendarKeyDown,\n handleInputKeyDown,\n } = useDateFieldOrchestration({\n inputRef,\n calendarDefaultOpen: false,\n popoverContentRef,\n disableCalendar,\n });\n\n const shouldShowCalendar = usePopoverCloseDelayWorkaround(calendarOpen);\n\n const currentValidity = useMemo(() => {\n return validateDateRange({\n required,\n startDate,\n endDate,\n startDateConstraints: {\n unavailable,\n minDate: minDate ?? undefined,\n maxDate: maxDate ?? undefined,\n },\n endDateConstraints: {\n unavailable,\n minDate: minDate ?? undefined,\n maxDate: maxDate ?? undefined,\n },\n });\n }, [required, startDate, endDate, minDate, maxDate, unavailable]);\n\n const justTheField = (\n <MaskedDateRangeInput\n data-tracking-id={trackingId}\n {...rest}\n mode={mode}\n ref={combinedRef}\n startDate={startDate ?? null}\n endDate={endDate ?? null}\n onChange={handleInputChange}\n disableHint={rest.disableHint}\n onKeyDown={handleInputKeyDown}\n onClick={() => setCalendarOpen(true)}\n required={required}\n autoComplete=\"off\"\n data-date-range-valid={currentValidity}\n />\n );\n\n if (disableCalendar) {\n return justTheField;\n }\n if (!popoverSupported) {\n return justTheField;\n }\n return (\n <div ref={wrapperRef}>\n <Popover\n open={calendarOpen}\n modal\n placement=\"bottom-start\"\n disableFlipFallback\n disableTriggerFocus\n onClose={() => setCalendarOpen(false)}\n disableAutoUpdate\n onOutsidePress={() => setCalendarOpen(false)}\n >\n <Popover.Trigger>\n {({ ref: iRef }) => {\n setPopoverTriggerRef(iRef as RefObject<HTMLInputElement>);\n return justTheField;\n }}\n </Popover.Trigger>\n <Popover.Content ref={popoverContentRef} data-testid=\"calendar-popover\">\n {shouldShowCalendar && (\n <DateFieldRangeCalendar\n startDate={startDate}\n endDate={endDate}\n onKeyDown={handleCalendarKeyDown}\n onSelection={handleCalendarSelection}\n minDate={minDate}\n maxDate={maxDate}\n unavailable={unavailable}\n />\n )}\n </Popover.Content>\n </Popover>\n </div>\n );\n};\n\nDateFieldRange.displayName = \"DateFieldRange\";\n"],"names":["datePlaceholderMask","dateRangePlaceholderMask","startDate","endDate","Event","useMergeRefs"],"mappings":";;;;;;;;;;;;;;;;;;;;AAaA,MAAM,sBAAsB,CAAC;AAAA,EAC3B,IAAA;AAAA,EACA,aAAgB,GAAA,GAAA;AAAA,EAChB,cAAiB,GAAA,KAAA;AAAA,EACjB;AACF,CAKM,KAAA;AACJ,EAAA,MAAM,mBAAmB,gCAAiC,CAAA;AAAA,IACxD,IAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,MAAM,EAAE,OAAS,EAAA,iBAAA,EAAmB,GAAG,kBAAmB,EAAA,GACxD,uBAAuB,WAAW,CAAA;AAEpC,EAAA,MAAMA,oBAAsB,GAAA;AAAA,IAC1B,GAAG,gBAAA;AAAA,IACH,SAAS,OAAQ,CAAA,MAAA,CAAO,gBAAiB,CAAA,OAAA,IAAW,EAAE,CAAA;AAAA,IACtD,aAAe,EAAA;AAAA,MACb,GAAG,kBAAmB,CAAA,aAAA;AAAA,MACtB,GAAG,gBAAiB,CAAA,aAAA;AAAA,MACpB,4BAAA,CAA6B,aAAa,aAAa;AAAA,KACzD;AAAA,IACA,cAAgB,EAAA;AAAA;AAAA;AAAA;AAAA,MAId,GAAG,gBAAA,CAAiB,cAAe,CAAA,KAAA,CAAM,GAAG,EAAE,CAAA;AAAA,MAC9C,GAAG,kBAAmB,CAAA;AAAA;AACxB,GACF;AAEA,EAAO,OAAA,EAAE,OAASA,EAAAA,oBAAAA,EAAqB,iBAAkB,EAAA;AAC3D,CAAA;;AC5BA,MAAM,eAAkB,GAAA,KAAA;AA0CjB,MAAM,oBAAuB,GAAA,UAAA;AAAA,EAIlC,CACE;AAAA,IACE,QAAA;AAAA,IACA,IAAO,GAAA,YAAA;AAAA,IACP,SAAA;AAAA,IACA,OAAA;AAAA,IACA,WAAc,GAAA,KAAA;AAAA,IACd,GAAG;AAAA,KAEL,GACG,KAAA;AACH,IAAM,MAAA,eAAA,GAAkB,yBAAyB,IAAI,CAAA;AACrD,IAAA,MAAM,kBAAkB,CAAG,EAAA,eAAe,CAAG,EAAA,eAAe,GAAG,eAAe,CAAA,CAAA;AAG9E,IAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,SAAS,eAAe,CAAA;AAE5D,IAAA,MAAM,EAAE,OAAA,EAAS,iBAAkB,EAAA,GAAIC,mBAAyB,CAAA;AAAA,MAC9D,IAAA;AAAA,MACA,WAAa,EAAA,eAAA;AAAA,MACb,aAAe,EAAA,GAAA;AAAA,MACf,cAAgB,EAAA;AAAA,KACjB,CAAA;AACD,IAAA,MAAM,cAAiB,GAAA,UAAA,CAAW,EAAE,OAAA,EAAS,CAAA;AAC7C,IAAM,MAAA,QAAA,GAAW,OAAyB,IAAI,CAAA;AAC9C,IAAA,MAAM,cAAc,YAAa,CAAA,CAAC,cAAgB,EAAA,QAAA,EAAU,GAAG,CAAC,CAAA;AAChE,IAAM,MAAA,iBAAA,GAAoB,YAAY,SAAS,CAAA;AAC/C,IAAM,MAAA,eAAA,GAAkB,YAAY,OAAO,CAAA;AAC3C,IAAM,MAAA,YAAA,GAAe,YAAY,IAAI,CAAA;AAGrC,IAAA,SAAA,CAAU,MAAM;AACd,MAAA,IAAI,SAAS,YAAc,EAAA;AACzB,QAAA,aAAA;AAAA,UAAc,CAAC,kBACb,KAAA,QAAA,CAAS,kBAAoB,EAAA,YAAA,IAAgB,MAAM,IAAI;AAAA,SACzD;AAAA;AACF,KACC,EAAA,CAAC,IAAM,EAAA,eAAA,EAAiB,YAAY,CAAC,CAAA;AAGxC,IAAA,SAAA,CAAU,MAAM;AACd,MAAI,IAAA,SAAA,KAAc,MAAa,IAAA,OAAA,KAAY,MAAW,EAAA;AAEtD,MAAI,IAAA,SAAA,KAAc,qBAAqB,OAAY,KAAA,eAAA;AACjD,QAAA;AACF,MAAA;AAAA;AAAA,QAEE,SAAA,EAAW,OAAO,iBAAqB,IAAA,SAAA,EAAW,KAAK,EAAE,IAAA,EAAM,CAAE,EAAC,CAAC,CAAA,KAClE,SAAS,MAAO,CAAA,eAAA,IAAmB,SAAS,IAAK,CAAA,EAAE,MAAM,CAAE,EAAC,CAAC,CAAA,IAC5D,OAAY,KAAA,eAAA;AAAA;AAEd,QAAA;AACF,MAAA,MAAM,kBACJ,SAAW,EAAA,QAAA,CAAS,mBAAoB,CAAA,IAAI,CAAC,CAAK,IAAA,eAAA;AACpD,MAAA,MAAM,gBACJ,OAAS,EAAA,QAAA,CAAS,mBAAoB,CAAA,IAAI,CAAC,CAAK,IAAA,eAAA;AAClD,MAAA,MAAM,gBAAgB,CAAG,EAAA,eAAe,CAAG,EAAA,eAAe,GAAG,aAAa,CAAA,CAAA;AAC1E,MAAA,aAAA,CAAc,aAAa,CAAA;AAAA,KAC1B,EAAA;AAAA,MACD,SAAA;AAAA,MACA,OAAA;AAAA,MACA,IAAA;AAAA,MACA,eAAA;AAAA,MACA,iBAAA;AAAA,MACA;AAAA,KACD,CAAA;AAED,IAAM,MAAA,iBAAA,GAAoB,QAAQ,MAAM;AACtC,MAAO,OAAA,oBAAA,CAAqB,UAAY,EAAA,IAAA,EAAM,iBAAiB,CAAA;AAAA,KAC9D,EAAA,CAAC,UAAY,EAAA,IAAA,EAAM,iBAAiB,CAAC,CAAA;AAExC,IAAM,MAAA,YAAA,GAAe,CAAC,KAA+C,KAAA;AACnE,MAAc,aAAA,CAAA,KAAA,CAAM,OAAO,KAAK,CAAA;AAChC,MAAM,MAAA;AAAA,QACJ,SAAW,EAAA,eAAA;AAAA,QACX,OAAS,EAAA,aAAA;AAAA,QACT,YAAA;AAAA,QACA,YAAA;AAAA,QACA;AAAA,UACE,oBAAqB,CAAA,KAAA,CAAM,MAAO,CAAA,KAAA,EAAO,MAAM,iBAAiB,CAAA;AAIpE,MAAM,MAAA,gBAAA,GACJ,iBAAiB,iBAAkB,CAAA,YAAA;AAAA,MACnC,iBAAiB,iBAAkB,CAAA,YAAA;AAAA,MAClC,eAAA,KAAoB,UAAW,SAAc,KAAA,IAAA,CAAA;AAAA,MAC7C,aAAA,KAAkB,UAAW,OAAY,KAAA,IAAA,CAAA;AAAA,MACzC,oBAAoB,IACnB,IAAA,SAAA,KAAc,QACd,CAAC,eAAA,CAAgB,OAAO,SAAS,CAAA;AAAA,MAClC,kBAAkB,IACjB,IAAA,OAAA,KAAY,QACZ,CAAC,aAAA,CAAc,OAAO,OAAO,CAAA;AAGjC,MAAA,IAAI,CAAC,gBAAkB,EAAA;AAEvB,MAAW,QAAA,GAAA;AAAA,QACT,SAAW,EAAA,YAAA,GAAe,IAAQ,GAAA,eAAA,IAAmB,SAAa,IAAA,IAAA;AAAA,QAClE,OACE,EAAA,YAAA,IAAgB,WACZ,GAAA,IAAA,GACC,iBAAiB,OAAW,IAAA,IAAA;AAAA,QACnC,YAAA;AAAA,QACA;AAAA,OACD,CAAA;AAAA,KACH;AAIA,IAAA,mBAAA,CAAoB,KAAK,MAAM;AAC7B,MAAA,MAAM,QAAQ,QAAS,CAAA,OAAA;AACvB,MAAI,IAAA,CAAC,OAAc,OAAA,IAAA;AACnB,MAAO,OAAA,MAAA,CAAO,OAAO,KAAO,EAAA;AAAA,QAC1B,YAAA,EAAc,CACZC,UAAAA,EACAC,QACG,KAAA;AACH,UAAA,MAAM,kBAAkBD,UAAW,EAAA,QAAA;AAAA,YACjC,oBAAoB,IAAI;AAAA,WAC1B;AACA,UAAA,MAAM,aAAgBC,GAAAA,QAAAA,EAAS,QAAS,CAAA,mBAAA,CAAoB,IAAI,CAAC,CAAA;AACjE,UAAM,MAAA,aAAA,GAAgB,GAAG,eAAmB,IAAA,eAAe,GAAG,eAAe,CAAA,EAAG,iBAAiB,eAAe,CAAA,CAAA;AAChH,UAAA,aAAA,CAAc,aAAa,CAAA;AAAA;AAC7B,OACD,CAAA;AAAA,KACA,EAAA,CAAC,IAAM,EAAA,eAAe,CAAC,CAAA;AAE1B,IACE,uBAAA,GAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,GAAK,EAAA,WAAA;AAAA,QACL,iBAAA,EAAiB,SAAW,EAAA,SAAA,EAAe,IAAA,EAAA;AAAA,QAC3C,eAAA,EAAe,OAAS,EAAA,SAAA,EAAe,IAAA,EAAA;AAAA,QACvC,oBAAkB,iBAAkB,CAAA,YAAA;AAAA,QACpC,oBAAkB,iBAAkB,CAAA,YAAA;AAAA,QACnC,GAAG,KAAA;AAAA,QACJ,WAAa,EAAA,KAAA;AAAA,QACb,KAAO,EAAA,UAAA;AAAA,QACP,QAAU,EAAA,YAAA;AAAA,QACV,MAAQ,kBAAA,GAAA,CAAC,IAAK,EAAA,EAAA,GAAA,EAAKC,QAAO,EAAA,CAAA;AAAA,QAC1B,IAAM,EAAA,WAAA,GAAc,MAAY,GAAA,CAAA,QAAA,EAAW,IAAI,CAAA;AAAA;AAAA,KACjD;AAAA;AAGN,CAAA;AAEA,oBAAA,CAAqB,WAAc,GAAA,sBAAA;AAEnC,SAAS,oBAAA,CACP,KACA,EAAA,IAAA,EACA,iBACA,EAAA;AACA,EAAM,MAAA,qBAAA,GAAwB,kBAAkB,KAAK,CAAA;AACrD,EAAA,MAAM,CAAC,SAAW,EAAA,OAAO,CAAI,GAAA,qBAAA,CAAsB,MAAM,eAAe,CAAA;AACxE,EAAA,MAAM,WAAc,GAAA,gBAAA,CAAiB,SAAW,EAAA,EAAE,MAAM,CAAA;AACxD,EAAA,MAAM,YAAY,OAAU,GAAA,gBAAA,CAAiB,SAAS,EAAE,IAAA,EAAM,CAAI,GAAA,IAAA;AAClE,EAAM,MAAA,cAAA,GAAiB,cACnB,QAAS,CAAA,UAAA,CAAW,aAAa,EAAE,IAAA,EAAM,KAAM,EAAC,CAChD,GAAA,IAAA;AACJ,EAAM,MAAA,YAAA,GAAe,YACjB,QAAS,CAAA,UAAA,CAAW,WAAW,EAAE,IAAA,EAAM,KAAM,EAAC,CAC9C,GAAA,IAAA;AACJ,EAAO,OAAA;AAAA,IACL,SAAW,EAAA,cAAA;AAAA,IACX,OAAS,EAAA,YAAA;AAAA,IACT,YAAA,EAAc,CAAC,EAAE,cAAkB,IAAA,YAAA,CAAA;AAAA;AAAA,IACnC,cAAc,qBAA0B,KAAA,EAAA;AAAA;AAAA,IACxC,aAAa,OAAY,KAAA;AAAA,GAC3B;AACF;AAEA,SAAS,QAAA,CAAS,WAAqB,EAAA,YAAA,EAAwB,IAAgB,EAAA;AAC7E,EAAM,MAAA,MAAA,GAAS,WAAY,CAAA,KAAA,CAAM,eAAe,CAAA;AAChD,EAAM,MAAA,QAAA,GAAW,OAAO,GAAI,CAAA,CAAC,SAAS,IAAK,CAAA,KAAA,CAAM,GAAG,CAAC,CAAA;AAErD,EAAA,IAAI,QAAU,EAAA,UAAA,EAAY,SAAW,EAAA,MAAA,EAAQ,QAAU,EAAA,OAAA;AACvD,EAAA,IAAI,iBAAiB,YAAc,EAAA;AACjC,IAAW,QAAA,GAAA,QAAA,CAAS,CAAC,CAAA,CAAE,CAAC,CAAA;AACxB,IAAa,UAAA,GAAA,QAAA,CAAS,CAAC,CAAA,CAAE,CAAC,CAAA;AAC1B,IAAY,SAAA,GAAA,QAAA,CAAS,CAAC,CAAA,CAAE,CAAC,CAAA;AACzB,IAAS,MAAA,GAAA,QAAA,CAAS,CAAC,CAAA,CAAE,CAAC,CAAA;AACtB,IAAW,QAAA,GAAA,QAAA,CAAS,CAAC,CAAA,CAAE,CAAC,CAAA;AACxB,IAAU,OAAA,GAAA,QAAA,CAAS,CAAC,CAAA,CAAE,CAAC,CAAA;AAAA;AAEzB,EAAA,IAAI,iBAAiB,YAAc,EAAA;AACjC,IAAW,QAAA,GAAA,QAAA,CAAS,CAAC,CAAA,CAAE,CAAC,CAAA;AACxB,IAAa,UAAA,GAAA,QAAA,CAAS,CAAC,CAAA,CAAE,CAAC,CAAA;AAC1B,IAAY,SAAA,GAAA,QAAA,CAAS,CAAC,CAAA,CAAE,CAAC,CAAA;AACzB,IAAS,MAAA,GAAA,QAAA,CAAS,CAAC,CAAA,CAAE,CAAC,CAAA;AACtB,IAAW,QAAA,GAAA,QAAA,CAAS,CAAC,CAAA,CAAE,CAAC,CAAA;AACxB,IAAU,OAAA,GAAA,QAAA,CAAS,CAAC,CAAA,CAAE,CAAC,CAAA;AAAA;AAEzB,EAAA,IAAI,iBAAiB,YAAc,EAAA;AACjC,IAAW,QAAA,GAAA,QAAA,CAAS,CAAC,CAAA,CAAE,CAAC,CAAA;AACxB,IAAa,UAAA,GAAA,QAAA,CAAS,CAAC,CAAA,CAAE,CAAC,CAAA;AAC1B,IAAY,SAAA,GAAA,QAAA,CAAS,CAAC,CAAA,CAAE,CAAC,CAAA;AACzB,IAAS,MAAA,GAAA,QAAA,CAAS,CAAC,CAAA,CAAE,CAAC,CAAA;AACtB,IAAW,QAAA,GAAA,QAAA,CAAS,CAAC,CAAA,CAAE,CAAC,CAAA;AACxB,IAAU,OAAA,GAAA,QAAA,CAAS,CAAC,CAAA,CAAE,CAAC,CAAA;AAAA;AAGzB,EAAA,IAAI,SAAS,YAAc,EAAA;AACzB,IAAA,OAAO,CAAG,EAAA,UAAU,CAAI,CAAA,EAAA,QAAQ,CAAI,CAAA,EAAA,SAAS,CAAG,EAAA,eAAe,CAAG,EAAA,QAAQ,CAAI,CAAA,EAAA,MAAM,IAAI,OAAO,CAAA,CAAA;AAAA;AAEjG,EAAA,IAAI,SAAS,YAAc,EAAA;AACzB,IAAA,OAAO,CAAG,EAAA,QAAQ,CAAI,CAAA,EAAA,UAAU,CAAI,CAAA,EAAA,SAAS,CAAG,EAAA,eAAe,CAAG,EAAA,MAAM,CAAI,CAAA,EAAA,QAAQ,IAAI,OAAO,CAAA,CAAA;AAAA;AAEjG,EAAA,IAAI,SAAS,YAAc,EAAA;AACzB,IAAA,OAAO,CAAG,EAAA,SAAS,CAAI,CAAA,EAAA,UAAU,CAAI,CAAA,EAAA,QAAQ,CAAG,EAAA,eAAe,CAAG,EAAA,OAAO,CAAI,CAAA,EAAA,QAAQ,IAAI,MAAM,CAAA,CAAA;AAAA;AAGjG,EAAO,OAAA,WAAA;AACT;;ACnQO,MAAM,yBAAyB,CAAC;AAAA,EACrC,SAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAmC,KAAA;AACjC,EAAM,MAAA,iBAAA,GAAoB,YAAY,SAAS,CAAA;AAC/C,EAAM,MAAA,eAAA,GAAkB,YAAY,OAAO,CAAA;AAE3C,EAAM,MAAA,uBAAA,GAA0B,CAAC,IAAwC,KAAA;AACvE,IAAI,IAAA,CAAC,KAAK,KAAO,EAAA;AACjB,IAAA,MAAM,YAAe,GAAA,IAAA,CAAK,KAAM,CAAA,KAAA,GAC5B,QAAS,CAAA,OAAA,CAAQ,IAAK,CAAA,KAAA,CAAM,KAAO,EAAA,EAAE,IAAM,EAAA,KAAA,EAAO,CAClD,GAAA,IAAA;AACJ,IAAA,MAAM,UAAa,GAAA,IAAA,CAAK,KAAM,CAAA,GAAA,GAC1B,QAAS,CAAA,OAAA,CAAQ,IAAK,CAAA,KAAA,CAAM,GAAK,EAAA,EAAE,IAAM,EAAA,KAAA,EAAO,CAChD,GAAA,IAAA;AACJ,IAAY,WAAA,CAAA;AAAA,MACV,SAAW,EAAA,YAAA;AAAA,MACX,OAAS,EAAA;AAAA,KACV,CAAA;AAAA,GACH;AAEA,EAAM,MAAA,kBAAA,GAAqB,QAAQ,MAAM;AAEvC,IAAI,IAAA,CAAC,aAAa,CAAC,OAAA,SAAgB,QAAS,CAAA,GAAA,GAAM,SAAU,EAAA;AAC5D,IAAA,IAAI,CAAC,SAAA,EAAkB,OAAA,OAAA,EAAS,SAAU,EAAA;AAC1C,IAAA,IAAI,CAAC,OAAA,EAAgB,OAAA,SAAA,EAAW,SAAU,EAAA;AAC1C,IAAA,IAAI,OAAW,IAAA,CAAC,eAAiB,EAAA,MAAA,CAAO,OAAO,CAAG,EAAA;AAChD,MAAA,OAAO,QAAQ,SAAU,EAAA;AAAA,eAChB,SAAa,IAAA,CAAC,iBAAmB,EAAA,MAAA,CAAO,SAAS,CAAG,EAAA;AAC7D,MAAA,OAAO,UAAU,SAAU,EAAA;AAAA;AAG7B,IAAI,IAAA,OAAA,EAAgB,OAAA,OAAA,CAAQ,SAAU,EAAA;AACtC,IAAI,IAAA,SAAA,EAAkB,OAAA,SAAA,CAAU,SAAU,EAAA;AAC1C,IAAO,OAAA,QAAA,CAAS,GAAI,EAAA,CAAE,SAAU,EAAA;AAAA,KAC/B,CAAC,iBAAA,EAAmB,eAAiB,EAAA,SAAA,EAAW,OAAO,CAAC,CAAA;AAE3D,EACE,uBAAA,GAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MAGC,KAAO,EAAA,IAAA;AAAA,MACP,SAAA;AAAA,MACA,kBAAA;AAAA,MACA,KAAO,EAAA;AAAA,QACL,KAAA,EAAO,SAAW,EAAA,SAAA,EAAe,IAAA,MAAA;AAAA,QACjC,GAAA,EAAK,OAAS,EAAA,SAAA,EAAe,IAAA;AAAA,OAC/B;AAAA,MACA,WAAa,EAAA,uBAAA;AAAA,MACb,eAAgB,EAAA,KAAA;AAAA,MAChB,OAAA,EAAS,OAAS,EAAA,SAAA,EAAe,IAAA,MAAA;AAAA,MACjC,OAAA,EAAS,OAAS,EAAA,SAAA,EAAe,IAAA,MAAA;AAAA,MACjC,aACE,WACI,GAAA;AAAA,QACE,KAAA,EAAO,YAAY,KAAO,EAAA,GAAA,CAAI,CAAC,CAAM,KAAA,CAAA,CAAE,SAAU,EAAA,IAAK,EAAE,CAAA;AAAA,QACxD,YAAY,WAAY,CAAA;AAAA,OAE1B,GAAA,MAAA;AAAA,MAEN,iBAAiB,EAAA;AAAA,KAAA;AAAA,IApBZ,GAAG,SAAW,EAAA,SAAA,EAAW,CAAI,CAAA,EAAA,OAAA,EAAS,WAAW,CAAA;AAAA,GAqBxD;AAEJ,CAAA;;AChFa,MAAA,2BAAA,GAA8B,CAAC,KAA+B,KAAA;AACzE,EAAA,MAAM,EAAE,KAAO,EAAA,YAAA,EAAc,SAAS,OAAS,EAAA,WAAA,EAAa,UAC1D,GAAA,KAAA;AAEF,EAAM,MAAA,eAAA,GAAkB,QAAQ,MAAM;AACpC,IAAA,IAAI,KAAU,KAAA,IAAA,IAAQ,KAAU,KAAA,MAAA,EAAkB,OAAA,KAAA;AAClD,IAAO,OAAA;AAAA,MACL,SAAW,EAAA,mBAAA,CAAoB,KAAM,CAAA,SAAS,CAAK,IAAA,IAAA;AAAA,MACnD,OAAS,EAAA,mBAAA,CAAoB,KAAM,CAAA,OAAO,CAAK,IAAA;AAAA,KACjD;AAAA,GACF,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAM,MAAA,sBAAA,GAAyB,QAAQ,MAAM;AAC3C,IAAI,IAAA,YAAA,KAAiB,QAAQ,YAAiB,KAAA,MAAA;AAC5C,MAAO,OAAA,YAAA;AACT,IAAO,OAAA;AAAA,MACL,SAAW,EAAA,mBAAA,CAAoB,YAAa,CAAA,SAAS,CAAK,IAAA,IAAA;AAAA,MAC1D,OAAS,EAAA,mBAAA,CAAoB,YAAa,CAAA,OAAO,CAAK,IAAA;AAAA,KACxD;AAAA,GACF,EAAG,CAAC,YAAY,CAAC,CAAA;AAEjB,EAAA,MAAM,iBAAoB,GAAA,OAAA;AAAA,IACxB,MAAM,oBAAoB,OAAO,CAAA;AAAA,IACjC,CAAC,OAAO;AAAA,GACV;AACA,EAAA,MAAM,iBAAoB,GAAA,OAAA;AAAA,IACxB,MAAM,oBAAoB,OAAO,CAAA;AAAA,IACjC,CAAC,OAAO;AAAA,GACV;AAEA,EAAM,MAAA,0BAAA,GAA6B,QAAQ,MAAM;AAC/C,IAAA,OAAO,WAAa,EAAA,KAAA,EAChB,GAAI,CAAA,CAAC,SAAS,mBAAoB,CAAA,IAAI,CAAC,CAAA,CACxC,OAAO,CAAC,IAAA,KAAS,IAAS,KAAA,IAAA,IAAQ,SAAS,MAAS,CAAA;AAAA,GACtD,EAAA,CAAC,WAAa,EAAA,KAAK,CAAC,CAAA;AAEvB,EAAA,MAAM,YAAe,GAAA,WAAA;AAAA,IACnB,CACE,MAIG,KAAA;AACH,MAAW,QAAA,GAAA;AAAA,QACT,GAAG,MAAA;AAAA,QACH,SAAW,EAAA,MAAA,CAAO,SAAW,EAAA,SAAA,EAAe,IAAA,IAAA;AAAA,QAC5C,OAAS,EAAA,MAAA,CAAO,OAAS,EAAA,SAAA,EAAe,IAAA;AAAA,OACzC,CAAA;AAAA,KACH;AAAA,IACA,CAAC,QAAQ;AAAA,GACX;AAEA,EAAO,OAAA;AAAA,IACL,KAAO,EAAA,eAAA;AAAA,IACP,YAAc,EAAA,sBAAA;AAAA,IACd,OAAS,EAAA,iBAAA;AAAA,IACT,OAAS,EAAA,iBAAA;AAAA,IACT,WAAa,EAAA;AAAA,MACX,KAAO,EAAA,0BAAA;AAAA,MACP,YAAY,WAAa,EAAA;AAAA,KAC3B;AAAA,IACA,QAAU,EAAA;AAAA,GACZ;AACF,CAAA;;ACQO,SAAS,sBAAuB,CAAA;AAAA,EACrC,SAAA;AAAA,EACA,gBAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAkD,EAAA;AAChD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAC5B,4BAA8C,CAAA;AAAA,IAC5C,eACE,EAAA,SAAA,KAAc,MAAY,GAAA,SAAA,EAAW,SAAY,GAAA,MAAA;AAAA,IACnD,YACE,EAAA,gBAAA,KAAqB,MACjB,GAAA,gBAAA,EAAkB,SAClB,GAAA;AAAA,GACP,CAAA;AACH,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,4BAA8C,CAAA;AAAA,IAC1E,eAAiB,EAAA,SAAA,KAAc,MAAY,GAAA,SAAA,EAAW,OAAU,GAAA,MAAA;AAAA,IAChE,YACE,EAAA,gBAAA,KAAqB,MAAY,GAAA,gBAAA,EAAkB,OAAU,GAAA;AAAA,GAChE,CAAA;AAED,EAAM,MAAA,cAAA,GAAiB,CAAC,KAGlB,KAAA;AACJ,IAAA,QAAA,CAAS,OAAS,EAAA,YAAA,CAAa,KAAM,CAAA,SAAA,EAAW,MAAM,OAAO,CAAA;AAC7D,IAAA,YAAA,CAAa,MAAM,SAAS,CAAA;AAC5B,IAAA,UAAA,CAAW,MAAM,OAAO,CAAA;AAAA,GAC1B;AAEA,EAAM,MAAA,iBAAA,GAAoB,CAAC,MAAuC,KAAA;AAChE,IAAM,MAAA,KAAA,GAAQ,MAAO,CAAA,YAAA,GACjB,IACA,GAAA;AAAA,MACE,SAAW,EAAA,MAAA,CAAO,SAAW,EAAA,OAAA,CAAQ,KAAK,CAAK,IAAA,IAAA;AAAA,MAC/C,OAAS,EAAA,MAAA,CAAO,OAAS,EAAA,OAAA,CAAQ,KAAK,CAAK,IAAA;AAAA,KAC7C;AACJ,IAAa,YAAA,CAAA,KAAA,EAAO,aAAa,IAAI,CAAA;AACrC,IAAW,UAAA,CAAA,KAAA,EAAO,WAAW,IAAI,CAAA;AACjC,IAAW,QAAA,GAAA;AAAA,MACT,SAAA,EAAW,OAAO,SAAa,IAAA,IAAA;AAAA,MAC/B,OAAA,EAAS,OAAO,OAAW,IAAA,IAAA;AAAA,MAC3B,cAAc,MAAO,CAAA,YAAA;AAAA,MACrB,cAAc,MAAO,CAAA;AAAA,KACtB,CAAA;AAAA,GACH;AAEA,EAAA,MAAM,0BAA0B,CAAC;AAAA,IAC/B,SAAAF,EAAAA,UAAAA;AAAA,IACA,OAAAC,EAAAA;AAAA,GAII,KAAA;AACJ,IAAA,cAAA,CAAe,EAAE,SAAA,EAAAD,UAAW,EAAA,OAAA,EAAAC,UAAS,CAAA;AACrC,IAAW,QAAA,GAAA;AAAA,MACT,SAAAD,EAAAA,UAAAA;AAAA,MACA,OAAAC,EAAAA,QAAAA;AAAA,MACA,YAAc,EAAA,IAAA;AAAA,MACd,YAAc,EAAA;AAAA,KACf,CAAA;AAAA,GACH;AAEA,EAAO,OAAA;AAAA,IACL,SAAA;AAAA,IACA,OAAA;AAAA,IACA,YAAA;AAAA,IACA,UAAA;AAAA,IACA,iBAAA;AAAA,IACA;AAAA,GACF;AACF;;AC9IO,SAAS,iBAAkB,CAAA;AAAA,EAChC,QAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,oBAAA;AAAA,EACA;AACF,CAMG,EAAA;AACD,EAAA,IAAI,CAAC,QAAY,IAAA,CAAC,SAAa,IAAA,CAAC,SAAgB,OAAA,IAAA;AAChD,EAAA,OACE,YAAa,CAAA;AAAA,IACX,IAAM,EAAA,SAAA;AAAA,IACN,WAAa,EAAA,EAAE,GAAG,oBAAA,EAAsB,UAAU,IAAK;AAAA,GACxD,KACD,YAAa,CAAA;AAAA,IACX,IAAM,EAAA,OAAA;AAAA,IACN,WAAa,EAAA,EAAE,GAAG,kBAAA,EAAoB,UAAU,IAAK;AAAA,GACtD,CACA,KAAA,CAAC,SAAa,IAAA,CAAC,WAAW,SAAa,IAAA,OAAA,CAAA;AAE5C;;AC8Da,MAAA,cAAA,GAAiB,CAAC,KAA+B,KAAA;AAC5D,EAAA,MAAM,IAAO,GAAA;AAAA,IACX,KAAA,EAAO,gBAAiB,CAAA,KAAA,CAAM,KAAK,CAAA;AAAA,IACnC,YAAY,KAAM,CAAA,UAAA;AAAA,IAClB,WAAA,EAAa,gBAAiB,CAAA,KAAA,CAAM,WAAW;AAAA,GACjD;AAEA,EAAA,MAAM,aAAa,aAAc,CAAA;AAAA,IAC/B,IAAM,EAAA,gBAAA;AAAA,IACN,IAAA;AAAA,IACA,WAAa,EAAA,CAAC,CAAC,KAAA,CAAM,kBAAkB;AAAA,GACxC,CAAA;AAED,EAAM,MAAA;AAAA,IACJ,OAAA;AAAA,IACA,MAAA;AAAA,IACA,eAAA;AAAA,IACA,QAAA;AAAA,IACA,IAAA;AAAA,IACA,KAAO,EAAA,SAAA;AAAA,IACP,YAAc,EAAA,gBAAA;AAAA,IACd,OAAS,EAAA,WAAA;AAAA,IACT,OAAS,EAAA,WAAA;AAAA,IACT,WAAa,EAAA,eAAA;AAAA,IACb,QAAU,EAAA,YAAA;AAAA,IACV,GAAG;AAAA,GACD,GAAA,KAAA;AAEJ,EAAA,MAAM,EAAE,GAAA,EAAK,UAAW,EAAA,GAAI,cAAe,CAAA;AAAA,IACzC,MAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAM,MAAA,EAAE,OAAO,YAAc,EAAA,OAAA,EAAS,SAAS,WAAa,EAAA,QAAA,KAC1D,2BAA4B,CAAA;AAAA,IAC1B,KAAO,EAAA,SAAA;AAAA,IACP,YAAc,EAAA,gBAAA;AAAA,IACd,OAAS,EAAA,WAAA;AAAA,IACT,OAAS,EAAA,WAAA;AAAA,IACT,WAAa,EAAA,eAAA;AAAA,IACb,QAAU,EAAA;AAAA,GACX,CAAA;AAEH,EAAM,MAAA,QAAA,GAAW,OAAgC,IAAI,CAAA;AACrD,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAC5C,QAAsC,EAAA;AACxC,EAAM,MAAA,iBAAA,GAAoB,OAAuB,IAAI,CAAA;AACrD,EAAA,MAAM,WAAc,GAAAE,cAAA,CAAa,CAAC,iBAAA,EAAmB,QAAQ,CAAC,CAAA;AAC9D,EAAA,MAAM,mBAAmB,iBAAkB,EAAA;AAE3C,EAAM,MAAA,YAAA,GAAe,CAAC,MAAsC,KAAA;AAC1D,IAAA,MAAM,iBAAoB,GAAA;AAAA,MACxB,WAAA;AAAA,MACA,SAAS,OAAW,IAAA,MAAA;AAAA,MACpB,SAAS,OAAW,IAAA;AAAA,KACtB;AAEA,IAAW,QAAA,GAAA;AAAA,MACT,SAAW,EAAA,MAAA,CAAO,SAAW,EAAA,OAAA,CAAQ,KAAK,CAAK,IAAA,IAAA;AAAA,MAC/C,OAAS,EAAA,MAAA,CAAO,OAAS,EAAA,OAAA,CAAQ,KAAK,CAAK,IAAA,IAAA;AAAA,MAC3C,cAAc,MAAO,CAAA,YAAA;AAAA,MACrB,cAAc,MAAO,CAAA,YAAA;AAAA,MACrB,kBAAkB,iBAAkB,CAAA;AAAA,QAClC,QAAA;AAAA,QACA,SAAW,EAAA,MAAA,CAAO,SAAW,EAAA,OAAA,CAAQ,KAAK,CAAK,IAAA,IAAA;AAAA,QAC/C,OAAS,EAAA,MAAA,CAAO,OAAS,EAAA,OAAA,CAAQ,KAAK,CAAK,IAAA,IAAA;AAAA,QAC3C,oBAAsB,EAAA,iBAAA;AAAA,QACtB,kBAAoB,EAAA;AAAA,OACrB;AAAA,KACF,CAAA;AAAA,GACH;AAEA,EAAA,MAAM,EAAE,SAAW,EAAA,OAAA,EAAS,iBAAmB,EAAA,uBAAA,KAC7C,sBAAuB,CAAA;AAAA,IACrB,SAAW,EAAA,KAAA;AAAA,IACX,gBAAkB,EAAA,YAAA;AAAA,IAClB,QAAA;AAAA,IACA,QAAU,EAAA;AAAA,GACX,CAAA;AAEH,EAAM,MAAA;AAAA,IACJ,YAAA;AAAA,IACA,eAAA;AAAA,IACA,qBAAA;AAAA,IACA;AAAA,MACE,yBAA0B,CAAA;AAAA,IAC5B,QAAA;AAAA,IACA,mBAAqB,EAAA,KAAA;AAAA,IACrB,iBAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAM,MAAA,kBAAA,GAAqB,+BAA+B,YAAY,CAAA;AAEtE,EAAM,MAAA,eAAA,GAAkB,QAAQ,MAAM;AACpC,IAAA,OAAO,iBAAkB,CAAA;AAAA,MACvB,QAAA;AAAA,MACA,SAAA;AAAA,MACA,OAAA;AAAA,MACA,oBAAsB,EAAA;AAAA,QACpB,WAAA;AAAA,QACA,SAAS,OAAW,IAAA,MAAA;AAAA,QACpB,SAAS,OAAW,IAAA;AAAA,OACtB;AAAA,MACA,kBAAoB,EAAA;AAAA,QAClB,WAAA;AAAA,QACA,SAAS,OAAW,IAAA,MAAA;AAAA,QACpB,SAAS,OAAW,IAAA;AAAA;AACtB,KACD,CAAA;AAAA,GACH,EAAG,CAAC,QAAU,EAAA,SAAA,EAAW,SAAS,OAAS,EAAA,OAAA,EAAS,WAAW,CAAC,CAAA;AAEhE,EAAA,MAAM,YACJ,mBAAA,GAAA;AAAA,IAAC,oBAAA;AAAA,IAAA;AAAA,MACC,kBAAkB,EAAA,UAAA;AAAA,MACjB,GAAG,IAAA;AAAA,MACJ,IAAA;AAAA,MACA,GAAK,EAAA,WAAA;AAAA,MACL,WAAW,SAAa,IAAA,IAAA;AAAA,MACxB,SAAS,OAAW,IAAA,IAAA;AAAA,MACpB,QAAU,EAAA,iBAAA;AAAA,MACV,aAAa,IAAK,CAAA,WAAA;AAAA,MAClB,SAAW,EAAA,kBAAA;AAAA,MACX,OAAA,EAAS,MAAM,eAAA,CAAgB,IAAI,CAAA;AAAA,MACnC,QAAA;AAAA,MACA,YAAa,EAAA,KAAA;AAAA,MACb,uBAAuB,EAAA;AAAA;AAAA,GACzB;AAGF,EAAA,IAAI,eAAiB,EAAA;AACnB,IAAO,OAAA,YAAA;AAAA;AAET,EAAA,IAAI,CAAC,gBAAkB,EAAA;AACrB,IAAO,OAAA,YAAA;AAAA;AAET,EACE,uBAAA,GAAA,CAAC,KAAI,EAAA,EAAA,GAAA,EAAK,UACR,EAAA,QAAA,kBAAA,IAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,IAAM,EAAA,YAAA;AAAA,MACN,KAAK,EAAA,IAAA;AAAA,MACL,SAAU,EAAA,cAAA;AAAA,MACV,mBAAmB,EAAA,IAAA;AAAA,MACnB,mBAAmB,EAAA,IAAA;AAAA,MACnB,OAAA,EAAS,MAAM,eAAA,CAAgB,KAAK,CAAA;AAAA,MACpC,iBAAiB,EAAA,IAAA;AAAA,MACjB,cAAA,EAAgB,MAAM,eAAA,CAAgB,KAAK,CAAA;AAAA,MAE3C,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,QAAQ,OAAR,EAAA,EACE,WAAC,EAAE,GAAA,EAAK,MAAW,KAAA;AAClB,UAAA,oBAAA,CAAqB,IAAmC,CAAA;AACxD,UAAO,OAAA,YAAA;AAAA,SAEX,EAAA,CAAA;AAAA,wBACA,GAAA,CAAC,QAAQ,OAAR,EAAA,EAAgB,KAAK,iBAAmB,EAAA,aAAA,EAAY,oBAClD,QACC,EAAA,kBAAA,oBAAA,GAAA;AAAA,UAAC,sBAAA;AAAA,UAAA;AAAA,YACC,SAAA;AAAA,YACA,OAAA;AAAA,YACA,SAAW,EAAA,qBAAA;AAAA,YACX,WAAa,EAAA,uBAAA;AAAA,YACb,OAAA;AAAA,YACA,OAAA;AAAA,YACA;AAAA;AAAA,SAGN,EAAA;AAAA;AAAA;AAAA,GAEJ,EAAA,CAAA;AAEJ;AAEA,cAAA,CAAe,WAAc,GAAA,gBAAA;;;;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"DateFieldSingle-CfAJDcx9.js","sources":["../src/components/DateFieldSingle/internal/maskito/datePlaceholderMask.ts","../src/components/DateFieldSingle/internal/MaskedDateInput.tsx","../src/components/DateFieldSingle/internal/useDateFieldSingleConversion.ts","../src/components/DateFieldSingle/internal/useDateFieldSingleState.ts","../src/components/DateFieldSingle/internal/DateFieldSingleCalendar.tsx","../src/components/DateFieldSingle/DateFieldSingle.tsx"],"sourcesContent":["import type { MaskitoOptions } from \"@maskito/core\";\nimport {\n maskitoDateOptionsGenerator,\n maskitoWithPlaceholder,\n} from \"@maskito/kit\";\nimport { makeZeroShortcutPreprocessor } from \"./makeZeroShortcutPreprocessor\";\nimport { DateMode } from \"../../types\";\n\nconst datePlaceholderMask = ({\n mode,\n separator = \"/\",\n placeholder,\n}: {\n mode: DateMode;\n separator?: string;\n placeholder: string;\n}) => {\n const dateOptions = maskitoDateOptionsGenerator({\n mode,\n separator,\n });\n\n const { plugins, removePlaceholder, ...placeholderOptions } =\n maskitoWithPlaceholder(placeholder);\n\n const datePlaceholderMask = {\n ...dateOptions,\n plugins: plugins.concat(dateOptions.plugins || []),\n preprocessors: [\n ...placeholderOptions.preprocessors,\n ...dateOptions.preprocessors,\n makeZeroShortcutPreprocessor(mode, separator),\n ],\n postprocessors: [\n ...dateOptions.postprocessors,\n ...placeholderOptions.postprocessors,\n ],\n } satisfies Required<MaskitoOptions>;\n\n return { options: datePlaceholderMask, removePlaceholder };\n};\n\nexport default datePlaceholderMask;\n","import { maskitoParseDate } from \"@maskito/kit\";\nimport { useMaskito } from \"@maskito/react\";\nimport { TextField, TextFieldProps } from \"../../TextField/internal/TextField\";\nimport {\n forwardRef,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { useMergeRefs } from \"@floating-ui/react\";\nimport { DateTime } from \"luxon\";\nimport datePlaceholderMask from \"./maskito/datePlaceholderMask\";\nimport { Icon } from \"../../Icon\";\nimport Event from \"@servicetitan/hammer-icon/mdi/round/event.svg\";\nimport { DateModeToFormatMap, DateModeToPlaceholderMap } from \"./constants\";\nimport { DateMode } from \"../types\";\nimport { usePrevious } from \"../../../internal/hooks\";\n\nexport type MaskedDateInputChange = {\n date: DateTime | null;\n isInputValid: boolean;\n isInputEmpty: boolean;\n};\n\nexport type MaskedDateInputChangeHandler = (\n change: MaskedDateInputChange,\n) => void;\n\nexport type MaskedDateInputProps = Omit<\n TextFieldProps,\n \"onChange\" | \"value\" | \"ref\" | \"showCounter\" | \"hint\" | \"prefix\"\n> & {\n onChange: MaskedDateInputChangeHandler;\n mode?: DateMode;\n lastValidDate: DateTime | null;\n disableHint?: boolean;\n};\n\nexport type MaskedDateInputRef = HTMLInputElement & {\n setDate: (date: DateTime | null) => void;\n};\n\n/**\n * A masked date input component that allows for the input of a date in a specific format.\n *\n * Provides a `setDate` method that can be used to set the date from outside the component (e.g from a calendar).\n *\n * @internal This component is not intended to be used directly in consumer code.\n *\n * @param props - The props for the MaskedDateInput component.\n * @param props.onChange - The function to call when the date changes.\n * @param props.mode - The mode of the date input.\n */\nexport const MaskedDateInput = forwardRef<\n MaskedDateInputRef,\n MaskedDateInputProps\n>(\n (\n {\n onChange,\n mode = \"mm/dd/yyyy\",\n lastValidDate,\n disableHint = false,\n ...props\n },\n ref,\n ) => {\n const placeholder = DateModeToPlaceholderMap[mode];\n const [inputValue, setInputValue] = useState(placeholder);\n const { options, removePlaceholder } = datePlaceholderMask({\n mode,\n placeholder,\n });\n const maskedInputRef = useMaskito({ options });\n const inputRef = useRef<HTMLInputElement>(null);\n const combinedRef = useMergeRefs([maskedInputRef, inputRef, ref]);\n const previousDateRef = useRef<DateTime | null>(null);\n const previousMode = usePrevious(mode);\n\n // Update the input value when the mode changes.\n useEffect(() => {\n if (mode !== previousMode) {\n setInputValue((oldInputValue) =>\n swapMode(oldInputValue, previousMode ?? mode, mode),\n );\n }\n }, [mode, previousMode]);\n\n // Update the input value when the parent's date changes.\n useEffect(() => {\n if (lastValidDate === undefined) return;\n if (lastValidDate === previousDateRef.current) return; // Note: Reference equality is intentional here\n if (!lastValidDate?.equals(previousDateRef.current ?? DateTime.now())) {\n setInputValue(\n lastValidDate?.toFormat(DateModeToFormatMap[mode]) ?? placeholder,\n );\n previousDateRef.current = lastValidDate;\n }\n }, [lastValidDate, mode, placeholder]);\n\n const currentParsedData = useMemo(() => {\n return parseInputValue(inputValue, mode, removePlaceholder);\n }, [inputValue, mode, removePlaceholder]);\n\n const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n setInputValue(event.target.value);\n const { date, isInputValid, isInputEmpty } = parseInputValue(\n event.target.value,\n mode,\n removePlaceholder,\n );\n\n // We only want to call onChange for substantive changes.\n // This is to avoid unnecessary re-renders of upstream components.\n const isValueDifferent =\n isInputValid !== currentParsedData.isInputValid || // The input has changed validity\n isInputEmpty !== currentParsedData.isInputEmpty || // The input has changed emptiness\n (date === null) !== (lastValidDate === null) || // The input has changed from empty to non-empty or vice versa\n (date !== null &&\n lastValidDate !== null &&\n !date.equals(lastValidDate)); // The date has changed\n\n // If the value has not changed, we do not need to call onChange.\n if (!isValueDifferent) return;\n onChange?.({\n date: date ?? lastValidDate ?? null,\n isInputValid,\n isInputEmpty,\n });\n };\n\n // Extend the input ref with additional methods.\n // This provides a way to set the input value from outside the component.\n useImperativeHandle(ref, () => {\n const input = inputRef.current;\n if (!input) return null as unknown as MaskedDateInputRef;\n return Object.assign(input, {\n setDate: (date: DateTime | null) => {\n setInputValue(\n date?.toFormat(DateModeToFormatMap[mode]) ?? placeholder,\n );\n },\n });\n }, [mode, placeholder]);\n\n return (\n <TextField\n ref={combinedRef}\n data-date={lastValidDate?.toISODate() ?? \"\"}\n data-input-valid={currentParsedData.isInputValid}\n data-input-empty={currentParsedData.isInputEmpty}\n {...props}\n showCounter={false}\n value={inputValue}\n onChange={handleChange}\n prefix={<Icon svg={Event} />}\n hint={disableHint ? undefined : `Format: ${mode}`}\n />\n );\n },\n);\n\nMaskedDateInput.displayName = \"MaskedDateInput\";\n\nfunction parseInputValue(\n value: string,\n mode: DateMode,\n removePlaceholder: (value: string) => string,\n) {\n const valueMinusPlaceholder = removePlaceholder(value);\n const jsDate = maskitoParseDate(valueMinusPlaceholder, { mode });\n const luxonDate = jsDate\n ? DateTime.fromJSDate(jsDate, { zone: \"utc\" })\n : null;\n return {\n date: luxonDate,\n isInputValid: !!luxonDate,\n isInputEmpty: valueMinusPlaceholder === \"\",\n };\n}\n\nfunction swapMode(inputString: string, previousMode: DateMode, mode: DateMode) {\n const { day, month, year } = divideSegments(inputString, previousMode);\n return orderSegmentsByMode(day, month, year, mode);\n}\n\nfunction divideSegments(\n value: string,\n mode: DateMode,\n): {\n day: string;\n month: string;\n year: string;\n} {\n const [segment1, segment2, segment3] = value.split(\"/\");\n if (mode === \"dd/mm/yyyy\") {\n return { day: segment1, month: segment2, year: segment3 };\n } else if (mode === \"mm/dd/yyyy\") {\n return { day: segment2, month: segment1, year: segment3 };\n } else if (mode === \"yyyy/mm/dd\") {\n return { day: segment3, month: segment2, year: segment1 };\n }\n return { day: \"__\", month: \"__\", year: \"____\" };\n}\n\nfunction orderSegmentsByMode(\n day: string,\n month: string,\n year: string,\n mode: DateMode,\n) {\n if (mode === \"dd/mm/yyyy\") {\n return `${day}/${month}/${year}`;\n } else if (mode === \"mm/dd/yyyy\") {\n return `${month}/${day}/${year}`;\n } else if (mode === \"yyyy/mm/dd\") {\n return `${year}/${month}/${day}`;\n } else {\n return \"\";\n }\n}\n","import { useCallback, useMemo } from \"react\";\nimport { convertStringToDate } from \"./utils\";\nimport {\n DateFieldSingleChange,\n DateFieldSingleProps,\n} from \"../DateFieldSingle\";\nimport { DateTime, WeekdayNumbers } from \"luxon\";\n\nexport type DateFieldSingleConversion = {\n /**\n * The current value of the date field.\n */\n value?: DateTime | null;\n /**\n * The default (uncontrolled) value of the date field.\n */\n defaultValue?: DateTime | null;\n /**\n * The minimum date of the date field.\n */\n minDate?: DateTime | null;\n /**\n * The maximum date of the date field.\n */\n maxDate?: DateTime | null;\n /**\n * The unavailable dates of the date field.\n */\n unavailable: {\n /**\n * The unavailable dates of the date field.\n */\n dates?: DateTime[];\n /**\n * The unavailable days of the week of the date field.\n */\n daysOfWeek?: WeekdayNumbers[];\n };\n /**\n * The callback for when the date changes.\n */\n onChange: (\n change: Omit<DateFieldSingleChange, \"date\"> & { date: DateTime | null },\n ) => void;\n};\n\n/**\n * Converts the props of the DateFieldSingle component to Luxon DateTime objects for easier internal use.\n * @param props - The props of the DateFieldSingle component using ISO 8601 strings.\n * @returns The converted props using Luxon DateTime objects.\n */\nexport function useDateFieldSingleConversion({\n value,\n defaultValue,\n minDate,\n maxDate,\n unavailable,\n onChange,\n}: DateFieldSingleProps): DateFieldSingleConversion {\n const normalizedValue = useMemo(() => convertStringToDate(value), [value]);\n const normalizedDefaultValue = useMemo(\n () => convertStringToDate(defaultValue),\n [defaultValue],\n );\n const normalizedMinDate = useMemo(\n () => convertStringToDate(minDate),\n [minDate],\n );\n const normalizedMaxDate = useMemo(\n () => convertStringToDate(maxDate),\n [maxDate],\n );\n const normalizedUnavailableDates = useMemo(\n () =>\n unavailable?.dates\n ?.map((d) => convertStringToDate(d))\n .filter((d) => d !== null && d !== undefined),\n [unavailable?.dates],\n );\n\n const handleChange = useCallback(\n (\n change: Omit<DateFieldSingleChange, \"date\"> & { date: DateTime | null },\n ) => {\n onChange?.({\n ...change,\n date: change.date?.toISODate() ?? null,\n });\n },\n [onChange],\n );\n\n return {\n value: normalizedValue,\n defaultValue: normalizedDefaultValue,\n minDate: normalizedMinDate,\n maxDate: normalizedMaxDate,\n unavailable: {\n dates: normalizedUnavailableDates,\n daysOfWeek: unavailable?.daysOfWeek,\n },\n onChange: handleChange,\n };\n}\n","import { DateTime } from \"luxon\";\nimport { useOptionallyControlledState } from \"../../../internal/hooks\";\nimport { MaskedDateInputChange, MaskedDateInputRef } from \"./MaskedDateInput\";\nimport { RefObject } from \"react\";\n\nexport type DateFieldSingleStateChange = {\n date: DateTime | null;\n isInputValid: boolean;\n isInputEmpty: boolean;\n};\n\nexport type DateFieldSingleStateChangeHandler = (\n change: DateFieldSingleStateChange,\n) => void;\n\nexport type DateFieldSingleStateParam = {\n /**\n * The controlled value of the date field.\n */\n valueProp?: DateTime | null;\n /**\n * The default (uncontrolled) value of the date field.\n */\n defaultValueProp?: DateTime | null;\n /**\n * The ref to the input field.\n */\n inputRef: RefObject<MaskedDateInputRef>;\n /**\n * Callback for when the date changes.\n */\n onChange: DateFieldSingleStateChangeHandler;\n};\n\nexport type DateFieldSingleState = {\n /**\n * The current value (DateTime) of the date field.\n */\n value: DateTime | null;\n /**\n * Sets the value of the date field.\n */\n setValue: (value: DateTime | null) => void;\n /**\n * Handles the change of the input field.\n */\n handleInputChange: (change: MaskedDateInputChange) => void;\n /**\n * Handles the selection of a date in the calendar.\n */\n handleCalendarSelection: (date: DateTime) => void;\n};\n\n/**\n * This is a hook for keeping state in sync between a date input and calendar.\n */\nexport function useDateFieldSingleState({\n valueProp,\n defaultValueProp,\n inputRef,\n onChange,\n}: DateFieldSingleStateParam): DateFieldSingleState {\n const [value, setValue] = useOptionallyControlledState<DateTime | null>({\n controlledValue: valueProp,\n defaultValue: defaultValueProp,\n });\n\n const setSharedValue = (date: DateTime | null) => {\n inputRef.current?.setDate(date);\n setValue(date);\n };\n\n const handleInputChange = (change: MaskedDateInputChange) => {\n const date = change.isInputEmpty\n ? null\n : (change.date?.startOf(\"day\") ?? null);\n onChange?.({\n date,\n isInputValid: change.isInputValid,\n isInputEmpty: change.isInputEmpty,\n });\n if (change.isInputValid) {\n setSharedValue(change.isInputEmpty ? null : change.date);\n }\n if (change.isInputEmpty) {\n setSharedValue(null);\n return;\n }\n if (change.date) {\n setSharedValue(change.date);\n }\n };\n\n const handleCalendarSelection = (date: DateTime) => {\n setSharedValue(date);\n onChange?.({\n date,\n isInputValid: true,\n isInputEmpty: false,\n });\n };\n\n return {\n value,\n setValue: setSharedValue,\n handleInputChange,\n handleCalendarSelection,\n };\n}\n","import { DateTime, WeekdayNumbers } from \"luxon\";\nimport { Calendar, CalendarProps, CalendarValue } from \"../../Calendar\";\n\ntype DateFieldSingleCalendarProps = Omit<\n CalendarProps,\n | \"onSelection\"\n | \"value\"\n | \"onKeyDown\"\n | \"defaultFocusedDate\"\n | \"range\"\n | \"defaultTimeZone\"\n | \"unavailable\"\n | \"minDate\"\n | \"maxDate\"\n | \"defaultValue\"\n | \"_disableAutofocus\"\n> & {\n onKeyDown?: (event: React.KeyboardEvent<HTMLDivElement>) => void;\n value: DateTime | null;\n onSelection: (date: DateTime) => void;\n minDate?: DateTime | null;\n maxDate?: DateTime | null;\n unavailable?: { dates?: DateTime[]; daysOfWeek?: WeekdayNumbers[] };\n};\n\nexport function DateFieldSingleCalendar({\n onKeyDown,\n value,\n onSelection,\n minDate,\n maxDate,\n unavailable,\n ...rest\n}: DateFieldSingleCalendarProps) {\n const handleCalendarSelection = (data: { value: CalendarValue }) => {\n if (data.value) {\n const date = DateTime.fromISO(data.value, { zone: \"utc\" });\n onSelection(date);\n }\n };\n\n return (\n <Calendar\n {...rest}\n range={false}\n onKeyDown={onKeyDown}\n defaultFocusedDate={value?.toISODate() || DateTime.now().toISODate()}\n value={value?.toISODate() || undefined}\n onSelection={handleCalendarSelection}\n defaultTimeZone=\"UTC\"\n minDate={minDate?.toISODate() ?? undefined}\n maxDate={maxDate?.toISODate() ?? undefined}\n unavailable={\n unavailable\n ? {\n dates: unavailable.dates?.map((d) => d.toISODate() ?? \"\"),\n daysOfWeek: unavailable.daysOfWeek,\n }\n : undefined\n }\n _disableAutofocus\n />\n );\n}\n","import { childrenToString } from \"../../internal/functions\";\nimport { useTrackingId, useMergeRefs } from \"../../hooks\";\nimport { DataTrackingId } from \"../../types\";\nimport Popover from \"../Popover\";\nimport { RefObject, useMemo, useRef, useState } from \"react\";\nimport {\n MaskedDateInput,\n MaskedDateInputProps,\n MaskedDateInputRef,\n} from \"./internal/MaskedDateInput\";\nimport { DateMode } from \"./types\";\nimport { useDateFieldSingleConversion } from \"./internal/useDateFieldSingleConversion\";\nimport {\n DateFieldSingleStateChangeHandler,\n useDateFieldSingleState,\n} from \"./internal/useDateFieldSingleState\";\nimport { validateDate } from \"./internal/utils\";\nimport {\n useFocusWithin,\n usePopoverCloseDelayWorkaround,\n usePopoverSupport,\n} from \"../../internal/hooks\";\nimport { useDateFieldOrchestration } from \"./internal/useDateFieldOrchestration\";\nimport { DateFieldSingleCalendar } from \"./internal/DateFieldSingleCalendar\";\n\nexport type DateFieldSingleProps = Omit<\n MaskedDateInputProps,\n | \"onChange\"\n | \"value\"\n | \"autoComplete\"\n | \"onClick\"\n | \"onKeyDown\"\n | \"ref\"\n | \"lastValidDate\"\n | \"setLastValidDate\"\n | \"required\"\n | \"onFocus\"\n | \"onBlur\"\n> & {\n value?: string | null;\n defaultValue?: string | null;\n onChange?: DateFieldSingleChangeHandler;\n onFocus?: (event: FocusEvent) => void;\n onBlur?: (event: FocusEvent) => void;\n mode?: Extract<DateMode, \"mm/dd/yyyy\" | \"dd/mm/yyyy\">;\n disableHint?: boolean;\n disableCalendar?: boolean;\n unavailable?: {\n /**\n * The specific dates that are unavailable. ISO 8601 format.\n * @example [\"2025-07-02\"]\n */\n dates?: string[];\n /**\n * The days of the week that are unavailable.\n * (1-7, where 1 is Monday and 7 is Sunday)\n */\n daysOfWeek?: (1 | 2 | 3 | 4 | 5 | 6 | 7)[];\n };\n minDate?: string;\n maxDate?: string;\n required?: boolean;\n} & DataTrackingId;\n\nexport type DateFieldSingleChange = {\n /**\n * The date in ISO 8601 format.\n * @example \"2025-07-02\"\n */\n date: string | null;\n /**\n * Whether the input is valid. That is, it matches the format and is not empty.\n * This does not mean that the date is valid according to the constraints.\n */\n isInputValid: boolean;\n /**\n * Whether the input is empty.\n */\n isInputEmpty: boolean;\n /**\n * Whether the date is valid according to the constraints.\n * Constraints include:\n * - Required\n * - Unavailable dates\n * - Unavailable days of the week\n * - Min date\n * - Max date\n */\n isDateValid: boolean;\n};\n\nexport type DateFieldSingleChangeHandler = (\n change: DateFieldSingleChange,\n) => void;\n\nexport const DateFieldSingle = (props: DateFieldSingleProps) => {\n const data = {\n label: childrenToString(props.label),\n labelProps: props.labelProps,\n description: childrenToString(props.description),\n };\n\n const trackingId = useTrackingId({\n name: \"DateFieldSingle\",\n data,\n hasOverride: !!props[\"data-tracking-id\"],\n });\n\n const {\n onFocus,\n onBlur,\n disableCalendar,\n required,\n mode,\n value: valueProp,\n defaultValue: defaultValueProp,\n minDate: minDateProp,\n maxDate: maxDateProp,\n unavailable: unavailableProp,\n onChange: onChangeProp,\n ...rest\n } = props;\n\n const inputRef = useRef<MaskedDateInputRef>(null);\n // We convert any props that deal in ISO 8601 strings to Luxon DateTime objects for easier internal use.\n const {\n value: normalizedValue,\n defaultValue: normalizedDefaultValue,\n minDate,\n maxDate,\n unavailable,\n onChange,\n } = useDateFieldSingleConversion({\n value: valueProp,\n defaultValue: defaultValueProp,\n onChange: onChangeProp,\n minDate: minDateProp,\n maxDate: maxDateProp,\n unavailable: unavailableProp,\n });\n\n const handleChange: DateFieldSingleStateChangeHandler = (change) => {\n onChange?.({\n ...change,\n isDateValid: validateDate({\n date: change.date,\n constraints: {\n required,\n unavailable,\n minDate: minDate ?? undefined,\n maxDate: maxDate ?? undefined,\n },\n }),\n });\n };\n\n // We use a hook to keep the value of input and the calendar in sync.\n const { value, handleInputChange, handleCalendarSelection } =\n useDateFieldSingleState({\n valueProp: normalizedValue,\n defaultValueProp: normalizedDefaultValue,\n inputRef,\n onChange: handleChange,\n });\n\n const { ref: wrapperRef } = useFocusWithin({\n onBlur,\n onFocus,\n });\n\n const [popoverTriggerRef, setPopoverTriggerRef] =\n useState<RefObject<HTMLInputElement>>();\n const popoverContentRef = useRef<HTMLDivElement>(null);\n const combinedRef = useMergeRefs([popoverTriggerRef, inputRef]);\n const {\n calendarOpen,\n setCalendarOpen,\n handleCalendarKeyDown,\n handleInputKeyDown,\n } = useDateFieldOrchestration({\n inputRef,\n calendarDefaultOpen: false,\n popoverContentRef,\n disableCalendar,\n });\n\n const popoverSupported = usePopoverSupport();\n\n const shouldShowCalendar = usePopoverCloseDelayWorkaround(calendarOpen);\n\n const currentValidity = useMemo(\n () =>\n validateDate({\n date: value,\n constraints: {\n required,\n unavailable,\n minDate: minDate ?? undefined,\n maxDate: maxDate ?? undefined,\n },\n }),\n [value, required, unavailable, minDate, maxDate],\n );\n\n const justTheField = (\n <MaskedDateInput\n {...rest}\n mode={mode}\n ref={combinedRef}\n onChange={handleInputChange}\n onKeyDown={handleInputKeyDown}\n onClick={() => setCalendarOpen(true)}\n lastValidDate={value}\n required={required}\n autoComplete=\"off\"\n data-date-valid={currentValidity}\n data-tracking-id={trackingId}\n />\n );\n\n if (disableCalendar) {\n return justTheField;\n }\n\n if (!popoverSupported) {\n return justTheField;\n }\n\n return (\n <div ref={wrapperRef}>\n <Popover\n open={calendarOpen}\n modal\n placement=\"bottom-start\"\n disableFlipFallback\n disableTriggerFocus\n onClose={() => setCalendarOpen(false)}\n disableAutoUpdate\n onClickOutside={() => setCalendarOpen(false)}\n >\n <Popover.Trigger>\n {({ ref: iRef }) => {\n setPopoverTriggerRef(iRef as RefObject<HTMLInputElement>);\n return justTheField;\n }}\n </Popover.Trigger>\n <Popover.Content ref={popoverContentRef} data-testid=\"calendar-popover\">\n {shouldShowCalendar && (\n <DateFieldSingleCalendar\n onKeyDown={handleCalendarKeyDown}\n value={value}\n onSelection={handleCalendarSelection}\n minDate={minDate}\n maxDate={maxDate}\n unavailable={unavailable}\n />\n )}\n </Popover.Content>\n </Popover>\n </div>\n );\n};\n\nDateFieldSingle.displayName = \"DateFieldSingle\";\n"],"names":["datePlaceholderMask","Event","useMergeRefs"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"FieldLabel-BfnCXung.js","sources":["../src/components/FieldLabel/internal/FieldLabelMoreInfoIcon.tsx","../src/components/FieldLabel/FieldLabel.tsx"],"sourcesContent":["import { useEffect, useState } from \"react\";\nimport { FieldLabelProps } from \"../FieldLabel\";\nimport { Tooltip } from \"../../Tooltip\";\nimport { Icon } from \"../../Icon\";\nimport Info from \"@servicetitan/hammer-icon/mdi/round/info.svg\";\nimport styles from \"../FieldLabel.module.scss\";\n\n/**\n * Internal component for rendering the info icon with tooltip.\n *\n * @param props - Component props\n * @param props.moreInfo - The content to display in the tooltip\n * @param props.openMoreInfo - Controls the tooltip open state\n */\nexport const FieldLabelMoreInfoIcon = ({\n moreInfo,\n openMoreInfo,\n}: {\n moreInfo: FieldLabelProps[\"moreInfo\"];\n openMoreInfo: FieldLabelProps[\"openMoreInfo\"];\n}) => {\n const [open, setOpen] = useState(openMoreInfo);\n\n useEffect(() => {\n if (openMoreInfo) {\n setOpen(true);\n } else {\n // close the tooltip\n setOpen(false);\n\n // reset to uncontrolled state\n setTimeout(() => {\n setOpen(undefined);\n });\n }\n }, [openMoreInfo]);\n\n return (\n <Tooltip\n open={open}\n placement=\"top\"\n offset={5}\n fallbackPlacements={[\"right\", \"bottom\", \"left\"]}\n >\n <Tooltip.Trigger className={styles[\"info-trigger\"]}>\n <Icon svg={Info} />\n </Tooltip.Trigger>\n <Tooltip.Content className={styles[\"info-content\"]}>\n {moreInfo}\n </Tooltip.Content>\n </Tooltip>\n );\n};\n","import { forwardRef, ComponentPropsWithoutRef, ReactNode } from \"react\";\nimport cx from \"classnames\";\n\nimport styles from \"./FieldLabel.module.scss\";\nimport { TooltipProps } from \"../Tooltip\";\nimport { SrOnly } from \"../SrOnly\";\nimport { FieldLabelMoreInfoIcon } from \"./internal/FieldLabelMoreInfoIcon\";\n\n/**\n * Props for the FieldLabel component.\n */\nexport type FieldLabelProps = Omit<ComponentPropsWithoutRef<\"label\">, \"id\"> & {\n /** Unique identifier for the label element */\n id?: string;\n /**\n * Whether the field is required. Shows a red asterisk (*) when true.\n * @default false\n */\n required?: boolean;\n /** Additional information to display in a tooltip */\n moreInfo?: ReactNode;\n /**\n * Controls the open state of the more info tooltip.\n * @default false\n */\n openMoreInfo?: TooltipProps[\"open\"];\n};\n\n/**\n * FieldLabel component for form field labels with optional required indicator and help tooltip.\n *\n * Features:\n * - Accessible form label with proper semantic HTML\n * - Optional required field indicator with red asterisk\n * - Help tooltip with info icon for additional context\n * - Screen reader support for required field announcement\n * - Controlled and uncontrolled tooltip state management\n * - Flexible content support for label text and help information\n * - Proper ARIA attributes and semantic structure\n * - Responsive design with consistent typography\n *\n * @example\n * <FieldLabel htmlFor=\"email\" required>\n * Email Address\n * </FieldLabel>\n * <input id=\"email\" type=\"email\" />\n *\n * @example\n * <FieldLabel\n * htmlFor=\"password\"\n * required\n * moreInfo=\"Password must be at least 8 characters long\"\n * >\n * Password\n * </FieldLabel>\n * <input id=\"password\" type=\"password\" />\n */\nexport const FieldLabel = forwardRef<HTMLLabelElement, FieldLabelProps>(\n (props, ref) => {\n const { children, className, moreInfo, required, openMoreInfo, ...rest } =\n props;\n const FieldLabelClassNames = cx([styles[\"label\"]], className);\n\n return (\n <label\n className={FieldLabelClassNames}\n data-anv=\"label\"\n ref={ref}\n {...rest}\n >\n <div className={styles[\"top-container\"]} aria-atomic=\"true\">\n <span className={styles[\"label-text\"]}>\n {children}\n {required ? (\n <>\n <span aria-hidden className={styles[\"required\"]}>\n *\n </span>\n <SrOnly>Required</SrOnly>\n </>\n ) : null}\n </span>\n {moreInfo ? (\n <FieldLabelMoreInfoIcon\n moreInfo={moreInfo}\n openMoreInfo={openMoreInfo}\n />\n ) : null}\n </div>\n\n {moreInfo ? <SrOnly>{moreInfo}</SrOnly> : null}\n </label>\n );\n },\n);\n\nFieldLabel.displayName = \"FieldLabel\";\n"],"names":["Info"],"mappings":";;;;;;;;;;;;;;;;;;;AAcO,MAAM,yBAAyB,CAAC;AAAA,EACrC,QAAA;AAAA,EACA;AACF,CAGM,KAAA;AACJ,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,SAAS,YAAY,CAAA;AAE7C,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,YAAc,EAAA;AAChB,MAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,KACP,MAAA;AAEL,MAAA,OAAA,CAAQ,KAAK,CAAA;AAGb,MAAA,UAAA,CAAW,MAAM;AACf,QAAA,OAAA,CAAQ,MAAS,CAAA;AAAA,OAClB,CAAA;AAAA;AACH,GACF,EAAG,CAAC,YAAY,CAAC,CAAA;AAEjB,EACE,uBAAA,IAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,IAAA;AAAA,MACA,SAAU,EAAA,KAAA;AAAA,MACV,MAAQ,EAAA,CAAA;AAAA,MACR,kBAAoB,EAAA,CAAC,OAAS,EAAA,QAAA,EAAU,MAAM,CAAA;AAAA,MAE9C,QAAA,EAAA;AAAA,wBAAC,GAAA,CAAA,OAAA,CAAQ,OAAR,EAAA,EAAgB,SAAW,EAAA,MAAA,CAAO,cAAc,CAAA,EAC/C,QAAC,kBAAA,GAAA,CAAA,IAAA,EAAA,EAAK,GAAK,EAAAA,OAAA,EAAM,CACnB,EAAA,CAAA;AAAA,wBACA,GAAA,CAAC,QAAQ,OAAR,EAAA,EAAgB,WAAW,MAAO,CAAA,cAAc,GAC9C,QACH,EAAA,QAAA,EAAA;AAAA;AAAA;AAAA,GACF;AAEJ,CAAA;;ACKO,MAAM,UAAa,GAAA,UAAA;AAAA,EACxB,CAAC,OAAO,GAAQ,KAAA;AACd,IAAM,MAAA,EAAE,UAAU,SAAW,EAAA,QAAA,EAAU,UAAU,YAAc,EAAA,GAAG,MAChE,GAAA,KAAA;AACF,IAAA,MAAM,uBAAuB,EAAG,CAAA,CAAC,OAAO,OAAO,CAAC,GAAG,SAAS,CAAA;AAE5D,IACE,uBAAA,IAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,SAAW,EAAA,oBAAA;AAAA,QACX,UAAS,EAAA,OAAA;AAAA,QACT,GAAA;AAAA,QACC,GAAG,IAAA;AAAA,QAEJ,QAAA,EAAA;AAAA,0BAAA,IAAA,CAAC,SAAI,SAAW,EAAA,MAAA,CAAO,eAAe,CAAA,EAAG,eAAY,MACnD,EAAA,QAAA,EAAA;AAAA,4BAAA,IAAA,CAAC,MAAK,EAAA,EAAA,SAAA,EAAW,MAAO,CAAA,YAAY,CACjC,EAAA,QAAA,EAAA;AAAA,cAAA,QAAA;AAAA,cACA,2BAEG,IAAA,CAAA,QAAA,EAAA,EAAA,QAAA,EAAA;AAAA,gCAAA,GAAA,CAAC,UAAK,aAAW,EAAA,IAAA,EAAC,WAAW,MAAO,CAAA,UAAU,GAAG,QAEjD,EAAA,GAAA,EAAA,CAAA;AAAA,gCACA,GAAA,CAAC,UAAO,QAAQ,EAAA,UAAA,EAAA;AAAA,eAAA,EAClB,CACE,GAAA;AAAA,aACN,EAAA,CAAA;AAAA,YACC,QACC,mBAAA,GAAA;AAAA,cAAC,sBAAA;AAAA,cAAA;AAAA,gBACC,QAAA;AAAA,gBACA;AAAA;AAAA,aAEA,GAAA;AAAA,WACN,EAAA,CAAA;AAAA,UAEC,QAAW,mBAAA,GAAA,CAAC,MAAQ,EAAA,EAAA,QAAA,EAAA,QAAA,EAAS,CAAY,GAAA;AAAA;AAAA;AAAA,KAC5C;AAAA;AAGN;AAEA,UAAA,CAAW,WAAc,GAAA,YAAA;;;;"}
@@ -1,25 +0,0 @@
1
- import { DateTime } from 'luxon';
2
- import { ComponentPropsWithoutRef } from 'react';
3
- export type CalendarYearSelectionProps = ComponentPropsWithoutRef<"div"> & {
4
- /**
5
- * The function to call when a year is selected.
6
- *
7
- * @param year - The year that is selected.
8
- */
9
- onYearSelection: (year: DateTime["year"]) => void;
10
- };
11
- /**
12
- * A component that displays a grid of year cards and allows the user to select a year.
13
- *
14
- * @param props.onYearSelection - The function to call when a year is selected.
15
- * @param props - The rest of the props for the div wrapper.
16
- * @returns A component that displays a grid of year cards and allows the user to select a year.
17
- */
18
- export declare const CalendarYearSelection: import('react').ForwardRefExoticComponent<Omit<import('react').DetailedHTMLProps<import('react').HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & {
19
- /**
20
- * The function to call when a year is selected.
21
- *
22
- * @param year - The year that is selected.
23
- */
24
- onYearSelection: (year: DateTime["year"]) => void;
25
- } & import('react').RefAttributes<HTMLDivElement>>;
@@ -1,56 +0,0 @@
1
- import { useState, useRef, useCallback, useEffect } from 'react';
2
-
3
- function containsRelatedTarget(event) {
4
- if (event.currentTarget instanceof HTMLElement && event.relatedTarget instanceof HTMLElement) {
5
- return event.currentTarget.contains(event.relatedTarget);
6
- }
7
- return false;
8
- }
9
- function useFocusWithin({
10
- onBlur,
11
- onFocus
12
- } = {}) {
13
- const [focused, setFocused] = useState(false);
14
- const focusedRef = useRef(false);
15
- const elementRef = useRef(null);
16
- const _setFocused = useCallback((value) => {
17
- setFocused(value);
18
- focusedRef.current = value;
19
- }, []);
20
- const handleFocusIn = useCallback(
21
- (event) => {
22
- if (!focusedRef.current) {
23
- _setFocused(true);
24
- onFocus?.(event);
25
- }
26
- },
27
- // eslint-disable-next-line react-hooks/exhaustive-deps
28
- [onFocus]
29
- );
30
- const handleFocusOut = useCallback(
31
- (event) => {
32
- if (focusedRef.current && !containsRelatedTarget(event)) {
33
- _setFocused(false);
34
- onBlur?.(event);
35
- }
36
- },
37
- // eslint-disable-next-line react-hooks/exhaustive-deps
38
- [onBlur]
39
- );
40
- useEffect(() => {
41
- const element = elementRef.current;
42
- if (!element) {
43
- return;
44
- }
45
- element.addEventListener("focusin", handleFocusIn);
46
- element.addEventListener("focusout", handleFocusOut);
47
- return () => {
48
- element.removeEventListener("focusin", handleFocusIn);
49
- element.removeEventListener("focusout", handleFocusOut);
50
- };
51
- }, [handleFocusIn, handleFocusOut]);
52
- return { ref: elementRef, focused };
53
- }
54
-
55
- export { useFocusWithin as u };
56
- //# sourceMappingURL=useFocusWithin-BhU7hoAD.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useFocusWithin-BhU7hoAD.js","sources":["../src/internal/hooks/useFocusWithin/useFocusWithin.ts"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from \"react\";\n\nfunction containsRelatedTarget(event: FocusEvent) {\n if (\n event.currentTarget instanceof HTMLElement &&\n event.relatedTarget instanceof HTMLElement\n ) {\n return event.currentTarget.contains(event.relatedTarget);\n }\n\n return false;\n}\n\nexport interface UseFocusWithinOptions {\n onFocus?: (event: FocusEvent) => void;\n onBlur?: (event: FocusEvent) => void;\n}\n\nexport interface UseFocusWithinReturnValue<T extends HTMLElement = any> {\n ref: React.RefObject<T>;\n focused: boolean;\n}\n\n/**\n * Custom hook for tracking focus state within a DOM element.\n *\n * Features:\n * - Tracks whether any child element has focus\n * - Provides a ref object to attach to the target element\n * - Handles focus events with proper cleanup\n * - Supports custom onFocus and onBlur callbacks\n * - Prevents false blur events when focus moves between children\n * - Automatically cleans up event listeners on unmount\n *\n * @param options Configuration options for the hook\n * @param options.onFocus Optional callback when focus enters the element\n * @param options.onBlur Optional callback when focus leaves the element\n * @returns Object containing ref and focused state\n *\n * @example\n * const { ref, focused } = useFocusWithin({\n * onFocus: () => console.log('Focus entered'),\n * onBlur: () => console.log('Focus left')\n * });\n *\n * return <div ref={ref} className={focused ? 'focused' : ''}>Content</div>;\n */\nexport function useFocusWithin<T extends HTMLElement = any>({\n onBlur,\n onFocus,\n}: UseFocusWithinOptions = {}): UseFocusWithinReturnValue<T> {\n const [focused, setFocused] = useState(false);\n const focusedRef = useRef(false);\n const elementRef = useRef<T>(null);\n\n const _setFocused = useCallback((value: boolean) => {\n setFocused(value);\n focusedRef.current = value;\n }, []);\n\n const handleFocusIn = useCallback(\n (event: FocusEvent) => {\n if (!focusedRef.current) {\n _setFocused(true);\n onFocus?.(event);\n }\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [onFocus],\n );\n\n const handleFocusOut = useCallback(\n (event: FocusEvent) => {\n if (focusedRef.current && !containsRelatedTarget(event)) {\n _setFocused(false);\n onBlur?.(event);\n }\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [onBlur],\n );\n\n useEffect(() => {\n const element = elementRef.current;\n if (!element) {\n return;\n }\n\n element.addEventListener(\"focusin\", handleFocusIn);\n element.addEventListener(\"focusout\", handleFocusOut);\n\n return () => {\n element.removeEventListener(\"focusin\", handleFocusIn);\n element.removeEventListener(\"focusout\", handleFocusOut);\n };\n }, [handleFocusIn, handleFocusOut]);\n\n return { ref: elementRef, focused };\n}\n"],"names":[],"mappings":";;AAEA,SAAS,sBAAsB,KAAmB,EAAA;AAChD,EAAA,IACE,KAAM,CAAA,aAAA,YAAyB,WAC/B,IAAA,KAAA,CAAM,yBAAyB,WAC/B,EAAA;AACA,IAAA,OAAO,KAAM,CAAA,aAAA,CAAc,QAAS,CAAA,KAAA,CAAM,aAAa,CAAA;AAAA;AAGzD,EAAO,OAAA,KAAA;AACT;AAoCO,SAAS,cAA4C,CAAA;AAAA,EAC1D,MAAA;AAAA,EACA;AACF,CAAA,GAA2B,EAAkC,EAAA;AAC3D,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAAS,KAAK,CAAA;AAC5C,EAAM,MAAA,UAAA,GAAa,OAAO,KAAK,CAAA;AAC/B,EAAM,MAAA,UAAA,GAAa,OAAU,IAAI,CAAA;AAEjC,EAAM,MAAA,WAAA,GAAc,WAAY,CAAA,CAAC,KAAmB,KAAA;AAClD,IAAA,UAAA,CAAW,KAAK,CAAA;AAChB,IAAA,UAAA,CAAW,OAAU,GAAA,KAAA;AAAA,GACvB,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,aAAgB,GAAA,WAAA;AAAA,IACpB,CAAC,KAAsB,KAAA;AACrB,MAAI,IAAA,CAAC,WAAW,OAAS,EAAA;AACvB,QAAA,WAAA,CAAY,IAAI,CAAA;AAChB,QAAA,OAAA,GAAU,KAAK,CAAA;AAAA;AACjB,KACF;AAAA;AAAA,IAEA,CAAC,OAAO;AAAA,GACV;AAEA,EAAA,MAAM,cAAiB,GAAA,WAAA;AAAA,IACrB,CAAC,KAAsB,KAAA;AACrB,MAAA,IAAI,UAAW,CAAA,OAAA,IAAW,CAAC,qBAAA,CAAsB,KAAK,CAAG,EAAA;AACvD,QAAA,WAAA,CAAY,KAAK,CAAA;AACjB,QAAA,MAAA,GAAS,KAAK,CAAA;AAAA;AAChB,KACF;AAAA;AAAA,IAEA,CAAC,MAAM;AAAA,GACT;AAEA,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,UAAU,UAAW,CAAA,OAAA;AAC3B,IAAA,IAAI,CAAC,OAAS,EAAA;AACZ,MAAA;AAAA;AAGF,IAAQ,OAAA,CAAA,gBAAA,CAAiB,WAAW,aAAa,CAAA;AACjD,IAAQ,OAAA,CAAA,gBAAA,CAAiB,YAAY,cAAc,CAAA;AAEnD,IAAA,OAAO,MAAM;AACX,MAAQ,OAAA,CAAA,mBAAA,CAAoB,WAAW,aAAa,CAAA;AACpD,MAAQ,OAAA,CAAA,mBAAA,CAAoB,YAAY,cAAc,CAAA;AAAA,KACxD;AAAA,GACC,EAAA,CAAC,aAAe,EAAA,cAAc,CAAC,CAAA;AAElC,EAAO,OAAA,EAAE,GAAK,EAAA,UAAA,EAAY,OAAQ,EAAA;AACpC;;;;"}