@ozen-ui/kit 0.74.0 → 0.76.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (228) hide show
  1. package/StepperVertical/package.json +5 -0
  2. package/__inner__/cjs/components/Autocomplete/helper.d.ts +1 -1
  3. package/__inner__/cjs/components/Autocomplete/types.d.ts +1 -1
  4. package/__inner__/cjs/components/Calendar/Calendar.js +26 -2
  5. package/__inner__/cjs/components/Calendar/CalendarContext.d.ts +8 -1
  6. package/__inner__/cjs/components/Calendar/CalendarContext.js +10 -1
  7. package/__inner__/cjs/components/Calendar/__tests__/utils.d.ts +11 -0
  8. package/__inner__/cjs/components/Calendar/__tests__/utils.js +58 -0
  9. package/__inner__/cjs/components/Calendar/components/CalendarGrid/CalendarGrid.js +4 -3
  10. package/__inner__/cjs/components/Calendar/components/CalendarItem/CalendarItem.js +25 -2
  11. package/__inner__/cjs/components/Calendar/components/CalendarItem/CalendarItemContext.d.ts +1 -0
  12. package/__inner__/cjs/components/Calendar/components/CalendarItem/CalendarItemContext.js +1 -0
  13. package/__inner__/cjs/components/Calendar/components/CalendarModeRange/CalendarModeRange.js +68 -13
  14. package/__inner__/cjs/components/Calendar/components/CalendarModeSingle/CalendarModeSingle.js +62 -16
  15. package/__inner__/cjs/components/Calendar/components/CalendarSwitcher/CalendarSwitcher.js +6 -7
  16. package/__inner__/cjs/components/Calendar/components/CalendarSwitcher/components/CalendarSwitcherText/CalendarSwitcherText.d.ts +3 -0
  17. package/__inner__/cjs/components/Calendar/components/CalendarSwitcher/components/CalendarSwitcherText/CalendarSwitcherText.js +13 -0
  18. package/__inner__/cjs/components/Calendar/components/CalendarSwitcher/components/CalendarSwitcherText/index.d.ts +2 -0
  19. package/__inner__/cjs/components/Calendar/components/CalendarSwitcher/components/CalendarSwitcherText/index.js +5 -0
  20. package/__inner__/cjs/components/Calendar/components/CalendarSwitcher/components/CalendarSwitcherText/types.d.ts +4 -0
  21. package/__inner__/cjs/components/Calendar/components/CalendarSwitcher/components/CalendarSwitcherText/types.js +2 -0
  22. package/__inner__/cjs/components/Calendar/components/CalendarSwitcher/components/index.d.ts +1 -0
  23. package/__inner__/cjs/components/Calendar/components/CalendarSwitcher/components/index.js +4 -0
  24. package/__inner__/cjs/components/Calendar/constants.d.ts +2 -0
  25. package/__inner__/cjs/components/Calendar/constants.js +7 -1
  26. package/__inner__/cjs/components/Calendar/index.d.ts +1 -0
  27. package/__inner__/cjs/components/Calendar/index.js +1 -0
  28. package/__inner__/cjs/components/Calendar/types.d.ts +13 -5
  29. package/__inner__/cjs/components/Calendar/utils.d.ts +10 -1
  30. package/__inner__/cjs/components/Calendar/utils.js +12 -1
  31. package/__inner__/cjs/components/DataList/types.d.ts +1 -1
  32. package/__inner__/cjs/components/DatePicker/components/DateInput/DateInput.js +4 -3
  33. package/__inner__/cjs/components/DatePicker/components/DateInput/types.d.ts +6 -2
  34. package/__inner__/cjs/components/DatePicker/components/DateInput/utils/dateInputMask/dateInputMask.d.ts +2 -1
  35. package/__inner__/cjs/components/DatePicker/components/DateInput/utils/dateInputMask/dateInputMask.js +67 -7
  36. package/__inner__/cjs/components/DatePicker/components/DatePickerModeDate/DatePickerModeDate.js +32 -20
  37. package/__inner__/cjs/components/DatePicker/components/DatePickerModeDateRange/DatePickerModeDateRange.js +74 -51
  38. package/__inner__/cjs/components/DatePicker/constants.d.ts +2 -0
  39. package/__inner__/cjs/components/DatePicker/constants.js +4 -1
  40. package/__inner__/cjs/components/DatePicker/types.d.ts +10 -6
  41. package/__inner__/cjs/components/DatePicker/types.js +3 -1
  42. package/__inner__/cjs/components/DatePicker/utils/formatDateToString/formatDateToString.d.ts +2 -1
  43. package/__inner__/cjs/components/DatePicker/utils/formatDateToString/formatDateToString.js +18 -5
  44. package/__inner__/cjs/components/DatePicker/utils/formatStringToDate/formatStringToDate.d.ts +2 -1
  45. package/__inner__/cjs/components/DatePicker/utils/formatStringToDate/formatStringToDate.js +6 -5
  46. package/__inner__/cjs/components/DatePicker/utils/getCommonCalendarProps/getCommonCalendarProps.js +2 -2
  47. package/__inner__/cjs/components/DatePicker/utils/index.d.ts +2 -0
  48. package/__inner__/cjs/components/DatePicker/utils/index.js +2 -0
  49. package/__inner__/cjs/components/DatePicker/utils/isValidDateString/isValidDateString.d.ts +2 -1
  50. package/__inner__/cjs/components/DatePicker/utils/isValidDateString/isValidDateString.js +9 -8
  51. package/__inner__/cjs/components/DatePicker/utils/maskPastedDate/index.d.ts +1 -0
  52. package/__inner__/cjs/components/DatePicker/utils/maskPastedDate/index.js +4 -0
  53. package/__inner__/cjs/components/DatePicker/utils/maskPastedDate/maskPastedDate.d.ts +6 -0
  54. package/__inner__/cjs/components/DatePicker/utils/maskPastedDate/maskPastedDate.js +43 -0
  55. package/__inner__/cjs/components/DatePicker/utils/parseDateString/index.d.ts +1 -0
  56. package/__inner__/cjs/components/DatePicker/utils/parseDateString/index.js +4 -0
  57. package/__inner__/cjs/components/DatePicker/utils/parseDateString/parseDateString.d.ts +6 -0
  58. package/__inner__/cjs/components/DatePicker/utils/parseDateString/parseDateString.js +66 -0
  59. package/__inner__/cjs/components/ListCardItem/hooks/useListCardItemRatio.js +10 -14
  60. package/__inner__/cjs/components/OzenProvider/providers/theme/tokens/color/b-business-dark/color-b-business-dark.css +1 -1
  61. package/__inner__/cjs/components/OzenProvider/providers/theme/tokens/color/b-business-default/color-b-business-default.css +1 -1
  62. package/__inner__/cjs/components/OzenProvider/providers/theme/tokens/color/ozen-dark/color-ozen-dark.css +1 -1
  63. package/__inner__/cjs/components/OzenProvider/providers/theme/tokens/color/ozen-default/color-ozen-default.css +1 -1
  64. package/__inner__/cjs/components/OzenProvider/providers/theme/tokens/color/vip-dark/color-vip-dark.css +1 -1
  65. package/__inner__/cjs/components/OzenProvider/providers/theme/tokens/color/vip-default/color-vip-default.css +1 -1
  66. package/__inner__/cjs/components/OzenProvider/providers/theme/tokens/shadow/ozen-default/shadow-ozen-default.css +1 -1
  67. package/__inner__/cjs/components/Select/Select.css +10 -1
  68. package/__inner__/cjs/components/Select/Select.d.ts +0 -1
  69. package/__inner__/cjs/components/Select/Select.js +40 -10
  70. package/__inner__/cjs/components/Select/SelectContext.d.ts +21 -0
  71. package/__inner__/cjs/components/Select/SelectContext.js +29 -0
  72. package/__inner__/cjs/components/Select/classNames.d.ts +1 -0
  73. package/__inner__/cjs/components/Select/classNames.js +5 -0
  74. package/__inner__/cjs/components/Select/components/SelectInput/SelectInput.js +14 -15
  75. package/__inner__/cjs/components/Select/components/SelectInput/types.d.ts +0 -22
  76. package/__inner__/cjs/components/Select/components/SelectInputContextConsumer/SelectInputContextConsumer.js +3 -3
  77. package/__inner__/cjs/components/Select/components/SelectInputRenderRight/SelectInputRenderRight.d.ts +2 -0
  78. package/__inner__/cjs/components/Select/components/SelectInputRenderRight/SelectInputRenderRight.js +42 -0
  79. package/__inner__/cjs/components/Select/components/SelectInputRenderRight/index.d.ts +1 -0
  80. package/__inner__/cjs/components/Select/components/SelectInputRenderRight/index.js +4 -0
  81. package/__inner__/cjs/components/Select/components/index.d.ts +1 -0
  82. package/__inner__/cjs/components/Select/components/index.js +1 -0
  83. package/__inner__/cjs/components/Select/constants.d.ts +3 -0
  84. package/__inner__/cjs/components/Select/constants.js +8 -1
  85. package/__inner__/cjs/components/Select/entities/index.d.ts +2 -0
  86. package/__inner__/cjs/components/Select/entities/index.js +5 -0
  87. package/__inner__/cjs/components/Select/entities/onClear.d.ts +2 -0
  88. package/__inner__/cjs/components/Select/entities/onClear.js +2 -0
  89. package/__inner__/cjs/components/Select/entities/render.d.ts +6 -0
  90. package/__inner__/cjs/components/Select/entities/render.js +4 -0
  91. package/__inner__/cjs/components/Select/index.d.ts +1 -0
  92. package/__inner__/cjs/components/Select/index.js +1 -0
  93. package/__inner__/cjs/components/Select/types.d.ts +30 -5
  94. package/__inner__/cjs/components/Select/types.js +3 -0
  95. package/__inner__/cjs/components/Stack/Stack.css +3 -0
  96. package/__inner__/cjs/components/Stack/Stack.js +2 -1
  97. package/__inner__/cjs/components/Stack/constants.d.ts +1 -0
  98. package/__inner__/cjs/components/Stack/constants.js +2 -1
  99. package/__inner__/cjs/components/Stack/types.d.ts +4 -0
  100. package/__inner__/cjs/components/Stack/types.js +2 -1
  101. package/__inner__/cjs/hooks/useDevEffect/index.d.ts +1 -0
  102. package/__inner__/cjs/hooks/useDevEffect/index.js +4 -0
  103. package/__inner__/cjs/hooks/useDevEffect/useDevEffect.d.ts +3 -0
  104. package/__inner__/cjs/hooks/useDevEffect/useDevEffect.js +13 -0
  105. package/__inner__/cjs/hooks/useIntersectionObserver/useIntersectionObserver.js +3 -2
  106. package/__inner__/cjs/locale/locale.js +48 -3
  107. package/__inner__/cjs/utils/array/createFilled/createFilledArray.d.ts +1 -1
  108. package/__inner__/cjs/utils/array/createFilled/createFilledArray.js +6 -1
  109. package/__inner__/cjs/utils/array/generatePermutations/generatePermutations.d.ts +1 -0
  110. package/__inner__/cjs/utils/array/generatePermutations/generatePermutations.js +47 -0
  111. package/__inner__/cjs/utils/array/generatePermutations/index.d.ts +1 -0
  112. package/__inner__/cjs/utils/array/generatePermutations/index.js +4 -0
  113. package/__inner__/cjs/utils/array/index.d.ts +1 -0
  114. package/__inner__/cjs/utils/array/index.js +1 -0
  115. package/__inner__/esm/components/Autocomplete/helper.d.ts +1 -1
  116. package/__inner__/esm/components/Autocomplete/types.d.ts +1 -1
  117. package/__inner__/esm/components/Calendar/Calendar.js +27 -3
  118. package/__inner__/esm/components/Calendar/CalendarContext.d.ts +8 -1
  119. package/__inner__/esm/components/Calendar/CalendarContext.js +10 -1
  120. package/__inner__/esm/components/Calendar/__tests__/utils.d.ts +11 -0
  121. package/__inner__/esm/components/Calendar/__tests__/utils.js +45 -0
  122. package/__inner__/esm/components/Calendar/components/CalendarGrid/CalendarGrid.js +4 -3
  123. package/__inner__/esm/components/Calendar/components/CalendarItem/CalendarItem.js +25 -2
  124. package/__inner__/esm/components/Calendar/components/CalendarItem/CalendarItemContext.d.ts +1 -0
  125. package/__inner__/esm/components/Calendar/components/CalendarItem/CalendarItemContext.js +1 -0
  126. package/__inner__/esm/components/Calendar/components/CalendarModeRange/CalendarModeRange.js +70 -15
  127. package/__inner__/esm/components/Calendar/components/CalendarModeSingle/CalendarModeSingle.js +64 -18
  128. package/__inner__/esm/components/Calendar/components/CalendarSwitcher/CalendarSwitcher.js +6 -7
  129. package/__inner__/esm/components/Calendar/components/CalendarSwitcher/components/CalendarSwitcherText/CalendarSwitcherText.d.ts +3 -0
  130. package/__inner__/esm/components/Calendar/components/CalendarSwitcher/components/CalendarSwitcherText/CalendarSwitcherText.js +9 -0
  131. package/__inner__/esm/components/Calendar/components/CalendarSwitcher/components/CalendarSwitcherText/index.d.ts +2 -0
  132. package/__inner__/esm/components/Calendar/components/CalendarSwitcher/components/CalendarSwitcherText/index.js +2 -0
  133. package/__inner__/esm/components/Calendar/components/CalendarSwitcher/components/CalendarSwitcherText/types.d.ts +4 -0
  134. package/__inner__/esm/components/Calendar/components/CalendarSwitcher/components/CalendarSwitcherText/types.js +1 -0
  135. package/__inner__/esm/components/Calendar/components/CalendarSwitcher/components/index.d.ts +1 -0
  136. package/__inner__/esm/components/Calendar/components/CalendarSwitcher/components/index.js +1 -0
  137. package/__inner__/esm/components/Calendar/constants.d.ts +2 -0
  138. package/__inner__/esm/components/Calendar/constants.js +6 -0
  139. package/__inner__/esm/components/Calendar/index.d.ts +1 -0
  140. package/__inner__/esm/components/Calendar/index.js +1 -0
  141. package/__inner__/esm/components/Calendar/types.d.ts +13 -5
  142. package/__inner__/esm/components/Calendar/utils.d.ts +10 -1
  143. package/__inner__/esm/components/Calendar/utils.js +9 -0
  144. package/__inner__/esm/components/DataList/types.d.ts +1 -1
  145. package/__inner__/esm/components/DatePicker/components/DateInput/DateInput.js +3 -2
  146. package/__inner__/esm/components/DatePicker/components/DateInput/types.d.ts +6 -2
  147. package/__inner__/esm/components/DatePicker/components/DateInput/utils/dateInputMask/dateInputMask.d.ts +2 -1
  148. package/__inner__/esm/components/DatePicker/components/DateInput/utils/dateInputMask/dateInputMask.js +67 -7
  149. package/__inner__/esm/components/DatePicker/components/DatePickerModeDate/DatePickerModeDate.js +33 -21
  150. package/__inner__/esm/components/DatePicker/components/DatePickerModeDateRange/DatePickerModeDateRange.js +68 -45
  151. package/__inner__/esm/components/DatePicker/constants.d.ts +2 -0
  152. package/__inner__/esm/components/DatePicker/constants.js +3 -0
  153. package/__inner__/esm/components/DatePicker/types.d.ts +10 -6
  154. package/__inner__/esm/components/DatePicker/types.js +2 -0
  155. package/__inner__/esm/components/DatePicker/utils/formatDateToString/formatDateToString.d.ts +2 -1
  156. package/__inner__/esm/components/DatePicker/utils/formatDateToString/formatDateToString.js +18 -5
  157. package/__inner__/esm/components/DatePicker/utils/formatStringToDate/formatStringToDate.d.ts +2 -1
  158. package/__inner__/esm/components/DatePicker/utils/formatStringToDate/formatStringToDate.js +6 -5
  159. package/__inner__/esm/components/DatePicker/utils/getCommonCalendarProps/getCommonCalendarProps.js +2 -2
  160. package/__inner__/esm/components/DatePicker/utils/index.d.ts +2 -0
  161. package/__inner__/esm/components/DatePicker/utils/index.js +2 -0
  162. package/__inner__/esm/components/DatePicker/utils/isValidDateString/isValidDateString.d.ts +2 -1
  163. package/__inner__/esm/components/DatePicker/utils/isValidDateString/isValidDateString.js +8 -7
  164. package/__inner__/esm/components/DatePicker/utils/maskPastedDate/index.d.ts +1 -0
  165. package/__inner__/esm/components/DatePicker/utils/maskPastedDate/index.js +1 -0
  166. package/__inner__/esm/components/DatePicker/utils/maskPastedDate/maskPastedDate.d.ts +6 -0
  167. package/__inner__/esm/components/DatePicker/utils/maskPastedDate/maskPastedDate.js +39 -0
  168. package/__inner__/esm/components/DatePicker/utils/parseDateString/index.d.ts +1 -0
  169. package/__inner__/esm/components/DatePicker/utils/parseDateString/index.js +1 -0
  170. package/__inner__/esm/components/DatePicker/utils/parseDateString/parseDateString.d.ts +6 -0
  171. package/__inner__/esm/components/DatePicker/utils/parseDateString/parseDateString.js +62 -0
  172. package/__inner__/esm/components/ListCardItem/hooks/useListCardItemRatio.js +10 -14
  173. package/__inner__/esm/components/OzenProvider/providers/theme/tokens/color/b-business-dark/color-b-business-dark.css +1 -1
  174. package/__inner__/esm/components/OzenProvider/providers/theme/tokens/color/b-business-default/color-b-business-default.css +1 -1
  175. package/__inner__/esm/components/OzenProvider/providers/theme/tokens/color/ozen-dark/color-ozen-dark.css +1 -1
  176. package/__inner__/esm/components/OzenProvider/providers/theme/tokens/color/ozen-default/color-ozen-default.css +1 -1
  177. package/__inner__/esm/components/OzenProvider/providers/theme/tokens/color/vip-dark/color-vip-dark.css +1 -1
  178. package/__inner__/esm/components/OzenProvider/providers/theme/tokens/color/vip-default/color-vip-default.css +1 -1
  179. package/__inner__/esm/components/OzenProvider/providers/theme/tokens/shadow/ozen-default/shadow-ozen-default.css +1 -1
  180. package/__inner__/esm/components/Select/Select.css +10 -1
  181. package/__inner__/esm/components/Select/Select.d.ts +0 -1
  182. package/__inner__/esm/components/Select/Select.js +40 -10
  183. package/__inner__/esm/components/Select/SelectContext.d.ts +21 -0
  184. package/__inner__/esm/components/Select/SelectContext.js +25 -0
  185. package/__inner__/esm/components/Select/classNames.d.ts +1 -0
  186. package/__inner__/esm/components/Select/classNames.js +2 -0
  187. package/__inner__/esm/components/Select/components/SelectInput/SelectInput.js +7 -8
  188. package/__inner__/esm/components/Select/components/SelectInput/types.d.ts +0 -22
  189. package/__inner__/esm/components/Select/components/SelectInputContextConsumer/SelectInputContextConsumer.js +1 -1
  190. package/__inner__/esm/components/Select/components/SelectInputRenderRight/SelectInputRenderRight.d.ts +2 -0
  191. package/__inner__/esm/components/Select/components/SelectInputRenderRight/SelectInputRenderRight.js +38 -0
  192. package/__inner__/esm/components/Select/components/SelectInputRenderRight/index.d.ts +1 -0
  193. package/__inner__/esm/components/Select/components/SelectInputRenderRight/index.js +1 -0
  194. package/__inner__/esm/components/Select/components/index.d.ts +1 -0
  195. package/__inner__/esm/components/Select/components/index.js +1 -0
  196. package/__inner__/esm/components/Select/constants.d.ts +3 -0
  197. package/__inner__/esm/components/Select/constants.js +7 -0
  198. package/__inner__/esm/components/Select/entities/index.d.ts +2 -0
  199. package/__inner__/esm/components/Select/entities/index.js +2 -0
  200. package/__inner__/esm/components/Select/entities/onClear.d.ts +2 -0
  201. package/__inner__/esm/components/Select/entities/onClear.js +1 -0
  202. package/__inner__/esm/components/Select/entities/render.d.ts +6 -0
  203. package/__inner__/esm/components/Select/entities/render.js +1 -0
  204. package/__inner__/esm/components/Select/index.d.ts +1 -0
  205. package/__inner__/esm/components/Select/index.js +1 -0
  206. package/__inner__/esm/components/Select/types.d.ts +30 -5
  207. package/__inner__/esm/components/Select/types.js +2 -1
  208. package/__inner__/esm/components/Stack/Stack.css +3 -0
  209. package/__inner__/esm/components/Stack/Stack.js +3 -2
  210. package/__inner__/esm/components/Stack/constants.d.ts +1 -0
  211. package/__inner__/esm/components/Stack/constants.js +1 -0
  212. package/__inner__/esm/components/Stack/types.d.ts +4 -0
  213. package/__inner__/esm/components/Stack/types.js +1 -0
  214. package/__inner__/esm/hooks/useDevEffect/index.d.ts +1 -0
  215. package/__inner__/esm/hooks/useDevEffect/index.js +1 -0
  216. package/__inner__/esm/hooks/useDevEffect/useDevEffect.d.ts +3 -0
  217. package/__inner__/esm/hooks/useDevEffect/useDevEffect.js +9 -0
  218. package/__inner__/esm/hooks/useIntersectionObserver/useIntersectionObserver.js +3 -2
  219. package/__inner__/esm/locale/locale.js +48 -3
  220. package/__inner__/esm/utils/array/createFilled/createFilledArray.d.ts +1 -1
  221. package/__inner__/esm/utils/array/createFilled/createFilledArray.js +6 -1
  222. package/__inner__/esm/utils/array/generatePermutations/generatePermutations.d.ts +1 -0
  223. package/__inner__/esm/utils/array/generatePermutations/generatePermutations.js +43 -0
  224. package/__inner__/esm/utils/array/generatePermutations/index.d.ts +1 -0
  225. package/__inner__/esm/utils/array/generatePermutations/index.js +1 -0
  226. package/__inner__/esm/utils/array/index.d.ts +1 -0
  227. package/__inner__/esm/utils/array/index.js +1 -0
  228. package/package.json +4 -4
@@ -1,18 +1,39 @@
1
1
  import { __assign, __read, __rest } from "tslib";
2
- import React, { forwardRef } from 'react';
2
+ import React, { forwardRef, useMemo } from 'react';
3
3
  import { DatePickerProvider } from '@rehookify/datepicker';
4
4
  import { useControlled } from '../../../../hooks/useControlled';
5
+ import { useStoredValue } from '../../../../hooks/useStoredValue';
5
6
  import { useThemeProps } from '../../../../hooks/useThemeProps';
6
7
  import { CalendarContext } from '../../CalendarContext';
7
- import { cnCalendar } from '../../utils';
8
+ import { calculateStepsAvailability, calculateStepsHelpers, cnCalendar, } from '../../utils';
8
9
  import { Calendars } from '../index';
9
10
  import { CalendarAdditionalControls } from './components';
11
+ var isSameDayMonthYear = function (date1, date2) {
12
+ return date1.getFullYear() === date2.getFullYear() &&
13
+ date1.getMonth() === date2.getMonth() &&
14
+ date1.getDate() === date2.getDate();
15
+ };
10
16
  export var CalendarModeRange = forwardRef(function (inProps, ref) {
11
17
  var props = useThemeProps({
12
18
  props: inProps,
13
19
  name: 'Calendar',
14
20
  });
15
- var size = props.size, startDay = props.startDay, renderAdditionalControls = props.renderAdditionalControls, locale = props.locale, onChangeProp = props.onChange, onCalendarsChange = props.onCalendarsChange, onOffsetDateChangeProp = props.onOffsetDateChange, calendars = props.calendars, onMonthClick = props.onMonthClick, onDayClick = props.onDayClick, onYearClick = props.onYearClick, valueProp = props.value, defaultValue = props.defaultValue, offsetDateProp = props.offsetDate, defaultOffsetDate = props.defaultOffsetDate, exclude = props.exclude, minDate = props.minDate, maxDate = props.maxDate, className = props.className, getPeriodSwitchAriaLabel = props.getPeriodSwitchAriaLabel, other = __rest(props, ["size", "startDay", "renderAdditionalControls", "locale", "onChange", "onCalendarsChange", "onOffsetDateChange", "calendars", "onMonthClick", "onDayClick", "onYearClick", "value", "defaultValue", "offsetDate", "defaultOffsetDate", "exclude", "minDate", "maxDate", "className", "getPeriodSwitchAriaLabel"]);
21
+ var size = props.size, startDay = props.startDay, renderAdditionalControls = props.renderAdditionalControls, locale = props.locale, onChangeProp = props.onChange, onCalendarsChange = props.onCalendarsChange, onOffsetDateChangeProp = props.onOffsetDateChange, calendars = props.calendars, onMonthClickProp = props.onMonthClick, onDayClickProp = props.onDayClick, onYearClickProp = props.onYearClick, valueProp = props.value, defaultValue = props.defaultValue, offsetDateProp = props.offsetDate, defaultOffsetDate = props.defaultOffsetDate, exclude = props.exclude, minDate = props.minDate, maxDate = props.maxDate, className = props.className, getPeriodSwitchAriaLabel = props.getPeriodSwitchAriaLabel, steps = props.steps, initialStep = props.initialStep, other = __rest(props, ["size", "startDay", "renderAdditionalControls", "locale", "onChange", "onCalendarsChange", "onOffsetDateChange", "calendars", "onMonthClick", "onDayClick", "onYearClick", "value", "defaultValue", "offsetDate", "defaultOffsetDate", "exclude", "minDate", "maxDate", "className", "getPeriodSwitchAriaLabel", "steps", "initialStep"]);
22
+ var lastClickedStep = useStoredValue(null);
23
+ var onMonthClick = function (event, date) {
24
+ lastClickedStep.current = 'months';
25
+ onMonthClickProp === null || onMonthClickProp === void 0 ? void 0 : onMonthClickProp(event, date);
26
+ };
27
+ var onDayClick = function (event, date) {
28
+ lastClickedStep.current = 'days';
29
+ onDayClickProp === null || onDayClickProp === void 0 ? void 0 : onDayClickProp(event, date);
30
+ };
31
+ var onYearClick = function (event, date) {
32
+ lastClickedStep.current = 'years';
33
+ onYearClickProp === null || onYearClickProp === void 0 ? void 0 : onYearClickProp(event, date);
34
+ };
35
+ var stepsHelpers = useMemo(function () { return calculateStepsHelpers(steps); }, [steps]);
36
+ var stepsAvailability = useMemo(function () { return calculateStepsAvailability(steps); }, [steps]);
16
37
  var _a = __read(useControlled({
17
38
  value: valueProp,
18
39
  defaultValue: defaultValue,
@@ -26,14 +47,56 @@ export var CalendarModeRange = forwardRef(function (inProps, ref) {
26
47
  state: 'offsetDate',
27
48
  }), 2), offsetDate = _b[0], setOffsetDateState = _b[1];
28
49
  var onOffsetChange = function (date) {
29
- setOffsetDateState(date);
30
- onOffsetDateChangeProp === null || onOffsetDateChangeProp === void 0 ? void 0 : onOffsetDateChangeProp(date);
50
+ var lastStep = lastClickedStep.current;
51
+ lastClickedStep.current = null;
52
+ var updateOffsetDate = function () {
53
+ setOffsetDateState(date);
54
+ onOffsetDateChangeProp === null || onOffsetDateChangeProp === void 0 ? void 0 : onOffsetDateChangeProp(date);
55
+ };
56
+ var isYearLastStep = stepsHelpers.lastStep === 'years';
57
+ var isMonthLastStep = stepsHelpers.lastStep === 'months';
58
+ var isFinishingImpossible = !isYearLastStep && !isMonthLastStep;
59
+ // Если произошло переключение через стрелки по датам
60
+ // Или финиш с текущей конфигурацией steps невозможен
61
+ if (!lastStep || isFinishingImpossible) {
62
+ updateOffsetDate();
63
+ return;
64
+ }
65
+ var isMonthStep = lastStep === 'months';
66
+ var isYearStep = lastStep === 'years';
67
+ var isFinish = (isMonthStep && isMonthLastStep) || (isYearStep && isYearLastStep);
68
+ if (isFinish) {
69
+ var previousDateFirstDate = value === null || value === void 0 ? void 0 : value[0];
70
+ var isEqualFirstDate = previousDateFirstDate &&
71
+ isSameDayMonthYear(previousDateFirstDate, date);
72
+ var previousDateLastDate = value === null || value === void 0 ? void 0 : value[1];
73
+ var isEqualLastDate = previousDateLastDate &&
74
+ isSameDayMonthYear(previousDateLastDate, date);
75
+ if (isEqualFirstDate && isEqualLastDate) {
76
+ return;
77
+ }
78
+ var newValue = previousDateFirstDate
79
+ ? [previousDateFirstDate, date]
80
+ : [date];
81
+ setValue(newValue);
82
+ onChangeProp === null || onChangeProp === void 0 ? void 0 : onChangeProp(newValue);
83
+ }
84
+ updateOffsetDate();
31
85
  };
32
86
  var onDatesChange = function (data) {
33
- if (data) {
87
+ var isFinishChange = stepsHelpers.lastStep === 'days';
88
+ if (isFinishChange) {
34
89
  setValue(data);
35
90
  onChangeProp === null || onChangeProp === void 0 ? void 0 : onChangeProp(data);
36
91
  }
92
+ else {
93
+ var firstDate = data[0];
94
+ if (!firstDate) {
95
+ return;
96
+ }
97
+ setOffsetDateState(firstDate);
98
+ onOffsetDateChangeProp === null || onOffsetDateChangeProp === void 0 ? void 0 : onOffsetDateChangeProp(firstDate);
99
+ }
37
100
  };
38
101
  var config = {
39
102
  calendar: __assign({ startDay: startDay }, (calendars && calendars > 1 && { offsets: [1] })),
@@ -56,15 +119,7 @@ export var CalendarModeRange = forwardRef(function (inProps, ref) {
56
119
  offsetDate: offsetDate || undefined,
57
120
  };
58
121
  return (React.createElement(DatePickerProvider, { config: config },
59
- React.createElement(CalendarContext.Provider, { value: {
60
- size: size,
61
- minDate: minDate,
62
- maxDate: maxDate,
63
- onDayClick: onDayClick,
64
- onYearClick: onYearClick,
65
- onMonthClick: onMonthClick,
66
- getPeriodSwitchAriaLabel: getPeriodSwitchAriaLabel,
67
- } },
122
+ React.createElement(CalendarContext.Provider, { value: __assign(__assign({ size: size, minDate: minDate, maxDate: maxDate, onDayClick: onDayClick, onYearClick: onYearClick, onMonthClick: onMonthClick, getPeriodSwitchAriaLabel: getPeriodSwitchAriaLabel, steps: steps, initialStep: initialStep }, stepsHelpers), stepsAvailability) },
68
123
  React.createElement("div", __assign({ className: cnCalendar({ size: size }, [className]) }, other, { ref: ref }),
69
124
  React.createElement(Calendars, { onCalendarsChange: onCalendarsChange }),
70
125
  React.createElement(CalendarAdditionalControls, { renderAdditionalControls: renderAdditionalControls })))));
@@ -1,13 +1,32 @@
1
1
  import { __assign, __read, __rest } from "tslib";
2
- import React, { forwardRef } from 'react';
2
+ import React, { forwardRef, useMemo } from 'react';
3
3
  import { DatePickerProvider } from '@rehookify/datepicker';
4
4
  import { useControlled } from '../../../../hooks/useControlled';
5
+ import { useStoredValue } from '../../../../hooks/useStoredValue';
5
6
  import { CalendarContext } from '../../CalendarContext';
6
- import { cnCalendar } from '../../utils';
7
+ import { calculateStepsAvailability, calculateStepsHelpers, cnCalendar, } from '../../utils';
7
8
  import { Calendars } from '../index';
8
9
  import { CalendarAdditionalControls } from './components';
10
+ var isSameDayMonthYear = function (date1, date2) {
11
+ return date1.getFullYear() === date2.getFullYear() &&
12
+ date1.getMonth() === date2.getMonth() &&
13
+ date1.getDate() === date2.getDate();
14
+ };
9
15
  export var CalendarModeSingle = forwardRef(function (props, ref) {
10
- var size = props.size, startDay = props.startDay, renderAdditionalControls = props.renderAdditionalControls, locale = props.locale, onChangeProp = props.onChange, onOffsetDateChangeProp = props.onOffsetDateChange, onMonthClick = props.onMonthClick, onDayClick = props.onDayClick, onYearClick = props.onYearClick, valueProp = props.value, defaultValue = props.defaultValue, offsetDateProp = props.offsetDate, onCalendarsChange = props.onCalendarsChange, defaultOffsetDate = props.defaultOffsetDate, exclude = props.exclude, minDate = props.minDate, maxDate = props.maxDate, calendars = props.calendars, className = props.className, getPeriodSwitchAriaLabel = props.getPeriodSwitchAriaLabel, other = __rest(props, ["size", "startDay", "renderAdditionalControls", "locale", "onChange", "onOffsetDateChange", "onMonthClick", "onDayClick", "onYearClick", "value", "defaultValue", "offsetDate", "onCalendarsChange", "defaultOffsetDate", "exclude", "minDate", "maxDate", "calendars", "className", "getPeriodSwitchAriaLabel"]);
16
+ var size = props.size, startDay = props.startDay, renderAdditionalControls = props.renderAdditionalControls, locale = props.locale, onChangeProp = props.onChange, onOffsetDateChangeProp = props.onOffsetDateChange, onMonthClickProp = props.onMonthClick, onDayClickProp = props.onDayClick, onYearClickProp = props.onYearClick, valueProp = props.value, defaultValue = props.defaultValue, offsetDateProp = props.offsetDate, onCalendarsChange = props.onCalendarsChange, defaultOffsetDate = props.defaultOffsetDate, exclude = props.exclude, minDate = props.minDate, maxDate = props.maxDate, calendars = props.calendars, className = props.className, getPeriodSwitchAriaLabel = props.getPeriodSwitchAriaLabel, steps = props.steps, initialStep = props.initialStep, other = __rest(props, ["size", "startDay", "renderAdditionalControls", "locale", "onChange", "onOffsetDateChange", "onMonthClick", "onDayClick", "onYearClick", "value", "defaultValue", "offsetDate", "onCalendarsChange", "defaultOffsetDate", "exclude", "minDate", "maxDate", "calendars", "className", "getPeriodSwitchAriaLabel", "steps", "initialStep"]);
17
+ var lastClickedStep = useStoredValue(null);
18
+ var onMonthClick = function (event, date) {
19
+ lastClickedStep.current = 'months';
20
+ onMonthClickProp === null || onMonthClickProp === void 0 ? void 0 : onMonthClickProp(event, date);
21
+ };
22
+ var onDayClick = function (event, date) {
23
+ lastClickedStep.current = 'days';
24
+ onDayClickProp === null || onDayClickProp === void 0 ? void 0 : onDayClickProp(event, date);
25
+ };
26
+ var onYearClick = function (event, date) {
27
+ lastClickedStep.current = 'years';
28
+ onYearClickProp === null || onYearClickProp === void 0 ? void 0 : onYearClickProp(event, date);
29
+ };
11
30
  var _a = __read(useControlled({
12
31
  value: valueProp,
13
32
  defaultValue: defaultValue,
@@ -20,16 +39,51 @@ export var CalendarModeSingle = forwardRef(function (props, ref) {
20
39
  name: 'Calendar',
21
40
  state: 'offsetDate',
22
41
  }), 2), offsetDate = _b[0], setOffsetDateState = _b[1];
42
+ var stepsHelpers = useMemo(function () { return calculateStepsHelpers(steps); }, [steps]);
43
+ var stepsAvailability = useMemo(function () { return calculateStepsAvailability(steps); }, [steps]);
23
44
  var onDatesChange = function (data) {
24
- var value = data[0];
25
- if (value) {
26
- setValue(value);
27
- onChangeProp === null || onChangeProp === void 0 ? void 0 : onChangeProp(value);
45
+ var newValue = data[0];
46
+ if (!newValue) {
47
+ return;
48
+ }
49
+ var isFinishChange = stepsHelpers.lastStep === 'days';
50
+ if (isFinishChange) {
51
+ setValue(newValue);
52
+ onChangeProp === null || onChangeProp === void 0 ? void 0 : onChangeProp(newValue);
53
+ }
54
+ else {
55
+ setOffsetDateState(newValue);
56
+ onOffsetDateChangeProp === null || onOffsetDateChangeProp === void 0 ? void 0 : onOffsetDateChangeProp(newValue);
28
57
  }
29
58
  };
30
59
  var onOffsetChange = function (date) {
31
- setOffsetDateState(date);
32
- onOffsetDateChangeProp === null || onOffsetDateChangeProp === void 0 ? void 0 : onOffsetDateChangeProp(date);
60
+ var lastStep = lastClickedStep.current;
61
+ lastClickedStep.current = null;
62
+ var updateOffsetDate = function () {
63
+ setOffsetDateState(date);
64
+ onOffsetDateChangeProp === null || onOffsetDateChangeProp === void 0 ? void 0 : onOffsetDateChangeProp(date);
65
+ };
66
+ var isYearLastStep = stepsHelpers.lastStep === 'years';
67
+ var isMonthLastStep = stepsHelpers.lastStep === 'months';
68
+ var isFinishingImpossible = !isYearLastStep && !isMonthLastStep;
69
+ // Если произошло переключение через стрелки по датам
70
+ // Или финиш с текущей конфигурацией steps невозможен
71
+ if (!lastStep || isFinishingImpossible) {
72
+ updateOffsetDate();
73
+ return;
74
+ }
75
+ var isMonthStep = lastStep === 'months';
76
+ var isYearStep = lastStep === 'years';
77
+ var isFinish = (isMonthStep && isMonthLastStep) || (isYearStep && isYearLastStep);
78
+ if (isFinish) {
79
+ var previousDate = value;
80
+ if (previousDate && isSameDayMonthYear(previousDate, date)) {
81
+ return;
82
+ }
83
+ setValue(date);
84
+ onChangeProp === null || onChangeProp === void 0 ? void 0 : onChangeProp(date);
85
+ }
86
+ updateOffsetDate();
33
87
  };
34
88
  var config = {
35
89
  calendar: __assign({ startDay: startDay }, (calendars && calendars > 1 && { offsets: [1] })),
@@ -47,15 +101,7 @@ export var CalendarModeSingle = forwardRef(function (props, ref) {
47
101
  selectedDates: value ? [value] : [],
48
102
  };
49
103
  return (React.createElement(DatePickerProvider, { config: config },
50
- React.createElement(CalendarContext.Provider, { value: {
51
- size: size,
52
- minDate: minDate,
53
- maxDate: maxDate,
54
- onDayClick: onDayClick,
55
- onYearClick: onYearClick,
56
- onMonthClick: onMonthClick,
57
- getPeriodSwitchAriaLabel: getPeriodSwitchAriaLabel,
58
- } },
104
+ React.createElement(CalendarContext.Provider, { value: __assign(__assign({ size: size, minDate: minDate, maxDate: maxDate, onDayClick: onDayClick, onYearClick: onYearClick, onMonthClick: onMonthClick, steps: steps, initialStep: initialStep, getPeriodSwitchAriaLabel: getPeriodSwitchAriaLabel }, stepsHelpers), stepsAvailability) },
59
105
  React.createElement("div", __assign({ className: cnCalendar({ size: size }, [className]) }, other, { ref: ref }),
60
106
  React.createElement(Calendars, { onCalendarsChange: onCalendarsChange }),
61
107
  React.createElement(CalendarAdditionalControls, { renderAdditionalControls: renderAdditionalControls })))));
@@ -7,14 +7,14 @@ import { capitalizeFirstLetter as capitalize } from '../../../../utils/capitaliz
7
7
  import { cn } from '../../../../utils/classname';
8
8
  import { Button } from '../../../ButtonNext';
9
9
  import { IconButton } from '../../../IconButtonNext';
10
- import { Typography } from '../../../Typography';
11
10
  import { useCalendar } from '../../CalendarContext';
12
11
  import { useCalendarItem } from '../CalendarItem/CalendarItemContext';
12
+ import { CalendarSwitcherText } from './components';
13
13
  export var cnCalendarSwitcher = cn('CalendarSwitcher');
14
14
  export var CalendarSwitcher = forwardRef(function (_a, ref) {
15
15
  var _b, _c;
16
16
  var className = _a.className, prevButton = _a.prevButton, nextButton = _a.nextButton, other = __rest(_a, ["className", "prevButton", "nextButton"]);
17
- var _d = useCalendar(), size = _d.size, getPeriodSwitchAriaLabel = _d.getPeriodSwitchAriaLabel;
17
+ var _d = useCalendar(), size = _d.size, getPeriodSwitchAriaLabel = _d.getPeriodSwitchAriaLabel, hasMonthsStep = _d.hasMonthsStep, hasYearsStep = _d.hasYearsStep;
18
18
  var _e = useCalendarItem(), step = _e.step, goStep = _e.goStep, calendar = _e.calendar;
19
19
  var _f = useDatePickerContext(), years = _f.data.years, _g = _f.propGetters, addOffset = _g.addOffset, subtractOffset = _g.subtractOffset, nextYearsButton = _g.nextYearsButton, previousYearsButton = _g.previousYearsButton;
20
20
  var _h = calendar || {}, year = _h.year, month = _h.month;
@@ -29,18 +29,17 @@ export var CalendarSwitcher = forwardRef(function (_a, ref) {
29
29
  step === 'days' && (React.createElement(React.Fragment, null,
30
30
  prevButton,
31
31
  React.createElement("div", { className: cnCalendarSwitcher('Actions') },
32
- React.createElement(Button, { variant: "function", type: "button", color: "primary", onClick: handleClickOnMonths, size: size }, month && capitalize(month)),
33
- React.createElement(Button, { variant: "function", type: "button", color: "primary", onClick: handleClickOnYears, size: size }, year)),
32
+ hasMonthsStep ? (React.createElement(Button, { variant: "function", type: "button", color: "primary", onClick: handleClickOnMonths, size: size }, month && capitalize(month))) : (React.createElement(CalendarSwitcherText, null, month && capitalize(month))),
33
+ hasYearsStep ? (React.createElement(Button, { variant: "function", type: "button", color: "primary", onClick: handleClickOnYears, size: size }, year)) : (React.createElement(CalendarSwitcherText, null, year))),
34
34
  nextButton)),
35
35
  step === 'months' && (React.createElement(React.Fragment, null,
36
- React.createElement("div", { className: cnCalendarSwitcher('StartActions') },
37
- React.createElement(Button, { variant: "function", type: "button", color: "primary", onClick: handleClickOnYears, size: size }, year)),
36
+ React.createElement("div", { className: cnCalendarSwitcher('StartActions') }, hasYearsStep ? (React.createElement(Button, { variant: "function", type: "button", color: "primary", onClick: handleClickOnYears, size: size }, year)) : (React.createElement(CalendarSwitcherText, null, year))),
38
37
  React.createElement("div", { className: cnCalendarSwitcher('EndActions') },
39
38
  React.createElement(IconButton, __assign({ variant: "function", type: "button", color: "primary", icon: ChevronLeftIcon, size: size, "aria-label": PREVIOUS, title: PREVIOUS }, subtractOffset({ years: 1 }))),
40
39
  React.createElement(IconButton, __assign({ variant: "function", type: "button", color: "primary", icon: ChevronRightIcon, size: size, "aria-label": NEXT, title: NEXT }, addOffset({ years: 1 })))))),
41
40
  step === 'years' && (React.createElement(React.Fragment, null,
42
41
  React.createElement("div", { className: cnCalendarSwitcher('StartActions') },
43
- React.createElement(Typography, __assign({ color: "primary" }, (size && { variant: "text-".concat(size) })), (_b = years === null || years === void 0 ? void 0 : years[0]) === null || _b === void 0 ? void 0 :
42
+ React.createElement(CalendarSwitcherText, null, (_b = years === null || years === void 0 ? void 0 : years[0]) === null || _b === void 0 ? void 0 :
44
43
  _b.year,
45
44
  " - ", (_c = years === null || years === void 0 ? void 0 : years[years.length - 1]) === null || _c === void 0 ? void 0 :
46
45
  _c.year)),
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ import type { CalendarSwitcherTextProps } from './types';
3
+ export declare const CalendarSwitcherText: ({ children, }: CalendarSwitcherTextProps) => React.JSX.Element;
@@ -0,0 +1,9 @@
1
+ import { __assign } from "tslib";
2
+ import React from 'react';
3
+ import { Typography } from '../../../../../Typography';
4
+ import { useCalendar } from '../../../../CalendarContext';
5
+ export var CalendarSwitcherText = function (_a) {
6
+ var children = _a.children;
7
+ var size = useCalendar().size;
8
+ return (React.createElement(Typography, __assign({ color: "primary" }, (size && { variant: "text-".concat(size) })), children));
9
+ };
@@ -0,0 +1,2 @@
1
+ export * from './CalendarSwitcherText';
2
+ export * from './types';
@@ -0,0 +1,2 @@
1
+ export * from './CalendarSwitcherText';
2
+ export * from './types';
@@ -0,0 +1,4 @@
1
+ import type { ReactNode } from 'react';
2
+ export type CalendarSwitcherTextProps = {
3
+ children: ReactNode;
4
+ };
@@ -0,0 +1 @@
1
+ export * from './CalendarSwitcherText';
@@ -0,0 +1 @@
1
+ export * from './CalendarSwitcherText';
@@ -2,3 +2,5 @@ export declare const CALENDAR_DEFAULT_START_DAY = 1;
2
2
  export declare const CALENDAR_DEFAULT_SIZE = "m";
3
3
  export declare const CALENDAR_DEFAULT_MODE = "single";
4
4
  export declare const CALENDAR_DEFAULT_CALENDARS = 1;
5
+ export declare const CALENDAR_DEFAULT_STEPS: ("days" | "months" | "years")[];
6
+ export declare const CALENDAR_DEFAULT_INITIAL_STEP = "days";
@@ -2,3 +2,9 @@ export var CALENDAR_DEFAULT_START_DAY = 1;
2
2
  export var CALENDAR_DEFAULT_SIZE = 'm';
3
3
  export var CALENDAR_DEFAULT_MODE = 'single';
4
4
  export var CALENDAR_DEFAULT_CALENDARS = 1;
5
+ export var CALENDAR_DEFAULT_STEPS = [
6
+ 'years',
7
+ 'months',
8
+ 'days',
9
+ ];
10
+ export var CALENDAR_DEFAULT_INITIAL_STEP = 'days';
@@ -1,2 +1,3 @@
1
1
  export * from './Calendar';
2
+ export * from './constants';
2
3
  export * from './types';
@@ -1,2 +1,3 @@
1
1
  export * from './Calendar';
2
+ export * from './constants';
2
3
  export * from './types';
@@ -1,6 +1,6 @@
1
1
  import type { MouseEvent, ReactElement, ReactNode } from 'react';
2
2
  import type { DPExcludeConfig, DPDayInteger } from '@rehookify/datepicker';
3
- import type { ExtendableComponentPropsWithRef } from '../../types/ExtendableComponentPropsWithRef';
3
+ import type { WithRequired, ExtendableComponentPropsWithRef } from '../../types';
4
4
  import type { WithDisplayName } from '../../types/react';
5
5
  import type { CALENDAR_DEFAULT_MODE } from './constants';
6
6
  export declare const calendarStepVariant: readonly ["days", "months", "years"];
@@ -18,6 +18,7 @@ export type CalendarPropRenderAdditionalControls<MODE extends CalendarModeVarian
18
18
  date?: MODE extends 'range' ? Date[] : Date;
19
19
  }) => ReactElement;
20
20
  export type CalendarPropCalendars = 1 | 2;
21
+ export type CalendarSteps = CalendarStepVariant[];
21
22
  /**
22
23
  * @deprecated
23
24
  * Use the `CalendarPropOnChange` type to replace it.
@@ -44,6 +45,9 @@ export type CalendarExclude = CalendarPropExclude;
44
45
  * */
45
46
  export type CalendarStartDay = CalendarPropStartDay;
46
47
  export type CalendarRenderAdditionalControls<MODE extends CalendarModeVariant> = CalendarPropRenderAdditionalControls<MODE>;
48
+ export type CalendarOnMonthClick = (event: MouseEvent<HTMLElement>, date: Date) => void;
49
+ export type CalendarOnDayClick = (event: MouseEvent<HTMLElement>, date: Date) => void;
50
+ export type CalendarOnYearClick = (event: MouseEvent<HTMLElement>, date: Date) => void;
47
51
  export type CalendarProps<MODE extends CalendarModeVariant = typeof CALENDAR_DEFAULT_MODE> = ExtendableComponentPropsWithRef<{
48
52
  /** Способ выбора даты:
49
53
  * - `single` — позволяет выбрать одну дату (показывает один календарь).
@@ -75,11 +79,11 @@ export type CalendarProps<MODE extends CalendarModeVariant = typeof CALENDAR_DEF
75
79
  /** Ограничение выбора дат по большей дате */
76
80
  maxDate?: Date;
77
81
  /** Обработчик нажатия на кнопку месяца */
78
- onMonthClick?(e: MouseEvent<HTMLElement>, date: Date): void;
82
+ onMonthClick?: CalendarOnMonthClick;
79
83
  /** Обработчик нажатия на кнопку дня */
80
- onDayClick?(e: MouseEvent<HTMLElement>, date: Date): void;
84
+ onDayClick?: CalendarOnDayClick;
81
85
  /** Обработчик нажатия на кнопку года */
82
- onYearClick?(e: MouseEvent<HTMLElement>, date: Date): void;
86
+ onYearClick?: CalendarOnYearClick;
83
87
  /** Дополнительные контролы — рендер функция */
84
88
  renderAdditionalControls?: CalendarPropRenderAdditionalControls<MODE>;
85
89
  /** Функция форматирования атрибута `aria-label` для кнопок переключения периодов */
@@ -89,6 +93,10 @@ export type CalendarProps<MODE extends CalendarModeVariant = typeof CALENDAR_DEF
89
93
  /** Количество отображаемых календарей в компоненте: один или два */
90
94
  calendars?: CalendarPropCalendars;
91
95
  children?: never;
96
+ /** Шаги календаря. Определяет порядок и наличие этапов выбора. */
97
+ steps?: CalendarSteps;
98
+ /** Изначальный шаг */
99
+ initialStep?: CalendarStepVariant;
92
100
  }, 'div'>;
93
101
  export type CalendarComponent = WithDisplayName<(<MODE extends CalendarModeVariant = typeof CALENDAR_DEFAULT_MODE>(props: CalendarProps<MODE>) => ReactNode)>;
94
- export type CalendarModeComponent<MODE extends CalendarModeVariant> = WithDisplayName<(props: Omit<CalendarProps<MODE>, 'mode'>) => ReactNode>;
102
+ export type CalendarModeComponent<MODE extends CalendarModeVariant> = WithDisplayName<(props: Omit<WithRequired<CalendarProps<MODE>, 'steps' | 'initialStep'>, 'mode'>) => ReactNode>;
@@ -1,3 +1,12 @@
1
- import type { CalendarProps } from './index';
1
+ import type { CalendarProps, CalendarSteps } from './index';
2
2
  export declare const cnCalendar: import("@bem-react/classname").ClassNameFormatter;
3
3
  export declare const getPeriodSwitchAriaLabel: CalendarProps['getPeriodSwitchAriaLabel'];
4
+ export declare const calculateStepsAvailability: (steps: CalendarSteps) => {
5
+ hasDaysStep: boolean;
6
+ hasMonthsStep: boolean;
7
+ hasYearsStep: boolean;
8
+ };
9
+ export declare const calculateStepsHelpers: (steps: CalendarSteps) => {
10
+ lastStep: "days" | "months" | "years";
11
+ firstStep: "days" | "months" | "years";
12
+ };
@@ -9,3 +9,12 @@ export var getPeriodSwitchAriaLabel = function (step) {
9
9
  }
10
10
  return ['Previous period', 'Next period'];
11
11
  };
12
+ export var calculateStepsAvailability = function (steps) { return ({
13
+ hasDaysStep: steps.includes('days'),
14
+ hasMonthsStep: steps.includes('months'),
15
+ hasYearsStep: steps.includes('years'),
16
+ }); };
17
+ export var calculateStepsHelpers = function (steps) { return ({
18
+ lastStep: steps[steps.length - 1],
19
+ firstStep: steps[0],
20
+ }); };
@@ -12,7 +12,7 @@ export type DataListPayload<MULTIPLE extends boolean> = {
12
12
  name?: string;
13
13
  value: DataListSelected<MULTIPLE>;
14
14
  };
15
- export type DataListOnSelect<MULTIPLE extends boolean> = (event: SyntheticEvent | KeyboardEvent, payload: DataListPayload<MULTIPLE>) => void;
15
+ export type DataListOnSelect<MULTIPLE extends boolean> = (event: SyntheticEvent | KeyboardEvent | MouseEvent, payload: DataListPayload<MULTIPLE>) => void;
16
16
  export type DataListBaseProps<MULTIPLE extends boolean = false> = {
17
17
  /** Имя списка */
18
18
  name?: string;
@@ -1,10 +1,11 @@
1
1
  import { __assign, __rest } from "tslib";
2
2
  import React, { forwardRef } from 'react';
3
3
  import { useMultiRef } from '../../../../hooks/useMultiRef';
4
+ import { isFunction } from '../../../../utils';
4
5
  import { Input } from '../../../Input';
5
6
  import { dateInputMask } from './utils';
6
7
  export var DateInput = forwardRef(function (_a, ref) {
7
- var valueProp = _a.value, defaultValue = _a.defaultValue, other = __rest(_a, ["value", "defaultValue"]);
8
- return (React.createElement(Input, __assign({ value: dateInputMask(valueProp), defaultValue: dateInputMask(defaultValue) }, other, { ref: useMultiRef([ref]) })));
8
+ var valueProp = _a.value, defaultValue = _a.defaultValue, steps = _a.steps, placeholder = _a.placeholder, other = __rest(_a, ["value", "defaultValue", "steps", "placeholder"]);
9
+ return (React.createElement(Input, __assign({ value: dateInputMask(valueProp, steps), defaultValue: dateInputMask(defaultValue, steps) }, other, { placeholder: isFunction(placeholder) ? placeholder(steps) : placeholder, ref: useMultiRef([ref]) })));
9
10
  });
10
11
  DateInput.displayName = 'DateInput';
@@ -1,9 +1,13 @@
1
1
  import type { ComponentRef } from 'react';
2
- import type { ExtendableComponentPropsWithRef } from '../../../../types/ExtendableComponentPropsWithRef';
2
+ import type { ExtendableComponentPropsWithRef } from '../../../../types';
3
+ import type { CalendarSteps } from '../../../Calendar';
3
4
  import type { FIELD_CONTROL_DEFAULT_TAG } from '../../../FieldControl';
4
5
  import type { InputProps } from '../../../Input';
6
+ import type { InputPropPlaceholder } from '../../types';
5
7
  export type DateInputRef = ComponentRef<typeof FIELD_CONTROL_DEFAULT_TAG>;
6
8
  export type DateInputProps = ExtendableComponentPropsWithRef<{
9
+ steps: CalendarSteps;
7
10
  value?: string;
8
11
  defaultValue?: string;
9
- } & Omit<InputProps, 'value' | 'defaultValue'>, typeof FIELD_CONTROL_DEFAULT_TAG>;
12
+ placeholder?: InputPropPlaceholder;
13
+ } & Omit<InputProps, 'value' | 'defaultValue' | 'placeholder'>, typeof FIELD_CONTROL_DEFAULT_TAG>;
@@ -1 +1,2 @@
1
- export declare const dateInputMask: (value: string | undefined) => string | undefined;
1
+ import type { CalendarSteps } from '../../../../../Calendar';
2
+ export declare const dateInputMask: (value: string | undefined, steps: CalendarSteps) => string | undefined;
@@ -1,14 +1,74 @@
1
- export var dateInputMask = function (value) {
1
+ var onlyOneDot = function (value) {
2
+ // Разрешить только первую точку, остальные убрать
3
+ var firstDotIndex = value.indexOf('.');
4
+ if (firstDotIndex === -1) {
5
+ return value;
6
+ }
7
+ // Сохраняем первую часть и одну точку
8
+ var beforeDot = value.slice(0, firstDotIndex + 1);
9
+ var afterDot = value.slice(firstDotIndex + 1).replace(/\./g, '');
10
+ return beforeDot + afterDot;
11
+ };
12
+ export var dateInputMask = function (value, steps) {
2
13
  if (!value) {
3
14
  return value;
4
15
  }
16
+ var hasDaysStep = steps.includes('days');
17
+ var hasMonthsStep = steps.includes('months');
18
+ var hasYearsStep = steps.includes('years');
19
+ var maxLength = 0;
5
20
  var newValue = value.replace(/[^0-9.]/g, ''); // Запрещаем ввод, кроме цифр и точек
6
21
  newValue = newValue.replace(/\.\.+/g, '..'); // Удаляем лишние точки
7
- newValue = newValue.replace(/^(\d)\.$/g, '0$1.'); // Добавляем 0 в D.
8
- newValue = newValue.replace(/^(\d\d)(\d)$/g, '$1.$2'); // Добавляем точку в DD.M
9
- newValue = newValue.replace(/^(\d\d)\.(\d)\.$/g, '$1.0$2.'); // Добавляем 0 в DD.M.
10
- newValue = newValue.replace(/^(\d\d\.\d\d)(\d)$/g, '$1.$2'); // Добавляем точку в DD.MM.Y
11
- if (newValue.length > 10)
12
- newValue = newValue.slice(0, 10); // Ограничиваем длину
22
+ // DD
23
+ if (hasDaysStep && !hasMonthsStep && !hasYearsStep) {
24
+ maxLength = 2;
25
+ newValue = newValue.replace('.', '');
26
+ }
27
+ // MM
28
+ if (!hasDaysStep && hasMonthsStep && !hasYearsStep) {
29
+ maxLength = 2;
30
+ newValue = newValue.replace('.', '');
31
+ }
32
+ // YYYY
33
+ if (!hasDaysStep && !hasMonthsStep && hasYearsStep) {
34
+ maxLength = 4;
35
+ newValue = newValue.replace('.', '');
36
+ }
37
+ // DD.MM.YYYY
38
+ if (hasDaysStep && hasMonthsStep && hasYearsStep) {
39
+ newValue = newValue.replace(/^(\d)\.$/g, '0$1.'); // Добавляем 0 в D.
40
+ newValue = newValue.replace(/^(\d\d)(\d)$/g, '$1.$2'); // Добавляем точку в DD.M
41
+ newValue = newValue.replace(/^(\d\d)\.(\d)\.$/g, '$1.0$2.'); // Добавляем 0 в DD.M.
42
+ newValue = newValue.replace(/^(\d\d\.\d\d)(\d)$/g, '$1.$2'); // Добавляем точку в DD.MM.Y
43
+ // + 2, так как одно соединение в виде "."
44
+ maxLength = 8 + 2;
45
+ }
46
+ // DD.MM
47
+ if (hasDaysStep && hasMonthsStep && !hasYearsStep) {
48
+ newValue = newValue.replace(/^(\d)\.$/g, '0$1.'); // Добавляем 0 в D.
49
+ newValue = newValue.replace(/^(\d\d)(\d)$/g, '$1.$2'); // Добавляем точку в DD.M
50
+ newValue = onlyOneDot(newValue); // Разрешаем только одну точку
51
+ // + 1, так как одно соединение в виде "."
52
+ maxLength = 4 + 1;
53
+ }
54
+ // DD.YYYY
55
+ if (hasDaysStep && !hasMonthsStep && hasYearsStep) {
56
+ newValue = newValue.replace(/^(\d)\.$/g, '0$1.'); // Добавляем 0 в D.
57
+ newValue = newValue.replace(/^(\d\d)(\d)$/g, '$1.$2'); // Добавляем точку в DD.Y
58
+ newValue = onlyOneDot(newValue);
59
+ // + 1, так как одно соединение в виде "."
60
+ maxLength = 6 + 1;
61
+ }
62
+ // MM.YYYY
63
+ if (!hasDaysStep && hasMonthsStep && hasYearsStep) {
64
+ newValue = newValue.replace(/^(\d)\.$/g, '0$1.'); // Добавляем 0 в M.
65
+ newValue = newValue.replace(/^(\d\d)(\d)$/g, '$1.$2'); // Добавляем точку в MM.Y
66
+ newValue = onlyOneDot(newValue);
67
+ // + 1, так как одно соединение в виде "."
68
+ maxLength = 6 + 1;
69
+ }
70
+ if (newValue.length > maxLength) {
71
+ newValue = newValue.slice(0, maxLength); // Ограничиваем длину
72
+ }
13
73
  return newValue;
14
74
  };