@servicetitan/anvil2 1.41.0 → 1.42.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (178) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/dist/{AnvilProvider-Lh8YtV03.js → AnvilProvider-BLYCqIbb.js} +2 -2
  3. package/dist/{AnvilProvider-Lh8YtV03.js.map → AnvilProvider-BLYCqIbb.js.map} +1 -1
  4. package/dist/AnvilProvider.js +1 -1
  5. package/dist/{Avatar-B20IdOEO-Di14brYV.js → Avatar-C7cbRTCt-DCvzmr2C.js} +14 -12
  6. package/dist/Avatar-C7cbRTCt-DCvzmr2C.js.map +1 -0
  7. package/dist/{Avatar-B20IdOEO.css → Avatar-C7cbRTCt.css} +34 -19
  8. package/dist/{Avatar-hNOToS9S.js → Avatar-DREZJN2K.js} +2 -2
  9. package/dist/Avatar-DREZJN2K.js.map +1 -0
  10. package/dist/Avatar.js +1 -1
  11. package/dist/{Breadcrumbs-D_jgwoN3-Dlw-weD8.js → Breadcrumbs-B5bqrZ5D-BqK-Qfh9.js} +3 -3
  12. package/dist/{Breadcrumbs-D_jgwoN3-Dlw-weD8.js.map → Breadcrumbs-B5bqrZ5D-BqK-Qfh9.js.map} +1 -1
  13. package/dist/{Breadcrumbs-C_gan90a.js → Breadcrumbs-De8uoLi8.js} +2 -2
  14. package/dist/{Breadcrumbs-C_gan90a.js.map → Breadcrumbs-De8uoLi8.js.map} +1 -1
  15. package/dist/Breadcrumbs.js +1 -1
  16. package/dist/{Calendar-MIwfKzm7.js → Calendar-Bgpz99F2.js} +2 -2
  17. package/dist/{Calendar-MIwfKzm7.js.map → Calendar-Bgpz99F2.js.map} +1 -1
  18. package/dist/{Calendar-CNrdcd3f-BAKv-Gz3.js → Calendar-DD5kmVd3-CBGTR11R.js} +4 -4
  19. package/dist/{Calendar-CNrdcd3f-BAKv-Gz3.js.map → Calendar-DD5kmVd3-CBGTR11R.js.map} +1 -1
  20. package/dist/Calendar.js +1 -1
  21. package/dist/{Checkbox-JWDraGFN--7ptfLKN.js → Checkbox-DyHm7Ntt-DYw5QL3l.js} +2 -2
  22. package/dist/{Checkbox-JWDraGFN--7ptfLKN.js.map → Checkbox-DyHm7Ntt-DYw5QL3l.js.map} +1 -1
  23. package/dist/{Checkbox-IPM-sdvR.js → Checkbox-zg8LVvB6.js} +2 -2
  24. package/dist/{Checkbox-IPM-sdvR.js.map → Checkbox-zg8LVvB6.js.map} +1 -1
  25. package/dist/Checkbox.js +1 -1
  26. package/dist/Chip-DXQiqF8k.js +34 -0
  27. package/dist/Chip-DXQiqF8k.js.map +1 -0
  28. package/dist/{Chip-_daV8CmM-CTke7zH4.js → Chip-MbBEXeAm-DmAcwPRJ.js} +57 -10
  29. package/dist/Chip-MbBEXeAm-DmAcwPRJ.js.map +1 -0
  30. package/dist/{Chip-_daV8CmM.css → Chip-MbBEXeAm.css} +68 -18
  31. package/dist/Chip.js +1 -1
  32. package/dist/{Combobox-CM8DmNMs.js → Combobox-D2aSaDkz.js} +7 -7
  33. package/dist/{Combobox-CM8DmNMs.js.map → Combobox-D2aSaDkz.js.map} +1 -1
  34. package/dist/Combobox.js +1 -1
  35. package/dist/{DateField-BDJEsVc1.js → DateField-D28_sa7P.js} +6 -6
  36. package/dist/{DateField-BDJEsVc1.js.map → DateField-D28_sa7P.js.map} +1 -1
  37. package/dist/DateField.js +1 -1
  38. package/dist/{DateFieldRange-BTq6MrNu.js → DateFieldRange-CgVqJrVg.js} +2 -2
  39. package/dist/{DateFieldRange-BTq6MrNu.js.map → DateFieldRange-CgVqJrVg.js.map} +1 -1
  40. package/dist/DateFieldRange.js +1 -1
  41. package/dist/{DateFieldSingle-CaeOLrI4.js → DateFieldSingle-CLoWDlPO.js} +2 -2
  42. package/dist/{DateFieldSingle-CaeOLrI4.js.map → DateFieldSingle-CLoWDlPO.js.map} +1 -1
  43. package/dist/DateFieldSingle.js +1 -1
  44. package/dist/{DateFieldYearless-CbFo3oyZ.js → DateFieldYearless-CXlUH0c7.js} +2 -2
  45. package/dist/{DateFieldYearless-CbFo3oyZ.js.map → DateFieldYearless-CXlUH0c7.js.map} +1 -1
  46. package/dist/{DateFieldYearless-CJP3H_Dg-BV5wGJp1.js → DateFieldYearless-M5KDI_hn-akXtkIZA.js} +673 -611
  47. package/dist/{DateFieldYearless-CJP3H_Dg-BV5wGJp1.js.map → DateFieldYearless-M5KDI_hn-akXtkIZA.js.map} +1 -1
  48. package/dist/DateFieldYearless.js +1 -1
  49. package/dist/{DaysOfTheWeek-8zaAuw55.js → DaysOfTheWeek-ImBPjEvl.js} +2 -2
  50. package/dist/{DaysOfTheWeek-8zaAuw55.js.map → DaysOfTheWeek-ImBPjEvl.js.map} +1 -1
  51. package/dist/DaysOfTheWeek.js +1 -1
  52. package/dist/{Dialog-DnZE02ob.js → Dialog-BR6f-XRH.js} +3 -3
  53. package/dist/{Dialog-DnZE02ob.js.map → Dialog-BR6f-XRH.js.map} +1 -1
  54. package/dist/Dialog.js +1 -1
  55. package/dist/{Drawer-5kgL0gY9.js → Drawer-0ayAWgAA.js} +2 -2
  56. package/dist/{Drawer-5kgL0gY9.js.map → Drawer-0ayAWgAA.js.map} +1 -1
  57. package/dist/Drawer.js +1 -1
  58. package/dist/{EditCard-C0hD1VPA.js → EditCard-B_n1uFkv.js} +2 -2
  59. package/dist/{EditCard-C0hD1VPA.js.map → EditCard-B_n1uFkv.js.map} +1 -1
  60. package/dist/EditCard.js +1 -1
  61. package/dist/{FieldLabel-D5rNXy6h.js → FieldLabel-DWl5qsRY.js} +2 -2
  62. package/dist/{FieldLabel-D5rNXy6h.js.map → FieldLabel-DWl5qsRY.js.map} +1 -1
  63. package/dist/FieldLabel.js +1 -1
  64. package/dist/{HammerProvider-CYP98rq3-Dd9GVIyP.js → HammerProvider-vt3DkcCZ-06BeBrPu.js} +2 -2
  65. package/dist/{HammerProvider-CYP98rq3-Dd9GVIyP.js.map → HammerProvider-vt3DkcCZ-06BeBrPu.js.map} +1 -1
  66. package/dist/{InputMask-BLZh7hka-CTcRCY2k.js → InputMask-CE3pdXwL-B8XVrj36.js} +2 -2
  67. package/dist/{InputMask-BLZh7hka-CTcRCY2k.js.map → InputMask-CE3pdXwL-B8XVrj36.js.map} +1 -1
  68. package/dist/{InputMask-B6kMdXCB.js → InputMask-wUro4G2j.js} +2 -2
  69. package/dist/{InputMask-B6kMdXCB.js.map → InputMask-wUro4G2j.js.map} +1 -1
  70. package/dist/InputMask.js +1 -1
  71. package/dist/{ListView-cMMBtp1O.js → ListView-DdHpJHTc.js} +3 -3
  72. package/dist/{ListView-cMMBtp1O.js.map → ListView-DdHpJHTc.js.map} +1 -1
  73. package/dist/ListView.js +1 -1
  74. package/dist/{Listbox-BvJLSAVO-Br5k6fmq.js → Listbox-B-WUuj-_-BWWeWtLW.js} +2 -2
  75. package/dist/{Listbox-BvJLSAVO-Br5k6fmq.js.map → Listbox-B-WUuj-_-BWWeWtLW.js.map} +1 -1
  76. package/dist/{Listbox-dVARiucB.js → Listbox-Di6OS1Fk.js} +2 -2
  77. package/dist/{Listbox-dVARiucB.js.map → Listbox-Di6OS1Fk.js.map} +1 -1
  78. package/dist/Listbox.js +1 -1
  79. package/dist/{Menu-Dk3ESnzI.js → Menu-DHCOMJx2.js} +2 -2
  80. package/dist/{Menu-Dk3ESnzI.js.map → Menu-DHCOMJx2.js.map} +1 -1
  81. package/dist/{Menu-CAiyc2zk-rxU7H28t.js → Menu-TtVJnSrA-yBYichuJ.js} +6 -9
  82. package/dist/Menu-TtVJnSrA-yBYichuJ.js.map +1 -0
  83. package/dist/Menu.js +1 -1
  84. package/dist/{Page-DWeD3rrr.js → Page-KN0DLtcf.js} +8 -8
  85. package/dist/{Page-DWeD3rrr.js.map → Page-KN0DLtcf.js.map} +1 -1
  86. package/dist/Page.js +1 -1
  87. package/dist/Pagination.js +2 -2
  88. package/dist/Pagination.js.map +1 -1
  89. package/dist/{Popover-2O1Q-34V.js → Popover-B1HaUjGI.js} +2 -2
  90. package/dist/{Popover-2O1Q-34V.js.map → Popover-B1HaUjGI.js.map} +1 -1
  91. package/dist/{Popover-DvLcjLjG-Yu5STx-v.js → Popover-CU2cGVD8-FWJOuFRj.js} +4 -4
  92. package/dist/{Popover-DvLcjLjG-Yu5STx-v.js.map → Popover-CU2cGVD8-FWJOuFRj.js.map} +1 -1
  93. package/dist/Popover.js +1 -1
  94. package/dist/{ProgressBar-BezETeA3-CeeedJ_w.js → ProgressBar-BRvB-bD4-DppwBrFg.js} +5 -5
  95. package/dist/{ProgressBar-BezETeA3-CeeedJ_w.js.map → ProgressBar-BRvB-bD4-DppwBrFg.js.map} +1 -1
  96. package/dist/{ProgressBar-CfstmN5D.js → ProgressBar-lPKNTz6i.js} +2 -2
  97. package/dist/{ProgressBar-CfstmN5D.js.map → ProgressBar-lPKNTz6i.js.map} +1 -1
  98. package/dist/ProgressBar.js +1 -1
  99. package/dist/{Radio-8E1l0DJa-CLVaSyQc.js → Radio-DQ_VQFGZ-SdFBlDnE.js} +3 -3
  100. package/dist/{Radio-8E1l0DJa-CLVaSyQc.js.map → Radio-DQ_VQFGZ-SdFBlDnE.js.map} +1 -1
  101. package/dist/{Radio-P6dkI3W0.js → Radio-DnOuBPi_.js} +2 -2
  102. package/dist/{Radio-P6dkI3W0.js.map → Radio-DnOuBPi_.js.map} +1 -1
  103. package/dist/Radio.js +1 -1
  104. package/dist/{SelectCard-m61WUlo--DlByowef.js → SelectCard-DUNwYa5y-BSi21Aba.js} +4 -4
  105. package/dist/{SelectCard-m61WUlo--DlByowef.js.map → SelectCard-DUNwYa5y-BSi21Aba.js.map} +1 -1
  106. package/dist/SelectCard.js +1 -1
  107. package/dist/{SelectCardGroup-DIaWX2Vp.js → SelectCardGroup-YGYiBv5M.js} +2 -2
  108. package/dist/{SelectCardGroup-DIaWX2Vp.js.map → SelectCardGroup-YGYiBv5M.js.map} +1 -1
  109. package/dist/{SelectTrigger-DKh0Bzy6.js → SelectTrigger-Cg-rlFKY.js} +3 -3
  110. package/dist/{SelectTrigger-DKh0Bzy6.js.map → SelectTrigger-Cg-rlFKY.js.map} +1 -1
  111. package/dist/SelectTrigger.js +1 -1
  112. package/dist/{SelectTriggerBase-DnRvuD3R-CTFWVZhY.js → SelectTriggerBase-C0fhFfuj-DfR6h1Lq.js} +4 -4
  113. package/dist/{SelectTriggerBase-DnRvuD3R-CTFWVZhY.js.map → SelectTriggerBase-C0fhFfuj-DfR6h1Lq.js.map} +1 -1
  114. package/dist/{SideNav-DEoGpeqJ.js → SideNav-Bh_pVeEw.js} +11 -11
  115. package/dist/{SideNav-DEoGpeqJ.js.map → SideNav-Bh_pVeEw.js.map} +1 -1
  116. package/dist/SideNav.css +70 -52
  117. package/dist/SideNav.js +1 -1
  118. package/dist/{Text-B91g6xKn.js → Text-35Ve4Uq0.js} +2 -2
  119. package/dist/{Text-B91g6xKn.js.map → Text-35Ve4Uq0.js.map} +1 -1
  120. package/dist/{Text-DCvcLCvf-DlmnnjTR.js → Text-CED_yrId-DsRYZw2-.js} +10 -10
  121. package/dist/{Text-DCvcLCvf-DlmnnjTR.js.map → Text-CED_yrId-DsRYZw2-.js.map} +1 -1
  122. package/dist/{Text-DCvcLCvf.css → Text-CED_yrId.css} +35 -17
  123. package/dist/Text.js +1 -1
  124. package/dist/{TextField-D_fqJf85-Bcd6rWv4.js → TextField-CRTh0gL_-D2CjcYXX.js} +6 -3
  125. package/dist/TextField-CRTh0gL_-D2CjcYXX.js.map +1 -0
  126. package/dist/{TextField--tytNBLh.js → TextField-gYAqTpcX.js} +2 -2
  127. package/dist/{TextField--tytNBLh.js.map → TextField-gYAqTpcX.js.map} +1 -1
  128. package/dist/TextField.js +1 -1
  129. package/dist/{Textarea-B0nZ9vOV.js → Textarea-DohNOiIp.js} +24 -11
  130. package/dist/Textarea-DohNOiIp.js.map +1 -0
  131. package/dist/Textarea.js +1 -1
  132. package/dist/{ThemeProvider-BKave7Ha.js → ThemeProvider-DwJqkbiU.js} +2 -2
  133. package/dist/{ThemeProvider-BKave7Ha.js.map → ThemeProvider-DwJqkbiU.js.map} +1 -1
  134. package/dist/{ThemeProvider-CR67FJg0-DYVRlJRA.js → ThemeProvider-Q3ji6Rpx-DBXlAuQ8.js} +5 -5
  135. package/dist/{ThemeProvider-CR67FJg0-DYVRlJRA.js.map → ThemeProvider-Q3ji6Rpx-DBXlAuQ8.js.map} +1 -1
  136. package/dist/{ThemeProvider-CR67FJg0.css → ThemeProvider-Q3ji6Rpx.css} +106 -4
  137. package/dist/ThemeProvider.js +1 -1
  138. package/dist/Toast.js +1 -1
  139. package/dist/{Toolbar-BM78DEEM.js → Toolbar-BznMJKGJ.js} +4 -4
  140. package/dist/{Toolbar-BM78DEEM.js.map → Toolbar-BznMJKGJ.js.map} +1 -1
  141. package/dist/Toolbar.js +1 -1
  142. package/dist/{Tooltip-ZFFXA77Y.js → Tooltip-C2HQDvYj.js} +2 -2
  143. package/dist/{Tooltip-ZFFXA77Y.js.map → Tooltip-C2HQDvYj.js.map} +1 -1
  144. package/dist/Tooltip.js +1 -1
  145. package/dist/assets/icons/st/fixed.svg +1 -0
  146. package/dist/assets/icons/st/full_fluid.svg +1 -0
  147. package/dist/assets/icons/st/installed_equipment.svg +1 -0
  148. package/dist/assets/icons/st/unpin.svg +1 -0
  149. package/dist/assets/icons/st.ts +4 -0
  150. package/dist/components/Avatar/Avatar.d.ts +7 -2
  151. package/dist/components/Chip/Chip.d.ts +12 -10
  152. package/dist/components/DateField/DateField.d.ts +1 -0
  153. package/dist/index.js +34 -34
  154. package/dist/{toast-uADTqqrS.js → toast-BhV_Ask2.js} +2 -2
  155. package/dist/{toast-uADTqqrS.js.map → toast-BhV_Ask2.js.map} +1 -1
  156. package/dist/token/core/raw.js +85 -0
  157. package/dist/token/core/semantic-variables.scss +102 -0
  158. package/dist/token/core/semantic.js +357 -0
  159. package/dist/token/core/semantic.scss +51 -0
  160. package/dist/token.js +408 -0
  161. package/dist/token.js.map +1 -1
  162. package/package.json +3 -3
  163. package/dist/Avatar-B20IdOEO-Di14brYV.js.map +0 -1
  164. package/dist/Avatar-hNOToS9S.js.map +0 -1
  165. package/dist/Chip-BlLavyIK.js +0 -24
  166. package/dist/Chip-BlLavyIK.js.map +0 -1
  167. package/dist/Chip-_daV8CmM-CTke7zH4.js.map +0 -1
  168. package/dist/Menu-CAiyc2zk-rxU7H28t.js.map +0 -1
  169. package/dist/TextField-D_fqJf85-Bcd6rWv4.js.map +0 -1
  170. package/dist/Textarea-B0nZ9vOV.js.map +0 -1
  171. /package/dist/{Breadcrumbs-D_jgwoN3.css → Breadcrumbs-B5bqrZ5D.css} +0 -0
  172. /package/dist/{Calendar-CNrdcd3f.css → Calendar-DD5kmVd3.css} +0 -0
  173. /package/dist/{Menu-CAiyc2zk.css → Menu-TtVJnSrA.css} +0 -0
  174. /package/dist/{Popover-DvLcjLjG.css → Popover-CU2cGVD8.css} +0 -0
  175. /package/dist/{ProgressBar-BezETeA3.css → ProgressBar-BRvB-bD4.css} +0 -0
  176. /package/dist/{Radio-8E1l0DJa.css → Radio-DQ_VQFGZ.css} +0 -0
  177. /package/dist/{SelectCard-m61WUlo-.css → SelectCard-DUNwYa5y.css} +0 -0
  178. /package/dist/{SelectTriggerBase-DnRvuD3R.css → SelectTriggerBase-C0fhFfuj.css} +0 -0
@@ -1,14 +1,14 @@
1
1
  import { jsx, jsxs } from 'react/jsx-runtime';
2
2
  import { useState, useCallback, useRef, useLayoutEffect, useEffect, useMemo, forwardRef, useImperativeHandle } from 'react';
3
- import { D as DateTime, f as Calendar } from './Calendar-CNrdcd3f-BAKv-Gz3.js';
4
- import { T as TextField } from './TextField-D_fqJf85-Bcd6rWv4.js';
3
+ import { T as TextField } from './TextField-CRTh0gL_-D2CjcYXX.js';
5
4
  import { u as useMergeRefs$1 } from './floating-ui.react-BFNinq1w.js';
5
+ import { D as DateTime, f as Calendar } from './Calendar-DD5kmVd3-CBGTR11R.js';
6
6
  import { I as Icon } from './Icon-B6HmlQiR-BxQkO3X5.js';
7
7
  import { u as usePopoverCloseDelayWorkaround, S as SvgEvent } from './usePopoverCloseDelayWorkaround-BhhG-xEB-hfJZaXHC.js';
8
- import { d as Popover } from './Popover-DvLcjLjG-Yu5STx-v.js';
9
- import { u as useMergeRefs } from './useMergeRefs-Bde85AWI-Bde85AWI.js';
8
+ import { d as Popover } from './Popover-CU2cGVD8-FWJOuFRj.js';
10
9
  import { u as useOptionallyControlledState } from './useOptionallyControlledState-DAv5LXXh-DAv5LXXh.js';
11
- import { s as supportsPopover, u as useKeyboardFocusables } from './ProgressBar-BezETeA3-CeeedJ_w.js';
10
+ import { u as useMergeRefs } from './useMergeRefs-Bde85AWI-Bde85AWI.js';
11
+ import { s as supportsPopover, u as useKeyboardFocusables } from './ProgressBar-BRvB-bD4-DppwBrFg.js';
12
12
 
13
13
  function getContentEditableSelection(element) {
14
14
  const { anchorOffset = 0, focusOffset = 0 } = element.ownerDocument.getSelection() || {};
@@ -1911,8 +1911,12 @@ const MaskedDateInput = forwardRef(
1911
1911
  mode,
1912
1912
  removePlaceholder
1913
1913
  );
1914
+ const isValueDifferent = isInputValid !== currentParsedData.isInputValid || // The input has changed validity
1915
+ isInputEmpty !== currentParsedData.isInputEmpty || // The input has changed emptiness
1916
+ date === null !== (lastValidDate === null) || // The input has changed from empty to non-empty or vice versa
1917
+ date !== null && lastValidDate !== null && !date.equals(lastValidDate);
1918
+ if (!isValueDifferent) return;
1914
1919
  onChange?.({
1915
- event,
1916
1920
  date: date ?? lastValidDate ?? null,
1917
1921
  isInputValid,
1918
1922
  isInputEmpty
@@ -1984,6 +1988,206 @@ function orderSegmentsByMode(day, month, year, mode) {
1984
1988
  }
1985
1989
  }
1986
1990
 
1991
+ function containsRelatedTarget(event) {
1992
+ if (event.currentTarget instanceof HTMLElement && event.relatedTarget instanceof HTMLElement) {
1993
+ return event.currentTarget.contains(event.relatedTarget);
1994
+ }
1995
+ return false;
1996
+ }
1997
+ function useFocusWithin({
1998
+ onBlur,
1999
+ onFocus
2000
+ } = {}) {
2001
+ const [focused, setFocused] = useState(false);
2002
+ const focusedRef = useRef(false);
2003
+ const elementRef = useRef(null);
2004
+ const _setFocused = useCallback((value) => {
2005
+ setFocused(value);
2006
+ focusedRef.current = value;
2007
+ }, []);
2008
+ const handleFocusIn = useCallback(
2009
+ (event) => {
2010
+ if (!focusedRef.current) {
2011
+ _setFocused(true);
2012
+ onFocus?.(event);
2013
+ }
2014
+ },
2015
+ // eslint-disable-next-line react-hooks/exhaustive-deps
2016
+ [onFocus]
2017
+ );
2018
+ const handleFocusOut = useCallback(
2019
+ (event) => {
2020
+ if (focusedRef.current && !containsRelatedTarget(event)) {
2021
+ _setFocused(false);
2022
+ onBlur?.(event);
2023
+ }
2024
+ },
2025
+ // eslint-disable-next-line react-hooks/exhaustive-deps
2026
+ [onBlur]
2027
+ );
2028
+ useEffect(() => {
2029
+ const element = elementRef.current;
2030
+ if (!element) {
2031
+ return;
2032
+ }
2033
+ element.addEventListener("focusin", handleFocusIn);
2034
+ element.addEventListener("focusout", handleFocusOut);
2035
+ return () => {
2036
+ element.removeEventListener("focusin", handleFocusIn);
2037
+ element.removeEventListener("focusout", handleFocusOut);
2038
+ };
2039
+ }, [handleFocusIn, handleFocusOut]);
2040
+ return { ref: elementRef, focused };
2041
+ }
2042
+
2043
+ function convertStringToDate(v) {
2044
+ if (v === void 0 || v === null) {
2045
+ return v;
2046
+ }
2047
+ const date = DateTime.fromISO(v, { setZone: true, zone: "utc" }).startOf(
2048
+ "day"
2049
+ );
2050
+ if (date.isValid) {
2051
+ return date;
2052
+ }
2053
+ return null;
2054
+ }
2055
+ function validateDate({
2056
+ date,
2057
+ constraints
2058
+ }) {
2059
+ const { required, unavailable, minDate, maxDate } = constraints;
2060
+ if (!date) {
2061
+ return required ? false : true;
2062
+ }
2063
+ if (unavailable?.dates?.some((d) => d.equals(date))) {
2064
+ return false;
2065
+ }
2066
+ if (unavailable?.daysOfWeek?.includes(date.weekday)) {
2067
+ return false;
2068
+ }
2069
+ if (minDate && date < minDate) {
2070
+ return false;
2071
+ }
2072
+ if (maxDate && date > maxDate) {
2073
+ return false;
2074
+ }
2075
+ return true;
2076
+ }
2077
+ function validateYearlessDate({
2078
+ value,
2079
+ constraints
2080
+ }) {
2081
+ const { required, unavailable, minDate, maxDate } = constraints;
2082
+ if (!value || !value?.day && !value?.month) {
2083
+ return required ? false : true;
2084
+ }
2085
+ if (value.day === null || value.month === null) {
2086
+ return false;
2087
+ }
2088
+ if (unavailable?.dates?.some(
2089
+ (d) => d.day === value.day && d.month === value.month
2090
+ )) {
2091
+ return false;
2092
+ }
2093
+ const minDateMonth = minDate?.month ?? 1;
2094
+ const minDateDay = minDate?.day ?? 1;
2095
+ const maxDateMonth = maxDate?.month ?? 12;
2096
+ const maxDateDay = maxDate?.day ?? 31;
2097
+ if (value.month < minDateMonth || // Earlier month
2098
+ value.month === minDateMonth && value.day < minDateDay) {
2099
+ return false;
2100
+ }
2101
+ if (value.month > maxDateMonth || // Later month
2102
+ value.month === maxDateMonth && value.day > maxDateDay) {
2103
+ return false;
2104
+ }
2105
+ return true;
2106
+ }
2107
+
2108
+ function useDateFieldSingleConversion({
2109
+ value,
2110
+ defaultValue,
2111
+ minDate,
2112
+ maxDate,
2113
+ unavailable,
2114
+ onChange
2115
+ }) {
2116
+ const normalizedValue = useMemo(() => convertStringToDate(value), [value]);
2117
+ const normalizedDefaultValue = useMemo(
2118
+ () => convertStringToDate(defaultValue),
2119
+ [defaultValue]
2120
+ );
2121
+ const normalizedMinDate = useMemo(
2122
+ () => convertStringToDate(minDate),
2123
+ [minDate]
2124
+ );
2125
+ const normalizedMaxDate = useMemo(
2126
+ () => convertStringToDate(maxDate),
2127
+ [maxDate]
2128
+ );
2129
+ const normalizedUnavailableDates = useMemo(
2130
+ () => unavailable?.dates?.map((d) => convertStringToDate(d)).filter((d) => d !== null && d !== void 0),
2131
+ [unavailable?.dates]
2132
+ );
2133
+ const handleChange = useCallback(
2134
+ (change) => {
2135
+ onChange?.({
2136
+ ...change,
2137
+ date: change.date?.toISODate() ?? null
2138
+ });
2139
+ },
2140
+ [onChange]
2141
+ );
2142
+ return {
2143
+ value: normalizedValue,
2144
+ defaultValue: normalizedDefaultValue,
2145
+ minDate: normalizedMinDate,
2146
+ maxDate: normalizedMaxDate,
2147
+ unavailable: {
2148
+ dates: normalizedUnavailableDates,
2149
+ daysOfWeek: unavailable?.daysOfWeek
2150
+ },
2151
+ onChange: handleChange
2152
+ };
2153
+ }
2154
+
2155
+ function DateFieldSingleCalendar({
2156
+ onKeyDown,
2157
+ value,
2158
+ onSelection,
2159
+ minDate,
2160
+ maxDate,
2161
+ unavailable,
2162
+ ...rest
2163
+ }) {
2164
+ const handleCalendarSelection = (data) => {
2165
+ if (data.value) {
2166
+ const date = DateTime.fromISO(data.value, { zone: "utc" });
2167
+ onSelection(date);
2168
+ }
2169
+ };
2170
+ return /* @__PURE__ */ jsx(
2171
+ Calendar,
2172
+ {
2173
+ ...rest,
2174
+ range: false,
2175
+ onKeyDown,
2176
+ defaultFocusedDate: value?.toISODate() || DateTime.now().toISODate(),
2177
+ value: value?.toISODate() || void 0,
2178
+ onSelection: handleCalendarSelection,
2179
+ defaultTimeZone: "UTC",
2180
+ minDate: minDate?.toISODate() ?? void 0,
2181
+ maxDate: maxDate?.toISODate() ?? void 0,
2182
+ unavailable: unavailable ? {
2183
+ dates: unavailable.dates?.map((d) => d.toISODate() ?? ""),
2184
+ daysOfWeek: unavailable.daysOfWeek
2185
+ } : void 0,
2186
+ _disableAutofocus: true
2187
+ }
2188
+ );
2189
+ }
2190
+
1987
2191
  const useDateFieldOrchestration = ({
1988
2192
  inputRef,
1989
2193
  calendarDefaultOpen,
@@ -2070,360 +2274,172 @@ const useDateFieldOrchestration = ({
2070
2274
  };
2071
2275
  };
2072
2276
 
2073
- function convertStringToDate(v) {
2074
- if (v === void 0 || v === null) {
2075
- return v;
2076
- }
2077
- const date = DateTime.fromISO(v, { setZone: true, zone: "utc" }).startOf(
2078
- "day"
2079
- );
2080
- if (date.isValid) {
2081
- return date;
2082
- }
2083
- return null;
2084
- }
2085
- function validateDate({
2086
- date,
2087
- constraints
2088
- }) {
2089
- const { required, unavailable, minDate, maxDate } = constraints;
2090
- if (!date) {
2091
- return required ? false : true;
2092
- }
2093
- if (unavailable?.dates?.some((d) => d.equals(date))) {
2094
- return false;
2095
- }
2096
- if (unavailable?.daysOfWeek?.includes(date.weekday)) {
2097
- return false;
2098
- }
2099
- if (minDate && date < minDate) {
2100
- return false;
2101
- }
2102
- if (maxDate && date > maxDate) {
2103
- return false;
2104
- }
2105
- return true;
2106
- }
2107
- function validateYearlessDate({
2108
- value,
2109
- constraints
2277
+ function useDateFieldSingleState({
2278
+ valueProp,
2279
+ defaultValueProp,
2280
+ inputRef,
2281
+ onChange
2110
2282
  }) {
2111
- const { required, unavailable, minDate, maxDate } = constraints;
2112
- if (!value || !value?.day && !value?.month) {
2113
- return required ? false : true;
2114
- }
2115
- if (value.day === null || value.month === null) {
2116
- return false;
2117
- }
2118
- if (unavailable?.dates?.some(
2119
- (d) => d.day === value.day && d.month === value.month
2120
- )) {
2121
- return false;
2122
- }
2123
- const minDateMonth = minDate?.month ?? 1;
2124
- const minDateDay = minDate?.day ?? 1;
2125
- const maxDateMonth = maxDate?.month ?? 12;
2126
- const maxDateDay = maxDate?.day ?? 31;
2127
- if (value.month < minDateMonth || // Earlier month
2128
- value.month === minDateMonth && value.day < minDateDay) {
2129
- return false;
2130
- }
2131
- if (value.month > maxDateMonth || // Later month
2132
- value.month === maxDateMonth && value.day > maxDateDay) {
2133
- return false;
2134
- }
2135
- return true;
2283
+ const [value, setValue] = useOptionallyControlledState({
2284
+ controlledValue: valueProp,
2285
+ defaultValue: defaultValueProp
2286
+ });
2287
+ const setSharedValue = (date) => {
2288
+ inputRef.current?.setDate(date);
2289
+ setValue(date);
2290
+ };
2291
+ const handleInputChange = (change) => {
2292
+ const date = change.isInputEmpty ? null : change.date?.startOf("day") ?? null;
2293
+ onChange?.({
2294
+ date,
2295
+ isInputValid: change.isInputValid,
2296
+ isInputEmpty: change.isInputEmpty
2297
+ });
2298
+ if (change.isInputValid) {
2299
+ setSharedValue(change.isInputEmpty ? null : change.date);
2300
+ }
2301
+ if (change.isInputEmpty) {
2302
+ setSharedValue(null);
2303
+ return;
2304
+ }
2305
+ if (change.date) {
2306
+ setSharedValue(change.date);
2307
+ }
2308
+ };
2309
+ const handleCalendarSelection = (date) => {
2310
+ setSharedValue(date);
2311
+ onChange?.({
2312
+ date,
2313
+ isInputValid: true,
2314
+ isInputEmpty: false
2315
+ });
2316
+ };
2317
+ return {
2318
+ value,
2319
+ setValue: setSharedValue,
2320
+ handleInputChange,
2321
+ handleCalendarSelection
2322
+ };
2136
2323
  }
2137
2324
 
2138
- const NormalizedDateFieldSingle = forwardRef(
2139
- ({
2140
- value: valueProp,
2141
- mode = "mm/dd/yyyy",
2142
- defaultValue: defaultValueProp,
2143
- onChange,
2144
- disableCalendar = false,
2145
- unavailable,
2325
+ const DateFieldSingle = ({
2326
+ onFocus,
2327
+ onBlur,
2328
+ disableCalendar,
2329
+ required,
2330
+ mode,
2331
+ ...rest
2332
+ }) => {
2333
+ const inputRef = useRef(null);
2334
+ const {
2335
+ value: valueProp,
2336
+ defaultValue: defaultValueProp,
2146
2337
  minDate,
2147
2338
  maxDate,
2148
- onFocus,
2149
- onBlur,
2150
- required = false,
2151
- ...rest
2152
- }, ref) => {
2153
- const inputRef = useRef(null);
2154
- const [popoverTriggerRef, setPopoverTriggerRef] = useState();
2155
- const popoverContentRef = useRef(null);
2156
- const combinedRef = useMergeRefs([popoverTriggerRef, inputRef, ref]);
2157
- const {
2158
- calendarOpen,
2159
- setCalendarOpen,
2160
- handleCalendarKeyDown,
2161
- handleInputKeyDown
2162
- } = useDateFieldOrchestration({
2163
- inputRef,
2164
- calendarDefaultOpen: false,
2165
- popoverContentRef,
2166
- disableCalendar
2167
- });
2168
- const [lastValidDate, setLastValidDate] = useOptionallyControlledState({
2169
- controlledValue: valueProp,
2170
- defaultValue: defaultValueProp
2171
- });
2172
- const popoverSupported = usePopoverSupport();
2173
- const shouldShowCalendar = usePopoverCloseDelayWorkaround(calendarOpen);
2174
- const currentValidity = useMemo(
2175
- () => validateDate({
2176
- date: lastValidDate,
2339
+ unavailable,
2340
+ onChange
2341
+ } = useDateFieldSingleConversion(rest);
2342
+ const handleChange = (change) => {
2343
+ onChange?.({
2344
+ ...change,
2345
+ isDateValid: validateDate({
2346
+ date: change.date,
2177
2347
  constraints: {
2178
2348
  required,
2179
2349
  unavailable,
2180
2350
  minDate: minDate ?? void 0,
2181
2351
  maxDate: maxDate ?? void 0
2182
2352
  }
2183
- }),
2184
- [lastValidDate, required, unavailable, minDate, maxDate]
2185
- );
2186
- const handleInputChange = (change) => {
2187
- const date = change.isInputEmpty ? null : change.date?.startOf("day") ?? null;
2188
- onChange?.({
2189
- date: date?.toISODate() ?? null,
2190
- isInputValid: change.isInputValid,
2191
- isInputEmpty: change.isInputEmpty,
2192
- isDateValid: validateDate({
2193
- date,
2194
- constraints: {
2195
- required,
2196
- unavailable,
2197
- minDate: minDate ?? void 0,
2198
- maxDate: maxDate ?? void 0
2199
- }
2200
- })
2201
- });
2202
- if (change.isInputValid) {
2203
- setLastValidDate(change.isInputEmpty ? null : change.date);
2204
- }
2205
- if (change.isInputEmpty) {
2206
- setLastValidDate(null);
2207
- return;
2208
- }
2209
- if (change.date) {
2210
- setLastValidDate(change.date);
2211
- }
2212
- };
2213
- const handleCalendarSelection = (data) => {
2214
- if (data.value) {
2215
- const date = DateTime.fromISO(data.value, { zone: "utc" });
2216
- setLastValidDate(date);
2217
- inputRef.current?.setDate(date);
2218
- onChange?.({
2219
- date: date.toISODate(),
2220
- isInputValid: true,
2221
- isInputEmpty: false,
2222
- isDateValid: validateDate({
2223
- date,
2224
- constraints: {
2225
- required,
2226
- unavailable,
2227
- minDate: minDate ?? void 0,
2228
- maxDate: maxDate ?? void 0
2229
- }
2230
- })
2231
- });
2232
- }
2233
- };
2234
- const justTheField = /* @__PURE__ */ jsx(
2235
- MaskedDateInput,
2236
- {
2237
- mode,
2238
- ref: combinedRef,
2239
- ...rest,
2240
- onChange: handleInputChange,
2241
- onKeyDown: handleInputKeyDown,
2242
- onClick: () => setCalendarOpen(true),
2243
- lastValidDate,
2353
+ })
2354
+ });
2355
+ };
2356
+ const { value, handleInputChange, handleCalendarSelection } = useDateFieldSingleState({
2357
+ valueProp,
2358
+ defaultValueProp,
2359
+ inputRef,
2360
+ onChange: handleChange
2361
+ });
2362
+ const { ref: wrapperRef } = useFocusWithin({
2363
+ onBlur,
2364
+ onFocus
2365
+ });
2366
+ const [popoverTriggerRef, setPopoverTriggerRef] = useState();
2367
+ const popoverContentRef = useRef(null);
2368
+ const combinedRef = useMergeRefs([popoverTriggerRef, inputRef]);
2369
+ const {
2370
+ calendarOpen,
2371
+ setCalendarOpen,
2372
+ handleCalendarKeyDown,
2373
+ handleInputKeyDown
2374
+ } = useDateFieldOrchestration({
2375
+ inputRef,
2376
+ calendarDefaultOpen: false,
2377
+ popoverContentRef,
2378
+ disableCalendar
2379
+ });
2380
+ const popoverSupported = usePopoverSupport();
2381
+ const shouldShowCalendar = usePopoverCloseDelayWorkaround(calendarOpen);
2382
+ const currentValidity = useMemo(
2383
+ () => validateDate({
2384
+ date: value,
2385
+ constraints: {
2244
2386
  required,
2245
- autoComplete: "off",
2246
- "data-date-valid": currentValidity
2247
- }
2248
- );
2249
- if (disableCalendar) {
2250
- return justTheField;
2251
- }
2252
- if (!popoverSupported) {
2253
- return justTheField;
2254
- }
2255
- return /* @__PURE__ */ jsxs(
2256
- Popover,
2257
- {
2258
- open: calendarOpen,
2259
- modal: true,
2260
- placement: "bottom-start",
2261
- disableFlipFallback: true,
2262
- disableTriggerFocus: true,
2263
- onClose: () => setCalendarOpen(false),
2264
- disableAutoUpdate: true,
2265
- onClickOutside: () => setCalendarOpen(false),
2266
- children: [
2267
- /* @__PURE__ */ jsx(Popover.Trigger, { children: ({ ref: iRef }) => {
2268
- setPopoverTriggerRef(iRef);
2269
- return justTheField;
2270
- } }),
2271
- /* @__PURE__ */ jsx(Popover.Content, { ref: popoverContentRef, "data-testid": "calendar-popover", children: shouldShowCalendar && /* @__PURE__ */ jsx(
2272
- Calendar,
2273
- {
2274
- range: false,
2275
- onKeyDown: handleCalendarKeyDown,
2276
- defaultFocusedDate: lastValidDate?.toISODate() || DateTime.now().toISODate(),
2277
- value: lastValidDate?.toISODate() || void 0,
2278
- onSelection: handleCalendarSelection,
2279
- defaultTimeZone: "UTC",
2280
- minDate: minDate?.toISODate() ?? void 0,
2281
- maxDate: maxDate?.toISODate() ?? void 0,
2282
- unavailable: unavailable ? {
2283
- dates: unavailable.dates?.map((d) => d.toISODate() ?? ""),
2284
- daysOfWeek: unavailable.daysOfWeek
2285
- } : void 0,
2286
- _disableAutofocus: true
2287
- }
2288
- ) })
2289
- ]
2290
- }
2291
- );
2292
- }
2293
- );
2294
- NormalizedDateFieldSingle.displayName = "NormalizedDateFieldSingle";
2295
-
2296
- function containsRelatedTarget(event) {
2297
- if (event.currentTarget instanceof HTMLElement && event.relatedTarget instanceof HTMLElement) {
2298
- return event.currentTarget.contains(event.relatedTarget);
2299
- }
2300
- return false;
2301
- }
2302
- function useFocusWithin({
2303
- onBlur,
2304
- onFocus
2305
- } = {}) {
2306
- const [focused, setFocused] = useState(false);
2307
- const focusedRef = useRef(false);
2308
- const elementRef = useRef(null);
2309
- const _setFocused = useCallback((value) => {
2310
- setFocused(value);
2311
- focusedRef.current = value;
2312
- }, []);
2313
- const handleFocusIn = useCallback(
2314
- (event) => {
2315
- if (!focusedRef.current) {
2316
- _setFocused(true);
2317
- onFocus?.(event);
2318
- }
2319
- },
2320
- // eslint-disable-next-line react-hooks/exhaustive-deps
2321
- [onFocus]
2322
- );
2323
- const handleFocusOut = useCallback(
2324
- (event) => {
2325
- if (focusedRef.current && !containsRelatedTarget(event)) {
2326
- _setFocused(false);
2327
- onBlur?.(event);
2387
+ unavailable,
2388
+ minDate: minDate ?? void 0,
2389
+ maxDate: maxDate ?? void 0
2328
2390
  }
2329
- },
2330
- // eslint-disable-next-line react-hooks/exhaustive-deps
2331
- [onBlur]
2391
+ }),
2392
+ [value, required, unavailable, minDate, maxDate]
2332
2393
  );
2333
- useEffect(() => {
2334
- const element = elementRef.current;
2335
- if (!element) {
2336
- return;
2394
+ const justTheField = /* @__PURE__ */ jsx(
2395
+ MaskedDateInput,
2396
+ {
2397
+ mode,
2398
+ ref: combinedRef,
2399
+ ...rest,
2400
+ onChange: handleInputChange,
2401
+ onKeyDown: handleInputKeyDown,
2402
+ onClick: () => setCalendarOpen(true),
2403
+ lastValidDate: value,
2404
+ required,
2405
+ autoComplete: "off",
2406
+ "data-date-valid": currentValidity
2337
2407
  }
2338
- element.addEventListener("focusin", handleFocusIn);
2339
- element.addEventListener("focusout", handleFocusOut);
2340
- return () => {
2341
- element.removeEventListener("focusin", handleFocusIn);
2342
- element.removeEventListener("focusout", handleFocusOut);
2343
- };
2344
- }, [handleFocusIn, handleFocusOut]);
2345
- return { ref: elementRef, focused };
2346
- }
2347
-
2348
- const useConditionalChange = ({
2349
- changeHandler,
2350
- compareFn
2351
- }) => {
2352
- const lastChangeRef = useRef(null);
2353
- const onChange = useCallback(
2354
- (change) => {
2355
- if (!!lastChangeRef.current && !compareFn(lastChangeRef.current, change)) {
2356
- return;
2357
- }
2358
- changeHandler?.(change);
2359
- lastChangeRef.current = change;
2360
- },
2361
- [changeHandler, compareFn]
2362
- );
2363
- return onChange;
2364
- };
2365
-
2366
- const DateFieldSingle = ({
2367
- value,
2368
- defaultValue,
2369
- minDate,
2370
- maxDate,
2371
- unavailable,
2372
- onChange,
2373
- onFocus,
2374
- onBlur,
2375
- ...rest
2376
- }) => {
2377
- const handleBlur = useCallback(
2378
- (event) => {
2379
- onBlur?.(event);
2380
- },
2381
- [onBlur]
2382
- );
2383
- const handleFocus = useCallback(
2384
- (event) => {
2385
- onFocus?.(event);
2386
- },
2387
- [onFocus]
2388
- );
2389
- const { ref: wrapperRef } = useFocusWithin({
2390
- onBlur: handleBlur,
2391
- onFocus: handleFocus
2392
- });
2393
- const normalizedValue = useMemo(() => convertStringToDate(value), [value]);
2394
- const normalizedDefaultValue = useMemo(
2395
- () => convertStringToDate(defaultValue),
2396
- [defaultValue]
2397
- );
2398
- const normalizedMinDate = useMemo(
2399
- () => convertStringToDate(minDate),
2400
- [minDate]
2401
- );
2402
- const normalizedMaxDate = useMemo(
2403
- () => convertStringToDate(maxDate),
2404
- [maxDate]
2405
- );
2406
- const normalizedUnavailableDates = useMemo(
2407
- () => unavailable?.dates?.map((d) => convertStringToDate(d)).filter((d) => d !== null && d !== void 0),
2408
- [unavailable?.dates]
2409
2408
  );
2410
- const handleChange = useConditionalChange({
2411
- changeHandler: onChange,
2412
- compareFn: (a, b) => a.isInputValid !== b.isInputValid || a.isInputEmpty !== b.isInputEmpty || a.isDateValid !== b.isDateValid || a.date !== b.date
2413
- });
2414
- return /* @__PURE__ */ jsx("div", { ref: wrapperRef, children: /* @__PURE__ */ jsx(
2415
- NormalizedDateFieldSingle,
2409
+ if (disableCalendar) {
2410
+ return justTheField;
2411
+ }
2412
+ if (!popoverSupported) {
2413
+ return justTheField;
2414
+ }
2415
+ return /* @__PURE__ */ jsx("div", { ref: wrapperRef, children: /* @__PURE__ */ jsxs(
2416
+ Popover,
2416
2417
  {
2417
- ...rest,
2418
- onChange: handleChange,
2419
- value: normalizedValue,
2420
- defaultValue: normalizedDefaultValue,
2421
- minDate: normalizedMinDate,
2422
- maxDate: normalizedMaxDate,
2423
- unavailable: unavailable ? {
2424
- dates: normalizedUnavailableDates,
2425
- daysOfWeek: unavailable?.daysOfWeek
2426
- } : void 0
2418
+ open: calendarOpen,
2419
+ modal: true,
2420
+ placement: "bottom-start",
2421
+ disableFlipFallback: true,
2422
+ disableTriggerFocus: true,
2423
+ onClose: () => setCalendarOpen(false),
2424
+ disableAutoUpdate: true,
2425
+ onClickOutside: () => setCalendarOpen(false),
2426
+ children: [
2427
+ /* @__PURE__ */ jsx(Popover.Trigger, { children: ({ ref: iRef }) => {
2428
+ setPopoverTriggerRef(iRef);
2429
+ return justTheField;
2430
+ } }),
2431
+ /* @__PURE__ */ jsx(Popover.Content, { ref: popoverContentRef, "data-testid": "calendar-popover", children: shouldShowCalendar && /* @__PURE__ */ jsx(
2432
+ DateFieldSingleCalendar,
2433
+ {
2434
+ onKeyDown: handleCalendarKeyDown,
2435
+ value,
2436
+ onSelection: handleCalendarSelection,
2437
+ minDate,
2438
+ maxDate,
2439
+ unavailable
2440
+ }
2441
+ ) })
2442
+ ]
2427
2443
  }
2428
2444
  ) });
2429
2445
  };
@@ -2513,6 +2529,9 @@ const MaskedDateRangeInput = forwardRef(
2513
2529
  previousStartDate,
2514
2530
  previousEndDate
2515
2531
  ]);
2532
+ const currentParsedData = useMemo(() => {
2533
+ return parseRangeInputValue(inputValue, mode, removePlaceholder);
2534
+ }, [inputValue, mode, removePlaceholder]);
2516
2535
  const handleChange = (event) => {
2517
2536
  setInputValue(event.target.value);
2518
2537
  const {
@@ -2522,17 +2541,20 @@ const MaskedDateRangeInput = forwardRef(
2522
2541
  isInputEmpty,
2523
2542
  isHalfEmpty
2524
2543
  } = parseRangeInputValue(event.target.value, mode, removePlaceholder);
2544
+ const isValueDifferent = isInputValid !== currentParsedData.isInputValid || // The input has changed validity
2545
+ isInputEmpty !== currentParsedData.isInputEmpty || // The input has changed emptiness
2546
+ parsedStartDate === null !== (startDate === null) || // The start date has changed from empty to non-empty or vice versa
2547
+ parsedEndDate === null !== (endDate === null) || // The end date has changed from empty to non-empty or vice versa
2548
+ parsedStartDate !== null && startDate !== null && !parsedStartDate.equals(startDate) || // The start date has changed
2549
+ parsedEndDate !== null && endDate !== null && !parsedEndDate.equals(endDate);
2550
+ if (!isValueDifferent) return;
2525
2551
  onChange?.({
2526
- event,
2527
2552
  startDate: isInputEmpty ? null : parsedStartDate ?? startDate ?? null,
2528
2553
  endDate: isInputEmpty || isHalfEmpty ? null : parsedEndDate ?? endDate ?? null,
2529
2554
  isInputValid,
2530
2555
  isInputEmpty
2531
2556
  });
2532
2557
  };
2533
- const currentParsedData = useMemo(() => {
2534
- return parseRangeInputValue(inputValue, mode, removePlaceholder);
2535
- }, [inputValue, mode, removePlaceholder]);
2536
2558
  useImperativeHandle(ref, () => {
2537
2559
  const input = inputRef.current;
2538
2560
  if (!input) return null;
@@ -2623,202 +2645,299 @@ function swapMode$1(inputString, previousMode, mode) {
2623
2645
  return inputString;
2624
2646
  }
2625
2647
 
2626
- const NormalizedDateFieldRange = forwardRef(
2627
- ({
2628
- value: valueProp,
2629
- mode = "mm/dd/yyyy",
2630
- defaultValue: defaultValueProp,
2631
- onChange,
2632
- disableCalendar = false,
2633
- unavailable,
2634
- minDate,
2635
- maxDate,
2636
- required = false,
2637
- onFocus,
2638
- onBlur,
2639
- ...rest
2640
- }, ref) => {
2641
- const inputRef = useRef(null);
2642
- const [popoverTriggerRef, setPopoverTriggerRef] = useState();
2643
- const popoverContentRef = useRef(null);
2644
- const combinedRef = useMergeRefs([popoverTriggerRef, inputRef, ref]);
2645
- const [startDate, setStartDate] = useOptionallyControlledState({
2646
- controlledValue: valueProp !== void 0 ? valueProp?.startDate : void 0,
2647
- defaultValue: defaultValueProp !== void 0 ? defaultValueProp?.startDate : void 0
2648
- });
2649
- const [endDate, setEndDate] = useOptionallyControlledState(
2650
- {
2651
- controlledValue: valueProp !== void 0 ? valueProp?.endDate : void 0,
2652
- defaultValue: defaultValueProp !== void 0 ? defaultValueProp?.endDate : void 0
2653
- }
2654
- );
2655
- const previousStartDate = usePrevious(startDate);
2656
- const previousEndDate = usePrevious(endDate);
2657
- const popoverSupported = usePopoverSupport();
2658
- const {
2659
- calendarOpen,
2660
- setCalendarOpen,
2661
- handleCalendarKeyDown,
2662
- handleInputKeyDown
2663
- } = useDateFieldOrchestration({
2664
- inputRef,
2665
- calendarDefaultOpen: false,
2666
- popoverContentRef,
2667
- disableCalendar
2668
- });
2669
- const shouldShowCalendar = usePopoverCloseDelayWorkaround(calendarOpen);
2670
- const isDateRangeValid = useMemo(() => {
2671
- return validateDate({
2672
- date: startDate ?? null,
2673
- constraints: {
2674
- required,
2675
- unavailable,
2676
- minDate: minDate ?? void 0,
2677
- maxDate: maxDate ?? void 0
2678
- }
2679
- }) && validateDate({
2680
- date: endDate ?? null,
2681
- constraints: {
2682
- required,
2683
- unavailable,
2684
- minDate: minDate ?? void 0,
2685
- maxDate: maxDate ?? void 0
2686
- }
2687
- }) && (!startDate || !endDate || startDate <= endDate);
2688
- }, [required, unavailable, minDate, maxDate, startDate, endDate]);
2689
- const defaultFocusedDate = useMemo(() => {
2690
- if (!startDate && !endDate) return DateTime.now().toISODate();
2691
- if (!startDate) return endDate?.toISODate();
2692
- if (!endDate) return startDate?.toISODate();
2693
- if (endDate && !previousEndDate?.equals(endDate)) {
2694
- return endDate.toISODate();
2695
- } else if (startDate && !previousStartDate?.equals(startDate)) {
2696
- return startDate.toISODate();
2697
- }
2698
- if (endDate) return endDate.toISODate();
2699
- if (startDate) return startDate.toISODate();
2700
- return DateTime.now().toISODate();
2701
- }, [previousStartDate, previousEndDate, startDate, endDate]);
2702
- const handleInputChange = (change) => {
2703
- const sharedConstraints = {
2704
- unavailable,
2705
- minDate: minDate ?? void 0,
2706
- maxDate: maxDate ?? void 0
2707
- };
2708
- const range = change.isInputEmpty ? null : {
2709
- startDate: change.startDate?.startOf("day") ?? null,
2710
- endDate: change.endDate?.startOf("day") ?? null
2711
- };
2712
- setStartDate(range?.startDate ?? null);
2713
- setEndDate(range?.endDate ?? null);
2648
+ const useDateFieldRangeConversion = (props) => {
2649
+ const { value, defaultValue, minDate, maxDate, unavailable, onChange } = props;
2650
+ const normalizedValue = useMemo(() => {
2651
+ if (value === null || value === void 0) return value;
2652
+ return {
2653
+ startDate: convertStringToDate(value.startDate) ?? null,
2654
+ endDate: convertStringToDate(value.endDate) ?? null
2655
+ };
2656
+ }, [value]);
2657
+ const normalizedDefaultValue = useMemo(() => {
2658
+ if (defaultValue === null || defaultValue === void 0)
2659
+ return defaultValue;
2660
+ return {
2661
+ startDate: convertStringToDate(defaultValue.startDate) ?? null,
2662
+ endDate: convertStringToDate(defaultValue.endDate) ?? null
2663
+ };
2664
+ }, [defaultValue]);
2665
+ const normalizedMinDate = useMemo(
2666
+ () => convertStringToDate(minDate),
2667
+ [minDate]
2668
+ );
2669
+ const normalizedMaxDate = useMemo(
2670
+ () => convertStringToDate(maxDate),
2671
+ [maxDate]
2672
+ );
2673
+ const normalizedUnavailableDates = useMemo(() => {
2674
+ return unavailable?.dates?.map((date) => convertStringToDate(date)).filter((date) => date !== null && date !== void 0);
2675
+ }, [unavailable?.dates]);
2676
+ const handleChange = useCallback(
2677
+ (change) => {
2714
2678
  onChange?.({
2715
- startDate: range?.startDate?.toISODate() ?? null,
2716
- endDate: range?.endDate?.toISODate() ?? null,
2717
- isInputValid: change.isInputValid,
2718
- isInputEmpty: change.isInputEmpty,
2719
- isDateRangeValid: validateDateRange({
2720
- required,
2721
- startDate: range?.startDate ?? null,
2722
- endDate: range?.endDate ?? null,
2723
- startDateConstraints: sharedConstraints,
2724
- endDateConstraints: sharedConstraints
2725
- })
2679
+ ...change,
2680
+ startDate: change.startDate?.toISODate() ?? null,
2681
+ endDate: change.endDate?.toISODate() ?? null
2726
2682
  });
2683
+ },
2684
+ [onChange]
2685
+ );
2686
+ return {
2687
+ value: normalizedValue,
2688
+ defaultValue: normalizedDefaultValue,
2689
+ minDate: normalizedMinDate,
2690
+ maxDate: normalizedMaxDate,
2691
+ unavailable: {
2692
+ dates: normalizedUnavailableDates,
2693
+ daysOfWeek: unavailable?.daysOfWeek
2694
+ },
2695
+ onChange: handleChange
2696
+ };
2697
+ };
2698
+
2699
+ function useDateFieldRangeState({
2700
+ valueProp,
2701
+ defaultValueProp,
2702
+ inputRef,
2703
+ onChange
2704
+ }) {
2705
+ const [startDate, setStartDate] = useOptionallyControlledState({
2706
+ controlledValue: valueProp !== void 0 ? valueProp?.startDate : void 0,
2707
+ defaultValue: defaultValueProp !== void 0 ? defaultValueProp?.startDate : void 0
2708
+ });
2709
+ const [endDate, setEndDate] = useOptionallyControlledState({
2710
+ controlledValue: valueProp !== void 0 ? valueProp?.endDate : void 0,
2711
+ defaultValue: defaultValueProp !== void 0 ? defaultValueProp?.endDate : void 0
2712
+ });
2713
+ const setSharedValue = (value) => {
2714
+ inputRef.current?.setDateRange(value.startDate, value.endDate);
2715
+ setStartDate(value.startDate);
2716
+ setEndDate(value.endDate);
2717
+ };
2718
+ const handleInputChange = (change) => {
2719
+ const range = change.isInputEmpty ? null : {
2720
+ startDate: change.startDate?.startOf("day") ?? null,
2721
+ endDate: change.endDate?.startOf("day") ?? null
2727
2722
  };
2728
- const handleCalendarSelection = (data) => {
2729
- if (data.value) {
2730
- const calStartDate = data.value.start ? DateTime.fromISO(data.value.start, { zone: "utc" }) : null;
2731
- const calEndDate = data.value.end ? DateTime.fromISO(data.value.end, { zone: "utc" }) : null;
2732
- setStartDate(calStartDate);
2733
- setEndDate(calEndDate);
2734
- inputRef.current?.setDateRange(calStartDate, calEndDate);
2735
- const sharedConstraints = {
2736
- unavailable,
2737
- minDate: minDate ?? void 0,
2738
- maxDate: maxDate ?? void 0
2739
- };
2740
- onChange?.({
2741
- startDate: calStartDate?.toISODate() ?? null,
2742
- endDate: calEndDate?.toISODate() ?? null,
2743
- isInputValid: !!calStartDate && !!calEndDate,
2744
- isInputEmpty: !calStartDate && !calEndDate,
2745
- isDateRangeValid: validateDateRange({
2746
- required,
2747
- startDate: calStartDate,
2748
- endDate: calEndDate,
2749
- startDateConstraints: sharedConstraints,
2750
- endDateConstraints: sharedConstraints
2751
- })
2752
- });
2753
- }
2723
+ setStartDate(range?.startDate ?? null);
2724
+ setEndDate(range?.endDate ?? null);
2725
+ onChange?.({
2726
+ startDate: range?.startDate ?? null,
2727
+ endDate: range?.endDate ?? null,
2728
+ isInputValid: change.isInputValid,
2729
+ isInputEmpty: change.isInputEmpty
2730
+ });
2731
+ };
2732
+ const handleCalendarSelection = ({
2733
+ startDate: startDate2,
2734
+ endDate: endDate2
2735
+ }) => {
2736
+ setSharedValue({ startDate: startDate2, endDate: endDate2 });
2737
+ onChange?.({
2738
+ startDate: startDate2,
2739
+ endDate: endDate2,
2740
+ isInputValid: true,
2741
+ isInputEmpty: false
2742
+ });
2743
+ };
2744
+ return {
2745
+ startDate,
2746
+ endDate,
2747
+ setStartDate,
2748
+ setEndDate,
2749
+ handleInputChange,
2750
+ handleCalendarSelection
2751
+ };
2752
+ }
2753
+
2754
+ const DateFieldRangeCalendar = ({
2755
+ startDate,
2756
+ endDate,
2757
+ onKeyDown,
2758
+ onSelection,
2759
+ minDate,
2760
+ maxDate,
2761
+ unavailable
2762
+ }) => {
2763
+ const previousStartDate = usePrevious(startDate);
2764
+ const previousEndDate = usePrevious(endDate);
2765
+ const handleCalendarSelection = (data) => {
2766
+ if (!data.value) return;
2767
+ const calStartDate = data.value.start ? DateTime.fromISO(data.value.start, { zone: "utc" }) : null;
2768
+ const calEndDate = data.value.end ? DateTime.fromISO(data.value.end, { zone: "utc" }) : null;
2769
+ onSelection({
2770
+ startDate: calStartDate,
2771
+ endDate: calEndDate
2772
+ });
2773
+ };
2774
+ const defaultFocusedDate = useMemo(() => {
2775
+ if (!startDate && !endDate) return DateTime.now().toISODate();
2776
+ if (!startDate) return endDate?.toISODate();
2777
+ if (!endDate) return startDate?.toISODate();
2778
+ if (endDate && !previousEndDate?.equals(endDate)) {
2779
+ return endDate.toISODate();
2780
+ } else if (startDate && !previousStartDate?.equals(startDate)) {
2781
+ return startDate.toISODate();
2782
+ }
2783
+ if (endDate) return endDate.toISODate();
2784
+ if (startDate) return startDate.toISODate();
2785
+ return DateTime.now().toISODate();
2786
+ }, [previousStartDate, previousEndDate, startDate, endDate]);
2787
+ return /* @__PURE__ */ jsx(
2788
+ Calendar,
2789
+ {
2790
+ range: true,
2791
+ onKeyDown,
2792
+ defaultFocusedDate,
2793
+ value: {
2794
+ start: startDate?.toISODate() || void 0,
2795
+ end: endDate?.toISODate() || void 0
2796
+ },
2797
+ onSelection: handleCalendarSelection,
2798
+ defaultTimeZone: "UTC",
2799
+ minDate: minDate?.toISODate() ?? void 0,
2800
+ maxDate: maxDate?.toISODate() ?? void 0,
2801
+ unavailable: unavailable ? {
2802
+ dates: unavailable.dates?.map((d) => d.toISODate() ?? ""),
2803
+ daysOfWeek: unavailable.daysOfWeek
2804
+ } : void 0,
2805
+ _disableAutofocus: true
2806
+ },
2807
+ `${startDate?.toISODate()}-${endDate?.toISODate()}`
2808
+ );
2809
+ };
2810
+
2811
+ const DateFieldRange = ({
2812
+ onFocus,
2813
+ onBlur,
2814
+ disableCalendar,
2815
+ required,
2816
+ mode,
2817
+ ...rest
2818
+ }) => {
2819
+ const { ref: wrapperRef } = useFocusWithin({
2820
+ onBlur,
2821
+ onFocus
2822
+ });
2823
+ const { value, defaultValue, minDate, maxDate, unavailable, onChange } = useDateFieldRangeConversion(rest);
2824
+ const inputRef = useRef(null);
2825
+ const [popoverTriggerRef, setPopoverTriggerRef] = useState();
2826
+ const popoverContentRef = useRef(null);
2827
+ const combinedRef = useMergeRefs([popoverTriggerRef, inputRef]);
2828
+ const popoverSupported = usePopoverSupport();
2829
+ const handleChange = (change) => {
2830
+ const sharedConstraints = {
2831
+ unavailable,
2832
+ minDate: minDate ?? void 0,
2833
+ maxDate: maxDate ?? void 0
2754
2834
  };
2755
- const justTheField = /* @__PURE__ */ jsx(
2756
- MaskedDateRangeInput,
2757
- {
2758
- mode,
2759
- ref: combinedRef,
2760
- ...rest,
2761
- onChange: handleInputChange,
2762
- disableHint: rest.disableHint,
2763
- onKeyDown: handleInputKeyDown,
2764
- onClick: () => setCalendarOpen(true),
2835
+ onChange?.({
2836
+ startDate: change.startDate?.startOf("day") ?? null,
2837
+ endDate: change.endDate?.startOf("day") ?? null,
2838
+ isInputValid: change.isInputValid,
2839
+ isInputEmpty: change.isInputEmpty,
2840
+ isDateRangeValid: validateDateRange({
2765
2841
  required,
2766
- autoComplete: "off",
2767
- "data-date-range-valid": isDateRangeValid,
2768
- startDate: startDate ?? null,
2769
- endDate: endDate ?? null
2842
+ startDate: change.startDate?.startOf("day") ?? null,
2843
+ endDate: change.endDate?.startOf("day") ?? null,
2844
+ startDateConstraints: sharedConstraints,
2845
+ endDateConstraints: sharedConstraints
2846
+ })
2847
+ });
2848
+ };
2849
+ const { startDate, endDate, handleInputChange, handleCalendarSelection } = useDateFieldRangeState({
2850
+ valueProp: value,
2851
+ defaultValueProp: defaultValue,
2852
+ inputRef,
2853
+ onChange: handleChange
2854
+ });
2855
+ const {
2856
+ calendarOpen,
2857
+ setCalendarOpen,
2858
+ handleCalendarKeyDown,
2859
+ handleInputKeyDown
2860
+ } = useDateFieldOrchestration({
2861
+ inputRef,
2862
+ calendarDefaultOpen: false,
2863
+ popoverContentRef,
2864
+ disableCalendar
2865
+ });
2866
+ const shouldShowCalendar = usePopoverCloseDelayWorkaround(calendarOpen);
2867
+ const currentValidity = useMemo(() => {
2868
+ return validateDateRange({
2869
+ required,
2870
+ startDate,
2871
+ endDate,
2872
+ startDateConstraints: {
2873
+ unavailable,
2874
+ minDate: minDate ?? void 0,
2875
+ maxDate: maxDate ?? void 0
2876
+ },
2877
+ endDateConstraints: {
2878
+ unavailable,
2879
+ minDate: minDate ?? void 0,
2880
+ maxDate: maxDate ?? void 0
2770
2881
  }
2771
- );
2772
- if (disableCalendar) {
2773
- return justTheField;
2774
- }
2775
- if (!popoverSupported) {
2776
- return justTheField;
2882
+ });
2883
+ }, [required, startDate, endDate, minDate, maxDate, unavailable]);
2884
+ const { defaultValue: _, ...passthroughProps } = rest;
2885
+ const justTheField = /* @__PURE__ */ jsx(
2886
+ MaskedDateRangeInput,
2887
+ {
2888
+ mode,
2889
+ ref: combinedRef,
2890
+ ...passthroughProps,
2891
+ startDate: startDate ?? null,
2892
+ endDate: endDate ?? null,
2893
+ onChange: handleInputChange,
2894
+ disableHint: rest.disableHint,
2895
+ onKeyDown: handleInputKeyDown,
2896
+ onClick: () => setCalendarOpen(true),
2897
+ required,
2898
+ autoComplete: "off",
2899
+ "data-date-range-valid": currentValidity
2777
2900
  }
2778
- return /* @__PURE__ */ jsxs(
2779
- Popover,
2780
- {
2781
- open: calendarOpen,
2782
- modal: true,
2783
- placement: "bottom-start",
2784
- disableFlipFallback: true,
2785
- disableTriggerFocus: true,
2786
- onClose: () => setCalendarOpen(false),
2787
- disableAutoUpdate: true,
2788
- onOutsidePress: () => setCalendarOpen(false),
2789
- children: [
2790
- /* @__PURE__ */ jsx(Popover.Trigger, { children: ({ ref: iRef }) => {
2791
- setPopoverTriggerRef(iRef);
2792
- return justTheField;
2793
- } }),
2794
- /* @__PURE__ */ jsx(Popover.Content, { ref: popoverContentRef, "data-testid": "calendar-popover", children: shouldShowCalendar && /* @__PURE__ */ jsx(
2795
- Calendar,
2796
- {
2797
- range: true,
2798
- onKeyDown: handleCalendarKeyDown,
2799
- defaultFocusedDate,
2800
- value: {
2801
- start: startDate?.toISODate() || void 0,
2802
- end: endDate?.toISODate() || void 0
2803
- },
2804
- onSelection: handleCalendarSelection,
2805
- defaultTimeZone: "UTC",
2806
- minDate: minDate?.toISODate() ?? void 0,
2807
- maxDate: maxDate?.toISODate() ?? void 0,
2808
- unavailable: unavailable ? {
2809
- dates: unavailable.dates?.map((d) => d.toISODate() ?? ""),
2810
- daysOfWeek: unavailable.daysOfWeek
2811
- } : void 0,
2812
- _disableAutofocus: true
2813
- },
2814
- `${startDate?.toISODate()}-${endDate?.toISODate()}`
2815
- ) })
2816
- ]
2817
- }
2818
- );
2901
+ );
2902
+ if (disableCalendar) {
2903
+ return justTheField;
2819
2904
  }
2820
- );
2821
- NormalizedDateFieldRange.displayName = "NormalizedDateFieldRange";
2905
+ if (!popoverSupported) {
2906
+ return justTheField;
2907
+ }
2908
+ return /* @__PURE__ */ jsx("div", { ref: wrapperRef, children: /* @__PURE__ */ jsxs(
2909
+ Popover,
2910
+ {
2911
+ open: calendarOpen,
2912
+ modal: true,
2913
+ placement: "bottom-start",
2914
+ disableFlipFallback: true,
2915
+ disableTriggerFocus: true,
2916
+ onClose: () => setCalendarOpen(false),
2917
+ disableAutoUpdate: true,
2918
+ onOutsidePress: () => setCalendarOpen(false),
2919
+ children: [
2920
+ /* @__PURE__ */ jsx(Popover.Trigger, { children: ({ ref: iRef }) => {
2921
+ setPopoverTriggerRef(iRef);
2922
+ return justTheField;
2923
+ } }),
2924
+ /* @__PURE__ */ jsx(Popover.Content, { ref: popoverContentRef, "data-testid": "calendar-popover", children: shouldShowCalendar && /* @__PURE__ */ jsx(
2925
+ DateFieldRangeCalendar,
2926
+ {
2927
+ startDate,
2928
+ endDate,
2929
+ onKeyDown: handleCalendarKeyDown,
2930
+ onSelection: handleCalendarSelection,
2931
+ minDate,
2932
+ maxDate,
2933
+ unavailable
2934
+ }
2935
+ ) })
2936
+ ]
2937
+ }
2938
+ ) });
2939
+ };
2940
+ DateFieldRange.displayName = "DateFieldRange";
2822
2941
  function validateDateRange({
2823
2942
  required,
2824
2943
  startDate,
@@ -2836,81 +2955,6 @@ function validateDateRange({
2836
2955
  }) && (!startDate || !endDate || startDate <= endDate);
2837
2956
  }
2838
2957
 
2839
- const DateFieldRange = ({
2840
- value,
2841
- defaultValue,
2842
- minDate,
2843
- maxDate,
2844
- unavailable,
2845
- onChange,
2846
- onFocus,
2847
- onBlur,
2848
- ...rest
2849
- }) => {
2850
- const handleBlur = useCallback(
2851
- (event) => {
2852
- onBlur?.(event);
2853
- },
2854
- [onBlur]
2855
- );
2856
- const handleFocus = useCallback(
2857
- (event) => {
2858
- onFocus?.(event);
2859
- },
2860
- [onFocus]
2861
- );
2862
- const { ref: wrapperRef } = useFocusWithin({
2863
- onBlur: handleBlur,
2864
- onFocus: handleFocus
2865
- });
2866
- const normalizedValue = useMemo(
2867
- () => value !== void 0 ? {
2868
- startDate: convertStringToDate(value?.startDate ?? null) ?? null,
2869
- endDate: convertStringToDate(value?.endDate ?? null) ?? null
2870
- } : void 0,
2871
- [value]
2872
- );
2873
- const normalizedDefaultValue = useMemo(
2874
- () => defaultValue !== void 0 ? {
2875
- startDate: convertStringToDate(defaultValue?.startDate ?? null) ?? null,
2876
- endDate: convertStringToDate(defaultValue?.endDate ?? null) ?? null
2877
- } : void 0,
2878
- [defaultValue]
2879
- );
2880
- const normalizedMinDate = useMemo(
2881
- () => convertStringToDate(minDate),
2882
- [minDate]
2883
- );
2884
- const normalizedMaxDate = useMemo(
2885
- () => convertStringToDate(maxDate),
2886
- [maxDate]
2887
- );
2888
- const normalizedUnavailableDates = useMemo(
2889
- () => unavailable?.dates?.map((d) => convertStringToDate(d)).filter((d) => d !== null && d !== void 0),
2890
- [unavailable?.dates]
2891
- );
2892
- const handleChange = useConditionalChange({
2893
- changeHandler: onChange,
2894
- compareFn: (a, b) => a.isInputValid !== b.isInputValid || a.isInputEmpty !== b.isInputEmpty || a.isDateRangeValid !== b.isDateRangeValid || a.startDate !== b.startDate || a.endDate !== b.endDate
2895
- });
2896
- return /* @__PURE__ */ jsx("div", { ref: wrapperRef, children: /* @__PURE__ */ jsx(
2897
- NormalizedDateFieldRange,
2898
- {
2899
- ...rest,
2900
- value: normalizedValue,
2901
- defaultValue: normalizedDefaultValue,
2902
- minDate: normalizedMinDate,
2903
- maxDate: normalizedMaxDate,
2904
- unavailable: unavailable ? {
2905
- dates: normalizedUnavailableDates,
2906
- daysOfWeek: unavailable?.daysOfWeek
2907
- } : void 0,
2908
- onChange: handleChange
2909
- }
2910
- ) });
2911
- };
2912
- DateFieldRange.displayName = "DateFieldRange";
2913
-
2914
2958
  const yearlessDatePlaceholderMask = ({
2915
2959
  mode,
2916
2960
  separator = "/",
@@ -3060,6 +3104,24 @@ function stringifyYearlessDate(day, month, mode) {
3060
3104
  return `${mm}/${dd}`;
3061
3105
  }
3062
3106
 
3107
+ const useConditionalChange = ({
3108
+ changeHandler,
3109
+ compareFn
3110
+ }) => {
3111
+ const lastChangeRef = useRef(null);
3112
+ const onChange = useCallback(
3113
+ (change) => {
3114
+ if (!!lastChangeRef.current && !compareFn(lastChangeRef.current, change)) {
3115
+ return;
3116
+ }
3117
+ changeHandler?.(change);
3118
+ lastChangeRef.current = change;
3119
+ },
3120
+ [changeHandler, compareFn]
3121
+ );
3122
+ return onChange;
3123
+ };
3124
+
3063
3125
  const DateFieldYearless = ({
3064
3126
  value: valueProp,
3065
3127
  defaultValue: defaultValueProp,
@@ -3122,4 +3184,4 @@ const DateFieldYearless = ({
3122
3184
  DateFieldYearless.displayName = "DateFieldYearless";
3123
3185
 
3124
3186
  export { DateFieldRange as D, DateFieldSingle as a, DateFieldYearless as b };
3125
- //# sourceMappingURL=DateFieldYearless-CJP3H_Dg-BV5wGJp1.js.map
3187
+ //# sourceMappingURL=DateFieldYearless-M5KDI_hn-akXtkIZA.js.map