@gravity-ui/date-components 3.4.2 → 4.0.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 (401) hide show
  1. package/README.md +31 -0
  2. package/dist/cjs/components/Calendar/Calendar.d.ts +6 -2
  3. package/dist/cjs/components/Calendar/Calendar.js +1 -1
  4. package/dist/cjs/components/Calendar/Calendar.js.map +1 -1
  5. package/dist/cjs/components/CalendarView/Calendar.css +3 -0
  6. package/dist/cjs/components/CalendarView/Calendar.css.map +1 -1
  7. package/dist/cjs/components/CalendarView/CalendarView.d.ts +2 -1
  8. package/dist/cjs/components/CalendarView/CalendarView.js +8 -8
  9. package/dist/cjs/components/CalendarView/CalendarView.js.map +1 -1
  10. package/dist/cjs/components/CalendarView/hooks/types.d.ts +5 -3
  11. package/dist/cjs/components/CalendarView/hooks/types.js.map +1 -1
  12. package/dist/cjs/components/CalendarView/hooks/useCalendarCellProps.js +1 -2
  13. package/dist/cjs/components/CalendarView/hooks/useCalendarCellProps.js.map +1 -1
  14. package/dist/cjs/components/CalendarView/hooks/useCalendarGridProps.js +10 -3
  15. package/dist/cjs/components/CalendarView/hooks/useCalendarGridProps.js.map +1 -1
  16. package/dist/cjs/components/CalendarView/hooks/useCalendarProps.js +7 -1
  17. package/dist/cjs/components/CalendarView/hooks/useCalendarProps.js.map +1 -1
  18. package/dist/cjs/components/CalendarView/hooks/useCalendarState.d.ts +5 -3
  19. package/dist/cjs/components/CalendarView/hooks/useCalendarState.js +74 -30
  20. package/dist/cjs/components/CalendarView/hooks/useCalendarState.js.map +1 -1
  21. package/dist/cjs/components/CalendarView/hooks/useRangeCalendarState.js +16 -9
  22. package/dist/cjs/components/CalendarView/hooks/useRangeCalendarState.js.map +1 -1
  23. package/dist/cjs/components/DateField/DateField.d.ts +1 -1
  24. package/dist/cjs/components/DateField/DateField.js +5 -17
  25. package/dist/cjs/components/DateField/DateField.js.map +1 -1
  26. package/dist/cjs/components/DateField/IncompleteDate.d.ts +28 -0
  27. package/dist/cjs/components/DateField/IncompleteDate.js +116 -0
  28. package/dist/cjs/components/DateField/IncompleteDate.js.map +1 -0
  29. package/dist/cjs/components/DateField/hooks/useBaseDateFieldState.d.ts +34 -68
  30. package/dist/cjs/components/DateField/hooks/useBaseDateFieldState.js +18 -249
  31. package/dist/cjs/components/DateField/hooks/useBaseDateFieldState.js.map +1 -1
  32. package/dist/cjs/components/DateField/hooks/useDateFieldProps.d.ts +2 -0
  33. package/dist/cjs/components/DateField/hooks/useDateFieldProps.js +250 -54
  34. package/dist/cjs/components/DateField/hooks/useDateFieldProps.js.map +1 -1
  35. package/dist/cjs/components/DateField/hooks/useDateFieldState.d.ts +20 -2
  36. package/dist/cjs/components/DateField/hooks/useDateFieldState.js +84 -118
  37. package/dist/cjs/components/DateField/hooks/useDateFieldState.js.map +1 -1
  38. package/dist/cjs/components/DateField/hooks/useFocusManager.d.ts +29 -0
  39. package/dist/cjs/components/DateField/hooks/useFocusManager.js +116 -0
  40. package/dist/cjs/components/DateField/hooks/useFocusManager.js.map +1 -0
  41. package/dist/cjs/components/{RangeDateField → DateField}/hooks/useRangeDateFieldState.d.ts +1 -1
  42. package/dist/cjs/components/DateField/hooks/useRangeDateFieldState.js +236 -0
  43. package/dist/cjs/components/DateField/hooks/useRangeDateFieldState.js.map +1 -0
  44. package/dist/cjs/components/DateField/i18n/ru.json +1 -1
  45. package/dist/cjs/components/DateField/index.d.ts +2 -1
  46. package/dist/cjs/components/DateField/index.js +1 -1
  47. package/dist/cjs/components/DateField/index.js.map +1 -1
  48. package/dist/cjs/components/DateField/types.d.ts +2 -22
  49. package/dist/cjs/components/DateField/types.js.map +1 -1
  50. package/dist/cjs/components/DateField/utils.d.ts +21 -34
  51. package/dist/cjs/components/DateField/utils.js +180 -132
  52. package/dist/cjs/components/DateField/utils.js.map +1 -1
  53. package/dist/cjs/components/DatePicker/DatePicker.d.ts +3 -3
  54. package/dist/cjs/components/DatePicker/DatePicker.js +3 -4
  55. package/dist/cjs/components/DatePicker/DatePicker.js.map +1 -1
  56. package/dist/cjs/components/DatePicker/MobileCalendar.d.ts +1 -1
  57. package/dist/cjs/components/DatePicker/MobileCalendar.js +3 -5
  58. package/dist/cjs/components/DatePicker/MobileCalendar.js.map +1 -1
  59. package/dist/cjs/components/DatePicker/StubButton.d.ts +1 -1
  60. package/dist/cjs/components/DatePicker/hooks/datePickerStateFactory.d.ts +1 -1
  61. package/dist/cjs/components/DatePicker/hooks/datePickerStateFactory.js +15 -6
  62. package/dist/cjs/components/DatePicker/hooks/datePickerStateFactory.js.map +1 -1
  63. package/dist/cjs/components/DatePicker/hooks/useDatePickerProps.d.ts +2 -2
  64. package/dist/cjs/components/DatePicker/hooks/useDatePickerProps.js +30 -17
  65. package/dist/cjs/components/DatePicker/hooks/useDatePickerProps.js.map +1 -1
  66. package/dist/cjs/components/HiddenInput/HiddenInput.d.ts +2 -5
  67. package/dist/cjs/components/HiddenInput/HiddenInput.js +2 -4
  68. package/dist/cjs/components/HiddenInput/HiddenInput.js.map +1 -1
  69. package/dist/cjs/components/RangeCalendar/RangeCalendar.d.ts +2 -2
  70. package/dist/cjs/components/RangeCalendar/RangeCalendar.js +2 -3
  71. package/dist/cjs/components/RangeCalendar/RangeCalendar.js.map +1 -1
  72. package/dist/cjs/components/RangeDateField/RangeDateField.d.ts +1 -1
  73. package/dist/cjs/components/RangeDateField/RangeDateField.js +6 -19
  74. package/dist/cjs/components/RangeDateField/RangeDateField.js.map +1 -1
  75. package/dist/cjs/components/RangeDateField/index.d.ts +0 -1
  76. package/dist/cjs/components/RangeDateField/index.js +0 -1
  77. package/dist/cjs/components/RangeDateField/index.js.map +1 -1
  78. package/dist/cjs/components/RangeDatePicker/RangeDatePicker.d.ts +2 -1
  79. package/dist/cjs/components/RangeDatePicker/RangeDatePicker.js +4 -5
  80. package/dist/cjs/components/RangeDatePicker/RangeDatePicker.js.map +1 -1
  81. package/dist/cjs/components/RangeDatePicker/hooks/useRangeDatePickerState.d.ts +1 -1
  82. package/dist/cjs/components/RangeDatePicker/hooks/useRangeDatePickerState.js +3 -4
  83. package/dist/cjs/components/RangeDatePicker/hooks/useRangeDatePickerState.js.map +1 -1
  84. package/dist/cjs/components/RangeDateSelection/RangeDateSelection.d.ts +1 -1
  85. package/dist/cjs/components/RangeDateSelection/RangeDateSelection.js +4 -5
  86. package/dist/cjs/components/RangeDateSelection/RangeDateSelection.js.map +1 -1
  87. package/dist/cjs/components/RangeDateSelection/components/NowLine/NowLine.d.ts +2 -1
  88. package/dist/cjs/components/RangeDateSelection/components/Ruler/Ruler.d.ts +1 -1
  89. package/dist/cjs/components/RangeDateSelection/components/Ruler/Ruler.js +1 -1
  90. package/dist/cjs/components/RangeDateSelection/components/Ruler/Ruler.js.map +1 -1
  91. package/dist/cjs/components/RangeDateSelection/components/RulerViewport/RulerViewport.js +2 -2
  92. package/dist/cjs/components/RangeDateSelection/components/RulerViewport/RulerViewport.js.map +1 -1
  93. package/dist/cjs/components/RangeDateSelection/components/SelectionControl/SelectionControl.d.ts +2 -1
  94. package/dist/cjs/components/RangeDateSelection/components/SelectionControl/SelectionControl.js +12 -21
  95. package/dist/cjs/components/RangeDateSelection/components/SelectionControl/SelectionControl.js.map +1 -1
  96. package/dist/cjs/components/RangeDateSelection/components/Ticks/MiddleTicks.d.ts +1 -1
  97. package/dist/cjs/components/RangeDateSelection/components/Ticks/SlitTicks.d.ts +1 -1
  98. package/dist/cjs/components/RangeDateSelection/components/Ticks/Ticks.d.ts +2 -2
  99. package/dist/cjs/components/RangeDateSelection/components/Ticks/Ticks.js.map +1 -1
  100. package/dist/cjs/components/RangeDateSelection/components/Ticks/UnavialableTicks.d.ts +3 -4
  101. package/dist/cjs/components/RangeDateSelection/components/Ticks/UnavialableTicks.js +0 -3
  102. package/dist/cjs/components/RangeDateSelection/components/Ticks/UnavialableTicks.js.map +1 -1
  103. package/dist/cjs/components/RangeDateSelection/hooks/useRangeDateSelectionState.js +9 -10
  104. package/dist/cjs/components/RangeDateSelection/hooks/useRangeDateSelectionState.js.map +1 -1
  105. package/dist/cjs/components/RangeDateSelection/utils/span.d.ts +2 -1
  106. package/dist/cjs/components/RangeDateSelection/utils/span.js.map +1 -1
  107. package/dist/cjs/components/RelativeDateField/RelativeDateField.d.ts +1 -1
  108. package/dist/cjs/components/RelativeDateField/RelativeDateField.js +3 -40
  109. package/dist/cjs/components/RelativeDateField/RelativeDateField.js.map +1 -1
  110. package/dist/cjs/components/RelativeDateField/hooks/useRelativeDateFieldProps.d.ts +7 -2
  111. package/dist/cjs/components/RelativeDateField/hooks/useRelativeDateFieldProps.js +71 -9
  112. package/dist/cjs/components/RelativeDateField/hooks/useRelativeDateFieldProps.js.map +1 -1
  113. package/dist/cjs/components/RelativeDateField/hooks/useRelativeDateFieldState.d.ts +2 -0
  114. package/dist/cjs/components/RelativeDateField/hooks/useRelativeDateFieldState.js +48 -34
  115. package/dist/cjs/components/RelativeDateField/hooks/useRelativeDateFieldState.js.map +1 -1
  116. package/dist/cjs/components/RelativeDatePicker/RelativeDatePicker.d.ts +1 -1
  117. package/dist/cjs/components/RelativeDatePicker/RelativeDatePicker.js +7 -4
  118. package/dist/cjs/components/RelativeDatePicker/RelativeDatePicker.js.map +1 -1
  119. package/dist/cjs/components/RelativeDatePicker/hooks/useRelativeDatePickerProps.d.ts +1 -1
  120. package/dist/cjs/components/RelativeDatePicker/hooks/useRelativeDatePickerProps.js +52 -21
  121. package/dist/cjs/components/RelativeDatePicker/hooks/useRelativeDatePickerProps.js.map +1 -1
  122. package/dist/cjs/components/RelativeDatePicker/hooks/useRelativeDatePickerState.js +9 -10
  123. package/dist/cjs/components/RelativeDatePicker/hooks/useRelativeDatePickerState.js.map +1 -1
  124. package/dist/cjs/components/RelativeRangeDatePicker/RelativeRangeDatePicker.d.ts +2 -1
  125. package/dist/cjs/components/RelativeRangeDatePicker/RelativeRangeDatePicker.js +13 -5
  126. package/dist/cjs/components/RelativeRangeDatePicker/RelativeRangeDatePicker.js.map +1 -1
  127. package/dist/cjs/components/RelativeRangeDatePicker/components/Control/Control.css +1 -1
  128. package/dist/cjs/components/RelativeRangeDatePicker/components/Control/Control.css.map +1 -1
  129. package/dist/cjs/components/RelativeRangeDatePicker/components/Control/Control.d.ts +2 -1
  130. package/dist/cjs/components/RelativeRangeDatePicker/components/Control/Control.js +12 -6
  131. package/dist/cjs/components/RelativeRangeDatePicker/components/Control/Control.js.map +1 -1
  132. package/dist/cjs/components/RelativeRangeDatePicker/components/PickerDialog/PickerDialog.d.ts +1 -1
  133. package/dist/cjs/components/RelativeRangeDatePicker/components/PickerDialog/PickerDialog.js +6 -8
  134. package/dist/cjs/components/RelativeRangeDatePicker/components/PickerDialog/PickerDialog.js.map +1 -1
  135. package/dist/cjs/components/RelativeRangeDatePicker/components/PickerDialog/PickerDoc.d.ts +5 -3
  136. package/dist/cjs/components/RelativeRangeDatePicker/components/PickerDialog/PickerDoc.js +18 -16
  137. package/dist/cjs/components/RelativeRangeDatePicker/components/PickerDialog/PickerDoc.js.map +1 -1
  138. package/dist/cjs/components/RelativeRangeDatePicker/components/PickerDialog/PickerForm.d.ts +2 -1
  139. package/dist/cjs/components/RelativeRangeDatePicker/components/PickerDialog/PickerForm.js +33 -7
  140. package/dist/cjs/components/RelativeRangeDatePicker/components/PickerDialog/PickerForm.js.map +1 -1
  141. package/dist/cjs/components/RelativeRangeDatePicker/components/PickerDialog/useRelativeRangeDatePickerDialogState.d.ts +3 -3
  142. package/dist/cjs/components/RelativeRangeDatePicker/components/PickerDialog/useRelativeRangeDatePickerDialogState.js +19 -18
  143. package/dist/cjs/components/RelativeRangeDatePicker/components/PickerDialog/useRelativeRangeDatePickerDialogState.js.map +1 -1
  144. package/dist/cjs/components/RelativeRangeDatePicker/components/Presets/Presets.d.ts +6 -9
  145. package/dist/cjs/components/RelativeRangeDatePicker/components/Presets/Presets.js +9 -12
  146. package/dist/cjs/components/RelativeRangeDatePicker/components/Presets/Presets.js.map +1 -1
  147. package/dist/cjs/components/RelativeRangeDatePicker/components/Presets/defaultPresets.d.ts +2 -2
  148. package/dist/cjs/components/RelativeRangeDatePicker/components/Presets/defaultPresets.js.map +1 -1
  149. package/dist/cjs/components/RelativeRangeDatePicker/components/Presets/utils.d.ts +9 -4
  150. package/dist/cjs/components/RelativeRangeDatePicker/components/Presets/utils.js +27 -16
  151. package/dist/cjs/components/RelativeRangeDatePicker/components/Presets/utils.js.map +1 -1
  152. package/dist/cjs/components/RelativeRangeDatePicker/components/Zones/Zones.d.ts +3 -3
  153. package/dist/cjs/components/RelativeRangeDatePicker/components/Zones/Zones.js +3 -4
  154. package/dist/cjs/components/RelativeRangeDatePicker/components/Zones/Zones.js.map +1 -1
  155. package/dist/cjs/components/RelativeRangeDatePicker/hooks/useRelativeRangeDatePickerState.js +8 -7
  156. package/dist/cjs/components/RelativeRangeDatePicker/hooks/useRelativeRangeDatePickerState.js.map +1 -1
  157. package/dist/cjs/components/RelativeRangeDatePicker/utils.d.ts +2 -2
  158. package/dist/cjs/components/RelativeRangeDatePicker/utils.js +32 -9
  159. package/dist/cjs/components/RelativeRangeDatePicker/utils.js.map +1 -1
  160. package/dist/cjs/components/utils/constants.d.ts +2 -0
  161. package/dist/cjs/components/utils/constants.js +7 -1
  162. package/dist/cjs/components/utils/constants.js.map +1 -1
  163. package/dist/cjs/components/utils/dates.d.ts +6 -1
  164. package/dist/cjs/components/utils/dates.js +6 -1
  165. package/dist/cjs/components/utils/dates.js.map +1 -1
  166. package/dist/cjs/components/utils/filterDOMProps.js +1 -1
  167. package/dist/cjs/components/utils/filterDOMProps.js.map +1 -1
  168. package/dist/cjs/components/utils/mergeProps.js +1 -1
  169. package/dist/cjs/components/utils/mergeProps.js.map +1 -1
  170. package/dist/cjs/components/utils/validation/datePicker.js +1 -1
  171. package/dist/cjs/components/utils/validation/datePicker.js.map +1 -1
  172. package/dist/cjs/components/utils/validation/i18n/ru.json +2 -2
  173. package/dist/cjs/components/utils/validation/relativeRangeDatePicker.d.ts +7 -11
  174. package/dist/cjs/components/utils/validation/relativeRangeDatePicker.js +6 -1
  175. package/dist/cjs/components/utils/validation/relativeRangeDatePicker.js.map +1 -1
  176. package/dist/cjs/hooks/useEventHandler.js +1 -2
  177. package/dist/cjs/hooks/useEventHandler.js.map +1 -1
  178. package/dist/cjs/hooks/useMove.d.ts +2 -2
  179. package/dist/cjs/hooks/useMove.js +6 -9
  180. package/dist/cjs/hooks/useMove.js.map +1 -1
  181. package/dist/cjs/hooks/useResizeObserver.js +1 -1
  182. package/dist/cjs/hooks/useResizeObserver.js.map +1 -1
  183. package/dist/cjs/package.json +1 -1
  184. package/dist/docs/INDEX.md +131 -0
  185. package/dist/docs/components/Calendar.md +125 -0
  186. package/dist/docs/components/DateField.md +206 -0
  187. package/dist/docs/components/DatePicker.md +194 -0
  188. package/dist/docs/components/RangeCalendar.md +125 -0
  189. package/dist/docs/components/RelativeDateField.md +73 -0
  190. package/dist/docs/components/RelativeDatePicker.md +59 -0
  191. package/dist/esm/components/Calendar/Calendar.d.ts +6 -2
  192. package/dist/esm/components/Calendar/Calendar.js +1 -1
  193. package/dist/esm/components/Calendar/Calendar.js.map +1 -1
  194. package/dist/esm/components/CalendarView/Calendar.css +3 -0
  195. package/dist/esm/components/CalendarView/Calendar.css.map +1 -1
  196. package/dist/esm/components/CalendarView/CalendarView.d.ts +2 -1
  197. package/dist/esm/components/CalendarView/CalendarView.js +8 -8
  198. package/dist/esm/components/CalendarView/CalendarView.js.map +1 -1
  199. package/dist/esm/components/CalendarView/hooks/types.d.ts +5 -3
  200. package/dist/esm/components/CalendarView/hooks/types.js.map +1 -1
  201. package/dist/esm/components/CalendarView/hooks/useCalendarCellProps.js +1 -2
  202. package/dist/esm/components/CalendarView/hooks/useCalendarCellProps.js.map +1 -1
  203. package/dist/esm/components/CalendarView/hooks/useCalendarGridProps.js +10 -3
  204. package/dist/esm/components/CalendarView/hooks/useCalendarGridProps.js.map +1 -1
  205. package/dist/esm/components/CalendarView/hooks/useCalendarProps.js +7 -1
  206. package/dist/esm/components/CalendarView/hooks/useCalendarProps.js.map +1 -1
  207. package/dist/esm/components/CalendarView/hooks/useCalendarState.d.ts +5 -3
  208. package/dist/esm/components/CalendarView/hooks/useCalendarState.js +74 -30
  209. package/dist/esm/components/CalendarView/hooks/useCalendarState.js.map +1 -1
  210. package/dist/esm/components/CalendarView/hooks/useRangeCalendarState.js +16 -10
  211. package/dist/esm/components/CalendarView/hooks/useRangeCalendarState.js.map +1 -1
  212. package/dist/esm/components/DateField/DateField.d.ts +1 -1
  213. package/dist/esm/components/DateField/DateField.js +6 -18
  214. package/dist/esm/components/DateField/DateField.js.map +1 -1
  215. package/dist/esm/components/DateField/IncompleteDate.d.ts +28 -0
  216. package/dist/esm/components/DateField/IncompleteDate.js +112 -0
  217. package/dist/esm/components/DateField/IncompleteDate.js.map +1 -0
  218. package/dist/esm/components/DateField/hooks/useBaseDateFieldState.d.ts +34 -68
  219. package/dist/esm/components/DateField/hooks/useBaseDateFieldState.js +17 -248
  220. package/dist/esm/components/DateField/hooks/useBaseDateFieldState.js.map +1 -1
  221. package/dist/esm/components/DateField/hooks/useDateFieldProps.d.ts +2 -0
  222. package/dist/esm/components/DateField/hooks/useDateFieldProps.js +250 -54
  223. package/dist/esm/components/DateField/hooks/useDateFieldProps.js.map +1 -1
  224. package/dist/esm/components/DateField/hooks/useDateFieldState.d.ts +20 -2
  225. package/dist/esm/components/DateField/hooks/useDateFieldState.js +85 -119
  226. package/dist/esm/components/DateField/hooks/useDateFieldState.js.map +1 -1
  227. package/dist/esm/components/DateField/hooks/useFocusManager.d.ts +29 -0
  228. package/dist/esm/components/DateField/hooks/useFocusManager.js +112 -0
  229. package/dist/esm/components/DateField/hooks/useFocusManager.js.map +1 -0
  230. package/dist/esm/components/{RangeDateField → DateField}/hooks/useRangeDateFieldState.d.ts +1 -1
  231. package/dist/esm/components/DateField/hooks/useRangeDateFieldState.js +232 -0
  232. package/dist/esm/components/DateField/hooks/useRangeDateFieldState.js.map +1 -0
  233. package/dist/esm/components/DateField/i18n/ru.json +1 -1
  234. package/dist/esm/components/DateField/index.d.ts +2 -1
  235. package/dist/esm/components/DateField/index.js +1 -1
  236. package/dist/esm/components/DateField/index.js.map +1 -1
  237. package/dist/esm/components/DateField/types.d.ts +2 -22
  238. package/dist/esm/components/DateField/types.js.map +1 -1
  239. package/dist/esm/components/DateField/utils.d.ts +21 -34
  240. package/dist/esm/components/DateField/utils.js +179 -125
  241. package/dist/esm/components/DateField/utils.js.map +1 -1
  242. package/dist/esm/components/DatePicker/DatePicker.d.ts +3 -3
  243. package/dist/esm/components/DatePicker/DatePicker.js +3 -5
  244. package/dist/esm/components/DatePicker/DatePicker.js.map +1 -1
  245. package/dist/esm/components/DatePicker/MobileCalendar.d.ts +1 -1
  246. package/dist/esm/components/DatePicker/MobileCalendar.js +3 -5
  247. package/dist/esm/components/DatePicker/MobileCalendar.js.map +1 -1
  248. package/dist/esm/components/DatePicker/StubButton.d.ts +1 -1
  249. package/dist/esm/components/DatePicker/hooks/datePickerStateFactory.d.ts +1 -1
  250. package/dist/esm/components/DatePicker/hooks/datePickerStateFactory.js +15 -6
  251. package/dist/esm/components/DatePicker/hooks/datePickerStateFactory.js.map +1 -1
  252. package/dist/esm/components/DatePicker/hooks/useDatePickerProps.d.ts +2 -2
  253. package/dist/esm/components/DatePicker/hooks/useDatePickerProps.js +30 -18
  254. package/dist/esm/components/DatePicker/hooks/useDatePickerProps.js.map +1 -1
  255. package/dist/esm/components/HiddenInput/HiddenInput.d.ts +2 -5
  256. package/dist/esm/components/HiddenInput/HiddenInput.js +3 -4
  257. package/dist/esm/components/HiddenInput/HiddenInput.js.map +1 -1
  258. package/dist/esm/components/RangeCalendar/RangeCalendar.d.ts +2 -2
  259. package/dist/esm/components/RangeCalendar/RangeCalendar.js +2 -3
  260. package/dist/esm/components/RangeCalendar/RangeCalendar.js.map +1 -1
  261. package/dist/esm/components/RangeDateField/RangeDateField.d.ts +1 -1
  262. package/dist/esm/components/RangeDateField/RangeDateField.js +7 -20
  263. package/dist/esm/components/RangeDateField/RangeDateField.js.map +1 -1
  264. package/dist/esm/components/RangeDateField/index.d.ts +0 -1
  265. package/dist/esm/components/RangeDateField/index.js +0 -1
  266. package/dist/esm/components/RangeDateField/index.js.map +1 -1
  267. package/dist/esm/components/RangeDatePicker/RangeDatePicker.d.ts +2 -1
  268. package/dist/esm/components/RangeDatePicker/RangeDatePicker.js +4 -6
  269. package/dist/esm/components/RangeDatePicker/RangeDatePicker.js.map +1 -1
  270. package/dist/esm/components/RangeDatePicker/hooks/useRangeDatePickerState.d.ts +1 -1
  271. package/dist/esm/components/RangeDatePicker/hooks/useRangeDatePickerState.js +2 -3
  272. package/dist/esm/components/RangeDatePicker/hooks/useRangeDatePickerState.js.map +1 -1
  273. package/dist/esm/components/RangeDateSelection/RangeDateSelection.d.ts +1 -1
  274. package/dist/esm/components/RangeDateSelection/RangeDateSelection.js +4 -5
  275. package/dist/esm/components/RangeDateSelection/RangeDateSelection.js.map +1 -1
  276. package/dist/esm/components/RangeDateSelection/components/NowLine/NowLine.d.ts +2 -1
  277. package/dist/esm/components/RangeDateSelection/components/Ruler/Ruler.d.ts +1 -1
  278. package/dist/esm/components/RangeDateSelection/components/Ruler/Ruler.js +1 -1
  279. package/dist/esm/components/RangeDateSelection/components/Ruler/Ruler.js.map +1 -1
  280. package/dist/esm/components/RangeDateSelection/components/RulerViewport/RulerViewport.js +2 -2
  281. package/dist/esm/components/RangeDateSelection/components/RulerViewport/RulerViewport.js.map +1 -1
  282. package/dist/esm/components/RangeDateSelection/components/SelectionControl/SelectionControl.d.ts +2 -1
  283. package/dist/esm/components/RangeDateSelection/components/SelectionControl/SelectionControl.js +12 -22
  284. package/dist/esm/components/RangeDateSelection/components/SelectionControl/SelectionControl.js.map +1 -1
  285. package/dist/esm/components/RangeDateSelection/components/Ticks/MiddleTicks.d.ts +1 -1
  286. package/dist/esm/components/RangeDateSelection/components/Ticks/SlitTicks.d.ts +1 -1
  287. package/dist/esm/components/RangeDateSelection/components/Ticks/Ticks.d.ts +2 -2
  288. package/dist/esm/components/RangeDateSelection/components/Ticks/Ticks.js.map +1 -1
  289. package/dist/esm/components/RangeDateSelection/components/Ticks/UnavialableTicks.d.ts +3 -4
  290. package/dist/esm/components/RangeDateSelection/components/Ticks/UnavialableTicks.js +1 -2
  291. package/dist/esm/components/RangeDateSelection/components/Ticks/UnavialableTicks.js.map +1 -1
  292. package/dist/esm/components/RangeDateSelection/hooks/useRangeDateSelectionState.js +9 -10
  293. package/dist/esm/components/RangeDateSelection/hooks/useRangeDateSelectionState.js.map +1 -1
  294. package/dist/esm/components/RangeDateSelection/utils/span.d.ts +2 -1
  295. package/dist/esm/components/RangeDateSelection/utils/span.js.map +1 -1
  296. package/dist/esm/components/RelativeDateField/RelativeDateField.d.ts +1 -1
  297. package/dist/esm/components/RelativeDateField/RelativeDateField.js +4 -40
  298. package/dist/esm/components/RelativeDateField/RelativeDateField.js.map +1 -1
  299. package/dist/esm/components/RelativeDateField/hooks/useRelativeDateFieldProps.d.ts +7 -2
  300. package/dist/esm/components/RelativeDateField/hooks/useRelativeDateFieldProps.js +71 -9
  301. package/dist/esm/components/RelativeDateField/hooks/useRelativeDateFieldProps.js.map +1 -1
  302. package/dist/esm/components/RelativeDateField/hooks/useRelativeDateFieldState.d.ts +2 -0
  303. package/dist/esm/components/RelativeDateField/hooks/useRelativeDateFieldState.js +48 -34
  304. package/dist/esm/components/RelativeDateField/hooks/useRelativeDateFieldState.js.map +1 -1
  305. package/dist/esm/components/RelativeDatePicker/RelativeDatePicker.d.ts +1 -1
  306. package/dist/esm/components/RelativeDatePicker/RelativeDatePicker.js +7 -4
  307. package/dist/esm/components/RelativeDatePicker/RelativeDatePicker.js.map +1 -1
  308. package/dist/esm/components/RelativeDatePicker/hooks/useRelativeDatePickerProps.d.ts +1 -1
  309. package/dist/esm/components/RelativeDatePicker/hooks/useRelativeDatePickerProps.js +52 -22
  310. package/dist/esm/components/RelativeDatePicker/hooks/useRelativeDatePickerProps.js.map +1 -1
  311. package/dist/esm/components/RelativeDatePicker/hooks/useRelativeDatePickerState.js +9 -10
  312. package/dist/esm/components/RelativeDatePicker/hooks/useRelativeDatePickerState.js.map +1 -1
  313. package/dist/esm/components/RelativeRangeDatePicker/RelativeRangeDatePicker.d.ts +2 -1
  314. package/dist/esm/components/RelativeRangeDatePicker/RelativeRangeDatePicker.js +13 -5
  315. package/dist/esm/components/RelativeRangeDatePicker/RelativeRangeDatePicker.js.map +1 -1
  316. package/dist/esm/components/RelativeRangeDatePicker/components/Control/Control.css +1 -1
  317. package/dist/esm/components/RelativeRangeDatePicker/components/Control/Control.css.map +1 -1
  318. package/dist/esm/components/RelativeRangeDatePicker/components/Control/Control.d.ts +2 -1
  319. package/dist/esm/components/RelativeRangeDatePicker/components/Control/Control.js +12 -6
  320. package/dist/esm/components/RelativeRangeDatePicker/components/Control/Control.js.map +1 -1
  321. package/dist/esm/components/RelativeRangeDatePicker/components/PickerDialog/PickerDialog.d.ts +1 -1
  322. package/dist/esm/components/RelativeRangeDatePicker/components/PickerDialog/PickerDialog.js +6 -8
  323. package/dist/esm/components/RelativeRangeDatePicker/components/PickerDialog/PickerDialog.js.map +1 -1
  324. package/dist/esm/components/RelativeRangeDatePicker/components/PickerDialog/PickerDoc.d.ts +5 -3
  325. package/dist/esm/components/RelativeRangeDatePicker/components/PickerDialog/PickerDoc.js +18 -17
  326. package/dist/esm/components/RelativeRangeDatePicker/components/PickerDialog/PickerDoc.js.map +1 -1
  327. package/dist/esm/components/RelativeRangeDatePicker/components/PickerDialog/PickerForm.d.ts +2 -1
  328. package/dist/esm/components/RelativeRangeDatePicker/components/PickerDialog/PickerForm.js +32 -7
  329. package/dist/esm/components/RelativeRangeDatePicker/components/PickerDialog/PickerForm.js.map +1 -1
  330. package/dist/esm/components/RelativeRangeDatePicker/components/PickerDialog/useRelativeRangeDatePickerDialogState.d.ts +3 -3
  331. package/dist/esm/components/RelativeRangeDatePicker/components/PickerDialog/useRelativeRangeDatePickerDialogState.js +19 -18
  332. package/dist/esm/components/RelativeRangeDatePicker/components/PickerDialog/useRelativeRangeDatePickerDialogState.js.map +1 -1
  333. package/dist/esm/components/RelativeRangeDatePicker/components/Presets/Presets.d.ts +6 -9
  334. package/dist/esm/components/RelativeRangeDatePicker/components/Presets/Presets.js +8 -10
  335. package/dist/esm/components/RelativeRangeDatePicker/components/Presets/Presets.js.map +1 -1
  336. package/dist/esm/components/RelativeRangeDatePicker/components/Presets/defaultPresets.d.ts +2 -2
  337. package/dist/esm/components/RelativeRangeDatePicker/components/Presets/defaultPresets.js.map +1 -1
  338. package/dist/esm/components/RelativeRangeDatePicker/components/Presets/utils.d.ts +9 -4
  339. package/dist/esm/components/RelativeRangeDatePicker/components/Presets/utils.js +26 -15
  340. package/dist/esm/components/RelativeRangeDatePicker/components/Presets/utils.js.map +1 -1
  341. package/dist/esm/components/RelativeRangeDatePicker/components/Zones/Zones.d.ts +3 -3
  342. package/dist/esm/components/RelativeRangeDatePicker/components/Zones/Zones.js +3 -4
  343. package/dist/esm/components/RelativeRangeDatePicker/components/Zones/Zones.js.map +1 -1
  344. package/dist/esm/components/RelativeRangeDatePicker/hooks/useRelativeRangeDatePickerState.js +8 -7
  345. package/dist/esm/components/RelativeRangeDatePicker/hooks/useRelativeRangeDatePickerState.js.map +1 -1
  346. package/dist/esm/components/RelativeRangeDatePicker/utils.d.ts +2 -2
  347. package/dist/esm/components/RelativeRangeDatePicker/utils.js +33 -9
  348. package/dist/esm/components/RelativeRangeDatePicker/utils.js.map +1 -1
  349. package/dist/esm/components/utils/constants.d.ts +2 -0
  350. package/dist/esm/components/utils/constants.js +6 -0
  351. package/dist/esm/components/utils/constants.js.map +1 -1
  352. package/dist/esm/components/utils/dates.d.ts +6 -1
  353. package/dist/esm/components/utils/dates.js +5 -1
  354. package/dist/esm/components/utils/dates.js.map +1 -1
  355. package/dist/esm/components/utils/filterDOMProps.js +1 -1
  356. package/dist/esm/components/utils/filterDOMProps.js.map +1 -1
  357. package/dist/esm/components/utils/mergeProps.js +1 -1
  358. package/dist/esm/components/utils/mergeProps.js.map +1 -1
  359. package/dist/esm/components/utils/validation/datePicker.js +1 -1
  360. package/dist/esm/components/utils/validation/datePicker.js.map +1 -1
  361. package/dist/esm/components/utils/validation/i18n/ru.json +2 -2
  362. package/dist/esm/components/utils/validation/relativeRangeDatePicker.d.ts +7 -11
  363. package/dist/esm/components/utils/validation/relativeRangeDatePicker.js +6 -1
  364. package/dist/esm/components/utils/validation/relativeRangeDatePicker.js.map +1 -1
  365. package/dist/esm/hooks/useEventHandler.js +1 -2
  366. package/dist/esm/hooks/useEventHandler.js.map +1 -1
  367. package/dist/esm/hooks/useMove.d.ts +2 -2
  368. package/dist/esm/hooks/useMove.js +6 -9
  369. package/dist/esm/hooks/useMove.js.map +1 -1
  370. package/dist/esm/hooks/useResizeObserver.js +1 -1
  371. package/dist/esm/hooks/useResizeObserver.js.map +1 -1
  372. package/dist/esm/package.json +1 -1
  373. package/package.json +34 -27
  374. package/dist/cjs/components/RangeDateField/hooks/useRangeDateFieldState.js +0 -224
  375. package/dist/cjs/components/RangeDateField/hooks/useRangeDateFieldState.js.map +0 -1
  376. package/dist/cjs/components/RangeDateField/utils/createPlaceholderRangeValue.d.ts +0 -5
  377. package/dist/cjs/components/RangeDateField/utils/createPlaceholderRangeValue.js +0 -9
  378. package/dist/cjs/components/RangeDateField/utils/createPlaceholderRangeValue.js.map +0 -1
  379. package/dist/cjs/components/RangeDateField/utils/getRangeEditableSections.d.ts +0 -5
  380. package/dist/cjs/components/RangeDateField/utils/getRangeEditableSections.js +0 -42
  381. package/dist/cjs/components/RangeDateField/utils/getRangeEditableSections.js.map +0 -1
  382. package/dist/cjs/components/RangeDateField/utils/index.d.ts +0 -3
  383. package/dist/cjs/components/RangeDateField/utils/index.js +0 -7
  384. package/dist/cjs/components/RangeDateField/utils/index.js.map +0 -1
  385. package/dist/cjs/components/RangeDateField/utils/isValidRange.d.ts +0 -3
  386. package/dist/cjs/components/RangeDateField/utils/isValidRange.js +0 -7
  387. package/dist/cjs/components/RangeDateField/utils/isValidRange.js.map +0 -1
  388. package/dist/esm/components/RangeDateField/hooks/useRangeDateFieldState.js +0 -220
  389. package/dist/esm/components/RangeDateField/hooks/useRangeDateFieldState.js.map +0 -1
  390. package/dist/esm/components/RangeDateField/utils/createPlaceholderRangeValue.d.ts +0 -5
  391. package/dist/esm/components/RangeDateField/utils/createPlaceholderRangeValue.js +0 -6
  392. package/dist/esm/components/RangeDateField/utils/createPlaceholderRangeValue.js.map +0 -1
  393. package/dist/esm/components/RangeDateField/utils/getRangeEditableSections.d.ts +0 -5
  394. package/dist/esm/components/RangeDateField/utils/getRangeEditableSections.js +0 -39
  395. package/dist/esm/components/RangeDateField/utils/getRangeEditableSections.js.map +0 -1
  396. package/dist/esm/components/RangeDateField/utils/index.d.ts +0 -3
  397. package/dist/esm/components/RangeDateField/utils/index.js +0 -4
  398. package/dist/esm/components/RangeDateField/utils/index.js.map +0 -1
  399. package/dist/esm/components/RangeDateField/utils/isValidRange.d.ts +0 -3
  400. package/dist/esm/components/RangeDateField/utils/isValidRange.js +0 -4
  401. package/dist/esm/components/RangeDateField/utils/isValidRange.js.map +0 -1
@@ -3,20 +3,23 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.useDateFieldProps = useDateFieldProps;
4
4
  const tslib_1 = require("tslib");
5
5
  const react_1 = tslib_1.__importDefault(require("react"));
6
+ const uikit_1 = require("@gravity-ui/uikit");
7
+ const constants_js_1 = require("../../utils/constants.js");
8
+ const filterDOMProps_js_1 = require("../../utils/filterDOMProps.js");
6
9
  const utils_1 = require("../utils.js");
10
+ const useFocusManager_1 = require("./useFocusManager.js");
7
11
  function useDateFieldProps(state, props) {
8
12
  const inputRef = react_1.default.useRef(null);
9
13
  const [, setInnerState] = react_1.default.useState({});
10
- function setSelectedSections(section) {
11
- state.setSelectedSections(section);
12
- setInnerState({});
13
- }
14
+ const enteredKeys = react_1.default.useRef('');
15
+ const focusManager = (0, useFocusManager_1.useFocusManager)({ sections: state.sections });
16
+ const { text, positions } = react_1.default.useMemo(() => prepareState(state.sections), [state.sections]);
14
17
  react_1.default.useLayoutEffect(() => {
15
18
  const inputElement = inputRef.current;
16
19
  if (!inputElement) {
17
20
  return;
18
21
  }
19
- if (state.selectedSectionIndexes === null) {
22
+ if (focusManager.selectedSectionIndexes === null) {
20
23
  if (inputElement.scrollLeft) {
21
24
  // Ensure that input content is not marked as selected.
22
25
  // setting selection range to 0 causes issues in Safari.
@@ -25,8 +28,8 @@ function useDateFieldProps(state, props) {
25
28
  }
26
29
  return;
27
30
  }
28
- const firstSelectedSection = state.sections[state.selectedSectionIndexes.startIndex];
29
- const lastSelectedSection = state.sections[state.selectedSectionIndexes.endIndex];
31
+ const firstSelectedSection = positions[focusManager.selectedSectionIndexes.startIndex];
32
+ const lastSelectedSection = positions[focusManager.selectedSectionIndexes.endIndex];
30
33
  if (firstSelectedSection && lastSelectedSection) {
31
34
  const selectionStart = firstSelectedSection.start;
32
35
  const selectionEnd = lastSelectedSection.end;
@@ -37,23 +40,189 @@ function useDateFieldProps(state, props) {
37
40
  }
38
41
  });
39
42
  function syncSelectionFromDOM() {
40
- var _a, _b;
41
- state.focusSectionInPosition((_b = (_a = inputRef.current) === null || _a === void 0 ? void 0 : _a.selectionStart) !== null && _b !== void 0 ? _b : 0);
43
+ enteredKeys.current = '';
44
+ const position = inputRef.current?.selectionStart ?? 0;
45
+ const index = positions.findIndex((s) => s.end >= position);
46
+ focusManager.focusSection(index === -1 ? 0 : index);
42
47
  setInnerState({});
43
48
  }
44
49
  const inputMode = react_1.default.useMemo(() => {
45
- if (!state.selectedSectionIndexes) {
50
+ if (!focusManager.selectedSectionIndexes) {
46
51
  return 'text';
47
52
  }
48
- const activeSection = state.sections[state.selectedSectionIndexes.startIndex];
53
+ const activeSection = state.sections[focusManager.selectedSectionIndexes.startIndex];
49
54
  if (!activeSection || activeSection.contentType === 'letter') {
50
55
  return 'text';
51
56
  }
52
57
  return 'tel';
53
- }, [state.selectedSectionIndexes, state.sections]);
58
+ }, [focusManager.selectedSectionIndexes, state.sections]);
59
+ function onInput(key) {
60
+ if (state.readOnly || state.disabled) {
61
+ return;
62
+ }
63
+ const sectionIndex = focusManager.activeSectionIndex;
64
+ if (sectionIndex === -1) {
65
+ return;
66
+ }
67
+ const section = state.sections[sectionIndex];
68
+ const isLastSection = focusManager.isLastSection(sectionIndex);
69
+ let newValue = enteredKeys.current + key;
70
+ const onInputNumber = (numberValue) => {
71
+ let sectionValue = numberValue;
72
+ const sectionMaxValue = section.maxValue ?? 0;
73
+ const allowsZero = section.minValue === 0;
74
+ let shouldResetUserInput;
75
+ if (
76
+ // 12-hour clock format with AM/PM
77
+ section.type === 'hour' &&
78
+ (sectionMaxValue === 11 || section.minValue === 12)) {
79
+ if (sectionValue > 12) {
80
+ sectionValue = Number(key);
81
+ newValue = key;
82
+ }
83
+ if (sectionValue === 0) {
84
+ sectionValue = -Infinity;
85
+ }
86
+ if (sectionValue === 12) {
87
+ sectionValue = 0;
88
+ }
89
+ if (section.minValue === 12) {
90
+ sectionValue += 12;
91
+ }
92
+ shouldResetUserInput = Number(newValue + '0') > 12;
93
+ }
94
+ else if (sectionValue > sectionMaxValue) {
95
+ sectionValue = Number(key);
96
+ newValue = key;
97
+ if (sectionValue > sectionMaxValue) {
98
+ enteredKeys.current = '';
99
+ return;
100
+ }
101
+ }
102
+ const shouldSetValue = sectionValue > 0 || (sectionValue === 0 && allowsZero);
103
+ if (shouldSetValue) {
104
+ state.setSection(sectionIndex, sectionValue);
105
+ }
106
+ if (shouldResetUserInput === undefined) {
107
+ shouldResetUserInput = Number(newValue + '0') > sectionMaxValue;
108
+ }
109
+ const isMaxLength = newValue.length >= String(sectionMaxValue).length;
110
+ if (shouldResetUserInput) {
111
+ enteredKeys.current = '';
112
+ if (shouldSetValue) {
113
+ focusManager.focusNextSection();
114
+ }
115
+ }
116
+ else if (isMaxLength && shouldSetValue && !isLastSection) {
117
+ focusManager.focusNextSection();
118
+ }
119
+ else {
120
+ enteredKeys.current = newValue;
121
+ }
122
+ };
123
+ const onInputString = (stringValue) => {
124
+ const options = section.options ?? [];
125
+ let sectionValue = stringValue.toLocaleUpperCase();
126
+ let foundOptions = options.filter((v) => v.startsWith(sectionValue));
127
+ if (foundOptions.length === 0) {
128
+ if (stringValue !== key) {
129
+ sectionValue = key.toLocaleUpperCase();
130
+ foundOptions = options.filter((v) => v.startsWith(sectionValue));
131
+ }
132
+ if (foundOptions.length === 0) {
133
+ enteredKeys.current = '';
134
+ return;
135
+ }
136
+ }
137
+ const foundValue = foundOptions[0];
138
+ const index = options.indexOf(foundValue);
139
+ if (section.type === 'month') {
140
+ state.setSection(sectionIndex, index + 1);
141
+ }
142
+ else {
143
+ state.setSection(sectionIndex, index);
144
+ }
145
+ if (foundOptions.length > 1) {
146
+ enteredKeys.current = newValue;
147
+ }
148
+ else {
149
+ enteredKeys.current = '';
150
+ focusManager.focusNextSection();
151
+ }
152
+ };
153
+ switch (section.type) {
154
+ case 'day':
155
+ case 'hour':
156
+ case 'minute':
157
+ case 'second':
158
+ case 'quarter':
159
+ case 'year': {
160
+ if (!Number.isInteger(Number(newValue))) {
161
+ return;
162
+ }
163
+ const numberValue = Number(newValue);
164
+ onInputNumber(numberValue);
165
+ break;
166
+ }
167
+ case 'dayPeriod': {
168
+ onInputString(newValue);
169
+ break;
170
+ }
171
+ case 'weekday':
172
+ case 'month': {
173
+ if (Number.isInteger(Number(newValue))) {
174
+ const numberValue = Number(newValue);
175
+ onInputNumber(numberValue);
176
+ }
177
+ else {
178
+ onInputString(newValue);
179
+ }
180
+ break;
181
+ }
182
+ }
183
+ }
184
+ function backspace() {
185
+ if (focusManager.selectedSectionIndexes === null) {
186
+ return;
187
+ }
188
+ if (focusManager.selectedSectionIndexes.startIndex ===
189
+ focusManager.selectedSectionIndexes.endIndex) {
190
+ const activeSection = state.sections[focusManager.activeSectionIndex];
191
+ if (activeSection.value === null) {
192
+ focusManager.focusPreviousSection();
193
+ return;
194
+ }
195
+ else if (activeSection.contentType === 'digit') {
196
+ const newValue = Math.floor(activeSection.value / 10);
197
+ if (newValue !== 0) {
198
+ state.setSection(focusManager.activeSectionIndex, newValue);
199
+ enteredKeys.current = `${newValue}`;
200
+ return;
201
+ }
202
+ }
203
+ state.clearSection(focusManager.activeSectionIndex);
204
+ }
205
+ else {
206
+ state.clearAll();
207
+ }
208
+ }
209
+ const { focusWithinProps } = (0, uikit_1.useFocusWithin)({
210
+ onBlurWithin: () => {
211
+ state.confirmPlaceholder();
212
+ },
213
+ onFocusWithinChange(isFocusWithin) {
214
+ state.setActive(isFocusWithin);
215
+ },
216
+ });
217
+ const DOMProps = (0, filterDOMProps_js_1.filterDOMProps)(props);
218
+ delete DOMProps.id;
54
219
  return {
220
+ groupProps: {
221
+ ...DOMProps,
222
+ ...focusWithinProps,
223
+ },
55
224
  inputProps: {
56
- value: state.text,
225
+ value: state.isEmpty && !state.isActive && props.placeholder ? '' : text,
57
226
  view: props.view,
58
227
  size: props.size,
59
228
  disabled: state.disabled,
@@ -77,79 +246,75 @@ function useDateFieldProps(state, props) {
77
246
  }
78
247
  },
79
248
  onFocus(e) {
80
- var _a;
81
- (_a = props.onFocus) === null || _a === void 0 ? void 0 : _a.call(props, e);
82
- if (state.selectedSectionIndexes !== null) {
249
+ props.onFocus?.(e);
250
+ if (focusManager.selectedSectionIndexes !== null) {
251
+ setInnerState({});
83
252
  return;
84
253
  }
85
254
  const input = e.target;
86
- const isAutofocus = !inputRef.current;
87
255
  setTimeout(() => {
88
256
  if (!input || input !== inputRef.current) {
89
257
  return;
90
258
  }
91
- if (isAutofocus) {
92
- state.focusSectionInPosition(0);
93
- }
94
- else if (
95
- // avoid selecting all sections when focusing empty field without value
96
- input.value.length &&
97
- Number(input.selectionEnd) - Number(input.selectionStart) ===
98
- input.value.length) {
99
- setSelectedSections('all');
100
- }
101
- else {
102
- syncSelectionFromDOM();
103
- }
259
+ syncSelectionFromDOM();
104
260
  });
105
261
  },
106
262
  onBlur(e) {
107
- var _a;
108
- (_a = props.onBlur) === null || _a === void 0 ? void 0 : _a.call(props, e);
109
- setSelectedSections(-1);
263
+ enteredKeys.current = '';
264
+ props.onBlur?.(e);
265
+ focusManager.focusSection(-1);
110
266
  },
111
267
  onKeyDown(e) {
112
- var _a;
113
- (_a = props.onKeyDown) === null || _a === void 0 ? void 0 : _a.call(props, e);
268
+ props.onKeyDown?.(e);
114
269
  if (e.key === 'ArrowLeft') {
115
270
  e.preventDefault();
116
- state.focusPreviousSection();
271
+ enteredKeys.current = '';
272
+ focusManager.focusPreviousSection();
117
273
  }
118
274
  else if (e.key === 'ArrowRight') {
119
275
  e.preventDefault();
120
- state.focusNextSection();
276
+ enteredKeys.current = '';
277
+ focusManager.focusNextSection();
121
278
  }
122
279
  else if (e.key === 'Home') {
123
280
  e.preventDefault();
124
- state.decrementToMin();
281
+ enteredKeys.current = '';
282
+ state.decrementToMin(focusManager.activeSectionIndex);
125
283
  }
126
284
  else if (e.key === 'End') {
127
285
  e.preventDefault();
128
- state.incrementToMax();
286
+ enteredKeys.current = '';
287
+ state.incrementToMax(focusManager.activeSectionIndex);
129
288
  }
130
289
  else if (e.key === 'ArrowUp' && !e.altKey) {
131
290
  e.preventDefault();
132
- state.increment();
291
+ enteredKeys.current = '';
292
+ state.increment(focusManager.activeSectionIndex);
133
293
  }
134
294
  else if (e.key === 'ArrowDown' && !e.altKey) {
135
295
  e.preventDefault();
136
- state.decrement();
296
+ enteredKeys.current = '';
297
+ state.decrement(focusManager.activeSectionIndex);
137
298
  }
138
299
  else if (e.key === 'PageUp') {
139
300
  e.preventDefault();
140
- state.incrementPage();
301
+ enteredKeys.current = '';
302
+ state.incrementPage(focusManager.activeSectionIndex);
141
303
  }
142
304
  else if (e.key === 'PageDown') {
143
305
  e.preventDefault();
144
- state.decrementPage();
306
+ enteredKeys.current = '';
307
+ state.decrementPage(focusManager.activeSectionIndex);
145
308
  }
146
309
  else if (e.key === 'Backspace' || e.key === 'Delete') {
147
310
  e.preventDefault();
148
- state.clearSection();
311
+ enteredKeys.current = '';
312
+ backspace();
149
313
  }
150
- else if (e.key === 'a' && (e['ctrlKey'] || e['metaKey'])) {
314
+ else if (e.key === 'a' && e[constants_js_1.CtrlCmd]) {
151
315
  e.preventDefault();
152
- setSelectedSections('all');
316
+ enteredKeys.current = '';
317
+ focusManager.focusSection('all');
153
318
  }
154
319
  },
155
320
  onKeyUp: props.onKeyUp,
@@ -169,9 +334,19 @@ function useDateFieldProps(state, props) {
169
334
  },
170
335
  onBeforeInput(e) {
171
336
  e.preventDefault();
172
- const key = e.data;
173
- if (key !== undefined && key !== null) {
174
- state.onInput(key);
337
+ switch (e.nativeEvent.inputType) {
338
+ case 'deleteContentBackward':
339
+ case 'deleteContentForward': {
340
+ enteredKeys.current = '';
341
+ backspace();
342
+ break;
343
+ }
344
+ default: {
345
+ const key = e.data;
346
+ if (key !== undefined && key !== null) {
347
+ onInput(key);
348
+ }
349
+ }
175
350
  }
176
351
  },
177
352
  onPaste(e) {
@@ -179,18 +354,19 @@ function useDateFieldProps(state, props) {
179
354
  if (state.readOnly) {
180
355
  return;
181
356
  }
357
+ enteredKeys.current = '';
182
358
  const pastedValue = (0, utils_1.cleanString)(e.clipboardData.getData('text'));
183
- if (state.selectedSectionIndexes &&
184
- state.selectedSectionIndexes.startIndex ===
185
- state.selectedSectionIndexes.endIndex) {
186
- const activeSection = state.sections[state.selectedSectionIndexes.startIndex];
359
+ if (focusManager.selectedSectionIndexes &&
360
+ focusManager.selectedSectionIndexes.startIndex ===
361
+ focusManager.selectedSectionIndexes.endIndex) {
362
+ const activeSection = state.sections[focusManager.activeSectionIndex];
187
363
  const digitsOnly = /^\d+$/.test(pastedValue);
188
364
  const lettersOnly = /^[a-zA-Z]+$/.test(pastedValue);
189
365
  const isValidValue = Boolean(activeSection &&
190
366
  ((activeSection.contentType === 'digit' && digitsOnly) ||
191
367
  (activeSection.contentType === 'letter' && lettersOnly)));
192
368
  if (isValidValue) {
193
- state.onInput(pastedValue);
369
+ onInput(pastedValue);
194
370
  return;
195
371
  }
196
372
  if (digitsOnly || lettersOnly) {
@@ -203,4 +379,24 @@ function useDateFieldProps(state, props) {
203
379
  },
204
380
  };
205
381
  }
382
+ function prepareState(sections) {
383
+ let position = 1;
384
+ let text = '';
385
+ const positions = new Array(sections.length);
386
+ for (let i = 0; i < sections.length; i++) {
387
+ const section = sections[i];
388
+ if (!section) {
389
+ throw new Error('Section must be defined');
390
+ }
391
+ // use bidirectional context to allow the browser autodetect text direction
392
+ const textValue = '\u2068' + section.textValue + '\u2069';
393
+ text += textValue;
394
+ const pos = { start: position, end: position + textValue.length };
395
+ position += textValue.length;
396
+ positions[i] = pos;
397
+ }
398
+ // use ltr direction context to get predictable navigation inside input
399
+ text = '\u2066' + text + '\u2069';
400
+ return { text, positions };
401
+ }
206
402
  //# sourceMappingURL=useDateFieldProps.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useDateFieldProps.js","sourceRoot":"../../../../../src","sources":["components/DateField/hooks/useDateFieldProps.ts"],"names":[],"mappings":"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","sourcesContent":["import React from 'react';\n\nimport type {DateTime} from '@gravity-ui/date-utils';\nimport type {TextInputProps} from '@gravity-ui/uikit';\n\nimport type {\n AccessibilityProps,\n DateFieldBase,\n TextInputProps as DateFieldTextInputProps,\n DomProps,\n FocusableProps,\n InputDOMProps,\n KeyboardEvents,\n StyleProps,\n TextInputExtendProps,\n} from '../../types';\nimport {cleanString} from '../utils';\n\nimport type {DateFieldState} from './useBaseDateFieldState';\n\nexport interface DateFieldProps<T = DateTime>\n extends\n DateFieldBase<T>,\n DateFieldTextInputProps,\n TextInputExtendProps,\n DomProps,\n InputDOMProps,\n FocusableProps,\n KeyboardEvents,\n StyleProps,\n AccessibilityProps {}\n\nexport function useDateFieldProps<T = DateTime>(\n state: DateFieldState<T>,\n props: DateFieldProps<T>,\n): {inputProps: TextInputProps} {\n const inputRef = React.useRef<HTMLInputElement>(null);\n\n const [, setInnerState] = React.useState({});\n\n function setSelectedSections(section: 'all' | number) {\n state.setSelectedSections(section);\n setInnerState({});\n }\n\n React.useLayoutEffect(() => {\n const inputElement = inputRef.current;\n if (!inputElement) {\n return;\n }\n\n if (state.selectedSectionIndexes === null) {\n if (inputElement.scrollLeft) {\n // Ensure that input content is not marked as selected.\n // setting selection range to 0 causes issues in Safari.\n // https://bugs.webkit.org/show_bug.cgi?id=224425\n inputElement.scrollLeft = 0;\n }\n return;\n }\n\n const firstSelectedSection = state.sections[state.selectedSectionIndexes.startIndex];\n const lastSelectedSection = state.sections[state.selectedSectionIndexes.endIndex];\n if (firstSelectedSection && lastSelectedSection) {\n const selectionStart = firstSelectedSection.start;\n const selectionEnd = lastSelectedSection.end;\n\n if (\n selectionStart !== inputElement.selectionStart ||\n selectionEnd !== inputElement.selectionEnd\n ) {\n inputElement.setSelectionRange(selectionStart, selectionEnd);\n }\n }\n });\n\n function syncSelectionFromDOM() {\n state.focusSectionInPosition(inputRef.current?.selectionStart ?? 0);\n setInnerState({});\n }\n\n const inputMode = React.useMemo(() => {\n if (!state.selectedSectionIndexes) {\n return 'text';\n }\n\n const activeSection = state.sections[state.selectedSectionIndexes.startIndex];\n if (!activeSection || activeSection.contentType === 'letter') {\n return 'text';\n }\n\n return 'tel';\n }, [state.selectedSectionIndexes, state.sections]);\n\n return {\n inputProps: {\n value: state.text,\n view: props.view,\n size: props.size,\n disabled: state.disabled,\n hasClear: !state.readOnly && !state.isEmpty && props.hasClear,\n placeholder: props.placeholder,\n id: props.id,\n label: props.label,\n startContent: props.startContent,\n endContent: props.endContent,\n pin: props.pin,\n autoFocus: props.autoFocus,\n controlRef: inputRef,\n autoComplete: 'off',\n type: 'text',\n validationState: state.validationState,\n errorMessage: props.errorMessage,\n errorPlacement: props.errorPlacement,\n onUpdate(value) {\n if (!value) {\n state.clearAll();\n }\n },\n onFocus(e) {\n props.onFocus?.(e);\n\n if (state.selectedSectionIndexes !== null) {\n return;\n }\n const input = e.target;\n const isAutofocus = !inputRef.current;\n setTimeout(() => {\n if (!input || input !== inputRef.current) {\n return;\n }\n if (isAutofocus) {\n state.focusSectionInPosition(0);\n } else if (\n // avoid selecting all sections when focusing empty field without value\n input.value.length &&\n Number(input.selectionEnd) - Number(input.selectionStart) ===\n input.value.length\n ) {\n setSelectedSections('all');\n } else {\n syncSelectionFromDOM();\n }\n });\n },\n onBlur(e) {\n props.onBlur?.(e);\n setSelectedSections(-1);\n },\n onKeyDown(e) {\n props.onKeyDown?.(e);\n\n if (e.key === 'ArrowLeft') {\n e.preventDefault();\n state.focusPreviousSection();\n } else if (e.key === 'ArrowRight') {\n e.preventDefault();\n state.focusNextSection();\n } else if (e.key === 'Home') {\n e.preventDefault();\n state.decrementToMin();\n } else if (e.key === 'End') {\n e.preventDefault();\n state.incrementToMax();\n } else if (e.key === 'ArrowUp' && !e.altKey) {\n e.preventDefault();\n state.increment();\n } else if (e.key === 'ArrowDown' && !e.altKey) {\n e.preventDefault();\n state.decrement();\n } else if (e.key === 'PageUp') {\n e.preventDefault();\n state.incrementPage();\n } else if (e.key === 'PageDown') {\n e.preventDefault();\n state.decrementPage();\n } else if (e.key === 'Backspace' || e.key === 'Delete') {\n e.preventDefault();\n state.clearSection();\n } else if (e.key === 'a' && (e['ctrlKey'] || e['metaKey'])) {\n e.preventDefault();\n setSelectedSections('all');\n }\n },\n onKeyUp: props.onKeyUp,\n controlProps: {\n 'aria-label': props['aria-label'] || undefined,\n 'aria-labelledby': props['aria-labelledby'] || undefined,\n 'aria-describedby': props['aria-describedby'] || undefined,\n 'aria-details': props['aria-details'] || undefined,\n 'aria-disabled': state.disabled || undefined,\n readOnly: state.readOnly,\n inputMode,\n onClick() {\n syncSelectionFromDOM();\n },\n onMouseUp(e: React.MouseEvent) {\n e.preventDefault();\n },\n onBeforeInput(e) {\n e.preventDefault();\n const key = e.data;\n if (key !== undefined && key !== null) {\n state.onInput(key);\n }\n },\n onPaste(e: React.ClipboardEvent) {\n e.preventDefault();\n if (state.readOnly) {\n return;\n }\n\n const pastedValue = cleanString(e.clipboardData.getData('text'));\n if (\n state.selectedSectionIndexes &&\n state.selectedSectionIndexes.startIndex ===\n state.selectedSectionIndexes.endIndex\n ) {\n const activeSection =\n state.sections[state.selectedSectionIndexes.startIndex];\n\n const digitsOnly = /^\\d+$/.test(pastedValue);\n const lettersOnly = /^[a-zA-Z]+$/.test(pastedValue);\n\n const isValidValue = Boolean(\n activeSection &&\n ((activeSection.contentType === 'digit' && digitsOnly) ||\n (activeSection.contentType === 'letter' && lettersOnly)),\n );\n if (isValidValue) {\n state.onInput(pastedValue);\n return;\n }\n if (digitsOnly || lettersOnly) {\n return;\n }\n }\n\n state.setValueFromString(pastedValue);\n },\n },\n },\n };\n}\n"]}
1
+ {"version":3,"file":"useDateFieldProps.js","sourceRoot":"../../../../../src","sources":["components/DateField/hooks/useDateFieldProps.ts"],"names":[],"mappings":"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","sourcesContent":["import React from 'react';\n\nimport type {DateTime} from '@gravity-ui/date-utils';\nimport {useFocusWithin} from '@gravity-ui/uikit';\nimport type {TextInputProps} from '@gravity-ui/uikit';\n\nimport type {\n AccessibilityProps,\n DateFieldBase,\n TextInputProps as DateFieldTextInputProps,\n DomProps,\n FocusableProps,\n InputDOMProps,\n KeyboardEvents,\n StyleProps,\n TextInputExtendProps,\n} from '../../types';\nimport {CtrlCmd} from '../../utils/constants.js';\nimport {filterDOMProps} from '../../utils/filterDOMProps.js';\nimport type {DateFieldSection} from '../types';\nimport {cleanString} from '../utils';\n\nimport type {DateFieldState} from './useBaseDateFieldState';\nimport {useFocusManager} from './useFocusManager';\n\nexport interface DateFieldProps<T = DateTime>\n extends\n DateFieldBase<T>,\n DateFieldTextInputProps,\n TextInputExtendProps,\n DomProps,\n InputDOMProps,\n FocusableProps,\n KeyboardEvents,\n StyleProps,\n AccessibilityProps {}\n\nexport function useDateFieldProps<T = DateTime>(\n state: DateFieldState<T>,\n props: DateFieldProps<T>,\n): {groupProps: React.HTMLAttributes<unknown>; inputProps: TextInputProps} {\n const inputRef = React.useRef<HTMLInputElement>(null);\n\n const [, setInnerState] = React.useState({});\n\n const enteredKeys = React.useRef('');\n\n const focusManager = useFocusManager({sections: state.sections});\n\n const {text, positions} = React.useMemo(() => prepareState(state.sections), [state.sections]);\n\n React.useLayoutEffect(() => {\n const inputElement = inputRef.current;\n if (!inputElement) {\n return;\n }\n\n if (focusManager.selectedSectionIndexes === null) {\n if (inputElement.scrollLeft) {\n // Ensure that input content is not marked as selected.\n // setting selection range to 0 causes issues in Safari.\n // https://bugs.webkit.org/show_bug.cgi?id=224425\n inputElement.scrollLeft = 0;\n }\n return;\n }\n\n const firstSelectedSection = positions[focusManager.selectedSectionIndexes.startIndex];\n const lastSelectedSection = positions[focusManager.selectedSectionIndexes.endIndex];\n if (firstSelectedSection && lastSelectedSection) {\n const selectionStart = firstSelectedSection.start;\n const selectionEnd = lastSelectedSection.end;\n\n if (\n selectionStart !== inputElement.selectionStart ||\n selectionEnd !== inputElement.selectionEnd\n ) {\n inputElement.setSelectionRange(selectionStart, selectionEnd);\n }\n }\n });\n\n function syncSelectionFromDOM() {\n enteredKeys.current = '';\n const position = inputRef.current?.selectionStart ?? 0;\n const index = positions.findIndex((s) => s.end >= position);\n focusManager.focusSection(index === -1 ? 0 : index);\n setInnerState({});\n }\n\n const inputMode = React.useMemo(() => {\n if (!focusManager.selectedSectionIndexes) {\n return 'text';\n }\n\n const activeSection = state.sections[focusManager.selectedSectionIndexes.startIndex];\n if (!activeSection || activeSection.contentType === 'letter') {\n return 'text';\n }\n\n return 'tel';\n }, [focusManager.selectedSectionIndexes, state.sections]);\n\n function onInput(key: string) {\n if (state.readOnly || state.disabled) {\n return;\n }\n\n const sectionIndex = focusManager.activeSectionIndex;\n if (sectionIndex === -1) {\n return;\n }\n\n const section = state.sections[sectionIndex];\n const isLastSection = focusManager.isLastSection(sectionIndex);\n let newValue = enteredKeys.current + key;\n\n const onInputNumber = (numberValue: number) => {\n let sectionValue = numberValue;\n const sectionMaxValue = section.maxValue ?? 0;\n const allowsZero = section.minValue === 0;\n let shouldResetUserInput;\n if (\n // 12-hour clock format with AM/PM\n section.type === 'hour' &&\n (sectionMaxValue === 11 || section.minValue === 12)\n ) {\n if (sectionValue > 12) {\n sectionValue = Number(key);\n newValue = key;\n }\n if (sectionValue === 0) {\n sectionValue = -Infinity;\n }\n if (sectionValue === 12) {\n sectionValue = 0;\n }\n if (section.minValue === 12) {\n sectionValue += 12;\n }\n shouldResetUserInput = Number(newValue + '0') > 12;\n } else if (sectionValue > sectionMaxValue) {\n sectionValue = Number(key);\n newValue = key;\n if (sectionValue > sectionMaxValue) {\n enteredKeys.current = '';\n return;\n }\n }\n\n const shouldSetValue = sectionValue > 0 || (sectionValue === 0 && allowsZero);\n if (shouldSetValue) {\n state.setSection(sectionIndex, sectionValue);\n }\n\n if (shouldResetUserInput === undefined) {\n shouldResetUserInput = Number(newValue + '0') > sectionMaxValue;\n }\n const isMaxLength = newValue.length >= String(sectionMaxValue).length;\n if (shouldResetUserInput) {\n enteredKeys.current = '';\n if (shouldSetValue) {\n focusManager.focusNextSection();\n }\n } else if (isMaxLength && shouldSetValue && !isLastSection) {\n focusManager.focusNextSection();\n } else {\n enteredKeys.current = newValue;\n }\n };\n\n const onInputString = (stringValue: string) => {\n const options = section.options ?? [];\n let sectionValue = stringValue.toLocaleUpperCase();\n let foundOptions = options.filter((v) => v.startsWith(sectionValue));\n if (foundOptions.length === 0) {\n if (stringValue !== key) {\n sectionValue = key.toLocaleUpperCase();\n foundOptions = options.filter((v) => v.startsWith(sectionValue));\n }\n if (foundOptions.length === 0) {\n enteredKeys.current = '';\n return;\n }\n }\n const foundValue = foundOptions[0];\n const index = options.indexOf(foundValue);\n\n if (section.type === 'month') {\n state.setSection(sectionIndex, index + 1);\n } else {\n state.setSection(sectionIndex, index);\n }\n\n if (foundOptions.length > 1) {\n enteredKeys.current = newValue;\n } else {\n enteredKeys.current = '';\n focusManager.focusNextSection();\n }\n };\n\n switch (section.type) {\n case 'day':\n case 'hour':\n case 'minute':\n case 'second':\n case 'quarter':\n case 'year': {\n if (!Number.isInteger(Number(newValue))) {\n return;\n }\n const numberValue = Number(newValue);\n onInputNumber(numberValue);\n break;\n }\n case 'dayPeriod': {\n onInputString(newValue);\n break;\n }\n case 'weekday':\n case 'month': {\n if (Number.isInteger(Number(newValue))) {\n const numberValue = Number(newValue);\n onInputNumber(numberValue);\n } else {\n onInputString(newValue);\n }\n break;\n }\n }\n }\n\n function backspace() {\n if (focusManager.selectedSectionIndexes === null) {\n return;\n }\n if (\n focusManager.selectedSectionIndexes.startIndex ===\n focusManager.selectedSectionIndexes.endIndex\n ) {\n const activeSection = state.sections[focusManager.activeSectionIndex];\n if (activeSection.value === null) {\n focusManager.focusPreviousSection();\n return;\n } else if (activeSection.contentType === 'digit') {\n const newValue = Math.floor(activeSection.value / 10);\n if (newValue !== 0) {\n state.setSection(focusManager.activeSectionIndex, newValue);\n enteredKeys.current = `${newValue}`;\n return;\n }\n }\n state.clearSection(focusManager.activeSectionIndex);\n } else {\n state.clearAll();\n }\n }\n\n const {focusWithinProps} = useFocusWithin({\n onBlurWithin: () => {\n state.confirmPlaceholder();\n },\n onFocusWithinChange(isFocusWithin) {\n state.setActive(isFocusWithin);\n },\n });\n\n const DOMProps = filterDOMProps(props);\n delete DOMProps.id;\n\n return {\n groupProps: {\n ...DOMProps,\n ...focusWithinProps,\n },\n inputProps: {\n value: state.isEmpty && !state.isActive && props.placeholder ? '' : text,\n view: props.view,\n size: props.size,\n disabled: state.disabled,\n hasClear: !state.readOnly && !state.isEmpty && props.hasClear,\n placeholder: props.placeholder,\n id: props.id,\n label: props.label,\n startContent: props.startContent,\n endContent: props.endContent,\n pin: props.pin,\n autoFocus: props.autoFocus,\n controlRef: inputRef,\n autoComplete: 'off',\n type: 'text',\n validationState: state.validationState,\n errorMessage: props.errorMessage,\n errorPlacement: props.errorPlacement,\n onUpdate(value) {\n if (!value) {\n state.clearAll();\n }\n },\n onFocus(e) {\n props.onFocus?.(e);\n\n if (focusManager.selectedSectionIndexes !== null) {\n setInnerState({});\n return;\n }\n const input = e.target;\n setTimeout(() => {\n if (!input || input !== inputRef.current) {\n return;\n }\n syncSelectionFromDOM();\n });\n },\n onBlur(e) {\n enteredKeys.current = '';\n props.onBlur?.(e);\n focusManager.focusSection(-1);\n },\n onKeyDown(e) {\n props.onKeyDown?.(e);\n\n if (e.key === 'ArrowLeft') {\n e.preventDefault();\n enteredKeys.current = '';\n focusManager.focusPreviousSection();\n } else if (e.key === 'ArrowRight') {\n e.preventDefault();\n enteredKeys.current = '';\n focusManager.focusNextSection();\n } else if (e.key === 'Home') {\n e.preventDefault();\n enteredKeys.current = '';\n state.decrementToMin(focusManager.activeSectionIndex);\n } else if (e.key === 'End') {\n e.preventDefault();\n enteredKeys.current = '';\n state.incrementToMax(focusManager.activeSectionIndex);\n } else if (e.key === 'ArrowUp' && !e.altKey) {\n e.preventDefault();\n enteredKeys.current = '';\n state.increment(focusManager.activeSectionIndex);\n } else if (e.key === 'ArrowDown' && !e.altKey) {\n e.preventDefault();\n enteredKeys.current = '';\n state.decrement(focusManager.activeSectionIndex);\n } else if (e.key === 'PageUp') {\n e.preventDefault();\n enteredKeys.current = '';\n state.incrementPage(focusManager.activeSectionIndex);\n } else if (e.key === 'PageDown') {\n e.preventDefault();\n enteredKeys.current = '';\n state.decrementPage(focusManager.activeSectionIndex);\n } else if (e.key === 'Backspace' || e.key === 'Delete') {\n e.preventDefault();\n enteredKeys.current = '';\n backspace();\n } else if (e.key === 'a' && e[CtrlCmd]) {\n e.preventDefault();\n enteredKeys.current = '';\n focusManager.focusSection('all');\n }\n },\n onKeyUp: props.onKeyUp,\n controlProps: {\n 'aria-label': props['aria-label'] || undefined,\n 'aria-labelledby': props['aria-labelledby'] || undefined,\n 'aria-describedby': props['aria-describedby'] || undefined,\n 'aria-details': props['aria-details'] || undefined,\n 'aria-disabled': state.disabled || undefined,\n readOnly: state.readOnly,\n inputMode,\n onClick() {\n syncSelectionFromDOM();\n },\n onMouseUp(e: React.MouseEvent) {\n e.preventDefault();\n },\n onBeforeInput(e) {\n e.preventDefault();\n switch (e.nativeEvent.inputType) {\n case 'deleteContentBackward':\n case 'deleteContentForward': {\n enteredKeys.current = '';\n backspace();\n break;\n }\n default: {\n const key = e.data;\n if (key !== undefined && key !== null) {\n onInput(key);\n }\n }\n }\n },\n onPaste(e: React.ClipboardEvent) {\n e.preventDefault();\n if (state.readOnly) {\n return;\n }\n\n enteredKeys.current = '';\n const pastedValue = cleanString(e.clipboardData.getData('text'));\n if (\n focusManager.selectedSectionIndexes &&\n focusManager.selectedSectionIndexes.startIndex ===\n focusManager.selectedSectionIndexes.endIndex\n ) {\n const activeSection = state.sections[focusManager.activeSectionIndex];\n\n const digitsOnly = /^\\d+$/.test(pastedValue);\n const lettersOnly = /^[a-zA-Z]+$/.test(pastedValue);\n\n const isValidValue = Boolean(\n activeSection &&\n ((activeSection.contentType === 'digit' && digitsOnly) ||\n (activeSection.contentType === 'letter' && lettersOnly)),\n );\n if (isValidValue) {\n onInput(pastedValue);\n return;\n }\n if (digitsOnly || lettersOnly) {\n return;\n }\n }\n\n state.setValueFromString(pastedValue);\n },\n },\n },\n };\n}\n\nfunction prepareState(sections: DateFieldSection[]) {\n let position = 1;\n let text = '';\n const positions: {start: number; end: number}[] = new Array(sections.length);\n for (let i = 0; i < sections.length; i++) {\n const section = sections[i];\n if (!section) {\n throw new Error('Section must be defined');\n }\n\n // use bidirectional context to allow the browser autodetect text direction\n const textValue = '\\u2068' + section.textValue + '\\u2069';\n text += textValue;\n const pos = {start: position, end: position + textValue.length};\n position += textValue.length;\n positions[i] = pos;\n }\n // use ltr direction context to get predictable navigation inside input\n text = '\\u2066' + text + '\\u2069';\n return {text, positions};\n}\n"]}
@@ -1,5 +1,23 @@
1
- import type { DateFieldBase } from "../../types/datePicker.js";
1
+ import type { DateTime } from '@gravity-ui/date-utils';
2
+ import type { InputBase, Validation, ValueBase } from "../../types/index.js";
2
3
  import type { DateFieldState } from "./useBaseDateFieldState.js";
3
- export interface DateFieldStateOptions extends DateFieldBase {
4
+ export interface DateFieldStateOptions extends ValueBase<DateTime | null>, InputBase, Validation {
5
+ /** The minimum allowed date that a user may select. */
6
+ minValue?: DateTime;
7
+ /** The maximum allowed date that a user may select. */
8
+ maxValue?: DateTime;
9
+ /** Callback that is called for each date of the calendar. If it returns true, then the date is unavailable. */
10
+ isDateUnavailable?: (date: DateTime) => boolean;
11
+ /** Format of the date when rendered in the input. [Available formats](https://day.js.org/docs/en/display/format) */
12
+ format?: string;
13
+ /** A placeholder date that controls the default values of each segment when the user first interacts with them. Defaults to today's date at midnight. */
14
+ placeholderValue?: DateTime;
15
+ /**
16
+ * Which timezone use to show values. Example: 'default', 'system', 'Europe/Amsterdam'.
17
+ * @default The timezone of the `value` or `defaultValue` or `placeholderValue`, 'default' otherwise.
18
+ */
19
+ timeZone?: string;
20
+ /** Custom parser function for parsing pasted date strings. If not provided, the default parser will be used. */
21
+ parseDateFromString?: (dateStr: string, format: string, timeZone?: string) => DateTime;
4
22
  }
5
23
  export declare function useDateFieldState(props: DateFieldStateOptions): DateFieldState;