react-day-picker 8.0.0-beta.32 → 8.0.0-beta.33

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 (241) hide show
  1. package/CHANGELOG.md +12 -3
  2. package/build/DayPicker.d.ts +3 -2
  3. package/build/DayPicker.js +6 -5
  4. package/build/DayPicker.js.map +1 -1
  5. package/build/components/Button/Button.d.ts +1 -1
  6. package/build/components/Button/Button.js +1 -1
  7. package/build/components/Button/Button.js.map +1 -1
  8. package/build/components/Caption/Caption.d.ts +7 -0
  9. package/build/components/Caption/Caption.js +8 -8
  10. package/build/components/Caption/Caption.js.map +1 -1
  11. package/build/components/CaptionLabel/CaptionLabel.js +1 -1
  12. package/build/components/CaptionLabel/CaptionLabel.js.map +1 -1
  13. package/build/components/Day/Day.js +1 -1
  14. package/build/components/Day/Day.js.map +1 -1
  15. package/build/components/Day/hooks/useDay.d.ts +2 -2
  16. package/build/components/Day/hooks/useDay.js +5 -5
  17. package/build/components/Day/hooks/useDay.js.map +1 -1
  18. package/build/components/Day/hooks/useDayFocus.d.ts +1 -1
  19. package/build/components/Day/hooks/useDayFocus.js +1 -1
  20. package/build/components/Day/hooks/useDayFocus.js.map +1 -1
  21. package/build/components/DayContent/DayContent.js +1 -1
  22. package/build/components/DayContent/DayContent.js.map +1 -1
  23. package/build/components/Dropdown/Dropdown.d.ts +1 -1
  24. package/build/components/Dropdown/Dropdown.js +1 -1
  25. package/build/components/Dropdown/Dropdown.js.map +1 -1
  26. package/build/components/Footer/Footer.js +1 -1
  27. package/build/components/Footer/Footer.js.map +1 -1
  28. package/build/components/Head/Head.js +1 -1
  29. package/build/components/Head/Head.js.map +1 -1
  30. package/build/components/IconDropdown/IconDropdown.d.ts +2 -2
  31. package/build/components/IconDropdown/IconDropdown.js +1 -1
  32. package/build/components/IconDropdown/IconDropdown.js.map +1 -1
  33. package/build/components/IconLeft/IconLeft.d.ts +2 -2
  34. package/build/components/IconLeft/IconLeft.js +3 -3
  35. package/build/components/IconLeft/IconLeft.js.map +1 -1
  36. package/build/components/IconRight/IconRight.d.ts +2 -2
  37. package/build/components/IconRight/IconRight.js +3 -3
  38. package/build/components/IconRight/IconRight.js.map +1 -1
  39. package/build/components/MonthsDropdown/MonthsDropdown.d.ts +1 -1
  40. package/build/components/MonthsDropdown/MonthsDropdown.js +1 -1
  41. package/build/components/MonthsDropdown/MonthsDropdown.js.map +1 -1
  42. package/build/components/Navigation/Navigation.d.ts +1 -1
  43. package/build/components/Navigation/Navigation.js +1 -1
  44. package/build/components/Navigation/Navigation.js.map +1 -1
  45. package/build/components/Root/Root.js +1 -2
  46. package/build/components/Root/Root.js.map +1 -1
  47. package/build/components/Row/Row.js +1 -1
  48. package/build/components/Row/Row.js.map +1 -1
  49. package/build/components/Table/Table.js +1 -1
  50. package/build/components/Table/Table.js.map +1 -1
  51. package/build/components/WeekNumber/WeekNumber.js +1 -1
  52. package/build/components/WeekNumber/WeekNumber.js.map +1 -1
  53. package/build/components/YearsDropdown/YearsDropdown.d.ts +1 -1
  54. package/build/components/YearsDropdown/YearsDropdown.js +1 -1
  55. package/build/components/YearsDropdown/YearsDropdown.js.map +1 -1
  56. package/build/contexts/DayPicker/DayPickerContext.d.ts +3 -2
  57. package/build/contexts/DayPicker/DayPickerContext.js +1 -1
  58. package/build/contexts/DayPicker/DayPickerContext.js.map +1 -1
  59. package/build/contexts/DayPicker/DayPickerProvider.d.ts +1 -1
  60. package/build/contexts/DayPicker/DayPickerProvider.js +1 -1
  61. package/build/contexts/DayPicker/DayPickerProvider.js.map +1 -1
  62. package/build/contexts/DayPicker/defaultClassNames.js +1 -3
  63. package/build/contexts/DayPicker/defaultClassNames.js.map +1 -1
  64. package/build/contexts/DayPicker/labels/labelDay.d.ts +2 -2
  65. package/build/contexts/DayPicker/labels/labelDay.js +1 -1
  66. package/build/contexts/DayPicker/labels/labelDay.js.map +1 -1
  67. package/build/contexts/DayPicker/labels/labelNext.d.ts +2 -2
  68. package/build/contexts/DayPicker/labels/labelNext.js.map +1 -1
  69. package/build/contexts/DayPicker/labels/labelPrevious.d.ts +2 -2
  70. package/build/contexts/DayPicker/labels/labelPrevious.js.map +1 -1
  71. package/build/contexts/DayPicker/labels/labelWeekNumber.d.ts +2 -2
  72. package/build/contexts/DayPicker/labels/labelWeekNumber.js.map +1 -1
  73. package/build/contexts/DayPicker/labels/labelWeekday.d.ts +2 -2
  74. package/build/contexts/DayPicker/labels/labelWeekday.js.map +1 -1
  75. package/build/contexts/DayPicker/useDayPicker.js +1 -1
  76. package/build/contexts/DayPicker/useDayPicker.js.map +1 -1
  77. package/build/contexts/DayPicker/utils/parseModifierProps.js +1 -0
  78. package/build/contexts/DayPicker/utils/parseModifierProps.js.map +1 -1
  79. package/build/contexts/Focus/FocusContext.d.ts +5 -1
  80. package/build/contexts/Focus/FocusContext.js +63 -3
  81. package/build/contexts/Focus/FocusContext.js.map +1 -1
  82. package/build/contexts/Focus/index.d.ts +0 -1
  83. package/build/contexts/Focus/useFocus.js +1 -1
  84. package/build/contexts/Focus/useFocus.js.map +1 -1
  85. package/build/contexts/Navigation/NavigationContext.d.ts +5 -1
  86. package/build/contexts/Navigation/NavigationContext.js +23 -3
  87. package/build/contexts/Navigation/NavigationContext.js.map +1 -1
  88. package/build/contexts/Navigation/index.d.ts +0 -1
  89. package/build/contexts/Navigation/useNavigation.js +1 -1
  90. package/build/contexts/Navigation/useNavigation.js.map +1 -1
  91. package/build/contexts/RootProvider.d.ts +8 -0
  92. package/build/contexts/{ContextProvider.js → RootProvider.js} +9 -14
  93. package/build/contexts/RootProvider.js.map +1 -0
  94. package/build/contexts/SelectMultiple/SelectMultipleContext.d.ts +14 -2
  95. package/build/contexts/SelectMultiple/SelectMultipleContext.js +73 -3
  96. package/build/contexts/SelectMultiple/SelectMultipleContext.js.map +1 -1
  97. package/build/contexts/SelectMultiple/index.d.ts +0 -1
  98. package/build/contexts/SelectMultiple/useSelectMultiple.js +1 -1
  99. package/build/contexts/SelectMultiple/useSelectMultiple.js.map +1 -1
  100. package/build/contexts/SelectRange/SelectRangeContext.d.ts +14 -3
  101. package/build/contexts/SelectRange/SelectRangeContext.js +114 -3
  102. package/build/contexts/SelectRange/SelectRangeContext.js.map +1 -1
  103. package/build/contexts/SelectRange/index.d.ts +0 -1
  104. package/build/contexts/SelectRange/useSelectRange.js +1 -1
  105. package/build/contexts/SelectRange/useSelectRange.js.map +1 -1
  106. package/build/contexts/SelectSingle/SelectSingleContext.d.ts +17 -3
  107. package/build/contexts/SelectSingle/SelectSingleContext.js +36 -3
  108. package/build/contexts/SelectSingle/SelectSingleContext.js.map +1 -1
  109. package/build/contexts/SelectSingle/index.d.ts +0 -1
  110. package/build/contexts/SelectSingle/useSelectSingle.js +1 -1
  111. package/build/contexts/SelectSingle/useSelectSingle.js.map +1 -1
  112. package/build/contexts/index.d.ts +1 -1
  113. package/build/hooks/useControlledValue/useControlledValue.js +2 -2
  114. package/build/hooks/useControlledValue/useControlledValue.js.map +1 -1
  115. package/build/hooks/useInput/useInput.d.ts +11 -32
  116. package/build/hooks/useInput/useInput.js +2 -4
  117. package/build/hooks/useInput/useInput.js.map +1 -1
  118. package/build/hooks/useModifiers/useModifiers.js +3 -5
  119. package/build/hooks/useModifiers/useModifiers.js.map +1 -1
  120. package/build/hooks/useModifiers/utils/isDateInRange.d.ts +1 -1
  121. package/build/hooks/useModifiers/utils/isDateInRange.js.map +1 -1
  122. package/build/hooks/useModifiers/utils/isMatch.d.ts +1 -1
  123. package/build/hooks/useModifiers/utils/isMatch.js +10 -8
  124. package/build/hooks/useModifiers/utils/isMatch.js.map +1 -1
  125. package/build/main.js +11 -22
  126. package/build/main.js.map +1 -1
  127. package/build/types/{DayPickerProps.d.ts → DayPicker.d.ts} +35 -16
  128. package/build/types/DayPickerCustom.d.ts +11 -0
  129. package/build/types/{isDayPickerCustom.js → DayPickerCustom.js} +1 -1
  130. package/build/types/DayPickerCustom.js.map +1 -0
  131. package/build/types/{DayPickerMultipleProps.d.ts → DayPickerMultiple.d.ts} +5 -5
  132. package/build/types/{isDayPickerMultiple.js → DayPickerMultiple.js} +1 -1
  133. package/build/types/DayPickerMultiple.js.map +1 -0
  134. package/build/types/{DayPickerRangeProps.d.ts → DayPickerRange.d.ts} +6 -6
  135. package/build/types/{isDayPickerRange.js → DayPickerRange.js} +1 -1
  136. package/build/types/DayPickerRange.js.map +1 -0
  137. package/build/types/DayPickerSingle.d.ts +14 -0
  138. package/build/types/{isDayPickerSingle.js → DayPickerSingle.js} +1 -1
  139. package/build/types/DayPickerSingle.js.map +1 -0
  140. package/build/types/EventHandlers.d.ts +51 -0
  141. package/build/types/Formatters.d.ts +10 -5
  142. package/build/types/Labels.d.ts +24 -12
  143. package/build/types/Matchers.d.ts +34 -0
  144. package/build/types/Matchers.js +27 -0
  145. package/build/types/Matchers.js.map +1 -0
  146. package/build/types/Modifiers.d.ts +15 -4
  147. package/build/types/Styles.d.ts +83 -2
  148. package/build/types/index.d.ts +7 -50
  149. package/dist/main.js +555 -589
  150. package/dist/main.js.map +1 -1
  151. package/package.json +3 -2
  152. package/build/contexts/ContextProvider.d.ts +0 -8
  153. package/build/contexts/ContextProvider.js.map +0 -1
  154. package/build/contexts/Focus/FocusProvider.d.ts +0 -5
  155. package/build/contexts/Focus/FocusProvider.js +0 -66
  156. package/build/contexts/Focus/FocusProvider.js.map +0 -1
  157. package/build/contexts/Navigation/NavigationProvider.d.ts +0 -5
  158. package/build/contexts/Navigation/NavigationProvider.js +0 -26
  159. package/build/contexts/Navigation/NavigationProvider.js.map +0 -1
  160. package/build/contexts/SelectMultiple/SelectMultipleProvider.d.ts +0 -9
  161. package/build/contexts/SelectMultiple/SelectMultipleProvider.js +0 -23
  162. package/build/contexts/SelectMultiple/SelectMultipleProvider.js.map +0 -1
  163. package/build/contexts/SelectMultiple/SelectMultipleProviderInternal.d.ts +0 -8
  164. package/build/contexts/SelectMultiple/SelectMultipleProviderInternal.js +0 -61
  165. package/build/contexts/SelectMultiple/SelectMultipleProviderInternal.js.map +0 -1
  166. package/build/contexts/SelectRange/SelectRangeProvider.d.ts +0 -9
  167. package/build/contexts/SelectRange/SelectRangeProvider.js +0 -26
  168. package/build/contexts/SelectRange/SelectRangeProvider.js.map +0 -1
  169. package/build/contexts/SelectRange/SelectRangeProviderInternal.d.ts +0 -8
  170. package/build/contexts/SelectRange/SelectRangeProviderInternal.js +0 -99
  171. package/build/contexts/SelectRange/SelectRangeProviderInternal.js.map +0 -1
  172. package/build/contexts/SelectSingle/SelectSingleProvider.d.ts +0 -9
  173. package/build/contexts/SelectSingle/SelectSingleProvider.js +0 -20
  174. package/build/contexts/SelectSingle/SelectSingleProvider.js.map +0 -1
  175. package/build/contexts/SelectSingle/SelectSingleProviderInternal.d.ts +0 -8
  176. package/build/contexts/SelectSingle/SelectSingleProviderInternal.js +0 -27
  177. package/build/contexts/SelectSingle/SelectSingleProviderInternal.js.map +0 -1
  178. package/build/types/CaptionLayout.d.ts +0 -7
  179. package/build/types/ClassNames.d.ts +0 -3
  180. package/build/types/Components.d.ts +0 -39
  181. package/build/types/CustomModifiers.d.ts +0 -4
  182. package/build/types/DateAfter.d.ts +0 -7
  183. package/build/types/DateBefore.d.ts +0 -7
  184. package/build/types/DateFormatter.d.ts +0 -6
  185. package/build/types/DateInterval.d.ts +0 -8
  186. package/build/types/DateRange.d.ts +0 -8
  187. package/build/types/DayClickEventHandler.d.ts +0 -6
  188. package/build/types/DayFocusEventHandler.d.ts +0 -6
  189. package/build/types/DayKeyboardEventHandler.d.ts +0 -6
  190. package/build/types/DayLabelFormatter.d.ts +0 -7
  191. package/build/types/DayMouseEventHandler.d.ts +0 -6
  192. package/build/types/DayOfWeekMatcher.d.ts +0 -7
  193. package/build/types/DayPickerCustomProps.d.ts +0 -11
  194. package/build/types/DayPickerSingleProps.d.ts +0 -14
  195. package/build/types/DayTouchEventHandler.d.ts +0 -6
  196. package/build/types/InternalModifier.d.ts +0 -2
  197. package/build/types/Matcher.d.ts +0 -10
  198. package/build/types/Modifier.d.ts +0 -5
  199. package/build/types/ModifierClassNames.d.ts +0 -5
  200. package/build/types/ModifierStatus.d.ts +0 -5
  201. package/build/types/ModifierStyles.d.ts +0 -4
  202. package/build/types/MonthChangeEventHandler.d.ts +0 -4
  203. package/build/types/NavButtonLabelFormatter.d.ts +0 -7
  204. package/build/types/SelectMultipleEventHandler.d.ts +0 -12
  205. package/build/types/SelectRangeEventHandler.d.ts +0 -10
  206. package/build/types/SelectSingleEventHandler.d.ts +0 -12
  207. package/build/types/StyledComponentProps.d.ts +0 -10
  208. package/build/types/StyledElement.d.ts +0 -76
  209. package/build/types/WeekNumberClickEventHandler.d.ts +0 -9
  210. package/build/types/WeekNumberFormatter.d.ts +0 -6
  211. package/build/types/WeekNumberLabelFormatter.d.ts +0 -5
  212. package/build/types/WeekdayLabelFormatter.d.ts +0 -4
  213. package/build/types/isArrayOfDates.d.ts +0 -2
  214. package/build/types/isArrayOfDates.js +0 -9
  215. package/build/types/isArrayOfDates.js.map +0 -1
  216. package/build/types/isDateAfterType.d.ts +0 -3
  217. package/build/types/isDateAfterType.js +0 -7
  218. package/build/types/isDateAfterType.js.map +0 -1
  219. package/build/types/isDateBeforeType.d.ts +0 -3
  220. package/build/types/isDateBeforeType.js +0 -7
  221. package/build/types/isDateBeforeType.js.map +0 -1
  222. package/build/types/isDateInterval.d.ts +0 -3
  223. package/build/types/isDateInterval.js +0 -10
  224. package/build/types/isDateInterval.js.map +0 -1
  225. package/build/types/isDateRange.d.ts +0 -3
  226. package/build/types/isDateRange.js +0 -8
  227. package/build/types/isDateRange.js.map +0 -1
  228. package/build/types/isDateType.d.ts +0 -2
  229. package/build/types/isDateType.js +0 -9
  230. package/build/types/isDateType.js.map +0 -1
  231. package/build/types/isDayOfWeekType.d.ts +0 -3
  232. package/build/types/isDayOfWeekType.js +0 -7
  233. package/build/types/isDayOfWeekType.js.map +0 -1
  234. package/build/types/isDayPickerCustom.d.ts +0 -4
  235. package/build/types/isDayPickerCustom.js.map +0 -1
  236. package/build/types/isDayPickerMultiple.d.ts +0 -4
  237. package/build/types/isDayPickerMultiple.js.map +0 -1
  238. package/build/types/isDayPickerRange.d.ts +0 -4
  239. package/build/types/isDayPickerRange.js.map +0 -1
  240. package/build/types/isDayPickerSingle.d.ts +0 -4
  241. package/build/types/isDayPickerSingle.js.map +0 -1
package/dist/main.js CHANGED
@@ -8,25 +8,6 @@ var enUS = require('date-fns/locale/en-US');
8
8
 
9
9
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
10
10
 
11
- function _interopNamespace(e) {
12
- if (e && e.__esModule) return e;
13
- var n = Object.create(null);
14
- if (e) {
15
- Object.keys(e).forEach(function (k) {
16
- if (k !== 'default') {
17
- var d = Object.getOwnPropertyDescriptor(e, k);
18
- Object.defineProperty(n, k, d.get ? d : {
19
- enumerable: true,
20
- get: function () { return e[k]; }
21
- });
22
- }
23
- });
24
- }
25
- n["default"] = e;
26
- return Object.freeze(n);
27
- }
28
-
29
- var React__namespace = /*#__PURE__*/_interopNamespace(React);
30
11
  var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
31
12
  var enUS__default = /*#__PURE__*/_interopDefaultLegacy(enUS);
32
13
 
@@ -86,7 +67,7 @@ function __spreadArray(to, from, pack) {
86
67
  * Access this context from the [[useDayPicker]] hook when using custom
87
68
  * components.
88
69
  */
89
- var DayPickerContext = React__namespace.createContext(undefined);
70
+ var DayPickerContext = React__default["default"].createContext(undefined);
90
71
 
91
72
  /**
92
73
  * Hook to access the [[DayPickerContext]].
@@ -95,7 +76,7 @@ var DayPickerContext = React__namespace.createContext(undefined);
95
76
  * [[DayPickerProvider]].
96
77
  * */
97
78
  function useDayPicker() {
98
- var context = React__namespace.useContext(DayPickerContext);
79
+ var context = React__default["default"].useContext(DayPickerContext);
99
80
  if (!context) {
100
81
  throw new Error("Context is not defined. useDayPicker must be used within a DayPickerProvider with a valid values.");
101
82
  }
@@ -174,10 +155,131 @@ function getWeeks(month, _a) {
174
155
  function Table(props) {
175
156
  var _a = useDayPicker(), locale = _a.locale, classNames = _a.classNames, styles = _a.styles, hideHead = _a.hideHead, fixedWeeks = _a.fixedWeeks, _b = _a.components, Head = _b.Head, Row = _b.Row, Footer = _b.Footer;
176
157
  var weeks = getWeeks(props.displayMonth, { locale: locale, fixedWeeks: fixedWeeks });
177
- return (React__namespace.createElement("table", { className: classNames.table, style: styles.table },
178
- !hideHead && React__namespace.createElement(Head, null),
179
- React__namespace.createElement("tbody", { className: classNames.tbody, style: styles.tbody }, weeks.map(function (week) { return (React__namespace.createElement(Row, { displayMonth: props.displayMonth, key: week.weekNumber, dates: week.dates, weekNumber: week.weekNumber })); })),
180
- React__namespace.createElement(Footer, null)));
158
+ return (React__default["default"].createElement("table", { className: classNames.table, style: styles.table },
159
+ !hideHead && React__default["default"].createElement(Head, null),
160
+ React__default["default"].createElement("tbody", { className: classNames.tbody, style: styles.tbody }, weeks.map(function (week) { return (React__default["default"].createElement(Row, { displayMonth: props.displayMonth, key: week.weekNumber, dates: week.dates, weekNumber: week.weekNumber })); })),
161
+ React__default["default"].createElement(Footer, null)));
162
+ }
163
+
164
+ /** Return the initial month according to the given options. */
165
+ function getInitialMonth(context) {
166
+ var month = context.month, defaultMonth = context.defaultMonth, today = context.today;
167
+ var initialMonth = month || defaultMonth || today || new Date();
168
+ var toDate = context.toDate, fromDate = context.fromDate, _a = context.numberOfMonths, numberOfMonths = _a === void 0 ? 1 : _a;
169
+ // Fix the initialMonth if is after the to-date
170
+ if (toDate && dateFns.differenceInCalendarMonths(toDate, initialMonth) < 0) {
171
+ var offset = -1 * (numberOfMonths - 1);
172
+ initialMonth = dateFns.addMonths(toDate, offset);
173
+ }
174
+ // Fix the initialMonth if is before the from-date
175
+ if (fromDate && dateFns.differenceInCalendarMonths(initialMonth, fromDate) < 0) {
176
+ initialMonth = fromDate;
177
+ }
178
+ return dateFns.startOfMonth(initialMonth);
179
+ }
180
+
181
+ /**
182
+ * Helper hook for using controlled/uncontrolled values from a component props.
183
+ *
184
+ * When the value is not controlled, pass `undefined` as `controlledValue` and
185
+ * use the returned setter to update it.
186
+ *
187
+ * When the value is controlled, pass the controlled value as second
188
+ * argument, which will be always returned as `value`.
189
+ */
190
+ function useControlledValue(defaultValue, controlledValue) {
191
+ var _a = React__default["default"].useState(defaultValue), uncontrolledValue = _a[0], setValue = _a[1];
192
+ var value = controlledValue === undefined ? uncontrolledValue : controlledValue;
193
+ return [value, setValue];
194
+ }
195
+
196
+ /** Controls the navigation state. */
197
+ function useNavigationState() {
198
+ var context = useDayPicker();
199
+ var initialMonth = getInitialMonth(context);
200
+ var _a = useControlledValue(initialMonth, context.month), month = _a[0], setMonth = _a[1];
201
+ var goToMonth = function (date) {
202
+ if (context.disableNavigation)
203
+ return;
204
+ setMonth(date);
205
+ };
206
+ return [month, goToMonth];
207
+ }
208
+
209
+ /**
210
+ * Return the months to display in the component according to the number of
211
+ * months and the from/to date.
212
+ */
213
+ function getDisplayMonths(month, _a) {
214
+ var reverseMonths = _a.reverseMonths, numberOfMonths = _a.numberOfMonths;
215
+ var start = dateFns.startOfMonth(month);
216
+ var end = dateFns.startOfMonth(dateFns.addMonths(start, numberOfMonths));
217
+ var monthsDiff = dateFns.differenceInCalendarMonths(end, start);
218
+ var months = [];
219
+ for (var i = 0; i < monthsDiff; i++) {
220
+ var nextMonth = dateFns.addMonths(start, i);
221
+ months.push(nextMonth);
222
+ }
223
+ if (reverseMonths)
224
+ months = months.reverse();
225
+ return months;
226
+ }
227
+
228
+ /**
229
+ * Returns the next month the user can navigate to according to the given
230
+ * options.
231
+ *
232
+ * Please note that the next month is not always the next calendar month:
233
+ *
234
+ * - if after the `toDate` range, is undefined;
235
+ * - if the navigation is paged, is the number of months displayed ahead.
236
+ *
237
+ */
238
+ function getNextMonth(startingMonth, options) {
239
+ if (options.disableNavigation) {
240
+ return undefined;
241
+ }
242
+ var toDate = options.toDate, pagedNavigation = options.pagedNavigation, _a = options.numberOfMonths, numberOfMonths = _a === void 0 ? 1 : _a;
243
+ var offset = pagedNavigation ? numberOfMonths : 1;
244
+ var month = dateFns.startOfMonth(startingMonth);
245
+ if (!toDate) {
246
+ return dateFns.addMonths(month, offset);
247
+ }
248
+ var monthsDiff = dateFns.differenceInCalendarMonths(toDate, startingMonth);
249
+ if (monthsDiff < numberOfMonths) {
250
+ return undefined;
251
+ }
252
+ // Jump forward as the number of months when paged navigation
253
+ return dateFns.addMonths(month, offset);
254
+ }
255
+
256
+ /**
257
+ * Returns the next previous the user can navigate to, according to the given
258
+ * options.
259
+ *
260
+ * Please note that the previous month is not always the previous calendar
261
+ * month:
262
+ *
263
+ * - if before the `fromDate` date, is `undefined`;
264
+ * - if the navigation is paged, is the number of months displayed before.
265
+ *
266
+ */
267
+ function getPreviousMonth(startingMonth, options) {
268
+ if (options.disableNavigation) {
269
+ return undefined;
270
+ }
271
+ var fromDate = options.fromDate, pagedNavigation = options.pagedNavigation, _a = options.numberOfMonths, numberOfMonths = _a === void 0 ? 1 : _a;
272
+ var offset = pagedNavigation ? numberOfMonths : 1;
273
+ var month = dateFns.startOfMonth(startingMonth);
274
+ if (!fromDate) {
275
+ return dateFns.addMonths(month, -offset);
276
+ }
277
+ var monthsDiff = dateFns.differenceInCalendarMonths(month, fromDate);
278
+ if (monthsDiff <= 0) {
279
+ return undefined;
280
+ }
281
+ // Jump back as the number of months when paged navigation
282
+ return dateFns.addMonths(month, -offset);
181
283
  }
182
284
 
183
285
  /**
@@ -185,11 +287,26 @@ function Table(props) {
185
287
  *
186
288
  * Access this context from the [[useNavigation]] hook.
187
289
  */
188
- var NavigationContext = React__namespace.createContext(undefined);
290
+ var NavigationContext = React__default["default"].createContext(undefined);
291
+ /** Provides the values for the [[NavigationContext]]. */
292
+ function NavigationProvider(props) {
293
+ var context = useDayPicker();
294
+ var _a = useNavigationState(), month = _a[0], goToMonth = _a[1];
295
+ var displayMonths = getDisplayMonths(month, context);
296
+ var nextMonth = getNextMonth(month, context);
297
+ var previousMonth = getPreviousMonth(month, context);
298
+ return (React__default["default"].createElement(NavigationContext.Provider, { value: {
299
+ month: month,
300
+ displayMonths: displayMonths,
301
+ goToMonth: goToMonth,
302
+ previousMonth: previousMonth,
303
+ nextMonth: nextMonth
304
+ } }, props.children));
305
+ }
189
306
 
190
307
  /** Hook to access the [[NavigationContext]]. */
191
308
  function useNavigation() {
192
- var context = React__namespace.useContext(NavigationContext);
309
+ var context = React__default["default"].useContext(NavigationContext);
193
310
  if (!context) {
194
311
  throw new Error('useNavigation must be used within a NavigationProvider');
195
312
  }
@@ -228,12 +345,12 @@ function Root() {
228
345
  className.push(classNames.caption_last);
229
346
  if (!isFirst && !isLast)
230
347
  className.push(classNames.caption_middle);
231
- return (React__namespace.createElement("div", { key: displayIndex, className: className.join(' '), style: style },
232
- React__namespace.createElement(Caption, { displayMonth: displayMonth }),
233
- React__namespace.createElement(Table, { displayMonth: displayMonth })));
348
+ return (React__default["default"].createElement("div", { key: displayIndex, className: className.join(' '), style: style },
349
+ React__default["default"].createElement(Caption, { displayMonth: displayMonth }),
350
+ React__default["default"].createElement(Table, { displayMonth: displayMonth })));
234
351
  };
235
- return (React__namespace.createElement("div", { className: rootClassNames.join(' '), style: __assign(__assign({}, styles.root), style), dir: dir },
236
- React__namespace.createElement("div", { className: classNames.months, style: styles.months }, displayMonths.map(renderMonth))));
352
+ return (React__default["default"].createElement("div", { className: rootClassNames.join(' '), style: __assign(__assign({}, styles.root), style), dir: dir },
353
+ React__default["default"].createElement("div", { className: classNames.months, style: styles.months }, displayMonths.map(renderMonth))));
237
354
  }
238
355
 
239
356
  /**
@@ -244,7 +361,7 @@ function MonthsDropdown(props) {
244
361
  var _a = useDayPicker(), fromDate = _a.fromDate, toDate = _a.toDate, styles = _a.styles, locale = _a.locale, formatMonthCaption = _a.formatters.formatMonthCaption, classNames = _a.classNames, Dropdown = _a.components.Dropdown, labelMonthDropdown = _a.labels.labelMonthDropdown;
245
362
  if (!fromDate && !toDate) {
246
363
  // TODO: use type guards
247
- return React__namespace.createElement(React__namespace.Fragment, null);
364
+ return React__default["default"].createElement(React__default["default"].Fragment, null);
248
365
  }
249
366
  var dropdownMonths = [];
250
367
  if (fromDate && toDate) {
@@ -266,13 +383,13 @@ function MonthsDropdown(props) {
266
383
  var newMonth = dateFns.setMonth(new Date(displayMonth), Number(e.target.value));
267
384
  props.onChange(newMonth);
268
385
  };
269
- return (React__namespace.createElement(Dropdown, { "aria-label": labelMonthDropdown(), className: classNames.dropdown_month, style: styles.dropdown_month, onChange: handleChange, value: displayMonth.getMonth(), caption: formatMonthCaption(displayMonth, { locale: locale }) }, dropdownMonths.map(function (m) { return (React__namespace.createElement("option", { key: m.getMonth(), value: m.getMonth() }, formatMonthCaption(m, { locale: locale }))); })));
386
+ return (React__default["default"].createElement(Dropdown, { "aria-label": labelMonthDropdown(), className: classNames.dropdown_month, style: styles.dropdown_month, onChange: handleChange, value: displayMonth.getMonth(), caption: formatMonthCaption(displayMonth, { locale: locale }) }, dropdownMonths.map(function (m) { return (React__default["default"].createElement("option", { key: m.getMonth(), value: m.getMonth() }, formatMonthCaption(m, { locale: locale }))); })));
270
387
  }
271
388
 
272
389
  /**
273
390
  * Render a button HTML element applying the reset class name.
274
391
  */
275
- var Button = React__namespace.forwardRef(function (props, ref) {
392
+ var Button = React__default["default"].forwardRef(function (props, ref) {
276
393
  var _a = useDayPicker(), classNames = _a.classNames, styles = _a.styles;
277
394
  var classNamesArr = [classNames.button_reset, classNames.button];
278
395
  if (props.className) {
@@ -283,7 +400,7 @@ var Button = React__namespace.forwardRef(function (props, ref) {
283
400
  if (props.style) {
284
401
  Object.assign(style, props.style);
285
402
  }
286
- return (React__namespace.createElement("button", __assign({}, props, { ref: ref, type: "button", className: className, style: style })));
403
+ return (React__default["default"].createElement("button", __assign({}, props, { ref: ref, type: "button", className: className, style: style })));
287
404
  });
288
405
 
289
406
  /** A component rendering the navigation buttons or the drop-downs. */
@@ -306,11 +423,11 @@ function Navigation(props) {
306
423
  classNames.nav_button_next
307
424
  ].join(' ');
308
425
  if (!nextMonth && !previousMonth) {
309
- return React__namespace.createElement(React__namespace.Fragment, null);
426
+ return React__default["default"].createElement(React__default["default"].Fragment, null);
310
427
  }
311
- return (React__namespace.createElement("div", { className: classNames.nav, style: styles.nav },
312
- !props.hidePrevious && (React__namespace.createElement(Button, { "aria-label": previousLabel, className: previousClassName, style: styles.nav_button_next, disabled: !previousMonth, onClick: dir === 'rtl' ? onNextClick : onPreviousClick }, dir === 'rtl' ? (React__namespace.createElement(IconRight, { className: classNames.nav_icon, style: styles.nav_icon })) : (React__namespace.createElement(IconLeft, { className: classNames.nav_icon, style: styles.nav_icon })))),
313
- !props.hideNext && (React__namespace.createElement(Button, { "aria-label": nextLabel, className: nextClassName, style: styles.nav_button_next, disabled: !nextMonth, onClick: dir === 'rtl' ? onPreviousClick : onNextClick }, dir === 'rtl' ? (React__namespace.createElement(IconLeft, { className: classNames.nav_icon, style: styles.nav_icon })) : (React__namespace.createElement(IconRight, { className: classNames.nav_icon, style: styles.nav_icon }))))));
428
+ return (React__default["default"].createElement("div", { className: classNames.nav, style: styles.nav },
429
+ !props.hidePrevious && (React__default["default"].createElement(Button, { "aria-label": previousLabel, className: previousClassName, style: styles.nav_button_next, disabled: !previousMonth, onClick: dir === 'rtl' ? onNextClick : onPreviousClick }, dir === 'rtl' ? (React__default["default"].createElement(IconRight, { className: classNames.nav_icon, style: styles.nav_icon })) : (React__default["default"].createElement(IconLeft, { className: classNames.nav_icon, style: styles.nav_icon })))),
430
+ !props.hideNext && (React__default["default"].createElement(Button, { "aria-label": nextLabel, className: nextClassName, style: styles.nav_button_next, disabled: !nextMonth, onClick: dir === 'rtl' ? onPreviousClick : onNextClick }, dir === 'rtl' ? (React__default["default"].createElement(IconLeft, { className: classNames.nav_icon, style: styles.nav_icon })) : (React__default["default"].createElement(IconRight, { className: classNames.nav_icon, style: styles.nav_icon }))))));
314
431
  }
315
432
 
316
433
  /**
@@ -332,7 +449,7 @@ function YearsDropdown(props) {
332
449
  var newMonth = dateFns.setYear(new Date(displayMonth), Number(e.target.value));
333
450
  props.onChange(newMonth);
334
451
  };
335
- return (React__namespace.createElement(Dropdown, { "aria-label": labelYearDropdown(), className: classNames.dropdown_month, style: styles.dropdown_month, onChange: handleChange, value: displayMonth.getFullYear(), caption: formatYearCaption(displayMonth, { locale: locale }) }, years.map(function (year) { return (React__namespace.createElement("option", { key: year.getFullYear(), value: year.getFullYear() }, formatYearCaption(year, { locale: locale }))); })));
452
+ return (React__default["default"].createElement(Dropdown, { "aria-label": labelYearDropdown(), className: classNames.dropdown_month, style: styles.dropdown_month, onChange: handleChange, value: displayMonth.getFullYear(), caption: formatYearCaption(displayMonth, { locale: locale }) }, years.map(function (year) { return (React__default["default"].createElement("option", { key: year.getFullYear(), value: year.getFullYear() }, formatYearCaption(year, { locale: locale }))); })));
336
453
  }
337
454
 
338
455
  /**
@@ -384,7 +501,7 @@ function Caption(props) {
384
501
  /** Render the caption for the displayed month. This component is used when `captionLayout="buttons"`. */
385
502
  function CaptionLabel(props) {
386
503
  var _a = useDayPicker(), locale = _a.locale, classNames = _a.classNames, styles = _a.styles, formatCaption = _a.formatters.formatCaption;
387
- return (React__namespace.createElement("div", { key: "caption", className: classNames.caption_label, style: styles.caption_label, "aria-live": "polite", "aria-atomic": "true" }, formatCaption(props.displayMonth, { locale: locale })));
504
+ return (React__default["default"].createElement("div", { key: "caption", className: classNames.caption_label, style: styles.caption_label, "aria-live": "polite", "aria-atomic": "true" }, formatCaption(props.displayMonth, { locale: locale })));
388
505
  }
389
506
 
390
507
  /** Returns true when the props are of type [[DayPickerMultiple]]. */
@@ -408,11 +525,78 @@ function isDayPickerSingle(props) {
408
525
  *
409
526
  * Access this context from the [[useSelectMultiple]] hook.
410
527
  */
411
- var SelectMultipleContext = React__namespace.createContext(undefined);
528
+ var SelectMultipleContext = React__default["default"].createContext(undefined);
529
+ /** Provides the values for the [[SelectMultipleContext]]. */
530
+ function SelectMultipleProvider(props) {
531
+ if (!isDayPickerMultiple(props.initialProps)) {
532
+ var emptyContextValue = {
533
+ selected: undefined,
534
+ modifiers: {
535
+ selected: [],
536
+ disabled: []
537
+ }
538
+ };
539
+ return (React__default["default"].createElement(SelectMultipleContext.Provider, { value: emptyContextValue }, props.children));
540
+ }
541
+ return (React__default["default"].createElement(SelectMultipleProviderInternal, { initialProps: props.initialProps, children: props.children }));
542
+ }
543
+ function SelectMultipleProviderInternal(_a) {
544
+ var initialProps = _a.initialProps, children = _a.children;
545
+ var selected = initialProps.selected;
546
+ var handleDayClick = function (day, modifiers, e) {
547
+ var _a, _b;
548
+ (_a = initialProps.onDayClick) === null || _a === void 0 ? void 0 : _a.call(initialProps, day, modifiers, e);
549
+ var isMinSelected = Boolean(initialProps.min &&
550
+ modifiers.selected &&
551
+ selected &&
552
+ selected.length === initialProps.min);
553
+ if (isMinSelected) {
554
+ return;
555
+ }
556
+ var isMaxSelected = Boolean(initialProps.max &&
557
+ !modifiers.selected &&
558
+ selected &&
559
+ selected.length === initialProps.max);
560
+ if (isMaxSelected) {
561
+ return;
562
+ }
563
+ var days = selected ? __spreadArray([], selected, true) : [];
564
+ if (modifiers.selected) {
565
+ var index = days.findIndex(function (selectedDay) {
566
+ return dateFns.isSameDay(day, selectedDay);
567
+ });
568
+ days.splice(index, 1);
569
+ }
570
+ else {
571
+ days.push(day);
572
+ }
573
+ (_b = initialProps.onSelect) === null || _b === void 0 ? void 0 : _b.call(initialProps, days, day, modifiers, e);
574
+ };
575
+ var modifiers = {
576
+ selected: [],
577
+ disabled: []
578
+ };
579
+ if (selected) {
580
+ modifiers.selected = selected;
581
+ modifiers.disabled = [
582
+ function disableDay(day) {
583
+ var isMaxSelected = initialProps.max &&
584
+ selected &&
585
+ selected.length > initialProps.max - 1;
586
+ var isSelected = selected === null || selected === void 0 ? void 0 : selected.some(function (selectedDay) {
587
+ return dateFns.isSameDay(selectedDay, day);
588
+ });
589
+ return Boolean(isMaxSelected && !isSelected);
590
+ }
591
+ ];
592
+ }
593
+ var contextValue = { selected: selected, handleDayClick: handleDayClick, modifiers: modifiers };
594
+ return (React__default["default"].createElement(SelectMultipleContext.Provider, { value: contextValue }, children));
595
+ }
412
596
 
413
597
  /** Hook to access the [[SelectMultipleContext]]. */
414
598
  function useSelectMultiple() {
415
- var context = React__namespace.useContext(SelectMultipleContext);
599
+ var context = React__default["default"].useContext(SelectMultipleContext);
416
600
  if (!context) {
417
601
  throw new Error('useSelectMultiple must be used within a SelectMultipleProvider');
418
602
  }
@@ -420,52 +604,212 @@ function useSelectMultiple() {
420
604
  }
421
605
 
422
606
  /**
423
- * The SelectRange context shares details about the selected days when in
424
- * range selection mode.
607
+ * Add a day to an existing range.
425
608
  *
426
- * Access this context from the [[useSelectRange]] hook.
609
+ * The returned range takes in account the `undefined` values and if the added
610
+ * day is already present in the range.
427
611
  */
428
- var SelectRangeContext = React__namespace.createContext(undefined);
429
-
430
- /** Hook to access the [[SelectRangeContext]]. */
431
- function useSelectRange() {
432
- var context = React__namespace.useContext(SelectRangeContext);
433
- if (!context) {
434
- throw new Error('useSelectRange must be used within a SelectRangeProvider');
612
+ function addToRange(day, range) {
613
+ var _a = range || {}, from = _a.from, to = _a.to;
614
+ if (!from) {
615
+ return { from: day, to: day };
435
616
  }
436
- return context;
617
+ if (!to && dateFns.isSameDay(from, day)) {
618
+ return undefined;
619
+ }
620
+ if (!to && dateFns.isBefore(day, from)) {
621
+ return { from: day, to: from };
622
+ }
623
+ if (!to) {
624
+ return { from: from, to: day };
625
+ }
626
+ if (dateFns.isSameDay(to, day) && dateFns.isSameDay(from, day)) {
627
+ return undefined;
628
+ }
629
+ if (dateFns.isSameDay(to, day)) {
630
+ return { from: to, to: to };
631
+ }
632
+ if (dateFns.isSameDay(from, day)) {
633
+ return undefined;
634
+ }
635
+ if (dateFns.isAfter(from, day)) {
636
+ return { from: day, to: to };
637
+ }
638
+ return { from: from, to: day };
437
639
  }
438
640
 
439
641
  /**
440
- * The SelectSingle context shares details about the selected days when in
441
- * single selection mode.
642
+ * The SelectRange context shares details about the selected days when in
643
+ * range selection mode.
442
644
  *
443
- * Access this context from the [[useSelectSingle]] hook.
645
+ * Access this context from the [[useSelectRange]] hook.
444
646
  */
445
- var SelectSingleContext = React__namespace.createContext(undefined);
446
-
447
- /** Hook to access the [[SelectSingleContext]]. */
448
- function useSelectSingle() {
449
- var context = React__namespace.useContext(SelectSingleContext);
450
- if (!context) {
451
- throw new Error('useSelectSingle must be used within a SelectSingleProvider');
452
- }
453
- return context;
454
- }
455
-
456
- /** Returns true if `value` is an array of valid dates. */
457
- function isArrayOfDates(value) {
458
- return Array.isArray(value) && value.every(dateFns.isDate);
459
- }
647
+ var SelectRangeContext = React__default["default"].createContext(undefined);
648
+ /** Provides the values for the [[SelectRangeProvider]]. */
649
+ function SelectRangeProvider(props) {
650
+ if (!isDayPickerRange(props.initialProps)) {
651
+ var emptyContextValue = {
652
+ selected: undefined,
653
+ modifiers: {
654
+ selected: [],
655
+ range_start: [],
656
+ range_end: [],
657
+ range_middle: [],
658
+ disabled: []
659
+ }
660
+ };
661
+ return (React__default["default"].createElement(SelectRangeContext.Provider, { value: emptyContextValue }, props.children));
662
+ }
663
+ return (React__default["default"].createElement(SelectRangeProviderInternal, { initialProps: props.initialProps, children: props.children }));
664
+ }
665
+ function SelectRangeProviderInternal(_a) {
666
+ var initialProps = _a.initialProps, children = _a.children;
667
+ var selected = initialProps.selected;
668
+ var min = initialProps.min;
669
+ var max = initialProps.max;
670
+ var handleDayClick = function (day, modifiers, e) {
671
+ var _a, _b;
672
+ (_a = initialProps.onDayClick) === null || _a === void 0 ? void 0 : _a.call(initialProps, day, modifiers, e);
673
+ var newValue = addToRange(day, selected);
674
+ if ((min || max) &&
675
+ selected &&
676
+ (newValue === null || newValue === void 0 ? void 0 : newValue.to) &&
677
+ newValue.from &&
678
+ newValue.from !== newValue.to) {
679
+ var diff = Math.abs(dateFns.differenceInCalendarDays(newValue === null || newValue === void 0 ? void 0 : newValue.to, newValue === null || newValue === void 0 ? void 0 : newValue.from));
680
+ if (min && diff < min) {
681
+ return;
682
+ }
683
+ if (max && diff >= max) {
684
+ return;
685
+ }
686
+ }
687
+ (_b = initialProps.onSelect) === null || _b === void 0 ? void 0 : _b.call(initialProps, newValue, day, modifiers, e);
688
+ };
689
+ var modifiers = {
690
+ selected: [],
691
+ range_start: [],
692
+ range_end: [],
693
+ range_middle: [],
694
+ disabled: []
695
+ };
696
+ if (selected) {
697
+ modifiers.selected = [selected];
698
+ if (selected.from) {
699
+ modifiers.range_start = [selected.from];
700
+ if (selected.to) {
701
+ modifiers.range_middle = [
702
+ {
703
+ after: selected.from,
704
+ before: selected.to
705
+ }
706
+ ];
707
+ if (max || min) {
708
+ modifiers.disabled = [
709
+ function (date) {
710
+ if (max &&
711
+ selected.to &&
712
+ selected.from &&
713
+ dateFns.isBefore(date, selected.from)) {
714
+ var diff = dateFns.differenceInCalendarDays(selected.to, date);
715
+ if (diff >= max) {
716
+ return true;
717
+ }
718
+ }
719
+ if (max &&
720
+ selected.to &&
721
+ selected.from &&
722
+ dateFns.isAfter(date, selected.to)) {
723
+ var diff = dateFns.differenceInCalendarDays(date, selected.from);
724
+ if (diff >= max) {
725
+ return true;
726
+ }
727
+ }
728
+ if (min && selected.from && dateFns.isBefore(date, selected.from)) {
729
+ var diff = dateFns.differenceInCalendarDays(selected.from, date);
730
+ if (diff < min) {
731
+ return true;
732
+ }
733
+ }
734
+ if (min &&
735
+ selected.to &&
736
+ selected.from &&
737
+ dateFns.isAfter(date, selected.to)) {
738
+ var diff = dateFns.differenceInCalendarDays(date, selected.from);
739
+ if (diff < min) {
740
+ return true;
741
+ }
742
+ }
743
+ return false;
744
+ }
745
+ ];
746
+ }
747
+ modifiers.range_end = [selected.to];
748
+ }
749
+ else {
750
+ modifiers.range_end = [selected.from];
751
+ }
752
+ }
753
+ }
754
+ return (React__default["default"].createElement(SelectRangeContext.Provider, { value: { selected: selected, handleDayClick: handleDayClick, modifiers: modifiers } }, children));
755
+ }
460
756
 
461
- /** Returns true if `value` is of type [[DateAfter]]. */
462
- function isDateAfterType(value) {
463
- return Boolean(value && typeof value === 'object' && 'after' in value);
757
+ /** Hook to access the [[SelectRangeContext]]. */
758
+ function useSelectRange() {
759
+ var context = React__default["default"].useContext(SelectRangeContext);
760
+ if (!context) {
761
+ throw new Error('useSelectRange must be used within a SelectRangeProvider');
762
+ }
763
+ return context;
464
764
  }
465
765
 
466
- /** Returns true if `value` is of type [[DateBefore]]. */
467
- function isDateBeforeType(value) {
468
- return Boolean(value && typeof value === 'object' && 'before' in value);
766
+ /**
767
+ * The SelectSingle context shares details about the selected days when in
768
+ * single selection mode.
769
+ *
770
+ * Access this context from the [[useSelectSingle]] hook.
771
+ */
772
+ var SelectSingleContext = React__default["default"].createContext(undefined);
773
+ /** Provides the values for the [[SelectSingleProvider]]. */
774
+ function SelectSingleProvider(props) {
775
+ if (!isDayPickerSingle(props.initialProps)) {
776
+ var emptyContextValue = {
777
+ selected: undefined,
778
+ modifiers: { selected: [] }
779
+ };
780
+ return (React__default["default"].createElement(SelectSingleContext.Provider, { value: emptyContextValue }, props.children));
781
+ }
782
+ return (React__default["default"].createElement(SelectSingleProviderInternal, { initialProps: props.initialProps, children: props.children }));
783
+ }
784
+ function SelectSingleProviderInternal(_a) {
785
+ var initialProps = _a.initialProps, children = _a.children;
786
+ var handleDayClick = function (day, dayModifiers, e) {
787
+ var _a, _b;
788
+ if (dayModifiers.selected && !initialProps.required) {
789
+ (_a = initialProps.onSelect) === null || _a === void 0 ? void 0 : _a.call(initialProps, undefined, day, dayModifiers, e);
790
+ return;
791
+ }
792
+ (_b = initialProps.onSelect) === null || _b === void 0 ? void 0 : _b.call(initialProps, day, day, dayModifiers, e);
793
+ };
794
+ var modifiers = { selected: [] };
795
+ if (initialProps.selected) {
796
+ modifiers.selected = [initialProps.selected];
797
+ }
798
+ var contextValue = {
799
+ selected: initialProps.selected,
800
+ handleDayClick: handleDayClick,
801
+ modifiers: modifiers
802
+ };
803
+ return (React__default["default"].createElement(SelectSingleContext.Provider, { value: contextValue }, children));
804
+ }
805
+
806
+ /** Hook to access the [[SelectSingleContext]]. */
807
+ function useSelectSingle() {
808
+ var context = React__default["default"].useContext(SelectSingleContext);
809
+ if (!context) {
810
+ throw new Error('useSelectSingle must be used within a SelectSingleProvider');
811
+ }
812
+ return context;
469
813
  }
470
814
 
471
815
  /** Returns true if `matcher` is of type [[DateInterval]]. */
@@ -474,19 +818,20 @@ function isDateInterval(matcher) {
474
818
  typeof matcher === 'object' &&
475
819
  'before' in matcher &&
476
820
  'after' in matcher);
477
- }
478
-
821
+ }
479
822
  /** Returns true if `value` is a [[DateRange]] type. */
480
823
  function isDateRange(value) {
481
824
  // TODO: Check if dates?!
482
825
  return Boolean(value && typeof value === 'object' && 'from' in value);
483
- }
484
-
485
- /** Returns true if `value` is a Date type. */
486
- function isDateType(value) {
487
- return dateFns.isDate(value);
488
- }
489
-
826
+ }
827
+ /** Returns true if `value` is of type [[DateAfter]]. */
828
+ function isDateAfterType(value) {
829
+ return Boolean(value && typeof value === 'object' && 'after' in value);
830
+ }
831
+ /** Returns true if `value` is of type [[DateBefore]]. */
832
+ function isDateBeforeType(value) {
833
+ return Boolean(value && typeof value === 'object' && 'before' in value);
834
+ }
490
835
  /** Returns true if `value` is a [[DayOfWeek]] type. */
491
836
  function isDayOfWeekType(value) {
492
837
  return Boolean(value && typeof value === 'object' && 'dayOfWeek' in value);
@@ -513,6 +858,14 @@ function isDateInRange(date, range) {
513
858
  dateFns.differenceInCalendarDays(to, date) >= 0);
514
859
  }
515
860
 
861
+ /** Returns true if `value` is a Date type. */
862
+ function isDateType(value) {
863
+ return dateFns.isDate(value);
864
+ }
865
+ /** Returns true if `value` is an array of valid dates. */
866
+ function isArrayOfDates(value) {
867
+ return Array.isArray(value) && value.every(dateFns.isDate);
868
+ }
516
869
  /**
517
870
  * Returns `true` whether the day matches against the given matchers.
518
871
  */
@@ -624,11 +977,67 @@ function useModifiers(date) {
624
977
  *
625
978
  * Access this context from the [[useFocus]] hook.
626
979
  */
627
- var FocusContext = React__namespace.createContext(undefined);
980
+ var FocusContext = React__default["default"].createContext(undefined);
981
+ /** The provider for the [[FocusContext]]. */
982
+ function FocusProvider(_a) {
983
+ var children = _a.children;
984
+ var _b = React__default["default"].useState(), focusedDay = _b[0], setDay = _b[1];
985
+ var _c = useNavigation(), goToMonth = _c.goToMonth, displayMonths = _c.displayMonths;
986
+ var numberOfMonths = useDayPicker().numberOfMonths;
987
+ var blur = function () { return setDay(undefined); };
988
+ var focus = function (date) { return setDay(date); };
989
+ var switchMonth = function (date, offset) {
990
+ if (displayMonths.some(function (m) { return dateFns.isSameMonth(date, m); }))
991
+ return;
992
+ if (offset < 0) {
993
+ goToMonth(dateFns.addMonths(date, 1 + offset));
994
+ }
995
+ else {
996
+ goToMonth(date);
997
+ }
998
+ };
999
+ var focusDayBefore = function () {
1000
+ if (!focusedDay)
1001
+ return;
1002
+ var before = dateFns.addDays(focusedDay, -1);
1003
+ setDay(before);
1004
+ switchMonth(before, numberOfMonths * -1);
1005
+ };
1006
+ var focusDayAfter = function () {
1007
+ if (!focusedDay)
1008
+ return;
1009
+ var after = dateFns.addDays(focusedDay, 1);
1010
+ setDay(after);
1011
+ switchMonth(after, numberOfMonths);
1012
+ };
1013
+ var focusWeekBeforeDay = function () {
1014
+ if (!focusedDay)
1015
+ return;
1016
+ var up = dateFns.addWeeks(focusedDay, -1);
1017
+ setDay(up);
1018
+ switchMonth(up, numberOfMonths * -1);
1019
+ };
1020
+ var focusWeekAfterDay = function () {
1021
+ if (!focusedDay)
1022
+ return;
1023
+ var down = dateFns.addWeeks(focusedDay, 1);
1024
+ setDay(down);
1025
+ switchMonth(down, numberOfMonths);
1026
+ };
1027
+ var setters = {
1028
+ blur: blur,
1029
+ focus: focus,
1030
+ focusDayAfter: focusDayAfter,
1031
+ focusDayBefore: focusDayBefore,
1032
+ focusWeekAfterDay: focusWeekAfterDay,
1033
+ focusWeekBeforeDay: focusWeekBeforeDay
1034
+ };
1035
+ return (React__default["default"].createElement(FocusContext.Provider, { value: [focusedDay, setters] }, children));
1036
+ }
628
1037
 
629
1038
  /** Hook to access the [[FocusContext]]. */
630
1039
  function useFocus() {
631
- var context = React__namespace.useContext(FocusContext);
1040
+ var context = React__default["default"].useContext(FocusContext);
632
1041
  if (!context) {
633
1042
  throw new Error('useFocus must be used within a FocusProvider');
634
1043
  }
@@ -640,7 +1049,7 @@ function useDayFocus(date, buttonRef) {
640
1049
  var _a = useFocus(), focusedDay = _a[0], _b = _a[1], focusDayAfter = _b.focusDayAfter, focusDayBefore = _b.focusDayBefore, focusWeekAfterDay = _b.focusWeekAfterDay, focusWeekBeforeDay = _b.focusWeekBeforeDay, blur = _b.blur, focus = _b.focus;
641
1050
  var dir = useDayPicker().dir;
642
1051
  // Focus the HTML element if this is the focused day.
643
- React__namespace.useEffect(function () {
1052
+ React__default["default"].useEffect(function () {
644
1053
  var _a;
645
1054
  if (!focusedDay)
646
1055
  return;
@@ -838,16 +1247,16 @@ buttonRef) {
838
1247
  * modifiers.
839
1248
  */
840
1249
  function Day(props) {
841
- var buttonRef = React__namespace.useRef(null);
1250
+ var buttonRef = React__default["default"].useRef(null);
842
1251
  var day = useDay(props.date, props.displayMonth, buttonRef);
843
1252
  var buttonProps = day.buttonProps, nonInteractiveProps = day.nonInteractiveProps;
844
1253
  if (!buttonProps && !nonInteractiveProps) {
845
- return React__namespace.createElement(React__namespace.Fragment, null);
1254
+ return React__default["default"].createElement(React__default["default"].Fragment, null);
846
1255
  }
847
1256
  if (nonInteractiveProps) {
848
- return React__namespace.createElement("div", __assign({}, nonInteractiveProps));
1257
+ return React__default["default"].createElement("div", __assign({}, nonInteractiveProps));
849
1258
  }
850
- return React__namespace.createElement(Button, __assign({ ref: buttonRef }, buttonProps));
1259
+ return React__default["default"].createElement(Button, __assign({ ref: buttonRef }, buttonProps));
851
1260
  }
852
1261
 
853
1262
  /**
@@ -894,6 +1303,7 @@ function parseModifierProps(initialProps) {
894
1303
  selected: [],
895
1304
  disabled: [],
896
1305
  hidden: [],
1306
+ today: [],
897
1307
  range_end: [],
898
1308
  range_middle: [],
899
1309
  range_start: []
@@ -931,9 +1341,9 @@ function parseModifierProps(initialProps) {
931
1341
  */
932
1342
  function DayContent(props) {
933
1343
  var _a = useDayPicker(), locale = _a.locale, classNames = _a.classNames, styles = _a.styles, labelDay = _a.labels.labelDay, formatDay = _a.formatters.formatDay;
934
- return (React__namespace.createElement(React__namespace.Fragment, null,
935
- React__namespace.createElement("span", { "aria-hidden": "true" }, formatDay(props.date, { locale: locale })),
936
- React__namespace.createElement("span", { className: classNames.vhidden, style: styles.vhidden }, labelDay(props.date, props.modifiers, { locale: locale }))));
1344
+ return (React__default["default"].createElement(React__default["default"].Fragment, null,
1345
+ React__default["default"].createElement("span", { "aria-hidden": "true" }, formatDay(props.date, { locale: locale })),
1346
+ React__default["default"].createElement("span", { className: classNames.vhidden, style: styles.vhidden }, labelDay(props.date, props.modifiers, { locale: locale }))));
937
1347
  }
938
1348
 
939
1349
  /**
@@ -943,22 +1353,22 @@ function DayContent(props) {
943
1353
  function Dropdown(props) {
944
1354
  var onChange = props.onChange, value = props.value, children = props.children, caption = props.caption, className = props.className, style = props.style;
945
1355
  var _a = useDayPicker(), classNames = _a.classNames, styles = _a.styles, IconDropdown = _a.components.IconDropdown;
946
- return (React__namespace.createElement("div", { className: className, style: style },
947
- React__namespace.createElement("span", { className: classNames.vhidden }, props['aria-label']),
948
- React__namespace.createElement("select", { "aria-label": props['aria-label'], className: classNames.dropdown, style: styles.dropdown, value: value, onChange: onChange }, children),
949
- React__namespace.createElement("div", { className: classNames.caption_label, style: styles.caption_label, "aria-hidden": "true" },
1356
+ return (React__default["default"].createElement("div", { className: className, style: style },
1357
+ React__default["default"].createElement("span", { className: classNames.vhidden }, props['aria-label']),
1358
+ React__default["default"].createElement("select", { "aria-label": props['aria-label'], className: classNames.dropdown, style: styles.dropdown, value: value, onChange: onChange }, children),
1359
+ React__default["default"].createElement("div", { className: classNames.caption_label, style: styles.caption_label, "aria-hidden": "true" },
950
1360
  caption,
951
- React__namespace.createElement(IconDropdown, { className: classNames.dropdown_icon, style: styles.dropdown_icon }))));
1361
+ React__default["default"].createElement(IconDropdown, { className: classNames.dropdown_icon, style: styles.dropdown_icon }))));
952
1362
  }
953
1363
 
954
1364
  /** Render the Footer component (empty as default).*/
955
1365
  function Footer() {
956
1366
  var _a = useDayPicker(), footer = _a.footer, styles = _a.styles, tfoot = _a.classNames.tfoot;
957
1367
  if (!footer)
958
- return React__namespace.createElement(React__namespace.Fragment, null);
959
- return (React__namespace.createElement("tfoot", { className: tfoot, style: styles.tfoot },
960
- React__namespace.createElement("tr", null,
961
- React__namespace.createElement("td", { colSpan: 8 }, footer))));
1368
+ return React__default["default"].createElement(React__default["default"].Fragment, null);
1369
+ return (React__default["default"].createElement("tfoot", { className: tfoot, style: styles.tfoot },
1370
+ React__default["default"].createElement("tr", null,
1371
+ React__default["default"].createElement("td", { colSpan: 8 }, footer))));
962
1372
  }
963
1373
 
964
1374
  /**
@@ -981,20 +1391,20 @@ function getWeekdays(locale) {
981
1391
  function Head() {
982
1392
  var _a = useDayPicker(), classNames = _a.classNames, styles = _a.styles, showWeekNumber = _a.showWeekNumber, locale = _a.locale, formatWeekdayName = _a.formatters.formatWeekdayName, labelWeekday = _a.labels.labelWeekday;
983
1393
  var weekdays = getWeekdays(locale);
984
- return (React__namespace.createElement("thead", { style: styles.head, className: classNames.head },
985
- React__namespace.createElement("tr", { style: styles.head_row, className: classNames.head_row },
986
- showWeekNumber && (React__namespace.createElement("th", { scope: "col", style: styles.head_cell, className: classNames.head_cell })),
987
- weekdays.map(function (weekday, i) { return (React__namespace.createElement("th", { key: i, scope: "col", className: classNames.head_cell, style: styles.head_cell },
988
- React__namespace.createElement("span", { className: classNames.vhidden, "aria-label": "" }, labelWeekday(weekday, { locale: locale })),
989
- React__namespace.createElement("span", { "aria-hidden": true }, formatWeekdayName(weekday, { locale: locale })))); }))));
1394
+ return (React__default["default"].createElement("thead", { style: styles.head, className: classNames.head },
1395
+ React__default["default"].createElement("tr", { style: styles.head_row, className: classNames.head_row },
1396
+ showWeekNumber && (React__default["default"].createElement("th", { scope: "col", style: styles.head_cell, className: classNames.head_cell })),
1397
+ weekdays.map(function (weekday, i) { return (React__default["default"].createElement("th", { key: i, scope: "col", className: classNames.head_cell, style: styles.head_cell },
1398
+ React__default["default"].createElement("span", { className: classNames.vhidden, "aria-label": "" }, labelWeekday(weekday, { locale: locale })),
1399
+ React__default["default"].createElement("span", { "aria-hidden": true }, formatWeekdayName(weekday, { locale: locale })))); }))));
990
1400
  }
991
1401
 
992
1402
  /**
993
1403
  * Render the icon in the styled drop-down.
994
1404
  */
995
1405
  function IconDropdown(props) {
996
- return (React__namespace.createElement("svg", __assign({ width: "8px", height: "8px", viewBox: "0 0 120 120", "data-testid": "iconDropdown" }, props),
997
- React__namespace.createElement("path", { d: "M4.22182541,48.2218254 C8.44222828,44.0014225 15.2388494,43.9273804 19.5496459,47.9996989 L19.7781746,48.2218254 L60,88.443 L100.221825,48.2218254 C104.442228,44.0014225 111.238849,43.9273804 115.549646,47.9996989 L115.778175,48.2218254 C119.998577,52.4422283 120.07262,59.2388494 116.000301,63.5496459 L115.778175,63.7781746 L67.7781746,111.778175 C63.5577717,115.998577 56.7611506,116.07262 52.4503541,112.000301 L52.2218254,111.778175 L4.22182541,63.7781746 C-0.0739418023,59.4824074 -0.0739418023,52.5175926 4.22182541,48.2218254 Z", fill: "currentColor", fillRule: "nonzero" })));
1406
+ return (React__default["default"].createElement("svg", __assign({ width: "8px", height: "8px", viewBox: "0 0 120 120", "data-testid": "iconDropdown" }, props),
1407
+ React__default["default"].createElement("path", { d: "M4.22182541,48.2218254 C8.44222828,44.0014225 15.2388494,43.9273804 19.5496459,47.9996989 L19.7781746,48.2218254 L60,88.443 L100.221825,48.2218254 C104.442228,44.0014225 111.238849,43.9273804 115.549646,47.9996989 L115.778175,48.2218254 C119.998577,52.4422283 120.07262,59.2388494 116.000301,63.5496459 L115.778175,63.7781746 L67.7781746,111.778175 C63.5577717,115.998577 56.7611506,116.07262 52.4503541,112.000301 L52.2218254,111.778175 L4.22182541,63.7781746 C-0.0739418023,59.4824074 -0.0739418023,52.5175926 4.22182541,48.2218254 Z", fill: "currentColor", fillRule: "nonzero" })));
998
1408
  }
999
1409
 
1000
1410
  /**
@@ -1020,13 +1430,13 @@ function Row(props) {
1020
1430
  var _a = useDayPicker(), styles = _a.styles, classNames = _a.classNames, showWeekNumber = _a.showWeekNumber, _b = _a.components, Day = _b.Day, WeekNumber = _b.WeekNumber;
1021
1431
  var weekNumberCell;
1022
1432
  if (showWeekNumber) {
1023
- weekNumberCell = (React__namespace.createElement("td", { className: classNames.cell, style: styles.cell },
1024
- React__namespace.createElement(WeekNumber, { number: props.weekNumber, dates: props.dates })));
1433
+ weekNumberCell = (React__default["default"].createElement("td", { className: classNames.cell, style: styles.cell },
1434
+ React__default["default"].createElement(WeekNumber, { number: props.weekNumber, dates: props.dates })));
1025
1435
  }
1026
- return (React__namespace.createElement("tr", { className: classNames.row, style: styles.row },
1436
+ return (React__default["default"].createElement("tr", { className: classNames.row, style: styles.row },
1027
1437
  weekNumberCell,
1028
- props.dates.map(function (date) { return (React__namespace.createElement("td", { className: classNames.cell, style: styles.cell, key: dateFns.getUnixTime(date) },
1029
- React__namespace.createElement(Day, { displayMonth: props.displayMonth, date: date }))); })));
1438
+ props.dates.map(function (date) { return (React__default["default"].createElement("td", { className: classNames.cell, style: styles.cell, key: dateFns.getUnixTime(date) },
1439
+ React__default["default"].createElement(Day, { displayMonth: props.displayMonth, date: date }))); })));
1030
1440
  }
1031
1441
 
1032
1442
  /**
@@ -1041,10 +1451,10 @@ function WeekNumber(props) {
1041
1451
  };
1042
1452
  var content = formatWeekNumber(Number(weekNumber), { locale: locale });
1043
1453
  if (!onWeekNumberClick) {
1044
- return (React__namespace.createElement("span", { className: classNames.weeknumber, style: styles.weeknumber }, content));
1454
+ return (React__default["default"].createElement("span", { className: classNames.weeknumber, style: styles.weeknumber }, content));
1045
1455
  }
1046
1456
  var label = labelWeekNumber(Number(weekNumber), { locale: locale });
1047
- return (React__namespace.createElement(Button, { "aria-label": label, className: classNames.weeknumber, style: styles.weeknumber, onClick: handleClick }, content));
1457
+ return (React__default["default"].createElement(Button, { "aria-label": label, className: classNames.weeknumber, style: styles.weeknumber, onClick: handleClick }, content));
1048
1458
  }
1049
1459
 
1050
1460
  /**
@@ -1081,12 +1491,10 @@ var defaultClassNames = {
1081
1491
  nav_button_next: 'rdp-nav_button_next',
1082
1492
  nav_icon: 'rdp-nav_icon',
1083
1493
  row: 'rdp-row',
1084
- row_head: 'rdp-row_head',
1085
1494
  weeknumber: 'rdp-weeknumber',
1086
1495
  cell: 'rdp-cell',
1087
1496
  day: 'rdp-day',
1088
- day_outside: 'rdp-day_outside',
1089
- day_today: 'rdp-day_today'
1497
+ day_outside: 'rdp-day_outside'
1090
1498
  };
1091
1499
 
1092
1500
  /**
@@ -1144,7 +1552,7 @@ var index = /*#__PURE__*/Object.freeze({
1144
1552
  /**
1145
1553
  * The default ARIA label for the day button.
1146
1554
  */
1147
- var labelDay = function (day, options) {
1555
+ var labelDay = function (day, modifers, options) {
1148
1556
  return dateFns.format(day, 'do MMMM (EEEE)', options);
1149
1557
  };
1150
1558
 
@@ -1227,460 +1635,18 @@ function DayPickerProvider(props) {
1227
1635
  }
1228
1636
  initialProps.toYear; initialProps.fromYear; initialProps.toMonth; initialProps.fromMonth; var contextProps = __rest(initialProps, ["toYear", "fromYear", "toMonth", "fromMonth"]);
1229
1637
  var context = __assign(__assign({}, contextProps), { captionLayout: captionLayout, fromDate: fromDate, toDate: toDate, today: today, locale: locale, modifierClassNames: (_e = initialProps.modifierClassNames) !== null && _e !== void 0 ? _e : {}, modifierPrefix: 'rdp-day_', modifiers: modifiers, numberOfMonths: numberOfMonths, styles: (_f = initialProps.styles) !== null && _f !== void 0 ? _f : {}, classNames: __assign(__assign({}, defaultClassNames), initialProps.classNames), formatters: __assign(__assign({}, index), initialProps.formatters), labels: __assign(__assign({}, index$1), initialProps.labels), components: __assign({ Caption: Caption, CaptionLabel: CaptionLabel, Day: Day, DayContent: DayContent, Dropdown: Dropdown, Footer: Footer, Head: Head, IconDropdown: IconDropdown, IconRight: IconRight, IconLeft: IconLeft, Row: Row, WeekNumber: WeekNumber }, initialProps.components) });
1230
- return (React__namespace.createElement(DayPickerContext.Provider, { value: context }, children));
1231
- }
1232
-
1233
- /** The provider for the [[FocusContext]]. */
1234
- function FocusProvider(_a) {
1235
- var children = _a.children;
1236
- var _b = React__namespace.useState(), focusedDay = _b[0], setDay = _b[1];
1237
- var _c = useNavigation(), goToMonth = _c.goToMonth, displayMonths = _c.displayMonths;
1238
- var numberOfMonths = useDayPicker().numberOfMonths;
1239
- var blur = function () { return setDay(undefined); };
1240
- var focus = function (date) { return setDay(date); };
1241
- var switchMonth = function (date, offset) {
1242
- if (displayMonths.some(function (m) { return dateFns.isSameMonth(date, m); }))
1243
- return;
1244
- if (offset < 0) {
1245
- goToMonth(dateFns.addMonths(date, 1 + offset));
1246
- }
1247
- else {
1248
- goToMonth(date);
1249
- }
1250
- };
1251
- var focusDayBefore = function () {
1252
- if (!focusedDay)
1253
- return;
1254
- var before = dateFns.addDays(focusedDay, -1);
1255
- setDay(before);
1256
- switchMonth(before, numberOfMonths * -1);
1257
- };
1258
- var focusDayAfter = function () {
1259
- if (!focusedDay)
1260
- return;
1261
- var after = dateFns.addDays(focusedDay, 1);
1262
- setDay(after);
1263
- switchMonth(after, numberOfMonths);
1264
- };
1265
- var focusWeekBeforeDay = function () {
1266
- if (!focusedDay)
1267
- return;
1268
- var up = dateFns.addWeeks(focusedDay, -1);
1269
- setDay(up);
1270
- switchMonth(up, numberOfMonths * -1);
1271
- };
1272
- var focusWeekAfterDay = function () {
1273
- if (!focusedDay)
1274
- return;
1275
- var down = dateFns.addWeeks(focusedDay, 1);
1276
- setDay(down);
1277
- switchMonth(down, numberOfMonths);
1278
- };
1279
- var setters = {
1280
- blur: blur,
1281
- focus: focus,
1282
- focusDayAfter: focusDayAfter,
1283
- focusDayBefore: focusDayBefore,
1284
- focusWeekAfterDay: focusWeekAfterDay,
1285
- focusWeekBeforeDay: focusWeekBeforeDay
1286
- };
1287
- return (React__namespace.createElement(FocusContext.Provider, { value: [focusedDay, setters] }, children));
1288
- }
1289
-
1290
- /** Return the initial month according to the given options. */
1291
- function getInitialMonth(context) {
1292
- var month = context.month, defaultMonth = context.defaultMonth, today = context.today;
1293
- var initialMonth = month || defaultMonth || today || new Date();
1294
- var toDate = context.toDate, fromDate = context.fromDate, _a = context.numberOfMonths, numberOfMonths = _a === void 0 ? 1 : _a;
1295
- // Fix the initialMonth if is after the to-date
1296
- if (toDate && dateFns.differenceInCalendarMonths(toDate, initialMonth) < 0) {
1297
- var offset = -1 * (numberOfMonths - 1);
1298
- initialMonth = dateFns.addMonths(toDate, offset);
1299
- }
1300
- // Fix the initialMonth if is before the from-date
1301
- if (fromDate && dateFns.differenceInCalendarMonths(initialMonth, fromDate) < 0) {
1302
- initialMonth = fromDate;
1303
- }
1304
- return dateFns.startOfMonth(initialMonth);
1305
- }
1306
-
1307
- /**
1308
- * Helper hook for using controlled/uncontrolled values from a component props.
1309
- *
1310
- * When the value is not controlled, pass `undefined` as `controlledValue` and
1311
- * use the returned setter to update it.
1312
- *
1313
- * When the value is controlled, pass the controlled value as second
1314
- * argument, which will be always returned as `value`.
1315
- */
1316
- function useControlledValue(defaultValue, controlledValue) {
1317
- var _a = React__default["default"].useState(defaultValue), uncontrolledValue = _a[0], setValue = _a[1];
1318
- var value = controlledValue === undefined ? uncontrolledValue : controlledValue;
1319
- return [value, setValue];
1320
- }
1321
-
1322
- /** Controls the navigation state. */
1323
- function useNavigationState() {
1324
- var context = useDayPicker();
1325
- var initialMonth = getInitialMonth(context);
1326
- var _a = useControlledValue(initialMonth, context.month), month = _a[0], setMonth = _a[1];
1327
- var goToMonth = function (date) {
1328
- if (context.disableNavigation)
1329
- return;
1330
- setMonth(date);
1331
- };
1332
- return [month, goToMonth];
1333
- }
1334
-
1335
- /**
1336
- * Return the months to display in the component according to the number of
1337
- * months and the from/to date.
1338
- */
1339
- function getDisplayMonths(month, _a) {
1340
- var reverseMonths = _a.reverseMonths, numberOfMonths = _a.numberOfMonths;
1341
- var start = dateFns.startOfMonth(month);
1342
- var end = dateFns.startOfMonth(dateFns.addMonths(start, numberOfMonths));
1343
- var monthsDiff = dateFns.differenceInCalendarMonths(end, start);
1344
- var months = [];
1345
- for (var i = 0; i < monthsDiff; i++) {
1346
- var nextMonth = dateFns.addMonths(start, i);
1347
- months.push(nextMonth);
1348
- }
1349
- if (reverseMonths)
1350
- months = months.reverse();
1351
- return months;
1352
- }
1353
-
1354
- /**
1355
- * Returns the next month the user can navigate to according to the given
1356
- * options.
1357
- *
1358
- * Please note that the next month is not always the next calendar month:
1359
- *
1360
- * - if after the `toDate` range, is undefined;
1361
- * - if the navigation is paged, is the number of months displayed ahead.
1362
- *
1363
- */
1364
- function getNextMonth(startingMonth, options) {
1365
- if (options.disableNavigation) {
1366
- return undefined;
1367
- }
1368
- var toDate = options.toDate, pagedNavigation = options.pagedNavigation, _a = options.numberOfMonths, numberOfMonths = _a === void 0 ? 1 : _a;
1369
- var offset = pagedNavigation ? numberOfMonths : 1;
1370
- var month = dateFns.startOfMonth(startingMonth);
1371
- if (!toDate) {
1372
- return dateFns.addMonths(month, offset);
1373
- }
1374
- var monthsDiff = dateFns.differenceInCalendarMonths(toDate, startingMonth);
1375
- if (monthsDiff < numberOfMonths) {
1376
- return undefined;
1377
- }
1378
- // Jump forward as the number of months when paged navigation
1379
- return dateFns.addMonths(month, offset);
1380
- }
1381
-
1382
- /**
1383
- * Returns the next previous the user can navigate to, according to the given
1384
- * options.
1385
- *
1386
- * Please note that the previous month is not always the previous calendar
1387
- * month:
1388
- *
1389
- * - if before the `fromDate` date, is `undefined`;
1390
- * - if the navigation is paged, is the number of months displayed before.
1391
- *
1392
- */
1393
- function getPreviousMonth(startingMonth, options) {
1394
- if (options.disableNavigation) {
1395
- return undefined;
1396
- }
1397
- var fromDate = options.fromDate, pagedNavigation = options.pagedNavigation, _a = options.numberOfMonths, numberOfMonths = _a === void 0 ? 1 : _a;
1398
- var offset = pagedNavigation ? numberOfMonths : 1;
1399
- var month = dateFns.startOfMonth(startingMonth);
1400
- if (!fromDate) {
1401
- return dateFns.addMonths(month, -offset);
1402
- }
1403
- var monthsDiff = dateFns.differenceInCalendarMonths(month, fromDate);
1404
- if (monthsDiff <= 0) {
1405
- return undefined;
1406
- }
1407
- // Jump back as the number of months when paged navigation
1408
- return dateFns.addMonths(month, -offset);
1409
- }
1410
-
1411
- /** Provides the values for the [[NavigationContext]]. */
1412
- function NavigationProvider(props) {
1413
- var context = useDayPicker();
1414
- var _a = useNavigationState(), month = _a[0], goToMonth = _a[1];
1415
- var displayMonths = getDisplayMonths(month, context);
1416
- var nextMonth = getNextMonth(month, context);
1417
- var previousMonth = getPreviousMonth(month, context);
1418
- return (React__namespace.createElement(NavigationContext.Provider, { value: {
1419
- month: month,
1420
- displayMonths: displayMonths,
1421
- goToMonth: goToMonth,
1422
- previousMonth: previousMonth,
1423
- nextMonth: nextMonth
1424
- } }, props.children));
1425
- }
1426
-
1427
- function SelectMultipleProviderInternal(_a) {
1428
- var initialProps = _a.initialProps, children = _a.children;
1429
- var selected = initialProps.selected;
1430
- var handleDayClick = function (day, modifiers, e) {
1431
- var _a, _b;
1432
- (_a = initialProps.onDayClick) === null || _a === void 0 ? void 0 : _a.call(initialProps, day, modifiers, e);
1433
- var isMinSelected = Boolean(initialProps.min &&
1434
- modifiers.selected &&
1435
- selected &&
1436
- selected.length === initialProps.min);
1437
- if (isMinSelected) {
1438
- return;
1439
- }
1440
- var isMaxSelected = Boolean(initialProps.max &&
1441
- !modifiers.selected &&
1442
- selected &&
1443
- selected.length === initialProps.max);
1444
- if (isMaxSelected) {
1445
- return;
1446
- }
1447
- var days = selected ? __spreadArray([], selected, true) : [];
1448
- if (modifiers.selected) {
1449
- var index = days.findIndex(function (selectedDay) {
1450
- return dateFns.isSameDay(day, selectedDay);
1451
- });
1452
- days.splice(index, 1);
1453
- }
1454
- else {
1455
- days.push(day);
1456
- }
1457
- (_b = initialProps.onSelect) === null || _b === void 0 ? void 0 : _b.call(initialProps, days, day, modifiers, e);
1458
- };
1459
- var modifiers = {
1460
- selected: [],
1461
- disabled: []
1462
- };
1463
- if (selected) {
1464
- modifiers.selected = selected;
1465
- modifiers.disabled = [
1466
- function disableDay(day) {
1467
- var isMaxSelected = initialProps.max &&
1468
- selected &&
1469
- selected.length > initialProps.max - 1;
1470
- var isSelected = selected === null || selected === void 0 ? void 0 : selected.some(function (selectedDay) {
1471
- return dateFns.isSameDay(selectedDay, day);
1472
- });
1473
- return Boolean(isMaxSelected && !isSelected);
1474
- }
1475
- ];
1476
- }
1477
- var contextValue = { selected: selected, handleDayClick: handleDayClick, modifiers: modifiers };
1478
- return (React__namespace.createElement(SelectMultipleContext.Provider, { value: contextValue }, children));
1479
- }
1480
-
1481
- /** Provides the values for the [[SelectMultipleContext]]. */
1482
- function SelectMultipleProvider(props) {
1483
- if (!isDayPickerMultiple(props.initialProps)) {
1484
- var emptyContextValue = {
1485
- selected: undefined,
1486
- modifiers: {
1487
- selected: [],
1488
- disabled: []
1489
- }
1490
- };
1491
- return (React__namespace.createElement(SelectMultipleContext.Provider, { value: emptyContextValue }, props.children));
1492
- }
1493
- return (React__namespace.createElement(SelectMultipleProviderInternal, { initialProps: props.initialProps, children: props.children }));
1494
- }
1495
-
1496
- /**
1497
- * Add a day to an existing range.
1498
- *
1499
- * The returned range takes in account the `undefined` values and if the added
1500
- * day is already present in the range.
1501
- */
1502
- function addToRange(day, range) {
1503
- var _a = range || {}, from = _a.from, to = _a.to;
1504
- if (!from) {
1505
- return { from: day, to: day };
1506
- }
1507
- if (!to && dateFns.isSameDay(from, day)) {
1508
- return undefined;
1509
- }
1510
- if (!to && dateFns.isBefore(day, from)) {
1511
- return { from: day, to: from };
1512
- }
1513
- if (!to) {
1514
- return { from: from, to: day };
1515
- }
1516
- if (dateFns.isSameDay(to, day) && dateFns.isSameDay(from, day)) {
1517
- return undefined;
1518
- }
1519
- if (dateFns.isSameDay(to, day)) {
1520
- return { from: to, to: to };
1521
- }
1522
- if (dateFns.isSameDay(from, day)) {
1523
- return undefined;
1524
- }
1525
- if (dateFns.isAfter(from, day)) {
1526
- return { from: day, to: to };
1527
- }
1528
- return { from: from, to: day };
1529
- }
1530
-
1531
- function SelectRangeProviderInternal(_a) {
1532
- var initialProps = _a.initialProps, children = _a.children;
1533
- var selected = initialProps.selected;
1534
- var min = initialProps.min;
1535
- var max = initialProps.max;
1536
- var handleDayClick = function (day, modifiers, e) {
1537
- var _a, _b;
1538
- (_a = initialProps.onDayClick) === null || _a === void 0 ? void 0 : _a.call(initialProps, day, modifiers, e);
1539
- var newValue = addToRange(day, selected);
1540
- if ((min || max) &&
1541
- selected &&
1542
- (newValue === null || newValue === void 0 ? void 0 : newValue.to) &&
1543
- newValue.from &&
1544
- newValue.from !== newValue.to) {
1545
- var diff = Math.abs(dateFns.differenceInCalendarDays(newValue === null || newValue === void 0 ? void 0 : newValue.to, newValue === null || newValue === void 0 ? void 0 : newValue.from));
1546
- if (min && diff < min) {
1547
- return;
1548
- }
1549
- if (max && diff >= max) {
1550
- return;
1551
- }
1552
- }
1553
- (_b = initialProps.onSelect) === null || _b === void 0 ? void 0 : _b.call(initialProps, newValue, day, modifiers, e);
1554
- };
1555
- var modifiers = {
1556
- selected: [],
1557
- range_start: [],
1558
- range_end: [],
1559
- range_middle: [],
1560
- disabled: []
1561
- };
1562
- if (selected) {
1563
- modifiers.selected = [selected];
1564
- if (selected.from) {
1565
- modifiers.range_start = [selected.from];
1566
- if (selected.to) {
1567
- modifiers.range_middle = [
1568
- {
1569
- after: selected.from,
1570
- before: selected.to
1571
- }
1572
- ];
1573
- if (max || min) {
1574
- modifiers.disabled = [
1575
- function (date) {
1576
- if (max &&
1577
- selected.to &&
1578
- selected.from &&
1579
- dateFns.isBefore(date, selected.from)) {
1580
- var diff = dateFns.differenceInCalendarDays(selected.to, date);
1581
- if (diff >= max) {
1582
- return true;
1583
- }
1584
- }
1585
- if (max &&
1586
- selected.to &&
1587
- selected.from &&
1588
- dateFns.isAfter(date, selected.to)) {
1589
- var diff = dateFns.differenceInCalendarDays(date, selected.from);
1590
- if (diff >= max) {
1591
- return true;
1592
- }
1593
- }
1594
- if (min && selected.from && dateFns.isBefore(date, selected.from)) {
1595
- var diff = dateFns.differenceInCalendarDays(selected.from, date);
1596
- if (diff < min) {
1597
- return true;
1598
- }
1599
- }
1600
- if (min &&
1601
- selected.to &&
1602
- selected.from &&
1603
- dateFns.isAfter(date, selected.to)) {
1604
- var diff = dateFns.differenceInCalendarDays(date, selected.from);
1605
- if (diff < min) {
1606
- return true;
1607
- }
1608
- }
1609
- return false;
1610
- }
1611
- ];
1612
- }
1613
- modifiers.range_end = [selected.to];
1614
- }
1615
- else {
1616
- modifiers.range_end = [selected.from];
1617
- }
1618
- }
1619
- }
1620
- return (React__namespace.createElement(SelectRangeContext.Provider, { value: { selected: selected, handleDayClick: handleDayClick, modifiers: modifiers } }, children));
1621
- }
1622
-
1623
- /** Provides the values for the [[SelectRangeProvider]]. */
1624
- function SelectRangeProvider(props) {
1625
- if (!isDayPickerRange(props.initialProps)) {
1626
- var emptyContextValue = {
1627
- selected: undefined,
1628
- modifiers: {
1629
- selected: [],
1630
- range_start: [],
1631
- range_end: [],
1632
- range_middle: [],
1633
- disabled: []
1634
- }
1635
- };
1636
- return (React__namespace.createElement(SelectRangeContext.Provider, { value: emptyContextValue }, props.children));
1637
- }
1638
- return (React__namespace.createElement(SelectRangeProviderInternal, { initialProps: props.initialProps, children: props.children }));
1639
- }
1640
-
1641
- function SelectSingleProviderInternal(_a) {
1642
- var initialProps = _a.initialProps, children = _a.children;
1643
- var handleDayClick = function (day, dayModifiers, e) {
1644
- var _a, _b;
1645
- if (dayModifiers.selected && !initialProps.required) {
1646
- (_a = initialProps.onSelect) === null || _a === void 0 ? void 0 : _a.call(initialProps, undefined, day, dayModifiers, e);
1647
- return;
1648
- }
1649
- (_b = initialProps.onSelect) === null || _b === void 0 ? void 0 : _b.call(initialProps, day, day, dayModifiers, e);
1650
- };
1651
- var modifiers = { selected: [] };
1652
- if (initialProps.selected) {
1653
- modifiers.selected = [initialProps.selected];
1654
- }
1655
- var contextValue = {
1656
- selected: initialProps.selected,
1657
- handleDayClick: handleDayClick,
1658
- modifiers: modifiers
1659
- };
1660
- return (React__namespace.createElement(SelectSingleContext.Provider, { value: contextValue }, children));
1661
- }
1662
-
1663
- /** Provides the values for the [[SelectSingleProvider]]. */
1664
- function SelectSingleProvider(props) {
1665
- if (!isDayPickerSingle(props.initialProps)) {
1666
- var emptyContextValue = {
1667
- selected: undefined,
1668
- modifiers: { selected: [] }
1669
- };
1670
- return (React__namespace.createElement(SelectSingleContext.Provider, { value: emptyContextValue }, props.children));
1671
- }
1672
- return (React__namespace.createElement(SelectSingleProviderInternal, { initialProps: props.initialProps, children: props.children }));
1638
+ return (React__default["default"].createElement(DayPickerContext.Provider, { value: context }, children));
1673
1639
  }
1674
1640
 
1675
1641
  /** Provide the value for all the context providers. */
1676
- function ContextProvider(props) {
1642
+ function RootProvider(props) {
1677
1643
  var children = props.children, initialProps = __rest(props, ["children"]);
1678
- return (React__namespace.createElement(DayPickerProvider, { initialProps: initialProps },
1679
- React__namespace.createElement(NavigationProvider, null,
1680
- React__namespace.createElement(SelectSingleProvider, { initialProps: initialProps },
1681
- React__namespace.createElement(SelectMultipleProvider, { initialProps: initialProps },
1682
- React__namespace.createElement(SelectRangeProvider, { initialProps: initialProps },
1683
- React__namespace.createElement(FocusProvider, null, children)))))));
1644
+ return (React__default["default"].createElement(DayPickerProvider, { initialProps: initialProps },
1645
+ React__default["default"].createElement(NavigationProvider, null,
1646
+ React__default["default"].createElement(SelectSingleProvider, { initialProps: initialProps },
1647
+ React__default["default"].createElement(SelectMultipleProvider, { initialProps: initialProps },
1648
+ React__default["default"].createElement(SelectRangeProvider, { initialProps: initialProps },
1649
+ React__default["default"].createElement(FocusProvider, null, children)))))));
1684
1650
  }
1685
1651
 
1686
1652
  /**
@@ -1719,6 +1685,7 @@ function ContextProvider(props) {
1719
1685
  * days that can be selected with the `min` or the `max` props.
1720
1686
  * - `mode="range"`: users can select a range of days. Limit the amount of days
1721
1687
  * in the range with the `min` or the `max` props.
1688
+ * - `mode="custom"`: implement your own selection mode with `onDayClick`.
1722
1689
  *
1723
1690
  * These selection modes should cover the most common use cases. In case you
1724
1691
  * need a more refined way of selecting days, use `mode="custom"`. Use the
@@ -1742,8 +1709,8 @@ function ContextProvider(props) {
1742
1709
  *
1743
1710
  * ### Styling
1744
1711
  *
1745
- * DayPicker comes with a default, basic style in `react-day-picker/style` –
1746
- * use it as template for your own style.
1712
+ * DayPicker comes with a default, basic style in `react-day-picker/style` – use
1713
+ * it as template for your own style.
1747
1714
  *
1748
1715
  * If you are using CSS modules, pass the imported styles object the
1749
1716
  * `classNames` props.
@@ -1769,8 +1736,8 @@ function ContextProvider(props) {
1769
1736
  * ```
1770
1737
  */
1771
1738
  function DayPicker(props) {
1772
- return (React__namespace.createElement(ContextProvider, __assign({}, props),
1773
- React__namespace.createElement(Root, null)));
1739
+ return (React__default["default"].createElement(RootProvider, __assign({}, props),
1740
+ React__default["default"].createElement(Root, null)));
1774
1741
  }
1775
1742
 
1776
1743
  /** Returns true when the props are of type [[DayPickerCustom]]. */
@@ -1788,16 +1755,15 @@ function useInput(options) {
1788
1755
  if (options === void 0) { options = {}; }
1789
1756
  var _a = options.locale, locale = _a === void 0 ? enUS__default["default"] : _a, required = options.required, _b = options.format, format$1 = _b === void 0 ? 'PP' : _b, defaultSelected = options.defaultSelected, _c = options.today, today = _c === void 0 ? new Date() : _c;
1790
1757
  var _d = parseFromToProps(options), fromDate = _d.fromDate, toDate = _d.toDate;
1791
- var min = required ? 1 : 0;
1792
1758
  // Shortcut to the DateFns functions
1793
1759
  var parseValue = function (value) { return dateFns.parse(value, format$1, today, { locale: locale }); };
1794
1760
  // Initialize states
1795
- var _e = React__namespace.useState(defaultSelected !== null && defaultSelected !== void 0 ? defaultSelected : today), month = _e[0], setMonth = _e[1];
1796
- var _f = React__namespace.useState(defaultSelected), selectedDay = _f[0], setSelectedDay = _f[1];
1761
+ var _e = React__default["default"].useState(defaultSelected !== null && defaultSelected !== void 0 ? defaultSelected : today), month = _e[0], setMonth = _e[1];
1762
+ var _f = React__default["default"].useState(defaultSelected), selectedDay = _f[0], setSelectedDay = _f[1];
1797
1763
  var defaultInputValue = defaultSelected
1798
1764
  ? dateFns.format(defaultSelected, format$1, { locale: locale })
1799
1765
  : '';
1800
- var _g = React__namespace.useState(defaultInputValue), inputValue = _g[0], setInputValue = _g[1];
1766
+ var _g = React__default["default"].useState(defaultInputValue), inputValue = _g[0], setInputValue = _g[1];
1801
1767
  var reset = function () {
1802
1768
  setSelectedDay(defaultSelected);
1803
1769
  setMonth(defaultSelected !== null && defaultSelected !== void 0 ? defaultSelected : today);
@@ -1865,8 +1831,7 @@ function useInput(options) {
1865
1831
  locale: locale,
1866
1832
  fromDate: options === null || options === void 0 ? void 0 : options.fromDate,
1867
1833
  toDate: options === null || options === void 0 ? void 0 : options.toDate,
1868
- today: today,
1869
- min: min
1834
+ today: today
1870
1835
  };
1871
1836
  var inputProps = {
1872
1837
  onBlur: handleBlur,
@@ -1881,7 +1846,6 @@ function useInput(options) {
1881
1846
  exports.Button = Button;
1882
1847
  exports.Caption = Caption;
1883
1848
  exports.CaptionLabel = CaptionLabel;
1884
- exports.ContextProvider = ContextProvider;
1885
1849
  exports.Day = Day;
1886
1850
  exports.DayContent = DayContent;
1887
1851
  exports.DayPicker = DayPicker;
@@ -1898,22 +1862,24 @@ exports.Navigation = Navigation;
1898
1862
  exports.NavigationContext = NavigationContext;
1899
1863
  exports.NavigationProvider = NavigationProvider;
1900
1864
  exports.Root = Root;
1865
+ exports.RootProvider = RootProvider;
1901
1866
  exports.Row = Row;
1902
1867
  exports.SelectMultipleContext = SelectMultipleContext;
1903
1868
  exports.SelectMultipleProvider = SelectMultipleProvider;
1869
+ exports.SelectMultipleProviderInternal = SelectMultipleProviderInternal;
1904
1870
  exports.SelectRangeContext = SelectRangeContext;
1905
1871
  exports.SelectRangeProvider = SelectRangeProvider;
1872
+ exports.SelectRangeProviderInternal = SelectRangeProviderInternal;
1906
1873
  exports.SelectSingleContext = SelectSingleContext;
1907
1874
  exports.SelectSingleProvider = SelectSingleProvider;
1875
+ exports.SelectSingleProviderInternal = SelectSingleProviderInternal;
1908
1876
  exports.Table = Table;
1909
1877
  exports.WeekNumber = WeekNumber;
1910
1878
  exports.YearsDropdown = YearsDropdown;
1911
- exports.isArrayOfDates = isArrayOfDates;
1912
1879
  exports.isDateAfterType = isDateAfterType;
1913
1880
  exports.isDateBeforeType = isDateBeforeType;
1914
1881
  exports.isDateInterval = isDateInterval;
1915
1882
  exports.isDateRange = isDateRange;
1916
- exports.isDateType = isDateType;
1917
1883
  exports.isDayOfWeekType = isDayOfWeekType;
1918
1884
  exports.isDayPickerCustom = isDayPickerCustom;
1919
1885
  exports.isDayPickerMultiple = isDayPickerMultiple;