@salt-ds/lab 1.0.0-alpha.81 → 1.0.0-alpha.83

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 (29) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/css/salt-lab.css +2 -2
  3. package/dist-cjs/calendar/internal/CalendarDay.js +1 -1
  4. package/dist-cjs/calendar/internal/CalendarDay.js.map +1 -1
  5. package/dist-cjs/date-input/DateInputRange.js +1 -1
  6. package/dist-cjs/date-input/DateInputRange.js.map +1 -1
  7. package/dist-cjs/date-input/DateInputSingle.js +1 -1
  8. package/dist-cjs/date-input/DateInputSingle.js.map +1 -1
  9. package/dist-cjs/date-picker/DatePickerRangeGridPanel.js +1 -1
  10. package/dist-cjs/date-picker/DatePickerRangeGridPanel.js.map +1 -1
  11. package/dist-cjs/date-picker/DatePickerRangePanel.js +1 -1
  12. package/dist-cjs/date-picker/DatePickerRangePanel.js.map +1 -1
  13. package/dist-cjs/date-picker/DatePickerSingleGridPanel.js +1 -1
  14. package/dist-cjs/date-picker/DatePickerSingleGridPanel.js.map +1 -1
  15. package/dist-cjs/list-deprecated/ListItem.css.js +1 -1
  16. package/dist-es/calendar/internal/CalendarDay.js +3 -3
  17. package/dist-es/calendar/internal/CalendarDay.js.map +1 -1
  18. package/dist-es/date-input/DateInputRange.js +1 -1
  19. package/dist-es/date-input/DateInputRange.js.map +1 -1
  20. package/dist-es/date-input/DateInputSingle.js +1 -1
  21. package/dist-es/date-input/DateInputSingle.js.map +1 -1
  22. package/dist-es/date-picker/DatePickerRangeGridPanel.js +3 -3
  23. package/dist-es/date-picker/DatePickerRangeGridPanel.js.map +1 -1
  24. package/dist-es/date-picker/DatePickerRangePanel.js +3 -3
  25. package/dist-es/date-picker/DatePickerRangePanel.js.map +1 -1
  26. package/dist-es/date-picker/DatePickerSingleGridPanel.js +3 -3
  27. package/dist-es/date-picker/DatePickerSingleGridPanel.js.map +1 -1
  28. package/dist-es/list-deprecated/ListItem.css.js +1 -1
  29. package/package.json +3 -3
package/CHANGELOG.md CHANGED
@@ -1,5 +1,33 @@
1
1
  # @salt-ds/lab
2
2
 
3
+ ## 1.0.0-alpha.83
4
+
5
+ ### Patch Changes
6
+
7
+ - 1179903: Fixed `DateInputSingle` and `DateInputRange` status adornments not appearing when validation is active in read-only mode.
8
+ - Updated dependencies [0c664ed]
9
+ - Updated dependencies [f670363]
10
+ - Updated dependencies [9f9be9d]
11
+ - Updated dependencies [0d3fc12]
12
+ - Updated dependencies [ee16c19]
13
+ - Updated dependencies [f670363]
14
+ - Updated dependencies [ee16c19]
15
+ - @salt-ds/icons@1.16.0
16
+ - @salt-ds/core@1.54.1
17
+
18
+ ## 1.0.0-alpha.82
19
+
20
+ ### Patch Changes
21
+
22
+ - e31acee: Removed `useLayoutEffect` usage to fix warnings being logged during SSR.
23
+ - Updated dependencies [64afd57]
24
+ - Updated dependencies [89779b5]
25
+ - Updated dependencies [10ffed9]
26
+ - Updated dependencies [12ef4c9]
27
+ - Updated dependencies [1511c0d]
28
+ - Updated dependencies [e31acee]
29
+ - @salt-ds/core@1.54.0
30
+
3
31
  ## 1.0.0-alpha.81
4
32
 
5
33
  ### Minor Changes
package/css/salt-lab.css CHANGED
@@ -2065,7 +2065,7 @@
2065
2065
  --list-item-text-color: var(--salt-selectable-foreground);
2066
2066
  --list-item-background: var(--salt-selectable-background);
2067
2067
  --list-item-background-hover: var(--salt-selectable-background-hover);
2068
- --list-item-selected-focus-outlineColor: var(--salt-accent-foreground);
2068
+ --list-item-selected-focus-outlineColor: var(--salt-content-bold-foreground);
2069
2069
  --list-item-text-color-active: var(--salt-selectable-foreground-selected);
2070
2070
  --list-item-background-active: var(--salt-selectable-background-selected);
2071
2071
  --list-item-textAlign: var(--salt-text-textAlign);
@@ -4346,4 +4346,4 @@ table.saltTable td.saltTable-td-align-right {
4346
4346
  margin: calc(var(--salt-size-unit) / 2) 0;
4347
4347
  }
4348
4348
 
4349
- /* src/1ad622a2-e21e-4df4-b3cb-21bb7de1ae85.css */
4349
+ /* src/4e4076d8-1150-4655-995e-62a13bac44e2.css */
@@ -40,7 +40,7 @@ const CalendarDay = react.forwardRef(function CalendarDay2(props, ref) {
40
40
  });
41
41
  const { focused, today, unselectable, highlighted, hidden, outOfRange } = status;
42
42
  const buttonRef = core.useForkRef(ref, focusedDateRef);
43
- react.useLayoutEffect(() => {
43
+ core.useIsomorphicLayoutEffect(() => {
44
44
  var _a;
45
45
  if (focused) {
46
46
  (_a = focusedDateRef == null ? void 0 : focusedDateRef.current) == null ? void 0 : _a.focus({ preventScroll: true });
@@ -1 +1 @@
1
- {"version":3,"file":"CalendarDay.js","sources":["../src/calendar/internal/CalendarDay.tsx"],"sourcesContent":["import {\n makePrefixer,\n type RenderPropsType,\n renderProps,\n Tooltip,\n type TooltipProps,\n useForkRef,\n} from \"@salt-ds/core\";\nimport type { DateFrameworkType } from \"@salt-ds/date-adapters\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport { type ComponentPropsWithRef, forwardRef, useLayoutEffect } from \"react\";\nimport { useLocalization } from \"../../localization-provider\";\nimport { type DayStatus, useCalendarDay } from \"../useCalendarDay\";\nimport calendarDayCss from \"./CalendarDay.css\";\n\nexport interface CalendarDayProps<TDate>\n extends Omit<ComponentPropsWithRef<\"button\">, \"children\"> {\n /**\n * Day date\n */\n date: TDate;\n /**\n * Format of date\n */\n format?: string;\n /**\n * Render prop to enable customisation of day button.\n */\n render?: RenderPropsType[\"render\"];\n /**\n * Month being rendered\n */\n month: TDate;\n /**\n * Additional Tooltip props\n */\n TooltipProps?: Partial<TooltipProps>;\n}\nexport interface renderCalendarDayProps<TDate> extends CalendarDayProps<TDate> {\n /**\n * Status of day\n */\n status: DayStatus;\n}\n\nconst withBaseName = makePrefixer(\"saltCalendarDay\");\n\nexport const CalendarDay = forwardRef<\n HTMLButtonElement,\n CalendarDayProps<DateFrameworkType>\n>(function CalendarDay<TDate extends DateFrameworkType>(\n props: CalendarDayProps<TDate>,\n ref: React.Ref<HTMLButtonElement>,\n) {\n const {\n className,\n date,\n render,\n month,\n TooltipProps,\n format = \"DD\",\n ...rest\n } = props;\n const { dateAdapter } = useLocalization<TDate>();\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-calendar-day\",\n css: calendarDayCss,\n window: targetWindow,\n });\n\n const {\n status,\n focusedDateRef = null,\n dayProps,\n unselectableReason,\n highlightedReason,\n } = useCalendarDay({\n date,\n month,\n });\n const { focused, today, unselectable, highlighted, hidden, outOfRange } =\n status;\n const buttonRef = useForkRef(ref, focusedDateRef);\n\n useLayoutEffect(() => {\n if (focused) {\n focusedDateRef?.current?.focus({ preventScroll: true });\n }\n }, [focused]);\n\n const defaultButtonProps = {\n \"aria-label\": dateAdapter.format(date, \"DD MMMM YYYY\"),\n children: (\n <>\n {highlighted ? <div className={withBaseName(\"highlighted\")} /> : null}\n <span className={withBaseName(\"content\")}>\n {dateAdapter.format(date, format)}\n </span>\n </>\n ),\n ...dayProps,\n ref: buttonRef,\n ...rest,\n className: clsx(\n withBaseName(),\n {\n [withBaseName(\"hidden\")]: hidden,\n [withBaseName(\"unselectable\")]: !!unselectable,\n [withBaseName(\"outOfRange\")]: outOfRange,\n [withBaseName(\"focused\")]: !!focused,\n [withBaseName(\"today\")]: today,\n },\n dayProps.className,\n className,\n ),\n };\n\n const buttonElement = render ? (\n renderProps<React.ElementType<renderCalendarDayProps<TDate>>>(\"button\", {\n render,\n ...defaultButtonProps,\n status,\n date,\n })\n ) : (\n <button type={\"button\"} {...defaultButtonProps} />\n );\n\n const tooltipContent = unselectableReason || highlightedReason;\n if (tooltipContent && tooltipContent?.length) {\n return (\n <Tooltip\n hideIcon\n status=\"info\"\n content={tooltipContent}\n placement=\"top\"\n enterDelay={0} // --salt-duration-instant\n leaveDelay={0} // --salt-duration-instant\n {...TooltipProps}\n >\n {buttonElement}\n </Tooltip>\n );\n }\n return buttonElement;\n});\n"],"names":["makePrefixer","forwardRef","CalendarDay","useLocalization","useWindow","useComponentCssInjection","calendarDayCss","useCalendarDay","useForkRef","useLayoutEffect","jsxs","Fragment","jsx","clsx","renderProps","Tooltip"],"mappings":"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"}
1
+ {"version":3,"file":"CalendarDay.js","sources":["../src/calendar/internal/CalendarDay.tsx"],"sourcesContent":["import {\n makePrefixer,\n type RenderPropsType,\n renderProps,\n Tooltip,\n type TooltipProps,\n useForkRef,\n useIsomorphicLayoutEffect,\n} from \"@salt-ds/core\";\nimport type { DateFrameworkType } from \"@salt-ds/date-adapters\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport { type ComponentPropsWithRef, forwardRef } from \"react\";\nimport { useLocalization } from \"../../localization-provider\";\nimport { type DayStatus, useCalendarDay } from \"../useCalendarDay\";\nimport calendarDayCss from \"./CalendarDay.css\";\n\nexport interface CalendarDayProps<TDate>\n extends Omit<ComponentPropsWithRef<\"button\">, \"children\"> {\n /**\n * Day date\n */\n date: TDate;\n /**\n * Format of date\n */\n format?: string;\n /**\n * Render prop to enable customisation of day button.\n */\n render?: RenderPropsType[\"render\"];\n /**\n * Month being rendered\n */\n month: TDate;\n /**\n * Additional Tooltip props\n */\n TooltipProps?: Partial<TooltipProps>;\n}\nexport interface renderCalendarDayProps<TDate> extends CalendarDayProps<TDate> {\n /**\n * Status of day\n */\n status: DayStatus;\n}\n\nconst withBaseName = makePrefixer(\"saltCalendarDay\");\n\nexport const CalendarDay = forwardRef<\n HTMLButtonElement,\n CalendarDayProps<DateFrameworkType>\n>(function CalendarDay<TDate extends DateFrameworkType>(\n props: CalendarDayProps<TDate>,\n ref: React.Ref<HTMLButtonElement>,\n) {\n const {\n className,\n date,\n render,\n month,\n TooltipProps,\n format = \"DD\",\n ...rest\n } = props;\n const { dateAdapter } = useLocalization<TDate>();\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-calendar-day\",\n css: calendarDayCss,\n window: targetWindow,\n });\n\n const {\n status,\n focusedDateRef = null,\n dayProps,\n unselectableReason,\n highlightedReason,\n } = useCalendarDay({\n date,\n month,\n });\n const { focused, today, unselectable, highlighted, hidden, outOfRange } =\n status;\n const buttonRef = useForkRef(ref, focusedDateRef);\n\n useIsomorphicLayoutEffect(() => {\n if (focused) {\n focusedDateRef?.current?.focus({ preventScroll: true });\n }\n }, [focused]);\n\n const defaultButtonProps = {\n \"aria-label\": dateAdapter.format(date, \"DD MMMM YYYY\"),\n children: (\n <>\n {highlighted ? <div className={withBaseName(\"highlighted\")} /> : null}\n <span className={withBaseName(\"content\")}>\n {dateAdapter.format(date, format)}\n </span>\n </>\n ),\n ...dayProps,\n ref: buttonRef,\n ...rest,\n className: clsx(\n withBaseName(),\n {\n [withBaseName(\"hidden\")]: hidden,\n [withBaseName(\"unselectable\")]: !!unselectable,\n [withBaseName(\"outOfRange\")]: outOfRange,\n [withBaseName(\"focused\")]: !!focused,\n [withBaseName(\"today\")]: today,\n },\n dayProps.className,\n className,\n ),\n };\n\n const buttonElement = render ? (\n renderProps<React.ElementType<renderCalendarDayProps<TDate>>>(\"button\", {\n render,\n ...defaultButtonProps,\n status,\n date,\n })\n ) : (\n <button type={\"button\"} {...defaultButtonProps} />\n );\n\n const tooltipContent = unselectableReason || highlightedReason;\n if (tooltipContent && tooltipContent?.length) {\n return (\n <Tooltip\n hideIcon\n status=\"info\"\n content={tooltipContent}\n placement=\"top\"\n enterDelay={0} // --salt-duration-instant\n leaveDelay={0} // --salt-duration-instant\n {...TooltipProps}\n >\n {buttonElement}\n </Tooltip>\n );\n }\n return buttonElement;\n});\n"],"names":["makePrefixer","forwardRef","CalendarDay","useLocalization","useWindow","useComponentCssInjection","calendarDayCss","useCalendarDay","useForkRef","useIsomorphicLayoutEffect","jsxs","Fragment","jsx","clsx","renderProps","Tooltip"],"mappings":"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"}
@@ -343,7 +343,7 @@ const DateInputRange = react.forwardRef(
343
343
  }
344
344
  ),
345
345
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: withBaseName("endAdornmentContainer"), children: [
346
- !isDisabled && !isReadOnly && validationStatus && /* @__PURE__ */ jsxRuntime.jsx(core.StatusAdornment, { status: validationStatus }),
346
+ !isDisabled && validationStatus && /* @__PURE__ */ jsxRuntime.jsx(core.StatusAdornment, { status: validationStatus }),
347
347
  endAdornment
348
348
  ] }),
349
349
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: withBaseName("activationIndicator") })
@@ -1 +1 @@
1
- {"version":3,"file":"DateInputRange.js","sources":["../src/date-input/DateInputRange.tsx"],"sourcesContent":["import {\n type InputProps,\n makePrefixer,\n StatusAdornment,\n useControlled,\n useForkRef,\n useFormFieldProps,\n useId,\n} from \"@salt-ds/core\";\nimport type {\n DateDetail,\n DateFrameworkType,\n ParserResult,\n TimeFields,\n Timezone,\n} from \"@salt-ds/date-adapters\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport {\n type ChangeEvent,\n type ChangeEventHandler,\n type ComponentPropsWithoutRef,\n type FocusEventHandler,\n forwardRef,\n type InputHTMLAttributes,\n type KeyboardEventHandler,\n type MouseEventHandler,\n type ReactNode,\n type Ref,\n type SyntheticEvent,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport type { DateRangeSelection } from \"../calendar\";\nimport { useLocalization } from \"../localization-provider\";\nimport dateInputCss from \"./DateInput.css\";\n\nconst withBaseName = makePrefixer(\"saltDateInput\");\n\n/**\n * DateInputRange raw value or null if no date is defined.\n */\nexport type DateInputRangeValue = {\n startDate?: string | null;\n endDate?: string | null;\n};\n\n/**\n * Details of parsing the date range\n */\nexport type DateInputRangeDetails = {\n /** Details of parsing the start date and applying any validation */\n startDate?: DateDetail;\n /** Details of parsing the end date and applying any validation */\n endDate?: DateDetail;\n};\n\n/**\n * Enum to identify the field being parsed\n */\nexport enum DateParserField {\n START = \"start\",\n END = \"end\",\n}\n\n/**\n * Props for the DateInputRange component.\n * @template TDate - The type of the date object.\n */\nexport interface DateInputRangeProps<TDate extends DateFrameworkType>\n extends Omit<ComponentPropsWithoutRef<\"div\">, \"defaultValue\" | \"onChange\">,\n Omit<InputProps, \"defaultValue\" | \"inputRef\" | \"value\" | \"onChange\"> {\n /**\n * The aria-label for accessibility.\n */\n ariaLabel?: string;\n /**\n * Styling variant with full border. Defaults to false.\n */\n bordered?: boolean;\n /**\n * The marker to use in an empty read-only DateInput.\n * Use `''` to disable this feature. Defaults to '—'.\n */\n emptyReadOnlyMarker?: string;\n /**\n * End adornment component.\n */\n endAdornment?: ReactNode;\n /**\n * Attributes applied to the start `input` element.\n * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dateInput#Attributes\n */\n startInputProps?: InputHTMLAttributes<HTMLInputElement>;\n /**\n * Attributes applied to the end `input` element.\n * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dateInput#Attributes\n */\n endInputProps?: InputHTMLAttributes<HTMLInputElement>;\n /**\n * If `true`, the component is read-only.\n */\n readOnly?: boolean;\n /**\n * Validation status.\n */\n validationStatus?: \"error\" | \"warning\" | \"success\";\n /**\n * Styling variant. Defaults to \"primary\".\n */\n variant?: \"primary\" | \"secondary\";\n /**\n * Format string for date.\n */\n format?: string;\n /**\n * Optional ref for the start input component.\n */\n startInputRef?: Ref<HTMLInputElement>;\n /**\n * Optional ref for the end input component.\n */\n endInputRef?: Ref<HTMLInputElement>;\n /**\n * Parser callback, if not using the adapter's parser\n * @param value - date string to parse\n * @param field: DateParserField to identify value,\n * @param format - format required\n */\n parse?: (\n value: string,\n field: DateParserField,\n format: string,\n ) => ParserResult<TDate>;\n /**\n * Input value. Use when the input value is controlled.\n */\n value?: DateInputRangeValue;\n /**\n * The initial input value. Use when the component is uncontrolled.\n */\n defaultValue?: DateInputRangeValue;\n /**\n * The date value. Use when the component is controlled.\n */\n date?: DateRangeSelection<TDate> | null;\n /**\n * The initial selected date value. Use when the component is uncontrolled.\n */\n defaultDate?: DateRangeSelection<TDate> | null;\n /**\n * Callback fired when the input value changes.\n * @param event - The change event.\n * @param date - The new date input range value.\n */\n onChange?: (event: ChangeEvent<HTMLInputElement>) => void;\n /**\n * Callback fired when the selected date changes.\n * @param event - The synthetic event.\n * @param date - the selected date, invalid date if not a valid date or undefined (uncontrolled) or null (controlled) if not defined\n * @param details - The details of date selection, either a valid date or error\n */\n onDateChange?: (\n event: SyntheticEvent,\n date: DateRangeSelection<TDate> | null,\n details: DateInputRangeDetails,\n ) => void;\n /**\n * Called when input values change, either due to user interaction or programmatic formatting of valid dates.\n * @param event - The synthetic event or null if a programmatic change.\n * @param newValue - The new date input range value.\n */\n onDateValueChange?: (\n event: SyntheticEvent | null,\n newValue: DateInputRangeValue,\n ) => void;\n /**\n * Specifies the timezone behavior:\n * - If undefined, the timezone will be derived from the passed date, or from `defaultSelectedDate`/`selectedDate`.\n * - If set to \"default\", the default timezone of the date library will be used.\n * - If set to \"system\", the local system's timezone will be applied.\n * - If set to \"UTC\", the time will be returned in UTC.\n * - If set to a valid IANA timezone identifier, the time will be returned for that specific timezone.\n */\n timezone?: Timezone;\n}\n\nexport const DateInputRange = forwardRef<\n HTMLDivElement,\n DateInputRangeProps<DateFrameworkType>\n>(\n <TDate extends DateFrameworkType>(\n props: DateInputRangeProps<TDate>,\n ref: React.Ref<HTMLDivElement>,\n ) => {\n const { dateAdapter } = useLocalization<TDate>();\n const {\n bordered = false,\n className,\n disabled,\n \"aria-label\": ariaLabel,\n date: dateProp,\n defaultDate,\n onDateChange,\n value: valueProp,\n format = \"DD MMM YYYY\",\n defaultValue = {\n startDate: \"\",\n endDate: \"\",\n },\n onChange,\n onClick,\n onDateValueChange,\n emptyReadOnlyMarker = \"—\",\n endAdornment,\n startInputProps = {},\n endInputProps = {},\n startInputRef: startInputRefProp,\n endInputRef: endInputRefProp,\n parse: parseProp,\n placeholder = format.toLowerCase(),\n readOnly: readOnlyProp,\n validationStatus: validationStatusProp,\n variant = \"primary\",\n timezone = dateProp?.startDate || defaultDate?.startDate\n ? dateAdapter.getTimezone(\n (dateProp?.startDate ?? defaultDate?.startDate) as TDate,\n )\n : \"default\",\n ...rest\n } = props;\n const wrapperRef = useRef(null);\n const handleWrapperRef = useForkRef<HTMLDivElement>(ref, wrapperRef);\n\n const startInputRef = useRef<HTMLInputElement>(null);\n const handleStartInputRef = useForkRef(startInputRef, startInputRefProp);\n const endInputRef = useRef<HTMLInputElement>(null);\n const handleEndInputRef = useForkRef(endInputRef, endInputRefProp);\n\n const startInputID = useId();\n const endInputID = useId();\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-date-input-range\",\n css: dateInputCss,\n window: targetWindow,\n });\n\n const parseDateValue = (\n dateValue: string | null | undefined,\n field: DateParserField,\n ): ParserResult<TDate> | undefined =>\n parseProp\n ? parseProp(dateValue ?? \"\", field, format)\n : dateAdapter.parse.bind(dateAdapter)(dateValue ?? \"\", format);\n\n const [dateValue, setDateValue] = useControlled({\n controlled: valueProp,\n default: defaultValue,\n name: \"DateInputRange\",\n state: \"dateValue\",\n });\n\n const [date, setDate] = useControlled({\n controlled: dateProp,\n // biome-ignore lint/correctness/useExhaustiveDependencies: just on mount\n default: useMemo(() => {\n if (defaultDate) {\n return defaultDate;\n }\n if (!defaultValue) {\n return undefined;\n }\n const { date: startDate = undefined } =\n parseDateValue(defaultValue?.startDate, DateParserField.START) ?? {};\n const { date: endDate = undefined } =\n parseDateValue(defaultValue?.endDate, DateParserField.END) ?? {};\n return {\n startDate,\n endDate,\n };\n }, []),\n name: \"DateInputRange\",\n state: \"date\",\n });\n\n const lastAppliedValue = useRef<DateInputRangeValue>(dateValue);\n const preservedTime = useRef<{\n startTime: TimeFields | null;\n endTime: TimeFields | null;\n }>({ startTime: null, endTime: null });\n preservedTime.current = {\n startTime:\n date?.startDate && dateAdapter.isValid(date?.startDate)\n ? dateAdapter.getTime(date.startDate)\n : null,\n endTime:\n date?.endDate && dateAdapter.isValid(date?.endDate)\n ? dateAdapter.getTime(date.endDate)\n : null,\n };\n const setDateValueFromDate = (newDate: typeof date) => {\n let newDateValue = { startDate: \"\", endDate: \"\" };\n if (!newDate?.startDate) {\n newDateValue = { ...newDateValue, startDate: \"\" };\n } else if (!dateAdapter.isValid(newDate?.startDate)) {\n newDateValue = {\n ...newDateValue,\n startDate: dateValue?.startDate ?? \"\",\n };\n } else if (newDate?.startDate) {\n const formattedStartDateValue = dateAdapter.format(\n newDate.startDate,\n format,\n );\n newDateValue = { ...newDateValue, startDate: formattedStartDateValue };\n }\n if (!newDate?.endDate) {\n newDateValue = { ...newDateValue, endDate: \"\" };\n } else if (!dateAdapter.isValid(newDate?.endDate)) {\n newDateValue = { ...newDateValue, endDate: dateValue?.endDate ?? \"\" };\n } else if (newDate?.endDate && dateAdapter.isValid(newDate.endDate)) {\n const formattedEndDateValue = dateAdapter.format(\n newDate.endDate,\n format,\n );\n newDateValue = { ...newDateValue, endDate: formattedEndDateValue };\n }\n\n if (\n (!newDateValue?.startDate && !!dateValue?.startDate) ||\n (!newDateValue.endDate && !!dateValue?.endDate) ||\n newDateValue?.startDate !== dateValue?.startDate ||\n newDateValue?.endDate !== dateValue?.endDate\n ) {\n onDateValueChange?.(null, newDateValue);\n setDateValue(newDateValue);\n }\n return newDateValue;\n };\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: Update date string value ONLY when selected date changes, not when date string itself change\n useEffect(() => {\n lastAppliedValue.current = setDateValueFromDate(date);\n }, [date, date?.startDate, date?.endDate, dateAdapter.format, format]);\n\n const [focused, setFocused] = useState(false);\n\n const {\n a11yProps: {\n \"aria-describedby\": formFieldDescribedBy,\n \"aria-labelledby\": formFieldLabelledBy,\n } = {},\n disabled: formFieldDisabled,\n readOnly: formFieldReadOnly,\n necessity: formFieldRequired,\n validationStatus: formFieldValidationStatus,\n } = useFormFieldProps();\n\n const isReadOnly = readOnlyProp || formFieldReadOnly;\n const isDisabled = disabled || formFieldDisabled;\n\n const validationStatus = formFieldValidationStatus ?? validationStatusProp;\n\n const {\n \"aria-describedby\": startInputPropsDescribedBy,\n \"aria-labelledby\": startInputPropsLabelledBy,\n onBlur: startInputPropsOnBlur,\n onChange: startInputPropsOnChange,\n onKeyDown: startInputPropsOnKeyDown,\n onFocus: startInputPropsOnFocus,\n required: startInputPropsRequired,\n ...restStartInputProps\n } = startInputProps;\n\n const startInputIsRequired = formFieldRequired\n ? [\"required\", \"asterisk\"].includes(formFieldRequired)\n : startInputPropsRequired;\n\n const {\n \"aria-describedby\": endInputPropsDescribedBy,\n \"aria-labelledby\": endInputPropsLabelledBy,\n onBlur: endInputPropsOnBlur,\n onChange: endInputPropsOnChange,\n onKeyDown: endInputPropsOnKeyDown,\n onFocus: endInputPropsOnFocus,\n required: endInputPropsRequired,\n ...restEndInputProps\n } = endInputProps;\n\n const endInputIsRequired = formFieldRequired\n ? [\"required\", \"asterisk\"].includes(formFieldRequired)\n : endInputPropsRequired;\n\n const apply = (event: SyntheticEvent) => {\n const { date: startDate = undefined, ...startDateParseDetails } =\n parseDateValue(dateValue?.startDate, DateParserField.START) ?? {};\n const { date: endDate = undefined, ...endDateParseDetails } =\n parseDateValue(dateValue?.endDate, DateParserField.END) ?? {};\n\n const updatedDateRange: DateRangeSelection<TDate> = {\n startDate: dateValue?.startDate?.length ? startDate : null,\n endDate: dateValue?.endDate?.length ? endDate : null,\n };\n if (dateAdapter.isValid(startDate)) {\n updatedDateRange.startDate = dateAdapter.setTimezone(\n startDate,\n timezone,\n );\n if (preservedTime.current.startTime) {\n updatedDateRange.startDate = dateAdapter.set(\n updatedDateRange.startDate,\n preservedTime.current.startTime,\n );\n }\n }\n if (dateAdapter.isValid(endDate)) {\n updatedDateRange.endDate = dateAdapter.setTimezone(endDate, timezone);\n if (preservedTime.current.endTime) {\n updatedDateRange.endDate = dateAdapter.set(\n updatedDateRange.endDate,\n preservedTime.current.endTime,\n );\n }\n }\n const updatedDateValue = setDateValueFromDate(updatedDateRange);\n\n setDate(updatedDateRange);\n\n if (\n lastAppliedValue.current.startDate !== updatedDateValue.startDate ||\n lastAppliedValue.current.endDate !== updatedDateValue.endDate\n ) {\n onDateChange?.(event, updatedDateRange, {\n startDate: startDateParseDetails,\n endDate: endDateParseDetails,\n });\n onDateValueChange?.(event, updatedDateValue);\n lastAppliedValue.current = updatedDateValue;\n }\n };\n\n const handleStartInputChange: ChangeEventHandler<HTMLInputElement> = (\n event,\n ) => {\n const newDateValue = { ...dateValue, startDate: event.target.value };\n setDateValue(newDateValue);\n startInputPropsOnChange?.(event);\n onChange?.(event);\n onDateValueChange?.(event, newDateValue);\n };\n\n const handleEndInputChange: ChangeEventHandler<HTMLInputElement> = (\n event,\n ) => {\n const newDateValue = { ...dateValue, endDate: event.target.value };\n setDateValue(newDateValue);\n endInputPropsOnChange?.(event);\n onChange?.(event);\n onDateValueChange?.(event, newDateValue);\n };\n\n const handleStartInputFocus: FocusEventHandler<HTMLInputElement> = (\n event,\n ) => {\n setFocused(true);\n startInputPropsOnFocus?.(event);\n };\n\n const handleEndInputFocus: FocusEventHandler<HTMLInputElement> = (\n event,\n ) => {\n setFocused(true);\n endInputPropsOnFocus?.(event);\n };\n\n const handleStartInputBlur: FocusEventHandler<HTMLInputElement> = (\n event,\n ) => {\n setFocused(false);\n apply(event);\n startInputPropsOnBlur?.(event);\n };\n\n const handleEndInputBlur: FocusEventHandler<HTMLInputElement> = (event) => {\n setFocused(false);\n apply(event);\n endInputPropsOnBlur?.(event);\n };\n\n const handleStartInputKeyDown: KeyboardEventHandler<HTMLInputElement> = (\n event,\n ) => {\n if (event.key === \"Enter\") {\n apply(event);\n }\n startInputPropsOnKeyDown?.(event);\n };\n\n const handleEndInputKeyDown: KeyboardEventHandler<HTMLInputElement> = (\n event,\n ) => {\n if (event.key === \"Enter\") {\n apply(event);\n }\n endInputPropsOnKeyDown?.(event);\n };\n\n const handleWrapperClick: MouseEventHandler<HTMLDivElement> = (event) => {\n if (event.target === wrapperRef.current) {\n const input = startInputRef.current;\n input?.focus();\n input?.setSelectionRange(input.value.length, input.value.length);\n }\n onClick?.(event);\n };\n\n return (\n <div\n className={clsx(\n withBaseName(),\n withBaseName(variant),\n {\n [withBaseName(\"focused\")]: !isDisabled && focused,\n [withBaseName(\"disabled\")]: isDisabled,\n [withBaseName(\"readOnly\")]: isReadOnly,\n [withBaseName(validationStatus ?? \"\")]: validationStatus,\n [withBaseName(\"bordered\")]: bordered,\n },\n className,\n )}\n ref={handleWrapperRef}\n onClick={handleWrapperClick}\n {...rest}\n >\n <input\n autoComplete=\"off\"\n aria-describedby={clsx(\n formFieldDescribedBy,\n startInputPropsDescribedBy,\n )}\n aria-labelledby={clsx(\n formFieldLabelledBy,\n startInputPropsLabelledBy,\n startInputID,\n )}\n aria-label={clsx(\"Start date\", ariaLabel)}\n id={startInputID}\n className={withBaseName(\"input\")}\n disabled={isDisabled}\n readOnly={isReadOnly}\n ref={handleStartInputRef}\n tabIndex={isDisabled ? -1 : 0}\n placeholder={placeholder}\n value={\n isReadOnly && !dateValue?.startDate\n ? emptyReadOnlyMarker\n : (dateValue.startDate ?? dateAdapter.format(undefined, format))\n }\n {...restStartInputProps}\n onBlur={handleStartInputBlur}\n onChange={handleStartInputChange}\n onKeyDown={handleStartInputKeyDown}\n onFocus={!isDisabled ? handleStartInputFocus : undefined}\n required={startInputIsRequired}\n />\n <span className={withBaseName(\"dash\")}>-</span>\n <input\n autoComplete=\"off\"\n aria-describedby={clsx(\n formFieldDescribedBy,\n endInputPropsDescribedBy,\n )}\n aria-labelledby={clsx(\n formFieldLabelledBy,\n endInputPropsLabelledBy,\n endInputID,\n )}\n aria-label={clsx(\"End date\", ariaLabel)}\n id={endInputID}\n className={withBaseName(\"input\")}\n disabled={isDisabled}\n readOnly={isReadOnly}\n ref={handleEndInputRef}\n tabIndex={isDisabled ? -1 : 0}\n placeholder={placeholder}\n value={\n isReadOnly && !dateValue?.endDate\n ? emptyReadOnlyMarker\n : (dateValue.endDate ?? dateAdapter.format(undefined, format))\n }\n {...restEndInputProps}\n onBlur={handleEndInputBlur}\n onChange={handleEndInputChange}\n onKeyDown={handleEndInputKeyDown}\n onFocus={!isDisabled ? handleEndInputFocus : undefined}\n required={endInputIsRequired}\n />\n <div className={withBaseName(\"endAdornmentContainer\")}>\n {!isDisabled && !isReadOnly && validationStatus && (\n <StatusAdornment status={validationStatus} />\n )}\n {endAdornment}\n </div>\n <div className={withBaseName(\"activationIndicator\")} />\n </div>\n );\n },\n);\n"],"names":["makePrefixer","DateParserField","forwardRef","useLocalization","useRef","useForkRef","useId","useWindow","useComponentCssInjection","dateInputCss","dateValue","useControlled","useMemo","useEffect","useState","useFormFieldProps","jsxs","clsx","jsx","StatusAdornment"],"mappings":";;;;;;;;;;;AAwCA,MAAM,YAAA,GAAeA,kBAAa,eAAe,CAAA;AAuB1C,IAAK,eAAA,qBAAAC,gBAAAA,KAAL;AACL,EAAAA,iBAAA,OAAA,CAAA,GAAQ,OAAA;AACR,EAAAA,iBAAA,KAAA,CAAA,GAAM,KAAA;AAFI,EAAA,OAAAA,gBAAAA;AAAA,CAAA,EAAA,eAAA,IAAA,EAAA;AA+HL,MAAM,cAAA,GAAiBC,gBAAA;AAAA,EAI5B,CACE,OACA,GAAA,KACG;AACH,IAAA,MAAM,EAAE,WAAA,EAAY,GAAIC,oCAAA,EAAuB;AAC/C,IAAA,MAAM;AAAA,MACJ,QAAA,GAAW,KAAA;AAAA,MACX,SAAA;AAAA,MACA,QAAA;AAAA,MACA,YAAA,EAAc,SAAA;AAAA,MACd,IAAA,EAAM,QAAA;AAAA,MACN,WAAA;AAAA,MACA,YAAA;AAAA,MACA,KAAA,EAAO,SAAA;AAAA,MACP,MAAA,GAAS,aAAA;AAAA,MACT,YAAA,GAAe;AAAA,QACb,SAAA,EAAW,EAAA;AAAA,QACX,OAAA,EAAS;AAAA,OACX;AAAA,MACA,QAAA;AAAA,MACA,OAAA;AAAA,MACA,iBAAA;AAAA,MACA,mBAAA,GAAsB,QAAA;AAAA,MACtB,YAAA;AAAA,MACA,kBAAkB,EAAC;AAAA,MACnB,gBAAgB,EAAC;AAAA,MACjB,aAAA,EAAe,iBAAA;AAAA,MACf,WAAA,EAAa,eAAA;AAAA,MACb,KAAA,EAAO,SAAA;AAAA,MACP,WAAA,GAAc,OAAO,WAAA,EAAY;AAAA,MACjC,QAAA,EAAU,YAAA;AAAA,MACV,gBAAA,EAAkB,oBAAA;AAAA,MAClB,OAAA,GAAU,SAAA;AAAA,MACV,QAAA,GAAA,CAAW,QAAA,IAAA,IAAA,GAAA,MAAA,GAAA,QAAA,CAAU,SAAA,MAAa,WAAA,IAAA,IAAA,GAAA,MAAA,GAAA,WAAA,CAAa,aAC3C,WAAA,CAAY,WAAA;AAAA,QAAA,CACT,QAAA,IAAA,IAAA,GAAA,MAAA,GAAA,QAAA,CAAU,eAAa,WAAA,IAAA,IAAA,GAAA,MAAA,GAAA,WAAA,CAAa,SAAA;AAAA,OACvC,GACA,SAAA;AAAA,MACJ,GAAG;AAAA,KACL,GAAI,KAAA;AACJ,IAAA,MAAM,UAAA,GAAaC,aAAO,IAAI,CAAA;AAC9B,IAAA,MAAM,gBAAA,GAAmBC,eAAA,CAA2B,GAAA,EAAK,UAAU,CAAA;AAEnE,IAAA,MAAM,aAAA,GAAgBD,aAAyB,IAAI,CAAA;AACnD,IAAA,MAAM,mBAAA,GAAsBC,eAAA,CAAW,aAAA,EAAe,iBAAiB,CAAA;AACvE,IAAA,MAAM,WAAA,GAAcD,aAAyB,IAAI,CAAA;AACjD,IAAA,MAAM,iBAAA,GAAoBC,eAAA,CAAW,WAAA,EAAa,eAAe,CAAA;AAEjE,IAAA,MAAM,eAAeC,UAAA,EAAM;AAC3B,IAAA,MAAM,aAAaA,UAAA,EAAM;AAEzB,IAAA,MAAM,eAAeC,gBAAA,EAAU;AAC/B,IAAAC,+BAAA,CAAyB;AAAA,MACvB,MAAA,EAAQ,uBAAA;AAAA,MACR,GAAA,EAAKC,SAAA;AAAA,MACL,MAAA,EAAQ;AAAA,KACT,CAAA;AAED,IAAA,MAAM,iBAAiB,CACrBC,UAAAA,EACA,UAEA,SAAA,GACI,SAAA,CAAUA,cAAa,EAAA,EAAI,KAAA,EAAO,MAAM,CAAA,GACxC,YAAY,KAAA,CAAM,IAAA,CAAK,WAAW,CAAA,CAAEA,UAAAA,IAAa,IAAI,MAAM,CAAA;AAEjE,IAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIC,kBAAA,CAAc;AAAA,MAC9C,UAAA,EAAY,SAAA;AAAA,MACZ,OAAA,EAAS,YAAA;AAAA,MACT,IAAA,EAAM,gBAAA;AAAA,MACN,KAAA,EAAO;AAAA,KACR,CAAA;AAED,IAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIA,kBAAA,CAAc;AAAA,MACpC,UAAA,EAAY,QAAA;AAAA;AAAA,MAEZ,OAAA,EAASC,cAAQ,MAAM;AACrB,QAAA,IAAI,WAAA,EAAa;AACf,UAAA,OAAO,WAAA;AAAA,QACT;AACA,QAAA,IAAI,CAAC,YAAA,EAAc;AACjB,UAAA,OAAO,MAAA;AAAA,QACT;AACA,QAAA,MAAM,EAAE,IAAA,EAAM,SAAA,GAAY,MAAA,EAAU,GAClC,eAAe,YAAA,IAAA,IAAA,GAAA,MAAA,GAAA,YAAA,CAAc,SAAA,EAAW,OAAA,aAAqB,IAAK,EAAC;AACrE,QAAA,MAAM,EAAE,IAAA,EAAM,OAAA,GAAU,MAAA,EAAU,GAChC,eAAe,YAAA,IAAA,IAAA,GAAA,MAAA,GAAA,YAAA,CAAc,OAAA,EAAS,KAAA,WAAmB,IAAK,EAAC;AACjE,QAAA,OAAO;AAAA,UACL,SAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF,CAAA,EAAG,EAAE,CAAA;AAAA,MACL,IAAA,EAAM,gBAAA;AAAA,MACN,KAAA,EAAO;AAAA,KACR,CAAA;AAED,IAAA,MAAM,gBAAA,GAAmBR,aAA4B,SAAS,CAAA;AAC9D,IAAA,MAAM,gBAAgBA,YAAA,CAGnB,EAAE,WAAW,IAAA,EAAM,OAAA,EAAS,MAAM,CAAA;AACrC,IAAA,aAAA,CAAc,OAAA,GAAU;AAAA,MACtB,SAAA,EAAA,CACE,IAAA,IAAA,IAAA,GAAA,MAAA,GAAA,IAAA,CAAM,SAAA,KAAa,WAAA,CAAY,OAAA,CAAQ,IAAA,IAAA,IAAA,GAAA,MAAA,GAAA,IAAA,CAAM,SAAS,CAAA,GAClD,WAAA,CAAY,OAAA,CAAQ,IAAA,CAAK,SAAS,CAAA,GAClC,IAAA;AAAA,MACN,OAAA,EAAA,CACE,IAAA,IAAA,IAAA,GAAA,MAAA,GAAA,IAAA,CAAM,OAAA,KAAW,WAAA,CAAY,OAAA,CAAQ,IAAA,IAAA,IAAA,GAAA,MAAA,GAAA,IAAA,CAAM,OAAO,CAAA,GAC9C,WAAA,CAAY,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAA,GAChC;AAAA,KACR;AACA,IAAA,MAAM,oBAAA,GAAuB,CAAC,OAAA,KAAyB;AACrD,MAAA,IAAI,YAAA,GAAe,EAAE,SAAA,EAAW,EAAA,EAAI,SAAS,EAAA,EAAG;AAChD,MAAA,IAAI,EAAC,mCAAS,SAAA,CAAA,EAAW;AACvB,QAAA,YAAA,GAAe,EAAE,GAAG,YAAA,EAAc,SAAA,EAAW,EAAA,EAAG;AAAA,MAClD,WAAW,CAAC,WAAA,CAAY,OAAA,CAAQ,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAS,SAAS,CAAA,EAAG;AACnD,QAAA,YAAA,GAAe;AAAA,UACb,GAAG,YAAA;AAAA,UACH,SAAA,EAAA,CAAW,uCAAW,SAAA,KAAa;AAAA,SACrC;AAAA,MACF,CAAA,MAAA,IAAW,mCAAS,SAAA,EAAW;AAC7B,QAAA,MAAM,0BAA0B,WAAA,CAAY,MAAA;AAAA,UAC1C,OAAA,CAAQ,SAAA;AAAA,UACR;AAAA,SACF;AACA,QAAA,YAAA,GAAe,EAAE,GAAG,YAAA,EAAc,SAAA,EAAW,uBAAA,EAAwB;AAAA,MACvE;AACA,MAAA,IAAI,EAAC,mCAAS,OAAA,CAAA,EAAS;AACrB,QAAA,YAAA,GAAe,EAAE,GAAG,YAAA,EAAc,OAAA,EAAS,EAAA,EAAG;AAAA,MAChD,WAAW,CAAC,WAAA,CAAY,OAAA,CAAQ,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAS,OAAO,CAAA,EAAG;AACjD,QAAA,YAAA,GAAe,EAAE,GAAG,YAAA,EAAc,OAAA,EAAA,CAAS,SAAA,IAAA,IAAA,GAAA,MAAA,GAAA,SAAA,CAAW,YAAW,EAAA,EAAG;AAAA,MACtE,YAAW,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAS,OAAA,KAAW,YAAY,OAAA,CAAQ,OAAA,CAAQ,OAAO,CAAA,EAAG;AACnE,QAAA,MAAM,wBAAwB,WAAA,CAAY,MAAA;AAAA,UACxC,OAAA,CAAQ,OAAA;AAAA,UACR;AAAA,SACF;AACA,QAAA,YAAA,GAAe,EAAE,GAAG,YAAA,EAAc,OAAA,EAAS,qBAAA,EAAsB;AAAA,MACnE;AAEA,MAAA,IACG,EAAC,6CAAc,SAAA,CAAA,IAAa,CAAC,EAAC,SAAA,IAAA,IAAA,GAAA,MAAA,GAAA,SAAA,CAAW,SAAA,CAAA,IACzC,CAAC,YAAA,CAAa,OAAA,IAAW,CAAC,EAAC,SAAA,IAAA,IAAA,GAAA,MAAA,GAAA,SAAA,CAAW,aACvC,YAAA,IAAA,IAAA,GAAA,MAAA,GAAA,YAAA,CAAc,SAAA,OAAc,uCAAW,SAAA,CAAA,IAAA,CACvC,YAAA,IAAA,IAAA,GAAA,MAAA,GAAA,YAAA,CAAc,OAAA,OAAY,SAAA,IAAA,IAAA,GAAA,MAAA,GAAA,SAAA,CAAW,OAAA,CAAA,EACrC;AACA,QAAA,iBAAA,IAAA,IAAA,GAAA,MAAA,GAAA,iBAAA,CAAoB,IAAA,EAAM,YAAA,CAAA;AAC1B,QAAA,YAAA,CAAa,YAAY,CAAA;AAAA,MAC3B;AACA,MAAA,OAAO,YAAA;AAAA,IACT,CAAA;AAGA,IAAAS,eAAA,CAAU,MAAM;AACd,MAAA,gBAAA,CAAiB,OAAA,GAAU,qBAAqB,IAAI,CAAA;AAAA,IACtD,CAAA,EAAG,CAAC,IAAA,EAAM,IAAA,IAAA,IAAA,GAAA,MAAA,GAAA,IAAA,CAAM,SAAA,EAAW,6BAAM,OAAA,EAAS,WAAA,CAAY,MAAA,EAAQ,MAAM,CAAC,CAAA;AAErE,IAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIC,eAAS,KAAK,CAAA;AAE5C,IAAA,MAAM;AAAA,MACJ,SAAA,EAAW;AAAA,QACT,kBAAA,EAAoB,oBAAA;AAAA,QACpB,iBAAA,EAAmB;AAAA,UACjB,EAAC;AAAA,MACL,QAAA,EAAU,iBAAA;AAAA,MACV,QAAA,EAAU,iBAAA;AAAA,MACV,SAAA,EAAW,iBAAA;AAAA,MACX,gBAAA,EAAkB;AAAA,QAChBC,sBAAA,EAAkB;AAEtB,IAAA,MAAM,aAAa,YAAA,IAAgB,iBAAA;AACnC,IAAA,MAAM,aAAa,QAAA,IAAY,iBAAA;AAE/B,IAAA,MAAM,mBAAmB,yBAAA,IAA6B,oBAAA;AAEtD,IAAA,MAAM;AAAA,MACJ,kBAAA,EAAoB,0BAAA;AAAA,MACpB,iBAAA,EAAmB,yBAAA;AAAA,MACnB,MAAA,EAAQ,qBAAA;AAAA,MACR,QAAA,EAAU,uBAAA;AAAA,MACV,SAAA,EAAW,wBAAA;AAAA,MACX,OAAA,EAAS,sBAAA;AAAA,MACT,QAAA,EAAU,uBAAA;AAAA,MACV,GAAG;AAAA,KACL,GAAI,eAAA;AAEJ,IAAA,MAAM,oBAAA,GAAuB,oBACzB,CAAC,UAAA,EAAY,UAAU,CAAA,CAAE,QAAA,CAAS,iBAAiB,CAAA,GACnD,uBAAA;AAEJ,IAAA,MAAM;AAAA,MACJ,kBAAA,EAAoB,wBAAA;AAAA,MACpB,iBAAA,EAAmB,uBAAA;AAAA,MACnB,MAAA,EAAQ,mBAAA;AAAA,MACR,QAAA,EAAU,qBAAA;AAAA,MACV,SAAA,EAAW,sBAAA;AAAA,MACX,OAAA,EAAS,oBAAA;AAAA,MACT,QAAA,EAAU,qBAAA;AAAA,MACV,GAAG;AAAA,KACL,GAAI,aAAA;AAEJ,IAAA,MAAM,kBAAA,GAAqB,oBACvB,CAAC,UAAA,EAAY,UAAU,CAAA,CAAE,QAAA,CAAS,iBAAiB,CAAA,GACnD,qBAAA;AAEJ,IAAA,MAAM,KAAA,GAAQ,CAAC,KAAA,KAA0B;AA9Y7C,MAAA,IAAA,EAAA,EAAA,EAAA;AA+YM,MAAA,MAAM,EAAE,IAAA,EAAM,SAAA,GAAY,MAAA,EAAW,GAAG,qBAAA,EAAsB,GAC5D,cAAA,CAAe,SAAA,IAAA,IAAA,GAAA,MAAA,GAAA,SAAA,CAAW,SAAA,EAAW,OAAA,aAAqB,IAAK,EAAC;AAClE,MAAA,MAAM,EAAE,IAAA,EAAM,OAAA,GAAU,MAAA,EAAW,GAAG,mBAAA,EAAoB,GACxD,cAAA,CAAe,SAAA,IAAA,IAAA,GAAA,MAAA,GAAA,SAAA,CAAW,OAAA,EAAS,KAAA,WAAmB,IAAK,EAAC;AAE9D,MAAA,MAAM,gBAAA,GAA8C;AAAA,QAClD,SAAA,EAAA,CAAA,CAAW,EAAA,GAAA,SAAA,IAAA,IAAA,GAAA,MAAA,GAAA,SAAA,CAAW,SAAA,KAAX,IAAA,GAAA,MAAA,GAAA,EAAA,CAAsB,UAAS,SAAA,GAAY,IAAA;AAAA,QACtD,OAAA,EAAA,CAAA,CAAS,EAAA,GAAA,SAAA,IAAA,IAAA,GAAA,MAAA,GAAA,SAAA,CAAW,OAAA,KAAX,IAAA,GAAA,MAAA,GAAA,EAAA,CAAoB,UAAS,OAAA,GAAU;AAAA,OAClD;AACA,MAAA,IAAI,WAAA,CAAY,OAAA,CAAQ,SAAS,CAAA,EAAG;AAClC,QAAA,gBAAA,CAAiB,YAAY,WAAA,CAAY,WAAA;AAAA,UACvC,SAAA;AAAA,UACA;AAAA,SACF;AACA,QAAA,IAAI,aAAA,CAAc,QAAQ,SAAA,EAAW;AACnC,UAAA,gBAAA,CAAiB,YAAY,WAAA,CAAY,GAAA;AAAA,YACvC,gBAAA,CAAiB,SAAA;AAAA,YACjB,cAAc,OAAA,CAAQ;AAAA,WACxB;AAAA,QACF;AAAA,MACF;AACA,MAAA,IAAI,WAAA,CAAY,OAAA,CAAQ,OAAO,CAAA,EAAG;AAChC,QAAA,gBAAA,CAAiB,OAAA,GAAU,WAAA,CAAY,WAAA,CAAY,OAAA,EAAS,QAAQ,CAAA;AACpE,QAAA,IAAI,aAAA,CAAc,QAAQ,OAAA,EAAS;AACjC,UAAA,gBAAA,CAAiB,UAAU,WAAA,CAAY,GAAA;AAAA,YACrC,gBAAA,CAAiB,OAAA;AAAA,YACjB,cAAc,OAAA,CAAQ;AAAA,WACxB;AAAA,QACF;AAAA,MACF;AACA,MAAA,MAAM,gBAAA,GAAmB,qBAAqB,gBAAgB,CAAA;AAE9D,MAAA,OAAA,CAAQ,gBAAgB,CAAA;AAExB,MAAA,IACE,gBAAA,CAAiB,QAAQ,SAAA,KAAc,gBAAA,CAAiB,aACxD,gBAAA,CAAiB,OAAA,CAAQ,OAAA,KAAY,gBAAA,CAAiB,OAAA,EACtD;AACA,QAAA,YAAA,IAAA,IAAA,GAAA,MAAA,GAAA,YAAA,CAAe,OAAO,gBAAA,EAAkB;AAAA,UACtC,SAAA,EAAW,qBAAA;AAAA,UACX,OAAA,EAAS;AAAA,SACX,CAAA;AACA,QAAA,iBAAA,IAAA,IAAA,GAAA,MAAA,GAAA,iBAAA,CAAoB,KAAA,EAAO,gBAAA,CAAA;AAC3B,QAAA,gBAAA,CAAiB,OAAA,GAAU,gBAAA;AAAA,MAC7B;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,sBAAA,GAA+D,CACnE,KAAA,KACG;AACH,MAAA,MAAM,eAAe,EAAE,GAAG,WAAW,SAAA,EAAW,KAAA,CAAM,OAAO,KAAA,EAAM;AACnE,MAAA,YAAA,CAAa,YAAY,CAAA;AACzB,MAAA,uBAAA,IAAA,IAAA,GAAA,MAAA,GAAA,uBAAA,CAA0B,KAAA,CAAA;AAC1B,MAAA,QAAA,IAAA,IAAA,GAAA,MAAA,GAAA,QAAA,CAAW,KAAA,CAAA;AACX,MAAA,iBAAA,IAAA,IAAA,GAAA,MAAA,GAAA,iBAAA,CAAoB,KAAA,EAAO,YAAA,CAAA;AAAA,IAC7B,CAAA;AAEA,IAAA,MAAM,oBAAA,GAA6D,CACjE,KAAA,KACG;AACH,MAAA,MAAM,eAAe,EAAE,GAAG,WAAW,OAAA,EAAS,KAAA,CAAM,OAAO,KAAA,EAAM;AACjE,MAAA,YAAA,CAAa,YAAY,CAAA;AACzB,MAAA,qBAAA,IAAA,IAAA,GAAA,MAAA,GAAA,qBAAA,CAAwB,KAAA,CAAA;AACxB,MAAA,QAAA,IAAA,IAAA,GAAA,MAAA,GAAA,QAAA,CAAW,KAAA,CAAA;AACX,MAAA,iBAAA,IAAA,IAAA,GAAA,MAAA,GAAA,iBAAA,CAAoB,KAAA,EAAO,YAAA,CAAA;AAAA,IAC7B,CAAA;AAEA,IAAA,MAAM,qBAAA,GAA6D,CACjE,KAAA,KACG;AACH,MAAA,UAAA,CAAW,IAAI,CAAA;AACf,MAAA,sBAAA,IAAA,IAAA,GAAA,MAAA,GAAA,sBAAA,CAAyB,KAAA,CAAA;AAAA,IAC3B,CAAA;AAEA,IAAA,MAAM,mBAAA,GAA2D,CAC/D,KAAA,KACG;AACH,MAAA,UAAA,CAAW,IAAI,CAAA;AACf,MAAA,oBAAA,IAAA,IAAA,GAAA,MAAA,GAAA,oBAAA,CAAuB,KAAA,CAAA;AAAA,IACzB,CAAA;AAEA,IAAA,MAAM,oBAAA,GAA4D,CAChE,KAAA,KACG;AACH,MAAA,UAAA,CAAW,KAAK,CAAA;AAChB,MAAA,KAAA,CAAM,KAAK,CAAA;AACX,MAAA,qBAAA,IAAA,IAAA,GAAA,MAAA,GAAA,qBAAA,CAAwB,KAAA,CAAA;AAAA,IAC1B,CAAA;AAEA,IAAA,MAAM,kBAAA,GAA0D,CAAC,KAAA,KAAU;AACzE,MAAA,UAAA,CAAW,KAAK,CAAA;AAChB,MAAA,KAAA,CAAM,KAAK,CAAA;AACX,MAAA,mBAAA,IAAA,IAAA,GAAA,MAAA,GAAA,mBAAA,CAAsB,KAAA,CAAA;AAAA,IACxB,CAAA;AAEA,IAAA,MAAM,uBAAA,GAAkE,CACtE,KAAA,KACG;AACH,MAAA,IAAI,KAAA,CAAM,QAAQ,OAAA,EAAS;AACzB,QAAA,KAAA,CAAM,KAAK,CAAA;AAAA,MACb;AACA,MAAA,wBAAA,IAAA,IAAA,GAAA,MAAA,GAAA,wBAAA,CAA2B,KAAA,CAAA;AAAA,IAC7B,CAAA;AAEA,IAAA,MAAM,qBAAA,GAAgE,CACpE,KAAA,KACG;AACH,MAAA,IAAI,KAAA,CAAM,QAAQ,OAAA,EAAS;AACzB,QAAA,KAAA,CAAM,KAAK,CAAA;AAAA,MACb;AACA,MAAA,sBAAA,IAAA,IAAA,GAAA,MAAA,GAAA,sBAAA,CAAyB,KAAA,CAAA;AAAA,IAC3B,CAAA;AAEA,IAAA,MAAM,kBAAA,GAAwD,CAAC,KAAA,KAAU;AACvE,MAAA,IAAI,KAAA,CAAM,MAAA,KAAW,UAAA,CAAW,OAAA,EAAS;AACvC,QAAA,MAAM,QAAQ,aAAA,CAAc,OAAA;AAC5B,QAAA,KAAA,IAAA,IAAA,GAAA,MAAA,GAAA,KAAA,CAAO,KAAA,EAAA;AACP,QAAA,KAAA,IAAA,IAAA,GAAA,MAAA,GAAA,KAAA,CAAO,iBAAA,CAAkB,KAAA,CAAM,KAAA,CAAM,MAAA,EAAQ,MAAM,KAAA,CAAM,MAAA,CAAA;AAAA,MAC3D;AACA,MAAA,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAU,KAAA,CAAA;AAAA,IACZ,CAAA;AAEA,IAAA,uBACEC,eAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAWC,SAAA;AAAA,UACT,YAAA,EAAa;AAAA,UACb,aAAa,OAAO,CAAA;AAAA,UACpB;AAAA,YACE,CAAC,YAAA,CAAa,SAAS,CAAC,GAAG,CAAC,UAAA,IAAc,OAAA;AAAA,YAC1C,CAAC,YAAA,CAAa,UAAU,CAAC,GAAG,UAAA;AAAA,YAC5B,CAAC,YAAA,CAAa,UAAU,CAAC,GAAG,UAAA;AAAA,YAC5B,CAAC,YAAA,CAAa,gBAAA,IAAoB,EAAE,CAAC,GAAG,gBAAA;AAAA,YACxC,CAAC,YAAA,CAAa,UAAU,CAAC,GAAG;AAAA,WAC9B;AAAA,UACA;AAAA,SACF;AAAA,QACA,GAAA,EAAK,gBAAA;AAAA,QACL,OAAA,EAAS,kBAAA;AAAA,QACR,GAAG,IAAA;AAAA,QAEJ,QAAA,EAAA;AAAA,0BAAAC,cAAA;AAAA,YAAC,OAAA;AAAA,YAAA;AAAA,cACC,YAAA,EAAa,KAAA;AAAA,cACb,kBAAA,EAAkBD,SAAA;AAAA,gBAChB,oBAAA;AAAA,gBACA;AAAA,eACF;AAAA,cACA,iBAAA,EAAiBA,SAAA;AAAA,gBACf,mBAAA;AAAA,gBACA,yBAAA;AAAA,gBACA;AAAA,eACF;AAAA,cACA,YAAA,EAAYA,SAAA,CAAK,YAAA,EAAc,SAAS,CAAA;AAAA,cACxC,EAAA,EAAI,YAAA;AAAA,cACJ,SAAA,EAAW,aAAa,OAAO,CAAA;AAAA,cAC/B,QAAA,EAAU,UAAA;AAAA,cACV,QAAA,EAAU,UAAA;AAAA,cACV,GAAA,EAAK,mBAAA;AAAA,cACL,QAAA,EAAU,aAAa,EAAA,GAAK,CAAA;AAAA,cAC5B,WAAA;AAAA,cACA,KAAA,EACE,UAAA,IAAc,EAAC,SAAA,IAAA,IAAA,GAAA,MAAA,GAAA,SAAA,CAAW,SAAA,CAAA,GACtB,mBAAA,GACC,SAAA,CAAU,SAAA,IAAa,WAAA,CAAY,MAAA,CAAO,MAAA,EAAW,MAAM,CAAA;AAAA,cAEjE,GAAG,mBAAA;AAAA,cACJ,MAAA,EAAQ,oBAAA;AAAA,cACR,QAAA,EAAU,sBAAA;AAAA,cACV,SAAA,EAAW,uBAAA;AAAA,cACX,OAAA,EAAS,CAAC,UAAA,GAAa,qBAAA,GAAwB,MAAA;AAAA,cAC/C,QAAA,EAAU;AAAA;AAAA,WACZ;AAAA,yCACC,MAAA,EAAA,EAAK,SAAA,EAAW,YAAA,CAAa,MAAM,GAAG,QAAA,EAAA,GAAA,EAAC,CAAA;AAAA,0BACxCC,cAAA;AAAA,YAAC,OAAA;AAAA,YAAA;AAAA,cACC,YAAA,EAAa,KAAA;AAAA,cACb,kBAAA,EAAkBD,SAAA;AAAA,gBAChB,oBAAA;AAAA,gBACA;AAAA,eACF;AAAA,cACA,iBAAA,EAAiBA,SAAA;AAAA,gBACf,mBAAA;AAAA,gBACA,uBAAA;AAAA,gBACA;AAAA,eACF;AAAA,cACA,YAAA,EAAYA,SAAA,CAAK,UAAA,EAAY,SAAS,CAAA;AAAA,cACtC,EAAA,EAAI,UAAA;AAAA,cACJ,SAAA,EAAW,aAAa,OAAO,CAAA;AAAA,cAC/B,QAAA,EAAU,UAAA;AAAA,cACV,QAAA,EAAU,UAAA;AAAA,cACV,GAAA,EAAK,iBAAA;AAAA,cACL,QAAA,EAAU,aAAa,EAAA,GAAK,CAAA;AAAA,cAC5B,WAAA;AAAA,cACA,KAAA,EACE,UAAA,IAAc,EAAC,SAAA,IAAA,IAAA,GAAA,MAAA,GAAA,SAAA,CAAW,OAAA,CAAA,GACtB,mBAAA,GACC,SAAA,CAAU,OAAA,IAAW,WAAA,CAAY,MAAA,CAAO,MAAA,EAAW,MAAM,CAAA;AAAA,cAE/D,GAAG,iBAAA;AAAA,cACJ,MAAA,EAAQ,kBAAA;AAAA,cACR,QAAA,EAAU,oBAAA;AAAA,cACV,SAAA,EAAW,qBAAA;AAAA,cACX,OAAA,EAAS,CAAC,UAAA,GAAa,mBAAA,GAAsB,MAAA;AAAA,cAC7C,QAAA,EAAU;AAAA;AAAA,WACZ;AAAA,0BACAD,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,YAAA,CAAa,uBAAuB,CAAA,EACjD,QAAA,EAAA;AAAA,YAAA,CAAC,cAAc,CAAC,UAAA,IAAc,oCAC7BE,cAAA,CAACC,oBAAA,EAAA,EAAgB,QAAQ,gBAAA,EAAkB,CAAA;AAAA,YAE5C;AAAA,WAAA,EACH,CAAA;AAAA,0BACAD,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,YAAA,CAAa,qBAAqB,CAAA,EAAG;AAAA;AAAA;AAAA,KACvD;AAAA,EAEJ;AACF;;;;;"}
1
+ {"version":3,"file":"DateInputRange.js","sources":["../src/date-input/DateInputRange.tsx"],"sourcesContent":["import {\n type InputProps,\n makePrefixer,\n StatusAdornment,\n useControlled,\n useForkRef,\n useFormFieldProps,\n useId,\n} from \"@salt-ds/core\";\nimport type {\n DateDetail,\n DateFrameworkType,\n ParserResult,\n TimeFields,\n Timezone,\n} from \"@salt-ds/date-adapters\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport {\n type ChangeEvent,\n type ChangeEventHandler,\n type ComponentPropsWithoutRef,\n type FocusEventHandler,\n forwardRef,\n type InputHTMLAttributes,\n type KeyboardEventHandler,\n type MouseEventHandler,\n type ReactNode,\n type Ref,\n type SyntheticEvent,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport type { DateRangeSelection } from \"../calendar\";\nimport { useLocalization } from \"../localization-provider\";\nimport dateInputCss from \"./DateInput.css\";\n\nconst withBaseName = makePrefixer(\"saltDateInput\");\n\n/**\n * DateInputRange raw value or null if no date is defined.\n */\nexport type DateInputRangeValue = {\n startDate?: string | null;\n endDate?: string | null;\n};\n\n/**\n * Details of parsing the date range\n */\nexport type DateInputRangeDetails = {\n /** Details of parsing the start date and applying any validation */\n startDate?: DateDetail;\n /** Details of parsing the end date and applying any validation */\n endDate?: DateDetail;\n};\n\n/**\n * Enum to identify the field being parsed\n */\nexport enum DateParserField {\n START = \"start\",\n END = \"end\",\n}\n\n/**\n * Props for the DateInputRange component.\n * @template TDate - The type of the date object.\n */\nexport interface DateInputRangeProps<TDate extends DateFrameworkType>\n extends Omit<ComponentPropsWithoutRef<\"div\">, \"defaultValue\" | \"onChange\">,\n Omit<InputProps, \"defaultValue\" | \"inputRef\" | \"value\" | \"onChange\"> {\n /**\n * The aria-label for accessibility.\n */\n ariaLabel?: string;\n /**\n * Styling variant with full border. Defaults to false.\n */\n bordered?: boolean;\n /**\n * The marker to use in an empty read-only DateInput.\n * Use `''` to disable this feature. Defaults to '—'.\n */\n emptyReadOnlyMarker?: string;\n /**\n * End adornment component.\n */\n endAdornment?: ReactNode;\n /**\n * Attributes applied to the start `input` element.\n * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dateInput#Attributes\n */\n startInputProps?: InputHTMLAttributes<HTMLInputElement>;\n /**\n * Attributes applied to the end `input` element.\n * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dateInput#Attributes\n */\n endInputProps?: InputHTMLAttributes<HTMLInputElement>;\n /**\n * If `true`, the component is read-only.\n */\n readOnly?: boolean;\n /**\n * Validation status.\n */\n validationStatus?: \"error\" | \"warning\" | \"success\";\n /**\n * Styling variant. Defaults to \"primary\".\n */\n variant?: \"primary\" | \"secondary\";\n /**\n * Format string for date.\n */\n format?: string;\n /**\n * Optional ref for the start input component.\n */\n startInputRef?: Ref<HTMLInputElement>;\n /**\n * Optional ref for the end input component.\n */\n endInputRef?: Ref<HTMLInputElement>;\n /**\n * Parser callback, if not using the adapter's parser\n * @param value - date string to parse\n * @param field: DateParserField to identify value,\n * @param format - format required\n */\n parse?: (\n value: string,\n field: DateParserField,\n format: string,\n ) => ParserResult<TDate>;\n /**\n * Input value. Use when the input value is controlled.\n */\n value?: DateInputRangeValue;\n /**\n * The initial input value. Use when the component is uncontrolled.\n */\n defaultValue?: DateInputRangeValue;\n /**\n * The date value. Use when the component is controlled.\n */\n date?: DateRangeSelection<TDate> | null;\n /**\n * The initial selected date value. Use when the component is uncontrolled.\n */\n defaultDate?: DateRangeSelection<TDate> | null;\n /**\n * Callback fired when the input value changes.\n * @param event - The change event.\n * @param date - The new date input range value.\n */\n onChange?: (event: ChangeEvent<HTMLInputElement>) => void;\n /**\n * Callback fired when the selected date changes.\n * @param event - The synthetic event.\n * @param date - the selected date, invalid date if not a valid date or undefined (uncontrolled) or null (controlled) if not defined\n * @param details - The details of date selection, either a valid date or error\n */\n onDateChange?: (\n event: SyntheticEvent,\n date: DateRangeSelection<TDate> | null,\n details: DateInputRangeDetails,\n ) => void;\n /**\n * Called when input values change, either due to user interaction or programmatic formatting of valid dates.\n * @param event - The synthetic event or null if a programmatic change.\n * @param newValue - The new date input range value.\n */\n onDateValueChange?: (\n event: SyntheticEvent | null,\n newValue: DateInputRangeValue,\n ) => void;\n /**\n * Specifies the timezone behavior:\n * - If undefined, the timezone will be derived from the passed date, or from `defaultSelectedDate`/`selectedDate`.\n * - If set to \"default\", the default timezone of the date library will be used.\n * - If set to \"system\", the local system's timezone will be applied.\n * - If set to \"UTC\", the time will be returned in UTC.\n * - If set to a valid IANA timezone identifier, the time will be returned for that specific timezone.\n */\n timezone?: Timezone;\n}\n\nexport const DateInputRange = forwardRef<\n HTMLDivElement,\n DateInputRangeProps<DateFrameworkType>\n>(\n <TDate extends DateFrameworkType>(\n props: DateInputRangeProps<TDate>,\n ref: React.Ref<HTMLDivElement>,\n ) => {\n const { dateAdapter } = useLocalization<TDate>();\n const {\n bordered = false,\n className,\n disabled,\n \"aria-label\": ariaLabel,\n date: dateProp,\n defaultDate,\n onDateChange,\n value: valueProp,\n format = \"DD MMM YYYY\",\n defaultValue = {\n startDate: \"\",\n endDate: \"\",\n },\n onChange,\n onClick,\n onDateValueChange,\n emptyReadOnlyMarker = \"—\",\n endAdornment,\n startInputProps = {},\n endInputProps = {},\n startInputRef: startInputRefProp,\n endInputRef: endInputRefProp,\n parse: parseProp,\n placeholder = format.toLowerCase(),\n readOnly: readOnlyProp,\n validationStatus: validationStatusProp,\n variant = \"primary\",\n timezone = dateProp?.startDate || defaultDate?.startDate\n ? dateAdapter.getTimezone(\n (dateProp?.startDate ?? defaultDate?.startDate) as TDate,\n )\n : \"default\",\n ...rest\n } = props;\n const wrapperRef = useRef(null);\n const handleWrapperRef = useForkRef<HTMLDivElement>(ref, wrapperRef);\n\n const startInputRef = useRef<HTMLInputElement>(null);\n const handleStartInputRef = useForkRef(startInputRef, startInputRefProp);\n const endInputRef = useRef<HTMLInputElement>(null);\n const handleEndInputRef = useForkRef(endInputRef, endInputRefProp);\n\n const startInputID = useId();\n const endInputID = useId();\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-date-input-range\",\n css: dateInputCss,\n window: targetWindow,\n });\n\n const parseDateValue = (\n dateValue: string | null | undefined,\n field: DateParserField,\n ): ParserResult<TDate> | undefined =>\n parseProp\n ? parseProp(dateValue ?? \"\", field, format)\n : dateAdapter.parse.bind(dateAdapter)(dateValue ?? \"\", format);\n\n const [dateValue, setDateValue] = useControlled({\n controlled: valueProp,\n default: defaultValue,\n name: \"DateInputRange\",\n state: \"dateValue\",\n });\n\n const [date, setDate] = useControlled({\n controlled: dateProp,\n // biome-ignore lint/correctness/useExhaustiveDependencies: just on mount\n default: useMemo(() => {\n if (defaultDate) {\n return defaultDate;\n }\n if (!defaultValue) {\n return undefined;\n }\n const { date: startDate = undefined } =\n parseDateValue(defaultValue?.startDate, DateParserField.START) ?? {};\n const { date: endDate = undefined } =\n parseDateValue(defaultValue?.endDate, DateParserField.END) ?? {};\n return {\n startDate,\n endDate,\n };\n }, []),\n name: \"DateInputRange\",\n state: \"date\",\n });\n\n const lastAppliedValue = useRef<DateInputRangeValue>(dateValue);\n const preservedTime = useRef<{\n startTime: TimeFields | null;\n endTime: TimeFields | null;\n }>({ startTime: null, endTime: null });\n preservedTime.current = {\n startTime:\n date?.startDate && dateAdapter.isValid(date?.startDate)\n ? dateAdapter.getTime(date.startDate)\n : null,\n endTime:\n date?.endDate && dateAdapter.isValid(date?.endDate)\n ? dateAdapter.getTime(date.endDate)\n : null,\n };\n const setDateValueFromDate = (newDate: typeof date) => {\n let newDateValue = { startDate: \"\", endDate: \"\" };\n if (!newDate?.startDate) {\n newDateValue = { ...newDateValue, startDate: \"\" };\n } else if (!dateAdapter.isValid(newDate?.startDate)) {\n newDateValue = {\n ...newDateValue,\n startDate: dateValue?.startDate ?? \"\",\n };\n } else if (newDate?.startDate) {\n const formattedStartDateValue = dateAdapter.format(\n newDate.startDate,\n format,\n );\n newDateValue = { ...newDateValue, startDate: formattedStartDateValue };\n }\n if (!newDate?.endDate) {\n newDateValue = { ...newDateValue, endDate: \"\" };\n } else if (!dateAdapter.isValid(newDate?.endDate)) {\n newDateValue = { ...newDateValue, endDate: dateValue?.endDate ?? \"\" };\n } else if (newDate?.endDate && dateAdapter.isValid(newDate.endDate)) {\n const formattedEndDateValue = dateAdapter.format(\n newDate.endDate,\n format,\n );\n newDateValue = { ...newDateValue, endDate: formattedEndDateValue };\n }\n\n if (\n (!newDateValue?.startDate && !!dateValue?.startDate) ||\n (!newDateValue.endDate && !!dateValue?.endDate) ||\n newDateValue?.startDate !== dateValue?.startDate ||\n newDateValue?.endDate !== dateValue?.endDate\n ) {\n onDateValueChange?.(null, newDateValue);\n setDateValue(newDateValue);\n }\n return newDateValue;\n };\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: Update date string value ONLY when selected date changes, not when date string itself change\n useEffect(() => {\n lastAppliedValue.current = setDateValueFromDate(date);\n }, [date, date?.startDate, date?.endDate, dateAdapter.format, format]);\n\n const [focused, setFocused] = useState(false);\n\n const {\n a11yProps: {\n \"aria-describedby\": formFieldDescribedBy,\n \"aria-labelledby\": formFieldLabelledBy,\n } = {},\n disabled: formFieldDisabled,\n readOnly: formFieldReadOnly,\n necessity: formFieldRequired,\n validationStatus: formFieldValidationStatus,\n } = useFormFieldProps();\n\n const isReadOnly = readOnlyProp || formFieldReadOnly;\n const isDisabled = disabled || formFieldDisabled;\n\n const validationStatus = formFieldValidationStatus ?? validationStatusProp;\n\n const {\n \"aria-describedby\": startInputPropsDescribedBy,\n \"aria-labelledby\": startInputPropsLabelledBy,\n onBlur: startInputPropsOnBlur,\n onChange: startInputPropsOnChange,\n onKeyDown: startInputPropsOnKeyDown,\n onFocus: startInputPropsOnFocus,\n required: startInputPropsRequired,\n ...restStartInputProps\n } = startInputProps;\n\n const startInputIsRequired = formFieldRequired\n ? [\"required\", \"asterisk\"].includes(formFieldRequired)\n : startInputPropsRequired;\n\n const {\n \"aria-describedby\": endInputPropsDescribedBy,\n \"aria-labelledby\": endInputPropsLabelledBy,\n onBlur: endInputPropsOnBlur,\n onChange: endInputPropsOnChange,\n onKeyDown: endInputPropsOnKeyDown,\n onFocus: endInputPropsOnFocus,\n required: endInputPropsRequired,\n ...restEndInputProps\n } = endInputProps;\n\n const endInputIsRequired = formFieldRequired\n ? [\"required\", \"asterisk\"].includes(formFieldRequired)\n : endInputPropsRequired;\n\n const apply = (event: SyntheticEvent) => {\n const { date: startDate = undefined, ...startDateParseDetails } =\n parseDateValue(dateValue?.startDate, DateParserField.START) ?? {};\n const { date: endDate = undefined, ...endDateParseDetails } =\n parseDateValue(dateValue?.endDate, DateParserField.END) ?? {};\n\n const updatedDateRange: DateRangeSelection<TDate> = {\n startDate: dateValue?.startDate?.length ? startDate : null,\n endDate: dateValue?.endDate?.length ? endDate : null,\n };\n if (dateAdapter.isValid(startDate)) {\n updatedDateRange.startDate = dateAdapter.setTimezone(\n startDate,\n timezone,\n );\n if (preservedTime.current.startTime) {\n updatedDateRange.startDate = dateAdapter.set(\n updatedDateRange.startDate,\n preservedTime.current.startTime,\n );\n }\n }\n if (dateAdapter.isValid(endDate)) {\n updatedDateRange.endDate = dateAdapter.setTimezone(endDate, timezone);\n if (preservedTime.current.endTime) {\n updatedDateRange.endDate = dateAdapter.set(\n updatedDateRange.endDate,\n preservedTime.current.endTime,\n );\n }\n }\n const updatedDateValue = setDateValueFromDate(updatedDateRange);\n\n setDate(updatedDateRange);\n\n if (\n lastAppliedValue.current.startDate !== updatedDateValue.startDate ||\n lastAppliedValue.current.endDate !== updatedDateValue.endDate\n ) {\n onDateChange?.(event, updatedDateRange, {\n startDate: startDateParseDetails,\n endDate: endDateParseDetails,\n });\n onDateValueChange?.(event, updatedDateValue);\n lastAppliedValue.current = updatedDateValue;\n }\n };\n\n const handleStartInputChange: ChangeEventHandler<HTMLInputElement> = (\n event,\n ) => {\n const newDateValue = { ...dateValue, startDate: event.target.value };\n setDateValue(newDateValue);\n startInputPropsOnChange?.(event);\n onChange?.(event);\n onDateValueChange?.(event, newDateValue);\n };\n\n const handleEndInputChange: ChangeEventHandler<HTMLInputElement> = (\n event,\n ) => {\n const newDateValue = { ...dateValue, endDate: event.target.value };\n setDateValue(newDateValue);\n endInputPropsOnChange?.(event);\n onChange?.(event);\n onDateValueChange?.(event, newDateValue);\n };\n\n const handleStartInputFocus: FocusEventHandler<HTMLInputElement> = (\n event,\n ) => {\n setFocused(true);\n startInputPropsOnFocus?.(event);\n };\n\n const handleEndInputFocus: FocusEventHandler<HTMLInputElement> = (\n event,\n ) => {\n setFocused(true);\n endInputPropsOnFocus?.(event);\n };\n\n const handleStartInputBlur: FocusEventHandler<HTMLInputElement> = (\n event,\n ) => {\n setFocused(false);\n apply(event);\n startInputPropsOnBlur?.(event);\n };\n\n const handleEndInputBlur: FocusEventHandler<HTMLInputElement> = (event) => {\n setFocused(false);\n apply(event);\n endInputPropsOnBlur?.(event);\n };\n\n const handleStartInputKeyDown: KeyboardEventHandler<HTMLInputElement> = (\n event,\n ) => {\n if (event.key === \"Enter\") {\n apply(event);\n }\n startInputPropsOnKeyDown?.(event);\n };\n\n const handleEndInputKeyDown: KeyboardEventHandler<HTMLInputElement> = (\n event,\n ) => {\n if (event.key === \"Enter\") {\n apply(event);\n }\n endInputPropsOnKeyDown?.(event);\n };\n\n const handleWrapperClick: MouseEventHandler<HTMLDivElement> = (event) => {\n if (event.target === wrapperRef.current) {\n const input = startInputRef.current;\n input?.focus();\n input?.setSelectionRange(input.value.length, input.value.length);\n }\n onClick?.(event);\n };\n\n return (\n <div\n className={clsx(\n withBaseName(),\n withBaseName(variant),\n {\n [withBaseName(\"focused\")]: !isDisabled && focused,\n [withBaseName(\"disabled\")]: isDisabled,\n [withBaseName(\"readOnly\")]: isReadOnly,\n [withBaseName(validationStatus ?? \"\")]: validationStatus,\n [withBaseName(\"bordered\")]: bordered,\n },\n className,\n )}\n ref={handleWrapperRef}\n onClick={handleWrapperClick}\n {...rest}\n >\n <input\n autoComplete=\"off\"\n aria-describedby={clsx(\n formFieldDescribedBy,\n startInputPropsDescribedBy,\n )}\n aria-labelledby={clsx(\n formFieldLabelledBy,\n startInputPropsLabelledBy,\n startInputID,\n )}\n aria-label={clsx(\"Start date\", ariaLabel)}\n id={startInputID}\n className={withBaseName(\"input\")}\n disabled={isDisabled}\n readOnly={isReadOnly}\n ref={handleStartInputRef}\n tabIndex={isDisabled ? -1 : 0}\n placeholder={placeholder}\n value={\n isReadOnly && !dateValue?.startDate\n ? emptyReadOnlyMarker\n : (dateValue.startDate ?? dateAdapter.format(undefined, format))\n }\n {...restStartInputProps}\n onBlur={handleStartInputBlur}\n onChange={handleStartInputChange}\n onKeyDown={handleStartInputKeyDown}\n onFocus={!isDisabled ? handleStartInputFocus : undefined}\n required={startInputIsRequired}\n />\n <span className={withBaseName(\"dash\")}>-</span>\n <input\n autoComplete=\"off\"\n aria-describedby={clsx(\n formFieldDescribedBy,\n endInputPropsDescribedBy,\n )}\n aria-labelledby={clsx(\n formFieldLabelledBy,\n endInputPropsLabelledBy,\n endInputID,\n )}\n aria-label={clsx(\"End date\", ariaLabel)}\n id={endInputID}\n className={withBaseName(\"input\")}\n disabled={isDisabled}\n readOnly={isReadOnly}\n ref={handleEndInputRef}\n tabIndex={isDisabled ? -1 : 0}\n placeholder={placeholder}\n value={\n isReadOnly && !dateValue?.endDate\n ? emptyReadOnlyMarker\n : (dateValue.endDate ?? dateAdapter.format(undefined, format))\n }\n {...restEndInputProps}\n onBlur={handleEndInputBlur}\n onChange={handleEndInputChange}\n onKeyDown={handleEndInputKeyDown}\n onFocus={!isDisabled ? handleEndInputFocus : undefined}\n required={endInputIsRequired}\n />\n <div className={withBaseName(\"endAdornmentContainer\")}>\n {!isDisabled && validationStatus && (\n <StatusAdornment status={validationStatus} />\n )}\n {endAdornment}\n </div>\n <div className={withBaseName(\"activationIndicator\")} />\n </div>\n );\n },\n);\n"],"names":["makePrefixer","DateParserField","forwardRef","useLocalization","useRef","useForkRef","useId","useWindow","useComponentCssInjection","dateInputCss","dateValue","useControlled","useMemo","useEffect","useState","useFormFieldProps","jsxs","clsx","jsx","StatusAdornment"],"mappings":"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"}
@@ -220,7 +220,7 @@ const DateInputSingle = react.forwardRef(
220
220
  }
221
221
  ),
222
222
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: withBaseName("endAdornmentContainer"), children: [
223
- !isDisabled && !isReadOnly && validationStatus && /* @__PURE__ */ jsxRuntime.jsx(core.StatusAdornment, { status: validationStatus }),
223
+ !isDisabled && validationStatus && /* @__PURE__ */ jsxRuntime.jsx(core.StatusAdornment, { status: validationStatus }),
224
224
  endAdornment
225
225
  ] }),
226
226
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: withBaseName("activationIndicator") })
@@ -1 +1 @@
1
- {"version":3,"file":"DateInputSingle.js","sources":["../src/date-input/DateInputSingle.tsx"],"sourcesContent":["import {\n makePrefixer,\n StatusAdornment,\n useControlled,\n useForkRef,\n useFormFieldProps,\n useId,\n} from \"@salt-ds/core\";\nimport type {\n DateDetail,\n DateFrameworkType,\n ParserResult,\n TimeFields,\n Timezone,\n} from \"@salt-ds/date-adapters\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport {\n type ChangeEventHandler,\n type ComponentPropsWithoutRef,\n type FocusEventHandler,\n forwardRef,\n type InputHTMLAttributes,\n type KeyboardEventHandler,\n type MouseEventHandler,\n type ReactNode,\n type Ref,\n type SyntheticEvent,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport type { SingleDateSelection } from \"../calendar\";\nimport { useLocalization } from \"../localization-provider\";\nimport dateInputCss from \"./DateInput.css\";\n\nconst withBaseName = makePrefixer(\"saltDateInput\");\n\n/**\n * Details of parsing the date\n */\nexport type DateInputSingleDetails = DateDetail;\n\n/**\n * Props for the DateInputSingle component.\n * @template TDate - The type of the date object.\n */\nexport interface DateInputSingleProps<TDate extends DateFrameworkType>\n extends Omit<ComponentPropsWithoutRef<\"div\">, \"defaultValue\">,\n Pick<\n ComponentPropsWithoutRef<\"input\">,\n \"disabled\" | \"value\" | \"defaultValue\" | \"placeholder\"\n > {\n /**\n * The aria-label for accessibility.\n */\n ariaLabel?: string;\n /**\n * Styling variant with full border. Defaults to false.\n */\n bordered?: boolean;\n /**\n * The marker to use in an empty read-only DateInput.\n * Use `''` to disable this feature. Defaults to '—'.\n */\n emptyReadOnlyMarker?: string;\n /**\n * End adornment component.\n */\n endAdornment?: ReactNode;\n /**\n * Attributes applied to the `input` element.\n * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dateInput#Attributes\n */\n inputProps?: InputHTMLAttributes<HTMLInputElement>;\n /**\n * If `true`, the component is read-only.\n */\n readOnly?: boolean;\n /**\n * Start adornment component\n */\n startAdornment?: ReactNode;\n /**\n * Validation status.\n */\n validationStatus?: \"error\" | \"warning\" | \"success\";\n /**\n * Styling variant. Defaults to \"primary\".\n */\n variant?: \"primary\" | \"secondary\";\n /**\n * Format string for date.\n */\n format?: string;\n /**\n * Reference for the input.\n */\n inputRef?: Ref<HTMLInputElement>;\n /**\n * Parser callback, if not using the adapter's parser\n * @param value - date string to parse\n * @param format - format required\n */\n parse?: (value: string, format: string) => ParserResult<TDate>;\n /**\n * Input value. Use when the input value is controlled.\n */\n value?: string;\n /**\n * The initial input value. Use when the component is uncontrolled.\n */\n defaultValue?: string;\n /**\n * The date value. Use when the component is controlled.\n */\n date?: TDate | null;\n /**\n * The initial selected date value. Use when the component is uncontrolled.\n */\n defaultDate?: TDate | null;\n /**\n * Callback fired when the selected date changes.\n * @param event - The synthetic event.\n * @param date - the selected date, invalid date if not a valid date or undefined (uncontrolled) or null (controlled) if not defined\n * @param details - The details of date selection, either a valid date or error\n */\n onDateChange?: (\n event: SyntheticEvent,\n date: SingleDateSelection<TDate> | null | undefined,\n details: DateInputSingleDetails,\n ) => void;\n /**\n * Called when input value changes, either due to user interaction or programmatic formatting of valid dates.\n * @param event - The synthetic event or null if a programmatic change.\n * @param newValue - The new date input value.\n */\n onDateValueChange?: (event: SyntheticEvent | null, newValue: string) => void;\n /**\n * Specifies the timezone behavior:\n * - If undefined, the timezone will be derived from the passed date, or from `defaultSelectedDate`/`selectedDate`.\n * - If set to \"default\", the default timezone of the date library will be used.\n * - If set to \"system\", the local system's timezone will be applied.\n * - If set to \"UTC\", the time will be returned in UTC.\n * - If set to a valid IANA timezone identifier, the time will be returned for that specific timezone.\n */\n timezone?: Timezone;\n}\n\nexport const DateInputSingle = forwardRef<\n HTMLDivElement,\n DateInputSingleProps<DateFrameworkType>\n>(\n <TDate extends DateFrameworkType>(\n props: DateInputSingleProps<TDate>,\n ref: React.Ref<HTMLDivElement>,\n ) => {\n const { dateAdapter } = useLocalization<TDate>();\n const {\n bordered = false,\n className,\n disabled,\n \"aria-label\": ariaLabel,\n date: dateProp,\n defaultDate,\n onDateChange,\n value: valueProp,\n format = \"DD MMM YYYY\",\n defaultValue = \"\",\n onChange,\n onClick,\n emptyReadOnlyMarker = \"—\",\n endAdornment,\n inputProps = {},\n inputRef: inputRefProp = null,\n parse: parseProp,\n placeholder = format.toLowerCase(),\n readOnly: readOnlyProp,\n startAdornment,\n validationStatus: validationStatusProp,\n variant = \"primary\",\n onDateValueChange,\n timezone = dateProp || defaultDate\n ? dateAdapter.getTimezone((dateProp ?? defaultDate) as TDate)\n : \"default\",\n ...rest\n } = props;\n const wrapperRef = useRef(null);\n const handleWrapperRef = useForkRef<HTMLDivElement>(ref, wrapperRef);\n const innerInputRef = useRef<HTMLInputElement>(null);\n const handleInputRef = useForkRef<HTMLInputElement>(\n innerInputRef,\n inputRefProp,\n );\n\n const inputId = useId();\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-date-input-single\",\n css: dateInputCss,\n window: targetWindow,\n });\n\n const [date, setDate] = useControlled({\n controlled: dateProp,\n // biome-ignore lint/correctness/useExhaustiveDependencies: just on mount\n default: useMemo(() => {\n if (defaultDate) {\n return defaultDate;\n }\n if (!defaultValue) {\n return undefined;\n }\n return dateAdapter.parse(defaultValue, format) as TDate;\n }, []),\n name: \"DateInputSingle\",\n state: \"date\",\n });\n const [dateValue, setDateValue] = useControlled({\n controlled: valueProp,\n default: defaultValue,\n name: \"DateInputSingle\",\n state: \"dateValue\",\n });\n const lastAppliedValue = useRef<string>(dateValue);\n const preservedTime = useRef<TimeFields | null>(null);\n preservedTime.current = dateAdapter.isValid(date)\n ? dateAdapter.getTime(date)\n : null;\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: Update date string value ONLY when selected date changes, not when date string itself change\n useEffect(() => {\n const formattedValue = dateAdapter.format(date, format);\n const hasValueChanged = formattedValue !== dateValue;\n if (\n // should not reset \"error\" input values\n (date === null || dateAdapter.isValid(date)) &&\n hasValueChanged\n ) {\n setDateValue(formattedValue);\n onDateValueChange?.(null, formattedValue);\n lastAppliedValue.current = formattedValue;\n }\n }, [date, dateAdapter.format, format]);\n\n const [focused, setFocused] = useState(false);\n\n const {\n a11yProps: {\n \"aria-describedby\": formFieldDescribedBy,\n \"aria-labelledby\": formFieldLabelledBy,\n } = {},\n disabled: formFieldDisabled,\n readOnly: formFieldReadOnly,\n necessity: formFieldRequired,\n validationStatus: formFieldValidationStatus,\n } = useFormFieldProps();\n\n const isReadOnly = readOnlyProp || formFieldReadOnly;\n const isDisabled = disabled || formFieldDisabled;\n\n const validationStatus = formFieldValidationStatus ?? validationStatusProp;\n\n const {\n \"aria-describedby\": dateInputDescribedBy,\n \"aria-labelledby\": dateInputLabelledBy,\n onBlur: inputPropsOnBlur,\n onChange: inputPropsOnChange,\n onKeyDown: inputPropsOnKeyDown,\n onFocus: inputPropsOnFocus,\n required: dateInputPropsRequired,\n ...restDateInputProps\n } = inputProps;\n\n const isRequired = formFieldRequired\n ? [\"required\", \"asterisk\"].includes(formFieldRequired)\n : dateInputPropsRequired;\n\n const apply = (event: SyntheticEvent) => {\n const parse = parseProp ?? dateAdapter.parse.bind(dateAdapter);\n const parseResult = parse(dateValue ?? \"\", format);\n let parsedDate: TDate | null;\n let parseDetails: DateDetail;\n ({ date: parsedDate, ...parseDetails } = parseResult);\n parsedDate = dateValue ? parsedDate : null;\n let formattedValue = \"\";\n const isDateValid = dateAdapter.isValid(parsedDate);\n if (isDateValid && parsedDate) {\n parsedDate = dateAdapter.setTimezone(parsedDate, timezone);\n if (preservedTime.current) {\n parsedDate = dateAdapter.set(parsedDate, preservedTime.current);\n }\n formattedValue = dateAdapter.format(parsedDate, format);\n }\n const hasValueChanged = formattedValue !== dateValue;\n const newValue = isDateValid ? formattedValue : dateValue;\n if (hasValueChanged) {\n setDateValue(newValue);\n onDateValueChange?.(event, newValue);\n }\n\n setDate(parsedDate);\n\n if (lastAppliedValue.current !== newValue) {\n onDateChange?.(event, parsedDate, parseDetails);\n }\n lastAppliedValue.current = newValue;\n };\n\n const handleChange: ChangeEventHandler<HTMLInputElement> = (event) => {\n const newDateValue = event.target.value;\n setDateValue(newDateValue);\n inputPropsOnChange?.(event);\n onChange?.(event);\n onDateValueChange?.(event, newDateValue);\n };\n\n const handleFocus: FocusEventHandler<HTMLInputElement> = (event) => {\n setFocused(true);\n inputPropsOnFocus?.(event);\n };\n const handleBlur: FocusEventHandler<HTMLInputElement> = (event) => {\n setFocused(false);\n apply(event);\n inputPropsOnBlur?.(event);\n };\n\n const handleKeyDown: KeyboardEventHandler<HTMLInputElement> = (event) => {\n if (event.key === \"Enter\") {\n apply(event);\n }\n inputPropsOnKeyDown?.(event);\n };\n\n const handleClick: MouseEventHandler<HTMLDivElement> = (event) => {\n if (event.target === wrapperRef.current) {\n innerInputRef?.current?.focus();\n }\n onClick?.(event);\n };\n\n return (\n <div\n className={clsx(\n withBaseName(),\n withBaseName(variant),\n {\n [withBaseName(\"focused\")]: !isDisabled && focused,\n [withBaseName(\"disabled\")]: isDisabled,\n [withBaseName(\"readOnly\")]: isReadOnly,\n [withBaseName(validationStatus ?? \"\")]: validationStatus,\n [withBaseName(\"bordered\")]: bordered,\n },\n className,\n )}\n ref={handleWrapperRef}\n onClick={handleClick}\n {...rest}\n >\n {startAdornment && (\n <div className={withBaseName(\"startAdornmentContainer\")}>\n {startAdornment}\n </div>\n )}\n <input\n autoComplete=\"off\"\n aria-describedby={clsx(formFieldDescribedBy, dateInputDescribedBy)}\n aria-labelledby={clsx(\n formFieldLabelledBy,\n dateInputLabelledBy,\n inputId,\n )}\n aria-label={clsx(\"Selected date\", ariaLabel)}\n id={inputId}\n className={withBaseName(\"input\")}\n disabled={isDisabled}\n readOnly={isReadOnly}\n ref={handleInputRef}\n tabIndex={isDisabled ? -1 : 0}\n placeholder={placeholder}\n value={isReadOnly && !dateValue ? emptyReadOnlyMarker : dateValue}\n {...restDateInputProps}\n onBlur={handleBlur}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n onFocus={!isDisabled ? handleFocus : undefined}\n required={isRequired}\n />\n <div className={withBaseName(\"endAdornmentContainer\")}>\n {!isDisabled && !isReadOnly && validationStatus && (\n <StatusAdornment status={validationStatus} />\n )}\n {endAdornment}\n </div>\n <div className={withBaseName(\"activationIndicator\")} />\n </div>\n );\n },\n);\n"],"names":["makePrefixer","forwardRef","useLocalization","useRef","useForkRef","useId","useWindow","useComponentCssInjection","dateInputCss","useControlled","useMemo","useEffect","useState","useFormFieldProps","jsxs","clsx","jsx","StatusAdornment"],"mappings":"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"}
1
+ {"version":3,"file":"DateInputSingle.js","sources":["../src/date-input/DateInputSingle.tsx"],"sourcesContent":["import {\n makePrefixer,\n StatusAdornment,\n useControlled,\n useForkRef,\n useFormFieldProps,\n useId,\n} from \"@salt-ds/core\";\nimport type {\n DateDetail,\n DateFrameworkType,\n ParserResult,\n TimeFields,\n Timezone,\n} from \"@salt-ds/date-adapters\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport {\n type ChangeEventHandler,\n type ComponentPropsWithoutRef,\n type FocusEventHandler,\n forwardRef,\n type InputHTMLAttributes,\n type KeyboardEventHandler,\n type MouseEventHandler,\n type ReactNode,\n type Ref,\n type SyntheticEvent,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport type { SingleDateSelection } from \"../calendar\";\nimport { useLocalization } from \"../localization-provider\";\nimport dateInputCss from \"./DateInput.css\";\n\nconst withBaseName = makePrefixer(\"saltDateInput\");\n\n/**\n * Details of parsing the date\n */\nexport type DateInputSingleDetails = DateDetail;\n\n/**\n * Props for the DateInputSingle component.\n * @template TDate - The type of the date object.\n */\nexport interface DateInputSingleProps<TDate extends DateFrameworkType>\n extends Omit<ComponentPropsWithoutRef<\"div\">, \"defaultValue\">,\n Pick<\n ComponentPropsWithoutRef<\"input\">,\n \"disabled\" | \"value\" | \"defaultValue\" | \"placeholder\"\n > {\n /**\n * The aria-label for accessibility.\n */\n ariaLabel?: string;\n /**\n * Styling variant with full border. Defaults to false.\n */\n bordered?: boolean;\n /**\n * The marker to use in an empty read-only DateInput.\n * Use `''` to disable this feature. Defaults to '—'.\n */\n emptyReadOnlyMarker?: string;\n /**\n * End adornment component.\n */\n endAdornment?: ReactNode;\n /**\n * Attributes applied to the `input` element.\n * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dateInput#Attributes\n */\n inputProps?: InputHTMLAttributes<HTMLInputElement>;\n /**\n * If `true`, the component is read-only.\n */\n readOnly?: boolean;\n /**\n * Start adornment component\n */\n startAdornment?: ReactNode;\n /**\n * Validation status.\n */\n validationStatus?: \"error\" | \"warning\" | \"success\";\n /**\n * Styling variant. Defaults to \"primary\".\n */\n variant?: \"primary\" | \"secondary\";\n /**\n * Format string for date.\n */\n format?: string;\n /**\n * Reference for the input.\n */\n inputRef?: Ref<HTMLInputElement>;\n /**\n * Parser callback, if not using the adapter's parser\n * @param value - date string to parse\n * @param format - format required\n */\n parse?: (value: string, format: string) => ParserResult<TDate>;\n /**\n * Input value. Use when the input value is controlled.\n */\n value?: string;\n /**\n * The initial input value. Use when the component is uncontrolled.\n */\n defaultValue?: string;\n /**\n * The date value. Use when the component is controlled.\n */\n date?: TDate | null;\n /**\n * The initial selected date value. Use when the component is uncontrolled.\n */\n defaultDate?: TDate | null;\n /**\n * Callback fired when the selected date changes.\n * @param event - The synthetic event.\n * @param date - the selected date, invalid date if not a valid date or undefined (uncontrolled) or null (controlled) if not defined\n * @param details - The details of date selection, either a valid date or error\n */\n onDateChange?: (\n event: SyntheticEvent,\n date: SingleDateSelection<TDate> | null | undefined,\n details: DateInputSingleDetails,\n ) => void;\n /**\n * Called when input value changes, either due to user interaction or programmatic formatting of valid dates.\n * @param event - The synthetic event or null if a programmatic change.\n * @param newValue - The new date input value.\n */\n onDateValueChange?: (event: SyntheticEvent | null, newValue: string) => void;\n /**\n * Specifies the timezone behavior:\n * - If undefined, the timezone will be derived from the passed date, or from `defaultSelectedDate`/`selectedDate`.\n * - If set to \"default\", the default timezone of the date library will be used.\n * - If set to \"system\", the local system's timezone will be applied.\n * - If set to \"UTC\", the time will be returned in UTC.\n * - If set to a valid IANA timezone identifier, the time will be returned for that specific timezone.\n */\n timezone?: Timezone;\n}\n\nexport const DateInputSingle = forwardRef<\n HTMLDivElement,\n DateInputSingleProps<DateFrameworkType>\n>(\n <TDate extends DateFrameworkType>(\n props: DateInputSingleProps<TDate>,\n ref: React.Ref<HTMLDivElement>,\n ) => {\n const { dateAdapter } = useLocalization<TDate>();\n const {\n bordered = false,\n className,\n disabled,\n \"aria-label\": ariaLabel,\n date: dateProp,\n defaultDate,\n onDateChange,\n value: valueProp,\n format = \"DD MMM YYYY\",\n defaultValue = \"\",\n onChange,\n onClick,\n emptyReadOnlyMarker = \"—\",\n endAdornment,\n inputProps = {},\n inputRef: inputRefProp = null,\n parse: parseProp,\n placeholder = format.toLowerCase(),\n readOnly: readOnlyProp,\n startAdornment,\n validationStatus: validationStatusProp,\n variant = \"primary\",\n onDateValueChange,\n timezone = dateProp || defaultDate\n ? dateAdapter.getTimezone((dateProp ?? defaultDate) as TDate)\n : \"default\",\n ...rest\n } = props;\n const wrapperRef = useRef(null);\n const handleWrapperRef = useForkRef<HTMLDivElement>(ref, wrapperRef);\n const innerInputRef = useRef<HTMLInputElement>(null);\n const handleInputRef = useForkRef<HTMLInputElement>(\n innerInputRef,\n inputRefProp,\n );\n\n const inputId = useId();\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-date-input-single\",\n css: dateInputCss,\n window: targetWindow,\n });\n\n const [date, setDate] = useControlled({\n controlled: dateProp,\n // biome-ignore lint/correctness/useExhaustiveDependencies: just on mount\n default: useMemo(() => {\n if (defaultDate) {\n return defaultDate;\n }\n if (!defaultValue) {\n return undefined;\n }\n return dateAdapter.parse(defaultValue, format) as TDate;\n }, []),\n name: \"DateInputSingle\",\n state: \"date\",\n });\n const [dateValue, setDateValue] = useControlled({\n controlled: valueProp,\n default: defaultValue,\n name: \"DateInputSingle\",\n state: \"dateValue\",\n });\n const lastAppliedValue = useRef<string>(dateValue);\n const preservedTime = useRef<TimeFields | null>(null);\n preservedTime.current = dateAdapter.isValid(date)\n ? dateAdapter.getTime(date)\n : null;\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: Update date string value ONLY when selected date changes, not when date string itself change\n useEffect(() => {\n const formattedValue = dateAdapter.format(date, format);\n const hasValueChanged = formattedValue !== dateValue;\n if (\n // should not reset \"error\" input values\n (date === null || dateAdapter.isValid(date)) &&\n hasValueChanged\n ) {\n setDateValue(formattedValue);\n onDateValueChange?.(null, formattedValue);\n lastAppliedValue.current = formattedValue;\n }\n }, [date, dateAdapter.format, format]);\n\n const [focused, setFocused] = useState(false);\n\n const {\n a11yProps: {\n \"aria-describedby\": formFieldDescribedBy,\n \"aria-labelledby\": formFieldLabelledBy,\n } = {},\n disabled: formFieldDisabled,\n readOnly: formFieldReadOnly,\n necessity: formFieldRequired,\n validationStatus: formFieldValidationStatus,\n } = useFormFieldProps();\n\n const isReadOnly = readOnlyProp || formFieldReadOnly;\n const isDisabled = disabled || formFieldDisabled;\n\n const validationStatus = formFieldValidationStatus ?? validationStatusProp;\n\n const {\n \"aria-describedby\": dateInputDescribedBy,\n \"aria-labelledby\": dateInputLabelledBy,\n onBlur: inputPropsOnBlur,\n onChange: inputPropsOnChange,\n onKeyDown: inputPropsOnKeyDown,\n onFocus: inputPropsOnFocus,\n required: dateInputPropsRequired,\n ...restDateInputProps\n } = inputProps;\n\n const isRequired = formFieldRequired\n ? [\"required\", \"asterisk\"].includes(formFieldRequired)\n : dateInputPropsRequired;\n\n const apply = (event: SyntheticEvent) => {\n const parse = parseProp ?? dateAdapter.parse.bind(dateAdapter);\n const parseResult = parse(dateValue ?? \"\", format);\n let parsedDate: TDate | null;\n let parseDetails: DateDetail;\n ({ date: parsedDate, ...parseDetails } = parseResult);\n parsedDate = dateValue ? parsedDate : null;\n let formattedValue = \"\";\n const isDateValid = dateAdapter.isValid(parsedDate);\n if (isDateValid && parsedDate) {\n parsedDate = dateAdapter.setTimezone(parsedDate, timezone);\n if (preservedTime.current) {\n parsedDate = dateAdapter.set(parsedDate, preservedTime.current);\n }\n formattedValue = dateAdapter.format(parsedDate, format);\n }\n const hasValueChanged = formattedValue !== dateValue;\n const newValue = isDateValid ? formattedValue : dateValue;\n if (hasValueChanged) {\n setDateValue(newValue);\n onDateValueChange?.(event, newValue);\n }\n\n setDate(parsedDate);\n\n if (lastAppliedValue.current !== newValue) {\n onDateChange?.(event, parsedDate, parseDetails);\n }\n lastAppliedValue.current = newValue;\n };\n\n const handleChange: ChangeEventHandler<HTMLInputElement> = (event) => {\n const newDateValue = event.target.value;\n setDateValue(newDateValue);\n inputPropsOnChange?.(event);\n onChange?.(event);\n onDateValueChange?.(event, newDateValue);\n };\n\n const handleFocus: FocusEventHandler<HTMLInputElement> = (event) => {\n setFocused(true);\n inputPropsOnFocus?.(event);\n };\n const handleBlur: FocusEventHandler<HTMLInputElement> = (event) => {\n setFocused(false);\n apply(event);\n inputPropsOnBlur?.(event);\n };\n\n const handleKeyDown: KeyboardEventHandler<HTMLInputElement> = (event) => {\n if (event.key === \"Enter\") {\n apply(event);\n }\n inputPropsOnKeyDown?.(event);\n };\n\n const handleClick: MouseEventHandler<HTMLDivElement> = (event) => {\n if (event.target === wrapperRef.current) {\n innerInputRef?.current?.focus();\n }\n onClick?.(event);\n };\n\n return (\n <div\n className={clsx(\n withBaseName(),\n withBaseName(variant),\n {\n [withBaseName(\"focused\")]: !isDisabled && focused,\n [withBaseName(\"disabled\")]: isDisabled,\n [withBaseName(\"readOnly\")]: isReadOnly,\n [withBaseName(validationStatus ?? \"\")]: validationStatus,\n [withBaseName(\"bordered\")]: bordered,\n },\n className,\n )}\n ref={handleWrapperRef}\n onClick={handleClick}\n {...rest}\n >\n {startAdornment && (\n <div className={withBaseName(\"startAdornmentContainer\")}>\n {startAdornment}\n </div>\n )}\n <input\n autoComplete=\"off\"\n aria-describedby={clsx(formFieldDescribedBy, dateInputDescribedBy)}\n aria-labelledby={clsx(\n formFieldLabelledBy,\n dateInputLabelledBy,\n inputId,\n )}\n aria-label={clsx(\"Selected date\", ariaLabel)}\n id={inputId}\n className={withBaseName(\"input\")}\n disabled={isDisabled}\n readOnly={isReadOnly}\n ref={handleInputRef}\n tabIndex={isDisabled ? -1 : 0}\n placeholder={placeholder}\n value={isReadOnly && !dateValue ? emptyReadOnlyMarker : dateValue}\n {...restDateInputProps}\n onBlur={handleBlur}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n onFocus={!isDisabled ? handleFocus : undefined}\n required={isRequired}\n />\n <div className={withBaseName(\"endAdornmentContainer\")}>\n {!isDisabled && validationStatus && (\n <StatusAdornment status={validationStatus} />\n )}\n {endAdornment}\n </div>\n <div className={withBaseName(\"activationIndicator\")} />\n </div>\n );\n },\n);\n"],"names":["makePrefixer","forwardRef","useLocalization","useRef","useForkRef","useId","useWindow","useComponentCssInjection","dateInputCss","useControlled","useMemo","useEffect","useState","useFormFieldProps","jsxs","clsx","jsx","StatusAdornment"],"mappings":"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"}
@@ -179,7 +179,7 @@ const DatePickerRangeGridPanel = react.forwardRef(
179
179
  visibleMonth
180
180
  ]
181
181
  );
182
- react.useLayoutEffect(() => {
182
+ core.useIsomorphicLayoutEffect(() => {
183
183
  if (focused && !calendarGridFocused.current) {
184
184
  setFocusedDate((prevFocusedDate) => {
185
185
  if (!prevFocusedDate) {
@@ -1 +1 @@
1
- {"version":3,"file":"DatePickerRangeGridPanel.js","sources":["../src/date-picker/DatePickerRangeGridPanel.tsx"],"sourcesContent":["import {\n FlexItem,\n FlexLayout,\n FormFieldContext,\n type FormFieldContextValue,\n FormFieldHelperText,\n makePrefixer,\n resolveResponsiveValue,\n StackLayout,\n useBreakpoint,\n useControlled,\n} from \"@salt-ds/core\";\nimport type { DateFrameworkType } from \"@salt-ds/date-adapters\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport {\n forwardRef,\n type SyntheticEvent,\n useCallback,\n useLayoutEffect,\n useRef,\n useState,\n} from \"react\";\nimport {\n Calendar,\n CalendarGrid,\n CalendarNavigation,\n type CalendarRangeProps,\n type DateRangeSelection,\n} from \"../calendar\";\nimport { generateDatesForMonth } from \"../calendar/internal/utils\";\nimport { useLocalization } from \"../localization-provider\";\nimport {\n type RangeDatePickerState,\n useDatePickerContext,\n} from \"./DatePickerContext\";\nimport { useDatePickerOverlay } from \"./DatePickerOverlayProvider\";\nimport datePickerPanelCss from \"./DatePickerPanel.css\";\nimport type { DatePickerPanelBaseProps } from \"./DatePickerSingleGridPanel\";\n\nconst withBaseName = makePrefixer(\"saltDatePickerPanel\");\n\n/**\n * Props for the DatePickerRangeGridPanel component.\n * @template TDate - The type of the date object.\n */\nexport type DatePickerRangeGridPanelProps<TDate extends DateFrameworkType> =\n DatePickerPanelBaseProps<TDate> &\n DateRangeSelection<TDate> & {\n onSelectionChange?: (\n event: SyntheticEvent,\n selectedDate?: DateRangeSelection<TDate> | null,\n ) => void;\n CalendarProps?: Partial<\n Omit<\n CalendarRangeProps<TDate>,\n | \"selectionVariant\"\n | \"selectedDate\"\n | \"defaultSelectedDate\"\n | \"multiselect\"\n | \"onHoveredDateChange\"\n | \"onSelectionChange\"\n | \"onVisibleMonthChange\"\n >\n >;\n };\n\nexport const DatePickerRangeGridPanel = forwardRef(\n function DatePickerRangeGridPanel<TDate extends DateFrameworkType>(\n props: DatePickerRangeGridPanelProps<TDate>,\n ref: React.Ref<HTMLDivElement>,\n ) {\n const { dateAdapter } = useLocalization<TDate>();\n\n const {\n CalendarProps,\n CalendarNavigationProps,\n CalendarGridProps,\n className,\n defaultVisibleMonth,\n visibleMonth: visibleMonthProp,\n onFocusedDateChange,\n onHoveredDateChange,\n onVisibleMonthChange,\n helperText,\n onSelectionChange,\n numberOfVisibleMonths = 2,\n columns = numberOfVisibleMonths,\n ...rest\n } = props;\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-date-picker-range-grid-panel\",\n css: datePickerPanelCss,\n window: targetWindow,\n });\n\n const stateAndHelpers: RangeDatePickerState<TDate> = useDatePickerContext({\n selectionVariant: \"range\",\n });\n\n const {\n state: { focused, initialFocusRef },\n } = useDatePickerOverlay();\n\n const [hoveredDate, setHoveredDate] = useState<TDate | null>(null);\n const [focusedDate, setFocusedDate] = useState<TDate | null>(null);\n const calendarGridFocused = useRef(false);\n\n const {\n state: {\n timezone,\n selectedDate = null,\n minDate = dateAdapter.startOf(dateAdapter.today(timezone), \"month\"),\n maxDate = dateAdapter.add(minDate, { months: 1 }),\n },\n helpers: { select, isDayHighlighted, isDayUnselectable },\n } = stateAndHelpers;\n\n const { matchedBreakpoints } = useBreakpoint();\n\n const responsiveColumns =\n resolveResponsiveValue(columns, matchedBreakpoints) ?? 1;\n const responsiveNumberOfVisibleMonths =\n resolveResponsiveValue(numberOfVisibleMonths, matchedBreakpoints) ?? 1;\n\n const [uncontrolledDefaultVisibleMonth] = useState(() => {\n const validDate: TDate =\n selectedDate?.startDate && dateAdapter.isValid(selectedDate.startDate)\n ? selectedDate.startDate\n : dateAdapter.today(timezone);\n\n // Ensure that defaultVisibleMonth is used if provided, otherwise use the start of the valid date\n return defaultVisibleMonth || dateAdapter.startOf(validDate, \"month\");\n });\n\n const [visibleMonth, setVisibleMonth] = useControlled({\n controlled: visibleMonthProp,\n default: uncontrolledDefaultVisibleMonth,\n name: \"DatePickerRangeGridPanel\",\n state: \"visibleMonth\",\n });\n\n const getNextFocusedDate = () => {\n const isOutsideAllowedDates = (date: TDate) => {\n return (\n dateAdapter.compare(date, minDate) < 0 ||\n dateAdapter.compare(date, maxDate) > 0\n );\n };\n\n const isDaySelectable = (date: TDate) =>\n !(date && (isDayUnselectable?.(date) || isOutsideAllowedDates(date)));\n\n const startVisibleMonth = dateAdapter.startOf(visibleMonth, \"month\");\n const endVisibleMonth = dateAdapter.add(visibleMonth, {\n months: responsiveNumberOfVisibleMonths - 1,\n });\n\n const getVisibleSelectedDate = () => {\n const startDateStartOfMonth = selectedDate?.startDate\n ? dateAdapter.startOf(selectedDate.startDate, \"month\")\n : null;\n const endDateStartOfMonth = selectedDate?.endDate\n ? dateAdapter.startOf(selectedDate.endDate, \"month\")\n : null;\n if (\n selectedDate?.startDate &&\n startDateStartOfMonth &&\n dateAdapter.compare(startDateStartOfMonth, startVisibleMonth) >= 0 &&\n dateAdapter.compare(startDateStartOfMonth, endVisibleMonth) <= 0 &&\n isDaySelectable(selectedDate?.startDate)\n ) {\n return selectedDate?.startDate;\n }\n if (\n selectedDate?.endDate &&\n endDateStartOfMonth &&\n dateAdapter.compare(endDateStartOfMonth, startVisibleMonth) >= 0 &&\n dateAdapter.compare(endDateStartOfMonth, endVisibleMonth) <= 0 &&\n isDaySelectable(selectedDate?.endDate)\n ) {\n return selectedDate?.endDate;\n }\n return null;\n };\n\n const focusSelectedDate = getVisibleSelectedDate();\n if (focusSelectedDate) {\n return focusSelectedDate;\n }\n\n // Today\n const today = dateAdapter.today(timezone);\n const todayStartOfMonth = dateAdapter.startOf(today, \"month\");\n if (\n dateAdapter.compare(todayStartOfMonth, startVisibleMonth) >= 0 &&\n dateAdapter.compare(todayStartOfMonth, endVisibleMonth) <= 0 &&\n isDaySelectable(today)\n ) {\n return today;\n }\n\n // First selectable date across visible months\n const getFirstSelectableDate = (\n startMonth: TDate,\n numberOfMonths: number,\n ) => {\n for (let i = 0; i < numberOfMonths; i++) {\n const currentMonth = dateAdapter.add(startMonth, { months: i });\n const firstSelectableDate = generateDatesForMonth(\n dateAdapter,\n currentMonth,\n ).find((visibleDay) => isDaySelectable(visibleDay));\n\n if (firstSelectableDate) {\n return firstSelectableDate;\n }\n }\n\n return null;\n };\n\n return getFirstSelectableDate(\n startVisibleMonth,\n responsiveNumberOfVisibleMonths,\n );\n };\n\n const handleSelectionChange = useCallback(\n (\n event: SyntheticEvent,\n newDate: TDate | DateRangeSelection<TDate> | null,\n ) => {\n const dateRange = newDate as DateRangeSelection<TDate> | null;\n select(event, dateRange);\n onSelectionChange?.(event, dateRange);\n },\n [onSelectionChange, select],\n );\n\n const handleHoveredDateChange = useCallback(\n (event: SyntheticEvent, newHoveredDate: TDate | null) => {\n setHoveredDate(newHoveredDate);\n onHoveredDateChange?.(event, newHoveredDate);\n },\n [onHoveredDateChange],\n );\n\n const handleVisibleMonthChange = useCallback(\n (event: SyntheticEvent | null, newVisibleMonth: TDate) => {\n setVisibleMonth(newVisibleMonth);\n onVisibleMonthChange?.(event, newVisibleMonth);\n },\n [onVisibleMonthChange],\n );\n\n const handleFocusedDateChange = useCallback(\n (event: SyntheticEvent | null, newFocusedDate: TDate) => {\n setFocusedDate(newFocusedDate);\n if (!newFocusedDate) {\n onFocusedDateChange?.(event, newFocusedDate);\n return;\n }\n\n const startOfFocusedMonth = dateAdapter.startOf(\n newFocusedDate,\n \"month\",\n );\n const lastVisibleMonth = dateAdapter.add(visibleMonth, {\n months: responsiveNumberOfVisibleMonths - 1,\n });\n\n const isBeforeVisibleMonth =\n dateAdapter.compare(startOfFocusedMonth, visibleMonth) < 0;\n const isAfterLastVisibleMonth =\n dateAdapter.compare(startOfFocusedMonth, lastVisibleMonth) > 0;\n\n if (isBeforeVisibleMonth) {\n handleVisibleMonthChange(event, startOfFocusedMonth);\n } else if (isAfterLastVisibleMonth) {\n const newLastVisibleMonth = dateAdapter.subtract(\n startOfFocusedMonth,\n { months: responsiveNumberOfVisibleMonths - 1 },\n );\n handleVisibleMonthChange(event, newLastVisibleMonth);\n }\n onFocusedDateChange?.(event, newFocusedDate);\n },\n [\n dateAdapter,\n handleVisibleMonthChange,\n onFocusedDateChange,\n responsiveNumberOfVisibleMonths,\n visibleMonth,\n ],\n );\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: only run when focus/min/max date changes\n useLayoutEffect(() => {\n // Called when the overlay opens or the focus shifts between trigger and overlay\n if (focused && !calendarGridFocused.current) {\n setFocusedDate((prevFocusedDate) => {\n if (!prevFocusedDate) {\n return getNextFocusedDate();\n }\n return prevFocusedDate;\n });\n }\n calendarGridFocused.current = focused;\n }, [focused]);\n\n const calendarProps = {\n visibleMonth,\n focusedDateRef: initialFocusRef,\n focusedDate: calendarGridFocused?.current ? focusedDate : null,\n hoveredDate,\n numberOfVisibleMonths: responsiveNumberOfVisibleMonths,\n onFocusedDateChange: handleFocusedDateChange,\n onHoveredDateChange: handleHoveredDateChange,\n onSelectionChange: handleSelectionChange,\n onVisibleMonthChange: handleVisibleMonthChange,\n hideOutOfRangeDates: true,\n isDayHighlighted,\n isDayUnselectable,\n selectedDate,\n minDate,\n maxDate,\n timezone,\n ...CalendarProps,\n };\n\n return (\n <StackLayout\n separators\n gap={0}\n className={clsx(className, withBaseName(\"container\"))}\n ref={ref}\n {...rest}\n >\n {helperText && (\n <FlexItem className={withBaseName(\"header\")}>\n <FormFieldHelperText>{helperText}</FormFieldHelperText>\n </FlexItem>\n )}\n <FlexLayout gap={0}>\n <FormFieldContext.Provider value={{} as FormFieldContextValue}>\n <Calendar\n selectionVariant={\"range\"}\n {...(calendarProps as Partial<CalendarRangeProps<TDate>>)}\n >\n <CalendarNavigation {...CalendarNavigationProps} />\n <CalendarGrid\n columns={responsiveColumns}\n {...CalendarGridProps}\n />\n </Calendar>\n </FormFieldContext.Provider>\n </FlexLayout>\n </StackLayout>\n );\n },\n);\n"],"names":["makePrefixer","forwardRef","DatePickerRangeGridPanel","useLocalization","useWindow","useComponentCssInjection","datePickerPanelCss","useDatePickerContext","useDatePickerOverlay","useState","useRef","useBreakpoint","resolveResponsiveValue","useControlled","generateDatesForMonth","useCallback","useLayoutEffect","jsxs","StackLayout","clsx","jsx","FlexItem","FormFieldHelperText","FlexLayout","FormFieldContext","Calendar","CalendarNavigation","CalendarGrid"],"mappings":";;;;;;;;;;;;;;;;;;;;AAyCA,MAAM,YAAA,GAAeA,kBAAa,qBAAqB,CAAA;AA2BhD,MAAM,wBAAA,GAA2BC,gBAAA;AAAA,EACtC,SAASC,yBAAAA,CACP,KAAA,EACA,GAAA,EACA;AACA,IAAA,MAAM,EAAE,WAAA,EAAY,GAAIC,oCAAA,EAAuB;AAE/C,IAAA,MAAM;AAAA,MACJ,aAAA;AAAA,MACA,uBAAA;AAAA,MACA,iBAAA;AAAA,MACA,SAAA;AAAA,MACA,mBAAA;AAAA,MACA,YAAA,EAAc,gBAAA;AAAA,MACd,mBAAA;AAAA,MACA,mBAAA;AAAA,MACA,oBAAA;AAAA,MACA,UAAA;AAAA,MACA,iBAAA;AAAA,MACA,qBAAA,GAAwB,CAAA;AAAA,MACxB,OAAA,GAAU,qBAAA;AAAA,MACV,GAAG;AAAA,KACL,GAAI,KAAA;AAEJ,IAAA,MAAM,eAAeC,gBAAA,EAAU;AAC/B,IAAAC,+BAAA,CAAyB;AAAA,MACvB,MAAA,EAAQ,mCAAA;AAAA,MACR,GAAA,EAAKC,eAAA;AAAA,MACL,MAAA,EAAQ;AAAA,KACT,CAAA;AAED,IAAA,MAAM,kBAA+CC,sCAAA,CAAqB;AAAA,MACxE,gBAAA,EAAkB;AAAA,KACnB,CAAA;AAED,IAAA,MAAM;AAAA,MACJ,KAAA,EAAO,EAAE,OAAA,EAAS,eAAA;AAAgB,QAChCC,8CAAA,EAAqB;AAEzB,IAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIC,eAAuB,IAAI,CAAA;AACjE,IAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,eAAuB,IAAI,CAAA;AACjE,IAAA,MAAM,mBAAA,GAAsBC,aAAO,KAAK,CAAA;AAExC,IAAA,MAAM;AAAA,MACJ,KAAA,EAAO;AAAA,QACL,QAAA;AAAA,QACA,YAAA,GAAe,IAAA;AAAA,QACf,UAAU,WAAA,CAAY,OAAA,CAAQ,YAAY,KAAA,CAAM,QAAQ,GAAG,OAAO,CAAA;AAAA,QAClE,UAAU,WAAA,CAAY,GAAA,CAAI,SAAS,EAAE,MAAA,EAAQ,GAAG;AAAA,OAClD;AAAA,MACA,OAAA,EAAS,EAAE,MAAA,EAAQ,gBAAA,EAAkB,iBAAA;AAAkB,KACzD,GAAI,eAAA;AAEJ,IAAA,MAAM,EAAE,kBAAA,EAAmB,GAAIC,kBAAA,EAAc;AAE7C,IAAA,MAAM,iBAAA,GACJC,2BAAA,CAAuB,OAAA,EAAS,kBAAkB,CAAA,IAAK,CAAA;AACzD,IAAA,MAAM,+BAAA,GACJA,2BAAA,CAAuB,qBAAA,EAAuB,kBAAkB,CAAA,IAAK,CAAA;AAEvE,IAAA,MAAM,CAAC,+BAA+B,CAAA,GAAIH,cAAA,CAAS,MAAM;AACvD,MAAA,MAAM,SAAA,GAAA,CACJ,YAAA,IAAA,IAAA,GAAA,MAAA,GAAA,YAAA,CAAc,SAAA,KAAa,WAAA,CAAY,OAAA,CAAQ,YAAA,CAAa,SAAS,CAAA,GACjE,YAAA,CAAa,SAAA,GACb,WAAA,CAAY,KAAA,CAAM,QAAQ,CAAA;AAGhC,MAAA,OAAO,mBAAA,IAAuB,WAAA,CAAY,OAAA,CAAQ,SAAA,EAAW,OAAO,CAAA;AAAA,IACtE,CAAC,CAAA;AAED,IAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAII,kBAAA,CAAc;AAAA,MACpD,UAAA,EAAY,gBAAA;AAAA,MACZ,OAAA,EAAS,+BAAA;AAAA,MACT,IAAA,EAAM,0BAAA;AAAA,MACN,KAAA,EAAO;AAAA,KACR,CAAA;AAED,IAAA,MAAM,qBAAqB,MAAM;AAC/B,MAAA,MAAM,qBAAA,GAAwB,CAAC,IAAA,KAAgB;AAC7C,QAAA,OACE,WAAA,CAAY,OAAA,CAAQ,IAAA,EAAM,OAAO,CAAA,GAAI,KACrC,WAAA,CAAY,OAAA,CAAQ,IAAA,EAAM,OAAO,CAAA,GAAI,CAAA;AAAA,MAEzC,CAAA;AAEA,MAAA,MAAM,eAAA,GAAkB,CAAC,IAAA,KACvB,EAAE,UAAS,iBAAA,IAAA,IAAA,GAAA,MAAA,GAAA,iBAAA,CAAoB,IAAA,CAAA,KAAS,sBAAsB,IAAI,CAAA,CAAA,CAAA;AAEpE,MAAA,MAAM,iBAAA,GAAoB,WAAA,CAAY,OAAA,CAAQ,YAAA,EAAc,OAAO,CAAA;AACnE,MAAA,MAAM,eAAA,GAAkB,WAAA,CAAY,GAAA,CAAI,YAAA,EAAc;AAAA,QACpD,QAAQ,+BAAA,GAAkC;AAAA,OAC3C,CAAA;AAED,MAAA,MAAM,yBAAyB,MAAM;AACnC,QAAA,MAAM,qBAAA,GAAA,CAAwB,6CAAc,SAAA,IACxC,WAAA,CAAY,QAAQ,YAAA,CAAa,SAAA,EAAW,OAAO,CAAA,GACnD,IAAA;AACJ,QAAA,MAAM,mBAAA,GAAA,CAAsB,6CAAc,OAAA,IACtC,WAAA,CAAY,QAAQ,YAAA,CAAa,OAAA,EAAS,OAAO,CAAA,GACjD,IAAA;AACJ,QAAA,IAAA,CACE,6CAAc,SAAA,KACd,qBAAA,IACA,YAAY,OAAA,CAAQ,qBAAA,EAAuB,iBAAiB,CAAA,IAAK,CAAA,IACjE,WAAA,CAAY,OAAA,CAAQ,uBAAuB,eAAe,CAAA,IAAK,KAC/D,eAAA,CAAgB,YAAA,IAAA,IAAA,GAAA,MAAA,GAAA,YAAA,CAAc,SAAS,CAAA,EACvC;AACA,UAAA,OAAO,YAAA,IAAA,IAAA,GAAA,MAAA,GAAA,YAAA,CAAc,SAAA;AAAA,QACvB;AACA,QAAA,IAAA,CACE,6CAAc,OAAA,KACd,mBAAA,IACA,YAAY,OAAA,CAAQ,mBAAA,EAAqB,iBAAiB,CAAA,IAAK,CAAA,IAC/D,WAAA,CAAY,OAAA,CAAQ,qBAAqB,eAAe,CAAA,IAAK,KAC7D,eAAA,CAAgB,YAAA,IAAA,IAAA,GAAA,MAAA,GAAA,YAAA,CAAc,OAAO,CAAA,EACrC;AACA,UAAA,OAAO,YAAA,IAAA,IAAA,GAAA,MAAA,GAAA,YAAA,CAAc,OAAA;AAAA,QACvB;AACA,QAAA,OAAO,IAAA;AAAA,MACT,CAAA;AAEA,MAAA,MAAM,oBAAoB,sBAAA,EAAuB;AACjD,MAAA,IAAI,iBAAA,EAAmB;AACrB,QAAA,OAAO,iBAAA;AAAA,MACT;AAGA,MAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,KAAA,CAAM,QAAQ,CAAA;AACxC,MAAA,MAAM,iBAAA,GAAoB,WAAA,CAAY,OAAA,CAAQ,KAAA,EAAO,OAAO,CAAA;AAC5D,MAAA,IACE,WAAA,CAAY,OAAA,CAAQ,iBAAA,EAAmB,iBAAiB,KAAK,CAAA,IAC7D,WAAA,CAAY,OAAA,CAAQ,iBAAA,EAAmB,eAAe,CAAA,IAAK,CAAA,IAC3D,eAAA,CAAgB,KAAK,CAAA,EACrB;AACA,QAAA,OAAO,KAAA;AAAA,MACT;AAGA,MAAA,MAAM,sBAAA,GAAyB,CAC7B,UAAA,EACA,cAAA,KACG;AACH,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,cAAA,EAAgB,CAAA,EAAA,EAAK;AACvC,UAAA,MAAM,eAAe,WAAA,CAAY,GAAA,CAAI,YAAY,EAAE,MAAA,EAAQ,GAAG,CAAA;AAC9D,UAAA,MAAM,mBAAA,GAAsBC,2BAAA;AAAA,YAC1B,WAAA;AAAA,YACA;AAAA,YACA,IAAA,CAAK,CAAC,UAAA,KAAe,eAAA,CAAgB,UAAU,CAAC,CAAA;AAElD,UAAA,IAAI,mBAAA,EAAqB;AACvB,YAAA,OAAO,mBAAA;AAAA,UACT;AAAA,QACF;AAEA,QAAA,OAAO,IAAA;AAAA,MACT,CAAA;AAEA,MAAA,OAAO,sBAAA;AAAA,QACL,iBAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,qBAAA,GAAwBC,iBAAA;AAAA,MAC5B,CACE,OACA,OAAA,KACG;AACH,QAAA,MAAM,SAAA,GAAY,OAAA;AAClB,QAAA,MAAA,CAAO,OAAO,SAAS,CAAA;AACvB,QAAA,iBAAA,IAAA,IAAA,GAAA,MAAA,GAAA,iBAAA,CAAoB,KAAA,EAAO,SAAA,CAAA;AAAA,MAC7B,CAAA;AAAA,MACA,CAAC,mBAAmB,MAAM;AAAA,KAC5B;AAEA,IAAA,MAAM,uBAAA,GAA0BA,iBAAA;AAAA,MAC9B,CAAC,OAAuB,cAAA,KAAiC;AACvD,QAAA,cAAA,CAAe,cAAc,CAAA;AAC7B,QAAA,mBAAA,IAAA,IAAA,GAAA,MAAA,GAAA,mBAAA,CAAsB,KAAA,EAAO,cAAA,CAAA;AAAA,MAC/B,CAAA;AAAA,MACA,CAAC,mBAAmB;AAAA,KACtB;AAEA,IAAA,MAAM,wBAAA,GAA2BA,iBAAA;AAAA,MAC/B,CAAC,OAA8B,eAAA,KAA2B;AACxD,QAAA,eAAA,CAAgB,eAAe,CAAA;AAC/B,QAAA,oBAAA,IAAA,IAAA,GAAA,MAAA,GAAA,oBAAA,CAAuB,KAAA,EAAO,eAAA,CAAA;AAAA,MAChC,CAAA;AAAA,MACA,CAAC,oBAAoB;AAAA,KACvB;AAEA,IAAA,MAAM,uBAAA,GAA0BA,iBAAA;AAAA,MAC9B,CAAC,OAA8B,cAAA,KAA0B;AACvD,QAAA,cAAA,CAAe,cAAc,CAAA;AAC7B,QAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,UAAA,mBAAA,IAAA,IAAA,GAAA,MAAA,GAAA,mBAAA,CAAsB,KAAA,EAAO,cAAA,CAAA;AAC7B,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,sBAAsB,WAAA,CAAY,OAAA;AAAA,UACtC,cAAA;AAAA,UACA;AAAA,SACF;AACA,QAAA,MAAM,gBAAA,GAAmB,WAAA,CAAY,GAAA,CAAI,YAAA,EAAc;AAAA,UACrD,QAAQ,+BAAA,GAAkC;AAAA,SAC3C,CAAA;AAED,QAAA,MAAM,oBAAA,GACJ,WAAA,CAAY,OAAA,CAAQ,mBAAA,EAAqB,YAAY,CAAA,GAAI,CAAA;AAC3D,QAAA,MAAM,uBAAA,GACJ,WAAA,CAAY,OAAA,CAAQ,mBAAA,EAAqB,gBAAgB,CAAA,GAAI,CAAA;AAE/D,QAAA,IAAI,oBAAA,EAAsB;AACxB,UAAA,wBAAA,CAAyB,OAAO,mBAAmB,CAAA;AAAA,QACrD,WAAW,uBAAA,EAAyB;AAClC,UAAA,MAAM,sBAAsB,WAAA,CAAY,QAAA;AAAA,YACtC,mBAAA;AAAA,YACA,EAAE,MAAA,EAAQ,+BAAA,GAAkC,CAAA;AAAE,WAChD;AACA,UAAA,wBAAA,CAAyB,OAAO,mBAAmB,CAAA;AAAA,QACrD;AACA,QAAA,mBAAA,IAAA,IAAA,GAAA,MAAA,GAAA,mBAAA,CAAsB,KAAA,EAAO,cAAA,CAAA;AAAA,MAC/B,CAAA;AAAA,MACA;AAAA,QACE,WAAA;AAAA,QACA,wBAAA;AAAA,QACA,mBAAA;AAAA,QACA,+BAAA;AAAA,QACA;AAAA;AACF,KACF;AAGA,IAAAC,qBAAA,CAAgB,MAAM;AAEpB,MAAA,IAAI,OAAA,IAAW,CAAC,mBAAA,CAAoB,OAAA,EAAS;AAC3C,QAAA,cAAA,CAAe,CAAC,eAAA,KAAoB;AAClC,UAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,YAAA,OAAO,kBAAA,EAAmB;AAAA,UAC5B;AACA,UAAA,OAAO,eAAA;AAAA,QACT,CAAC,CAAA;AAAA,MACH;AACA,MAAA,mBAAA,CAAoB,OAAA,GAAU,OAAA;AAAA,IAChC,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,IAAA,MAAM,aAAA,GAAgB;AAAA,MACpB,YAAA;AAAA,MACA,cAAA,EAAgB,eAAA;AAAA,MAChB,WAAA,EAAA,CAAa,mBAAA,IAAA,IAAA,GAAA,MAAA,GAAA,mBAAA,CAAqB,OAAA,IAAU,WAAA,GAAc,IAAA;AAAA,MAC1D,WAAA;AAAA,MACA,qBAAA,EAAuB,+BAAA;AAAA,MACvB,mBAAA,EAAqB,uBAAA;AAAA,MACrB,mBAAA,EAAqB,uBAAA;AAAA,MACrB,iBAAA,EAAmB,qBAAA;AAAA,MACnB,oBAAA,EAAsB,wBAAA;AAAA,MACtB,mBAAA,EAAqB,IAAA;AAAA,MACrB,gBAAA;AAAA,MACA,iBAAA;AAAA,MACA,YAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA;AAAA,MACA,QAAA;AAAA,MACA,GAAG;AAAA,KACL;AAEA,IAAA,uBACEC,eAAA;AAAA,MAACC,gBAAA;AAAA,MAAA;AAAA,QACC,UAAA,EAAU,IAAA;AAAA,QACV,GAAA,EAAK,CAAA;AAAA,QACL,SAAA,EAAWC,SAAA,CAAK,SAAA,EAAW,YAAA,CAAa,WAAW,CAAC,CAAA;AAAA,QACpD,GAAA;AAAA,QACC,GAAG,IAAA;AAAA,QAEH,QAAA,EAAA;AAAA,UAAA,UAAA,oBACCC,cAAA,CAACC,iBAAS,SAAA,EAAW,YAAA,CAAa,QAAQ,CAAA,EACxC,QAAA,kBAAAD,cAAA,CAACE,wBAAA,EAAA,EAAqB,QAAA,EAAA,UAAA,EAAW,CAAA,EACnC,CAAA;AAAA,0BAEFF,cAAA,CAACG,eAAA,EAAA,EAAW,GAAA,EAAK,CAAA,EACf,QAAA,kBAAAH,cAAA,CAACI,sBAAiB,QAAA,EAAjB,EAA0B,KAAA,EAAO,EAAC,EACjC,QAAA,kBAAAP,eAAA;AAAA,YAACQ,iBAAA;AAAA,YAAA;AAAA,cACC,gBAAA,EAAkB,OAAA;AAAA,cACjB,GAAI,aAAA;AAAA,cAEL,QAAA,EAAA;AAAA,gCAAAL,cAAA,CAACM,qCAAA,EAAA,EAAoB,GAAG,uBAAA,EAAyB,CAAA;AAAA,gCACjDN,cAAA;AAAA,kBAACO,yBAAA;AAAA,kBAAA;AAAA,oBACC,OAAA,EAAS,iBAAA;AAAA,oBACR,GAAG;AAAA;AAAA;AACN;AAAA;AAAA,aAEJ,CAAA,EACF;AAAA;AAAA;AAAA,KACF;AAAA,EAEJ;AACF;;;;"}
1
+ {"version":3,"file":"DatePickerRangeGridPanel.js","sources":["../src/date-picker/DatePickerRangeGridPanel.tsx"],"sourcesContent":["import {\n FlexItem,\n FlexLayout,\n FormFieldContext,\n type FormFieldContextValue,\n FormFieldHelperText,\n makePrefixer,\n resolveResponsiveValue,\n StackLayout,\n useBreakpoint,\n useControlled,\n useIsomorphicLayoutEffect,\n} from \"@salt-ds/core\";\nimport type { DateFrameworkType } from \"@salt-ds/date-adapters\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport {\n forwardRef,\n type SyntheticEvent,\n useCallback,\n useRef,\n useState,\n} from \"react\";\nimport {\n Calendar,\n CalendarGrid,\n CalendarNavigation,\n type CalendarRangeProps,\n type DateRangeSelection,\n} from \"../calendar\";\nimport { generateDatesForMonth } from \"../calendar/internal/utils\";\nimport { useLocalization } from \"../localization-provider\";\nimport {\n type RangeDatePickerState,\n useDatePickerContext,\n} from \"./DatePickerContext\";\nimport { useDatePickerOverlay } from \"./DatePickerOverlayProvider\";\nimport datePickerPanelCss from \"./DatePickerPanel.css\";\nimport type { DatePickerPanelBaseProps } from \"./DatePickerSingleGridPanel\";\n\nconst withBaseName = makePrefixer(\"saltDatePickerPanel\");\n\n/**\n * Props for the DatePickerRangeGridPanel component.\n * @template TDate - The type of the date object.\n */\nexport type DatePickerRangeGridPanelProps<TDate extends DateFrameworkType> =\n DatePickerPanelBaseProps<TDate> &\n DateRangeSelection<TDate> & {\n onSelectionChange?: (\n event: SyntheticEvent,\n selectedDate?: DateRangeSelection<TDate> | null,\n ) => void;\n CalendarProps?: Partial<\n Omit<\n CalendarRangeProps<TDate>,\n | \"selectionVariant\"\n | \"selectedDate\"\n | \"defaultSelectedDate\"\n | \"multiselect\"\n | \"onHoveredDateChange\"\n | \"onSelectionChange\"\n | \"onVisibleMonthChange\"\n >\n >;\n };\n\nexport const DatePickerRangeGridPanel = forwardRef(\n function DatePickerRangeGridPanel<TDate extends DateFrameworkType>(\n props: DatePickerRangeGridPanelProps<TDate>,\n ref: React.Ref<HTMLDivElement>,\n ) {\n const { dateAdapter } = useLocalization<TDate>();\n\n const {\n CalendarProps,\n CalendarNavigationProps,\n CalendarGridProps,\n className,\n defaultVisibleMonth,\n visibleMonth: visibleMonthProp,\n onFocusedDateChange,\n onHoveredDateChange,\n onVisibleMonthChange,\n helperText,\n onSelectionChange,\n numberOfVisibleMonths = 2,\n columns = numberOfVisibleMonths,\n ...rest\n } = props;\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-date-picker-range-grid-panel\",\n css: datePickerPanelCss,\n window: targetWindow,\n });\n\n const stateAndHelpers: RangeDatePickerState<TDate> = useDatePickerContext({\n selectionVariant: \"range\",\n });\n\n const {\n state: { focused, initialFocusRef },\n } = useDatePickerOverlay();\n\n const [hoveredDate, setHoveredDate] = useState<TDate | null>(null);\n const [focusedDate, setFocusedDate] = useState<TDate | null>(null);\n const calendarGridFocused = useRef(false);\n\n const {\n state: {\n timezone,\n selectedDate = null,\n minDate = dateAdapter.startOf(dateAdapter.today(timezone), \"month\"),\n maxDate = dateAdapter.add(minDate, { months: 1 }),\n },\n helpers: { select, isDayHighlighted, isDayUnselectable },\n } = stateAndHelpers;\n\n const { matchedBreakpoints } = useBreakpoint();\n\n const responsiveColumns =\n resolveResponsiveValue(columns, matchedBreakpoints) ?? 1;\n const responsiveNumberOfVisibleMonths =\n resolveResponsiveValue(numberOfVisibleMonths, matchedBreakpoints) ?? 1;\n\n const [uncontrolledDefaultVisibleMonth] = useState(() => {\n const validDate: TDate =\n selectedDate?.startDate && dateAdapter.isValid(selectedDate.startDate)\n ? selectedDate.startDate\n : dateAdapter.today(timezone);\n\n // Ensure that defaultVisibleMonth is used if provided, otherwise use the start of the valid date\n return defaultVisibleMonth || dateAdapter.startOf(validDate, \"month\");\n });\n\n const [visibleMonth, setVisibleMonth] = useControlled({\n controlled: visibleMonthProp,\n default: uncontrolledDefaultVisibleMonth,\n name: \"DatePickerRangeGridPanel\",\n state: \"visibleMonth\",\n });\n\n const getNextFocusedDate = () => {\n const isOutsideAllowedDates = (date: TDate) => {\n return (\n dateAdapter.compare(date, minDate) < 0 ||\n dateAdapter.compare(date, maxDate) > 0\n );\n };\n\n const isDaySelectable = (date: TDate) =>\n !(date && (isDayUnselectable?.(date) || isOutsideAllowedDates(date)));\n\n const startVisibleMonth = dateAdapter.startOf(visibleMonth, \"month\");\n const endVisibleMonth = dateAdapter.add(visibleMonth, {\n months: responsiveNumberOfVisibleMonths - 1,\n });\n\n const getVisibleSelectedDate = () => {\n const startDateStartOfMonth = selectedDate?.startDate\n ? dateAdapter.startOf(selectedDate.startDate, \"month\")\n : null;\n const endDateStartOfMonth = selectedDate?.endDate\n ? dateAdapter.startOf(selectedDate.endDate, \"month\")\n : null;\n if (\n selectedDate?.startDate &&\n startDateStartOfMonth &&\n dateAdapter.compare(startDateStartOfMonth, startVisibleMonth) >= 0 &&\n dateAdapter.compare(startDateStartOfMonth, endVisibleMonth) <= 0 &&\n isDaySelectable(selectedDate?.startDate)\n ) {\n return selectedDate?.startDate;\n }\n if (\n selectedDate?.endDate &&\n endDateStartOfMonth &&\n dateAdapter.compare(endDateStartOfMonth, startVisibleMonth) >= 0 &&\n dateAdapter.compare(endDateStartOfMonth, endVisibleMonth) <= 0 &&\n isDaySelectable(selectedDate?.endDate)\n ) {\n return selectedDate?.endDate;\n }\n return null;\n };\n\n const focusSelectedDate = getVisibleSelectedDate();\n if (focusSelectedDate) {\n return focusSelectedDate;\n }\n\n // Today\n const today = dateAdapter.today(timezone);\n const todayStartOfMonth = dateAdapter.startOf(today, \"month\");\n if (\n dateAdapter.compare(todayStartOfMonth, startVisibleMonth) >= 0 &&\n dateAdapter.compare(todayStartOfMonth, endVisibleMonth) <= 0 &&\n isDaySelectable(today)\n ) {\n return today;\n }\n\n // First selectable date across visible months\n const getFirstSelectableDate = (\n startMonth: TDate,\n numberOfMonths: number,\n ) => {\n for (let i = 0; i < numberOfMonths; i++) {\n const currentMonth = dateAdapter.add(startMonth, { months: i });\n const firstSelectableDate = generateDatesForMonth(\n dateAdapter,\n currentMonth,\n ).find((visibleDay) => isDaySelectable(visibleDay));\n\n if (firstSelectableDate) {\n return firstSelectableDate;\n }\n }\n\n return null;\n };\n\n return getFirstSelectableDate(\n startVisibleMonth,\n responsiveNumberOfVisibleMonths,\n );\n };\n\n const handleSelectionChange = useCallback(\n (\n event: SyntheticEvent,\n newDate: TDate | DateRangeSelection<TDate> | null,\n ) => {\n const dateRange = newDate as DateRangeSelection<TDate> | null;\n select(event, dateRange);\n onSelectionChange?.(event, dateRange);\n },\n [onSelectionChange, select],\n );\n\n const handleHoveredDateChange = useCallback(\n (event: SyntheticEvent, newHoveredDate: TDate | null) => {\n setHoveredDate(newHoveredDate);\n onHoveredDateChange?.(event, newHoveredDate);\n },\n [onHoveredDateChange],\n );\n\n const handleVisibleMonthChange = useCallback(\n (event: SyntheticEvent | null, newVisibleMonth: TDate) => {\n setVisibleMonth(newVisibleMonth);\n onVisibleMonthChange?.(event, newVisibleMonth);\n },\n [onVisibleMonthChange],\n );\n\n const handleFocusedDateChange = useCallback(\n (event: SyntheticEvent | null, newFocusedDate: TDate) => {\n setFocusedDate(newFocusedDate);\n if (!newFocusedDate) {\n onFocusedDateChange?.(event, newFocusedDate);\n return;\n }\n\n const startOfFocusedMonth = dateAdapter.startOf(\n newFocusedDate,\n \"month\",\n );\n const lastVisibleMonth = dateAdapter.add(visibleMonth, {\n months: responsiveNumberOfVisibleMonths - 1,\n });\n\n const isBeforeVisibleMonth =\n dateAdapter.compare(startOfFocusedMonth, visibleMonth) < 0;\n const isAfterLastVisibleMonth =\n dateAdapter.compare(startOfFocusedMonth, lastVisibleMonth) > 0;\n\n if (isBeforeVisibleMonth) {\n handleVisibleMonthChange(event, startOfFocusedMonth);\n } else if (isAfterLastVisibleMonth) {\n const newLastVisibleMonth = dateAdapter.subtract(\n startOfFocusedMonth,\n { months: responsiveNumberOfVisibleMonths - 1 },\n );\n handleVisibleMonthChange(event, newLastVisibleMonth);\n }\n onFocusedDateChange?.(event, newFocusedDate);\n },\n [\n dateAdapter,\n handleVisibleMonthChange,\n onFocusedDateChange,\n responsiveNumberOfVisibleMonths,\n visibleMonth,\n ],\n );\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: only run when focus/min/max date changes\n useIsomorphicLayoutEffect(() => {\n // Called when the overlay opens or the focus shifts between trigger and overlay\n if (focused && !calendarGridFocused.current) {\n setFocusedDate((prevFocusedDate) => {\n if (!prevFocusedDate) {\n return getNextFocusedDate();\n }\n return prevFocusedDate;\n });\n }\n calendarGridFocused.current = focused;\n }, [focused]);\n\n const calendarProps = {\n visibleMonth,\n focusedDateRef: initialFocusRef,\n focusedDate: calendarGridFocused?.current ? focusedDate : null,\n hoveredDate,\n numberOfVisibleMonths: responsiveNumberOfVisibleMonths,\n onFocusedDateChange: handleFocusedDateChange,\n onHoveredDateChange: handleHoveredDateChange,\n onSelectionChange: handleSelectionChange,\n onVisibleMonthChange: handleVisibleMonthChange,\n hideOutOfRangeDates: true,\n isDayHighlighted,\n isDayUnselectable,\n selectedDate,\n minDate,\n maxDate,\n timezone,\n ...CalendarProps,\n };\n\n return (\n <StackLayout\n separators\n gap={0}\n className={clsx(className, withBaseName(\"container\"))}\n ref={ref}\n {...rest}\n >\n {helperText && (\n <FlexItem className={withBaseName(\"header\")}>\n <FormFieldHelperText>{helperText}</FormFieldHelperText>\n </FlexItem>\n )}\n <FlexLayout gap={0}>\n <FormFieldContext.Provider value={{} as FormFieldContextValue}>\n <Calendar\n selectionVariant={\"range\"}\n {...(calendarProps as Partial<CalendarRangeProps<TDate>>)}\n >\n <CalendarNavigation {...CalendarNavigationProps} />\n <CalendarGrid\n columns={responsiveColumns}\n {...CalendarGridProps}\n />\n </Calendar>\n </FormFieldContext.Provider>\n </FlexLayout>\n </StackLayout>\n );\n },\n);\n"],"names":["makePrefixer","forwardRef","DatePickerRangeGridPanel","useLocalization","useWindow","useComponentCssInjection","datePickerPanelCss","useDatePickerContext","useDatePickerOverlay","useState","useRef","useBreakpoint","resolveResponsiveValue","useControlled","generateDatesForMonth","useCallback","useIsomorphicLayoutEffect","jsxs","StackLayout","clsx","jsx","FlexItem","FormFieldHelperText","FlexLayout","FormFieldContext","Calendar","CalendarNavigation","CalendarGrid"],"mappings":"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"}
@@ -218,7 +218,7 @@ const DatePickerRangePanel = react.forwardRef(function DatePickerRangePanel2(pro
218
218
  };
219
219
  return getFirstSelectableDate(nextStartVisibleMonth) ?? getFirstSelectableDate(nextEndVisibleMonth);
220
220
  };
221
- react.useLayoutEffect(() => {
221
+ core.useIsomorphicLayoutEffect(() => {
222
222
  if (!focused) {
223
223
  setFocusedDate(null);
224
224
  return;