@servicetitan/anvil2 1.41.0 → 1.42.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (178) hide show
  1. package/CHANGELOG.md +41 -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-c4LX8hoE.js} +2 -2
  39. package/dist/{DateFieldRange-BTq6MrNu.js.map → DateFieldRange-c4LX8hoE.js.map} +1 -1
  40. package/dist/DateFieldRange.js +1 -1
  41. package/dist/{DateFieldSingle-CaeOLrI4.js → DateFieldSingle-WfPOm0qk.js} +2 -2
  42. package/dist/{DateFieldSingle-CaeOLrI4.js.map → DateFieldSingle-WfPOm0qk.js.map} +1 -1
  43. package/dist/DateFieldSingle.js +1 -1
  44. package/dist/{DateFieldYearless-CbFo3oyZ.js → DateFieldYearless-DC50l-ht.js} +2 -2
  45. package/dist/{DateFieldYearless-CbFo3oyZ.js.map → DateFieldYearless-DC50l-ht.js.map} +1 -1
  46. package/dist/{DateFieldYearless-CJP3H_Dg-BV5wGJp1.js → DateFieldYearless-DU0z2fEA-ByR2ixI5.js} +697 -610
  47. package/dist/{DateFieldYearless-CJP3H_Dg-BV5wGJp1.js.map → DateFieldYearless-DU0z2fEA-ByR2ixI5.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,185 @@ 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
+ value: valueProp,
2332
+ defaultValue: defaultValueProp,
2333
+ minDate: minDateProp,
2334
+ maxDate: maxDateProp,
2335
+ unavailable: unavailableProp,
2336
+ onChange: onChangeProp,
2337
+ ...rest
2338
+ }) => {
2339
+ const inputRef = useRef(null);
2340
+ const {
2341
+ value: normalizedValue,
2342
+ defaultValue: normalizedDefaultValue,
2146
2343
  minDate,
2147
2344
  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,
2345
+ unavailable,
2346
+ onChange
2347
+ } = useDateFieldSingleConversion({
2348
+ value: valueProp,
2349
+ defaultValue: defaultValueProp,
2350
+ onChange: onChangeProp,
2351
+ minDate: minDateProp,
2352
+ maxDate: maxDateProp,
2353
+ unavailable: unavailableProp
2354
+ });
2355
+ const handleChange = (change) => {
2356
+ onChange?.({
2357
+ ...change,
2358
+ isDateValid: validateDate({
2359
+ date: change.date,
2177
2360
  constraints: {
2178
2361
  required,
2179
2362
  unavailable,
2180
2363
  minDate: minDate ?? void 0,
2181
2364
  maxDate: maxDate ?? void 0
2182
2365
  }
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,
2366
+ })
2367
+ });
2368
+ };
2369
+ const { value, handleInputChange, handleCalendarSelection } = useDateFieldSingleState({
2370
+ valueProp: normalizedValue,
2371
+ defaultValueProp: normalizedDefaultValue,
2372
+ inputRef,
2373
+ onChange: handleChange
2374
+ });
2375
+ const { ref: wrapperRef } = useFocusWithin({
2376
+ onBlur,
2377
+ onFocus
2378
+ });
2379
+ const [popoverTriggerRef, setPopoverTriggerRef] = useState();
2380
+ const popoverContentRef = useRef(null);
2381
+ const combinedRef = useMergeRefs([popoverTriggerRef, inputRef]);
2382
+ const {
2383
+ calendarOpen,
2384
+ setCalendarOpen,
2385
+ handleCalendarKeyDown,
2386
+ handleInputKeyDown
2387
+ } = useDateFieldOrchestration({
2388
+ inputRef,
2389
+ calendarDefaultOpen: false,
2390
+ popoverContentRef,
2391
+ disableCalendar
2392
+ });
2393
+ const popoverSupported = usePopoverSupport();
2394
+ const shouldShowCalendar = usePopoverCloseDelayWorkaround(calendarOpen);
2395
+ const currentValidity = useMemo(
2396
+ () => validateDate({
2397
+ date: value,
2398
+ constraints: {
2244
2399
  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);
2400
+ unavailable,
2401
+ minDate: minDate ?? void 0,
2402
+ maxDate: maxDate ?? void 0
2328
2403
  }
2329
- },
2330
- // eslint-disable-next-line react-hooks/exhaustive-deps
2331
- [onBlur]
2404
+ }),
2405
+ [value, required, unavailable, minDate, maxDate]
2332
2406
  );
2333
- useEffect(() => {
2334
- const element = elementRef.current;
2335
- if (!element) {
2336
- return;
2407
+ const justTheField = /* @__PURE__ */ jsx(
2408
+ MaskedDateInput,
2409
+ {
2410
+ ...rest,
2411
+ mode,
2412
+ ref: combinedRef,
2413
+ onChange: handleInputChange,
2414
+ onKeyDown: handleInputKeyDown,
2415
+ onClick: () => setCalendarOpen(true),
2416
+ lastValidDate: value,
2417
+ required,
2418
+ autoComplete: "off",
2419
+ "data-date-valid": currentValidity
2337
2420
  }
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
2421
  );
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
- );
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,
2422
+ if (disableCalendar) {
2423
+ return justTheField;
2424
+ }
2425
+ if (!popoverSupported) {
2426
+ return justTheField;
2427
+ }
2428
+ return /* @__PURE__ */ jsx("div", { ref: wrapperRef, children: /* @__PURE__ */ jsxs(
2429
+ Popover,
2416
2430
  {
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
2431
+ open: calendarOpen,
2432
+ modal: true,
2433
+ placement: "bottom-start",
2434
+ disableFlipFallback: true,
2435
+ disableTriggerFocus: true,
2436
+ onClose: () => setCalendarOpen(false),
2437
+ disableAutoUpdate: true,
2438
+ onClickOutside: () => setCalendarOpen(false),
2439
+ children: [
2440
+ /* @__PURE__ */ jsx(Popover.Trigger, { children: ({ ref: iRef }) => {
2441
+ setPopoverTriggerRef(iRef);
2442
+ return justTheField;
2443
+ } }),
2444
+ /* @__PURE__ */ jsx(Popover.Content, { ref: popoverContentRef, "data-testid": "calendar-popover", children: shouldShowCalendar && /* @__PURE__ */ jsx(
2445
+ DateFieldSingleCalendar,
2446
+ {
2447
+ onKeyDown: handleCalendarKeyDown,
2448
+ value,
2449
+ onSelection: handleCalendarSelection,
2450
+ minDate,
2451
+ maxDate,
2452
+ unavailable
2453
+ }
2454
+ ) })
2455
+ ]
2427
2456
  }
2428
2457
  ) });
2429
2458
  };
@@ -2513,6 +2542,9 @@ const MaskedDateRangeInput = forwardRef(
2513
2542
  previousStartDate,
2514
2543
  previousEndDate
2515
2544
  ]);
2545
+ const currentParsedData = useMemo(() => {
2546
+ return parseRangeInputValue(inputValue, mode, removePlaceholder);
2547
+ }, [inputValue, mode, removePlaceholder]);
2516
2548
  const handleChange = (event) => {
2517
2549
  setInputValue(event.target.value);
2518
2550
  const {
@@ -2522,17 +2554,20 @@ const MaskedDateRangeInput = forwardRef(
2522
2554
  isInputEmpty,
2523
2555
  isHalfEmpty
2524
2556
  } = parseRangeInputValue(event.target.value, mode, removePlaceholder);
2557
+ const isValueDifferent = isInputValid !== currentParsedData.isInputValid || // The input has changed validity
2558
+ isInputEmpty !== currentParsedData.isInputEmpty || // The input has changed emptiness
2559
+ parsedStartDate === null !== (startDate === null) || // The start date has changed from empty to non-empty or vice versa
2560
+ parsedEndDate === null !== (endDate === null) || // The end date has changed from empty to non-empty or vice versa
2561
+ parsedStartDate !== null && startDate !== null && !parsedStartDate.equals(startDate) || // The start date has changed
2562
+ parsedEndDate !== null && endDate !== null && !parsedEndDate.equals(endDate);
2563
+ if (!isValueDifferent) return;
2525
2564
  onChange?.({
2526
- event,
2527
2565
  startDate: isInputEmpty ? null : parsedStartDate ?? startDate ?? null,
2528
2566
  endDate: isInputEmpty || isHalfEmpty ? null : parsedEndDate ?? endDate ?? null,
2529
2567
  isInputValid,
2530
2568
  isInputEmpty
2531
2569
  });
2532
2570
  };
2533
- const currentParsedData = useMemo(() => {
2534
- return parseRangeInputValue(inputValue, mode, removePlaceholder);
2535
- }, [inputValue, mode, removePlaceholder]);
2536
2571
  useImperativeHandle(ref, () => {
2537
2572
  const input = inputRef.current;
2538
2573
  if (!input) return null;
@@ -2623,202 +2658,311 @@ function swapMode$1(inputString, previousMode, mode) {
2623
2658
  return inputString;
2624
2659
  }
2625
2660
 
2626
- const NormalizedDateFieldRange = forwardRef(
2627
- ({
2661
+ const useDateFieldRangeConversion = (props) => {
2662
+ const { value, defaultValue, minDate, maxDate, unavailable, onChange } = props;
2663
+ const normalizedValue = useMemo(() => {
2664
+ if (value === null || value === void 0) return value;
2665
+ return {
2666
+ startDate: convertStringToDate(value.startDate) ?? null,
2667
+ endDate: convertStringToDate(value.endDate) ?? null
2668
+ };
2669
+ }, [value]);
2670
+ const normalizedDefaultValue = useMemo(() => {
2671
+ if (defaultValue === null || defaultValue === void 0)
2672
+ return defaultValue;
2673
+ return {
2674
+ startDate: convertStringToDate(defaultValue.startDate) ?? null,
2675
+ endDate: convertStringToDate(defaultValue.endDate) ?? null
2676
+ };
2677
+ }, [defaultValue]);
2678
+ const normalizedMinDate = useMemo(
2679
+ () => convertStringToDate(minDate),
2680
+ [minDate]
2681
+ );
2682
+ const normalizedMaxDate = useMemo(
2683
+ () => convertStringToDate(maxDate),
2684
+ [maxDate]
2685
+ );
2686
+ const normalizedUnavailableDates = useMemo(() => {
2687
+ return unavailable?.dates?.map((date) => convertStringToDate(date)).filter((date) => date !== null && date !== void 0);
2688
+ }, [unavailable?.dates]);
2689
+ const handleChange = useCallback(
2690
+ (change) => {
2691
+ onChange?.({
2692
+ ...change,
2693
+ startDate: change.startDate?.toISODate() ?? null,
2694
+ endDate: change.endDate?.toISODate() ?? null
2695
+ });
2696
+ },
2697
+ [onChange]
2698
+ );
2699
+ return {
2700
+ value: normalizedValue,
2701
+ defaultValue: normalizedDefaultValue,
2702
+ minDate: normalizedMinDate,
2703
+ maxDate: normalizedMaxDate,
2704
+ unavailable: {
2705
+ dates: normalizedUnavailableDates,
2706
+ daysOfWeek: unavailable?.daysOfWeek
2707
+ },
2708
+ onChange: handleChange
2709
+ };
2710
+ };
2711
+
2712
+ function useDateFieldRangeState({
2713
+ valueProp,
2714
+ defaultValueProp,
2715
+ inputRef,
2716
+ onChange
2717
+ }) {
2718
+ const [startDate, setStartDate] = useOptionallyControlledState({
2719
+ controlledValue: valueProp !== void 0 ? valueProp?.startDate : void 0,
2720
+ defaultValue: defaultValueProp !== void 0 ? defaultValueProp?.startDate : void 0
2721
+ });
2722
+ const [endDate, setEndDate] = useOptionallyControlledState({
2723
+ controlledValue: valueProp !== void 0 ? valueProp?.endDate : void 0,
2724
+ defaultValue: defaultValueProp !== void 0 ? defaultValueProp?.endDate : void 0
2725
+ });
2726
+ const setSharedValue = (value) => {
2727
+ inputRef.current?.setDateRange(value.startDate, value.endDate);
2728
+ setStartDate(value.startDate);
2729
+ setEndDate(value.endDate);
2730
+ };
2731
+ const handleInputChange = (change) => {
2732
+ const range = change.isInputEmpty ? null : {
2733
+ startDate: change.startDate?.startOf("day") ?? null,
2734
+ endDate: change.endDate?.startOf("day") ?? null
2735
+ };
2736
+ setStartDate(range?.startDate ?? null);
2737
+ setEndDate(range?.endDate ?? null);
2738
+ onChange?.({
2739
+ startDate: range?.startDate ?? null,
2740
+ endDate: range?.endDate ?? null,
2741
+ isInputValid: change.isInputValid,
2742
+ isInputEmpty: change.isInputEmpty
2743
+ });
2744
+ };
2745
+ const handleCalendarSelection = ({
2746
+ startDate: startDate2,
2747
+ endDate: endDate2
2748
+ }) => {
2749
+ setSharedValue({ startDate: startDate2, endDate: endDate2 });
2750
+ onChange?.({
2751
+ startDate: startDate2,
2752
+ endDate: endDate2,
2753
+ isInputValid: true,
2754
+ isInputEmpty: false
2755
+ });
2756
+ };
2757
+ return {
2758
+ startDate,
2759
+ endDate,
2760
+ setStartDate,
2761
+ setEndDate,
2762
+ handleInputChange,
2763
+ handleCalendarSelection
2764
+ };
2765
+ }
2766
+
2767
+ const DateFieldRangeCalendar = ({
2768
+ startDate,
2769
+ endDate,
2770
+ onKeyDown,
2771
+ onSelection,
2772
+ minDate,
2773
+ maxDate,
2774
+ unavailable
2775
+ }) => {
2776
+ const previousStartDate = usePrevious(startDate);
2777
+ const previousEndDate = usePrevious(endDate);
2778
+ const handleCalendarSelection = (data) => {
2779
+ if (!data.value) return;
2780
+ const calStartDate = data.value.start ? DateTime.fromISO(data.value.start, { zone: "utc" }) : null;
2781
+ const calEndDate = data.value.end ? DateTime.fromISO(data.value.end, { zone: "utc" }) : null;
2782
+ onSelection({
2783
+ startDate: calStartDate,
2784
+ endDate: calEndDate
2785
+ });
2786
+ };
2787
+ const defaultFocusedDate = useMemo(() => {
2788
+ if (!startDate && !endDate) return DateTime.now().toISODate();
2789
+ if (!startDate) return endDate?.toISODate();
2790
+ if (!endDate) return startDate?.toISODate();
2791
+ if (endDate && !previousEndDate?.equals(endDate)) {
2792
+ return endDate.toISODate();
2793
+ } else if (startDate && !previousStartDate?.equals(startDate)) {
2794
+ return startDate.toISODate();
2795
+ }
2796
+ if (endDate) return endDate.toISODate();
2797
+ if (startDate) return startDate.toISODate();
2798
+ return DateTime.now().toISODate();
2799
+ }, [previousStartDate, previousEndDate, startDate, endDate]);
2800
+ return /* @__PURE__ */ jsx(
2801
+ Calendar,
2802
+ {
2803
+ range: true,
2804
+ onKeyDown,
2805
+ defaultFocusedDate,
2806
+ value: {
2807
+ start: startDate?.toISODate() || void 0,
2808
+ end: endDate?.toISODate() || void 0
2809
+ },
2810
+ onSelection: handleCalendarSelection,
2811
+ defaultTimeZone: "UTC",
2812
+ minDate: minDate?.toISODate() ?? void 0,
2813
+ maxDate: maxDate?.toISODate() ?? void 0,
2814
+ unavailable: unavailable ? {
2815
+ dates: unavailable.dates?.map((d) => d.toISODate() ?? ""),
2816
+ daysOfWeek: unavailable.daysOfWeek
2817
+ } : void 0,
2818
+ _disableAutofocus: true
2819
+ },
2820
+ `${startDate?.toISODate()}-${endDate?.toISODate()}`
2821
+ );
2822
+ };
2823
+
2824
+ const DateFieldRange = ({
2825
+ onFocus,
2826
+ onBlur,
2827
+ disableCalendar,
2828
+ required,
2829
+ mode,
2830
+ value: valueProp,
2831
+ defaultValue: defaultValueProp,
2832
+ minDate: minDateProp,
2833
+ maxDate: maxDateProp,
2834
+ unavailable: unavailableProp,
2835
+ onChange: onChangeProp,
2836
+ ...rest
2837
+ }) => {
2838
+ const { ref: wrapperRef } = useFocusWithin({
2839
+ onBlur,
2840
+ onFocus
2841
+ });
2842
+ const { value, defaultValue, minDate, maxDate, unavailable, onChange } = useDateFieldRangeConversion({
2628
2843
  value: valueProp,
2629
- mode = "mm/dd/yyyy",
2630
2844
  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
2845
+ minDate: minDateProp,
2846
+ maxDate: maxDateProp,
2847
+ unavailable: unavailableProp,
2848
+ onChange: onChangeProp
2849
+ });
2850
+ const inputRef = useRef(null);
2851
+ const [popoverTriggerRef, setPopoverTriggerRef] = useState();
2852
+ const popoverContentRef = useRef(null);
2853
+ const combinedRef = useMergeRefs([popoverTriggerRef, inputRef]);
2854
+ const popoverSupported = usePopoverSupport();
2855
+ const handleChange = (change) => {
2856
+ const sharedConstraints = {
2857
+ unavailable,
2858
+ minDate: minDate ?? void 0,
2859
+ maxDate: maxDate ?? void 0
2860
+ };
2861
+ onChange?.({
2862
+ startDate: change.startDate?.startOf("day") ?? null,
2863
+ endDate: change.endDate?.startOf("day") ?? null,
2864
+ isInputValid: change.isInputValid,
2865
+ isInputEmpty: change.isInputEmpty,
2866
+ isDateRangeValid: validateDateRange({
2867
+ required,
2868
+ startDate: change.startDate?.startOf("day") ?? null,
2869
+ endDate: change.endDate?.startOf("day") ?? null,
2870
+ startDateConstraints: sharedConstraints,
2871
+ endDateConstraints: sharedConstraints
2872
+ })
2668
2873
  });
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 = {
2874
+ };
2875
+ const { startDate, endDate, handleInputChange, handleCalendarSelection } = useDateFieldRangeState({
2876
+ valueProp: value,
2877
+ defaultValueProp: defaultValue,
2878
+ inputRef,
2879
+ onChange: handleChange
2880
+ });
2881
+ const {
2882
+ calendarOpen,
2883
+ setCalendarOpen,
2884
+ handleCalendarKeyDown,
2885
+ handleInputKeyDown
2886
+ } = useDateFieldOrchestration({
2887
+ inputRef,
2888
+ calendarDefaultOpen: false,
2889
+ popoverContentRef,
2890
+ disableCalendar
2891
+ });
2892
+ const shouldShowCalendar = usePopoverCloseDelayWorkaround(calendarOpen);
2893
+ const currentValidity = useMemo(() => {
2894
+ return validateDateRange({
2895
+ required,
2896
+ startDate,
2897
+ endDate,
2898
+ startDateConstraints: {
2899
+ unavailable,
2900
+ minDate: minDate ?? void 0,
2901
+ maxDate: maxDate ?? void 0
2902
+ },
2903
+ endDateConstraints: {
2704
2904
  unavailable,
2705
2905
  minDate: minDate ?? void 0,
2706
2906
  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);
2714
- 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
- })
2726
- });
2727
- };
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
- }
2754
- };
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),
2765
- required,
2766
- autoComplete: "off",
2767
- "data-date-range-valid": isDateRangeValid,
2768
- startDate: startDate ?? null,
2769
- endDate: endDate ?? null
2770
2907
  }
2771
- );
2772
- if (disableCalendar) {
2773
- return justTheField;
2774
- }
2775
- if (!popoverSupported) {
2776
- return justTheField;
2908
+ });
2909
+ }, [required, startDate, endDate, minDate, maxDate, unavailable]);
2910
+ const justTheField = /* @__PURE__ */ jsx(
2911
+ MaskedDateRangeInput,
2912
+ {
2913
+ ...rest,
2914
+ mode,
2915
+ ref: combinedRef,
2916
+ startDate: startDate ?? null,
2917
+ endDate: endDate ?? null,
2918
+ onChange: handleInputChange,
2919
+ disableHint: rest.disableHint,
2920
+ onKeyDown: handleInputKeyDown,
2921
+ onClick: () => setCalendarOpen(true),
2922
+ required,
2923
+ autoComplete: "off",
2924
+ "data-date-range-valid": currentValidity
2777
2925
  }
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
- );
2926
+ );
2927
+ if (disableCalendar) {
2928
+ return justTheField;
2819
2929
  }
2820
- );
2821
- NormalizedDateFieldRange.displayName = "NormalizedDateFieldRange";
2930
+ if (!popoverSupported) {
2931
+ return justTheField;
2932
+ }
2933
+ return /* @__PURE__ */ jsx("div", { ref: wrapperRef, children: /* @__PURE__ */ jsxs(
2934
+ Popover,
2935
+ {
2936
+ open: calendarOpen,
2937
+ modal: true,
2938
+ placement: "bottom-start",
2939
+ disableFlipFallback: true,
2940
+ disableTriggerFocus: true,
2941
+ onClose: () => setCalendarOpen(false),
2942
+ disableAutoUpdate: true,
2943
+ onOutsidePress: () => setCalendarOpen(false),
2944
+ children: [
2945
+ /* @__PURE__ */ jsx(Popover.Trigger, { children: ({ ref: iRef }) => {
2946
+ setPopoverTriggerRef(iRef);
2947
+ return justTheField;
2948
+ } }),
2949
+ /* @__PURE__ */ jsx(Popover.Content, { ref: popoverContentRef, "data-testid": "calendar-popover", children: shouldShowCalendar && /* @__PURE__ */ jsx(
2950
+ DateFieldRangeCalendar,
2951
+ {
2952
+ startDate,
2953
+ endDate,
2954
+ onKeyDown: handleCalendarKeyDown,
2955
+ onSelection: handleCalendarSelection,
2956
+ minDate,
2957
+ maxDate,
2958
+ unavailable
2959
+ }
2960
+ ) })
2961
+ ]
2962
+ }
2963
+ ) });
2964
+ };
2965
+ DateFieldRange.displayName = "DateFieldRange";
2822
2966
  function validateDateRange({
2823
2967
  required,
2824
2968
  startDate,
@@ -2836,81 +2980,6 @@ function validateDateRange({
2836
2980
  }) && (!startDate || !endDate || startDate <= endDate);
2837
2981
  }
2838
2982
 
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
2983
  const yearlessDatePlaceholderMask = ({
2915
2984
  mode,
2916
2985
  separator = "/",
@@ -3060,6 +3129,24 @@ function stringifyYearlessDate(day, month, mode) {
3060
3129
  return `${mm}/${dd}`;
3061
3130
  }
3062
3131
 
3132
+ const useConditionalChange = ({
3133
+ changeHandler,
3134
+ compareFn
3135
+ }) => {
3136
+ const lastChangeRef = useRef(null);
3137
+ const onChange = useCallback(
3138
+ (change) => {
3139
+ if (!!lastChangeRef.current && !compareFn(lastChangeRef.current, change)) {
3140
+ return;
3141
+ }
3142
+ changeHandler?.(change);
3143
+ lastChangeRef.current = change;
3144
+ },
3145
+ [changeHandler, compareFn]
3146
+ );
3147
+ return onChange;
3148
+ };
3149
+
3063
3150
  const DateFieldYearless = ({
3064
3151
  value: valueProp,
3065
3152
  defaultValue: defaultValueProp,
@@ -3122,4 +3209,4 @@ const DateFieldYearless = ({
3122
3209
  DateFieldYearless.displayName = "DateFieldYearless";
3123
3210
 
3124
3211
  export { DateFieldRange as D, DateFieldSingle as a, DateFieldYearless as b };
3125
- //# sourceMappingURL=DateFieldYearless-CJP3H_Dg-BV5wGJp1.js.map
3212
+ //# sourceMappingURL=DateFieldYearless-DU0z2fEA-ByR2ixI5.js.map