@vkontakte/vkui 7.5.4 → 7.6.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 (475) hide show
  1. package/dist/components/Calendar/Calendar.js +6 -6
  2. package/dist/components/Calendar/Calendar.js.map +1 -1
  3. package/dist/components/CalendarDays/CalendarDays.js +3 -3
  4. package/dist/components/CalendarDays/CalendarDays.js.map +1 -1
  5. package/dist/components/CalendarRange/CalendarRange.d.ts.map +1 -1
  6. package/dist/components/CalendarRange/CalendarRange.js +16 -14
  7. package/dist/components/CalendarRange/CalendarRange.js.map +1 -1
  8. package/dist/components/CalendarRange/utils.d.ts.map +1 -1
  9. package/dist/components/CalendarRange/utils.js +6 -5
  10. package/dist/components/CalendarRange/utils.js.map +1 -1
  11. package/dist/components/Cell/Cell.d.ts.map +1 -1
  12. package/dist/components/Cell/Cell.js +6 -3
  13. package/dist/components/Cell/Cell.js.map +1 -1
  14. package/dist/components/CellButtonGroup/CellButtonGroup.d.ts +5 -3
  15. package/dist/components/CellButtonGroup/CellButtonGroup.d.ts.map +1 -1
  16. package/dist/components/Checkbox/Checkbox.d.ts +4 -0
  17. package/dist/components/Checkbox/Checkbox.d.ts.map +1 -1
  18. package/dist/components/Checkbox/Checkbox.js +4 -2
  19. package/dist/components/Checkbox/Checkbox.js.map +1 -1
  20. package/dist/components/Checkbox/CheckboxSimple/CheckboxSimple.d.ts +1 -1
  21. package/dist/components/Checkbox/CheckboxSimple/CheckboxSimple.d.ts.map +1 -1
  22. package/dist/components/Checkbox/CheckboxSimple/CheckboxSimple.js +6 -3
  23. package/dist/components/Checkbox/CheckboxSimple/CheckboxSimple.js.map +1 -1
  24. package/dist/components/ChipsInputBase/Chip/Chip.d.ts +41 -2
  25. package/dist/components/ChipsInputBase/Chip/Chip.d.ts.map +1 -1
  26. package/dist/components/ChipsInputBase/Chip/Chip.js +7 -2
  27. package/dist/components/ChipsInputBase/Chip/Chip.js.map +1 -1
  28. package/dist/components/ChipsInputBase/types.d.ts +2 -35
  29. package/dist/components/ChipsInputBase/types.d.ts.map +1 -1
  30. package/dist/components/ChipsInputBase/types.js.map +1 -1
  31. package/dist/components/ContentBadge/ContentBadge.d.ts +1 -1
  32. package/dist/components/ContentBadge/ContentBadge.d.ts.map +1 -1
  33. package/dist/components/ContentBadge/ContentBadge.js +15 -9
  34. package/dist/components/ContentBadge/ContentBadge.js.map +1 -1
  35. package/dist/components/ContentCard/ContentCard.d.ts +1 -1
  36. package/dist/components/ContentCard/ContentCard.d.ts.map +1 -1
  37. package/dist/components/ContentCard/ContentCard.js.map +1 -1
  38. package/dist/components/CustomSelect/CustomSelect.d.ts +16 -27
  39. package/dist/components/CustomSelect/CustomSelect.d.ts.map +1 -1
  40. package/dist/components/CustomSelect/CustomSelect.js +161 -428
  41. package/dist/components/CustomSelect/CustomSelect.js.map +1 -1
  42. package/dist/components/CustomSelect/CustomSelectInput/CustomSelectInput.d.ts +3 -1
  43. package/dist/components/CustomSelect/CustomSelectInput/CustomSelectInput.d.ts.map +1 -1
  44. package/dist/components/CustomSelect/CustomSelectInput/CustomSelectInput.js +25 -5
  45. package/dist/components/CustomSelect/CustomSelectInput/CustomSelectInput.js.map +1 -1
  46. package/dist/components/CustomSelect/helpers.d.ts +12 -0
  47. package/dist/components/CustomSelect/helpers.d.ts.map +1 -0
  48. package/dist/components/CustomSelect/helpers.js +63 -0
  49. package/dist/components/CustomSelect/helpers.js.map +1 -0
  50. package/dist/components/CustomSelect/hooks/useAfterItems.d.ts +11 -0
  51. package/dist/components/CustomSelect/hooks/useAfterItems.d.ts.map +1 -0
  52. package/dist/components/CustomSelect/hooks/useAfterItems.js +57 -0
  53. package/dist/components/CustomSelect/hooks/useAfterItems.js.map +1 -0
  54. package/dist/components/CustomSelect/hooks/useDropdownOpenedController.d.ts +13 -0
  55. package/dist/components/CustomSelect/hooks/useDropdownOpenedController.d.ts.map +1 -0
  56. package/dist/components/CustomSelect/hooks/useDropdownOpenedController.js +60 -0
  57. package/dist/components/CustomSelect/hooks/useDropdownOpenedController.js.map +1 -0
  58. package/dist/components/CustomSelect/hooks/useFocusedOptionController.d.ts +20 -0
  59. package/dist/components/CustomSelect/hooks/useFocusedOptionController.d.ts.map +1 -0
  60. package/dist/components/CustomSelect/hooks/useFocusedOptionController.js +52 -0
  61. package/dist/components/CustomSelect/hooks/useFocusedOptionController.js.map +1 -0
  62. package/dist/components/CustomSelect/hooks/useInputKeyboardController.d.ts +13 -0
  63. package/dist/components/CustomSelect/hooks/useInputKeyboardController.d.ts.map +1 -0
  64. package/dist/components/CustomSelect/hooks/useInputKeyboardController.js +78 -0
  65. package/dist/components/CustomSelect/hooks/useInputKeyboardController.js.map +1 -0
  66. package/dist/components/CustomSelect/hooks/useInputValueController.d.ts +15 -0
  67. package/dist/components/CustomSelect/hooks/useInputValueController.d.ts.map +1 -0
  68. package/dist/components/CustomSelect/hooks/useInputValueController.js +43 -0
  69. package/dist/components/CustomSelect/hooks/useInputValueController.js.map +1 -0
  70. package/dist/components/CustomSelect/hooks/useScrollListController.d.ts +9 -0
  71. package/dist/components/CustomSelect/hooks/useScrollListController.d.ts.map +1 -0
  72. package/dist/components/CustomSelect/hooks/useScrollListController.js +37 -0
  73. package/dist/components/CustomSelect/hooks/useScrollListController.js.map +1 -0
  74. package/dist/components/CustomSelect/hooks/useSelectedOptionController.d.ts +18 -0
  75. package/dist/components/CustomSelect/hooks/useSelectedOptionController.d.ts.map +1 -0
  76. package/dist/components/CustomSelect/hooks/useSelectedOptionController.js +81 -0
  77. package/dist/components/CustomSelect/hooks/useSelectedOptionController.js.map +1 -0
  78. package/dist/components/CustomSelect/types.d.ts +33 -0
  79. package/dist/components/CustomSelect/types.d.ts.map +1 -0
  80. package/dist/components/CustomSelect/types.js +3 -0
  81. package/dist/components/CustomSelect/types.js.map +1 -0
  82. package/dist/components/CustomSelectDropdown/CustomSelectDropdown.d.ts.map +1 -1
  83. package/dist/components/CustomSelectDropdown/CustomSelectDropdown.js +1 -0
  84. package/dist/components/CustomSelectDropdown/CustomSelectDropdown.js.map +1 -1
  85. package/dist/components/DateInput/DateInput.d.ts.map +1 -1
  86. package/dist/components/DateInput/DateInput.js +3 -2
  87. package/dist/components/DateInput/DateInput.js.map +1 -1
  88. package/dist/components/DateRangeInput/DateRangeInput.d.ts.map +1 -1
  89. package/dist/components/DateRangeInput/DateRangeInput.js +4 -4
  90. package/dist/components/DateRangeInput/DateRangeInput.js.map +1 -1
  91. package/dist/components/ModalCard/ModalCard.d.ts +1 -1
  92. package/dist/components/ModalCard/ModalCard.d.ts.map +1 -1
  93. package/dist/components/ModalCard/ModalCard.js +4 -2
  94. package/dist/components/ModalCard/ModalCard.js.map +1 -1
  95. package/dist/components/ModalCard/ModalCardInternal.d.ts +1 -1
  96. package/dist/components/ModalCard/ModalCardInternal.d.ts.map +1 -1
  97. package/dist/components/ModalCard/ModalCardInternal.js +5 -3
  98. package/dist/components/ModalCard/ModalCardInternal.js.map +1 -1
  99. package/dist/components/ModalCard/types.d.ts +6 -0
  100. package/dist/components/ModalCard/types.d.ts.map +1 -1
  101. package/dist/components/ModalCard/types.js.map +1 -1
  102. package/dist/components/ModalOutlet/ModalOutlet.d.ts +2 -1
  103. package/dist/components/ModalOutlet/ModalOutlet.d.ts.map +1 -1
  104. package/dist/components/ModalOutlet/ModalOutlet.js +4 -3
  105. package/dist/components/ModalOutlet/ModalOutlet.js.map +1 -1
  106. package/dist/components/ModalPage/ModalPage.d.ts +1 -1
  107. package/dist/components/ModalPage/ModalPage.d.ts.map +1 -1
  108. package/dist/components/ModalPage/ModalPage.js +3 -1
  109. package/dist/components/ModalPage/ModalPage.js.map +1 -1
  110. package/dist/components/ModalPage/ModalPageInternal.d.ts +1 -1
  111. package/dist/components/ModalPage/ModalPageInternal.d.ts.map +1 -1
  112. package/dist/components/ModalPage/ModalPageInternal.js +5 -3
  113. package/dist/components/ModalPage/ModalPageInternal.js.map +1 -1
  114. package/dist/components/ModalPage/types.d.ts +6 -0
  115. package/dist/components/ModalPage/types.d.ts.map +1 -1
  116. package/dist/components/ModalPage/types.js.map +1 -1
  117. package/dist/components/ModalRoot/ModalRoot.d.ts +1 -1
  118. package/dist/components/ModalRoot/ModalRoot.d.ts.map +1 -1
  119. package/dist/components/ModalRoot/ModalRoot.js +4 -2
  120. package/dist/components/ModalRoot/ModalRoot.js.map +1 -1
  121. package/dist/components/ModalRoot/types.d.ts +4 -0
  122. package/dist/components/ModalRoot/types.d.ts.map +1 -1
  123. package/dist/components/ModalRoot/types.js.map +1 -1
  124. package/dist/components/ModalRoot/useModalManager.d.ts +3 -1
  125. package/dist/components/ModalRoot/useModalManager.d.ts.map +1 -1
  126. package/dist/components/ModalRoot/useModalManager.js +2 -1
  127. package/dist/components/ModalRoot/useModalManager.js.map +1 -1
  128. package/dist/components/OnboardingTooltip/OnboardingTooltip.d.ts +2 -2
  129. package/dist/components/OnboardingTooltip/OnboardingTooltip.d.ts.map +1 -1
  130. package/dist/components/OnboardingTooltip/OnboardingTooltip.js +4 -2
  131. package/dist/components/OnboardingTooltip/OnboardingTooltip.js.map +1 -1
  132. package/dist/components/Popover/Popover.d.ts +1 -1
  133. package/dist/components/Popover/Popover.d.ts.map +1 -1
  134. package/dist/components/Popover/Popover.js.map +1 -1
  135. package/dist/components/Popover/usePopover.d.ts +1 -1
  136. package/dist/components/Popover/usePopover.d.ts.map +1 -1
  137. package/dist/components/Popover/usePopover.js +3 -1
  138. package/dist/components/Popover/usePopover.js.map +1 -1
  139. package/dist/components/Popper/Popper.d.ts +2 -2
  140. package/dist/components/Popper/Popper.d.ts.map +1 -1
  141. package/dist/components/Popper/Popper.js +3 -1
  142. package/dist/components/Popper/Popper.js.map +1 -1
  143. package/dist/components/Select/Select.d.ts +2 -1
  144. package/dist/components/Select/Select.d.ts.map +1 -1
  145. package/dist/components/Select/Select.js +5 -2
  146. package/dist/components/Select/Select.js.map +1 -1
  147. package/dist/components/SelectionControl/SelectionControl.d.ts +5 -1
  148. package/dist/components/SelectionControl/SelectionControl.d.ts.map +1 -1
  149. package/dist/components/SelectionControl/SelectionControl.js +22 -6
  150. package/dist/components/SelectionControl/SelectionControl.js.map +1 -1
  151. package/dist/components/SelectionControl/SelectionControlContext.d.ts +7 -0
  152. package/dist/components/SelectionControl/SelectionControlContext.d.ts.map +1 -0
  153. package/dist/components/SelectionControl/SelectionControlContext.js +7 -0
  154. package/dist/components/SelectionControl/SelectionControlContext.js.map +1 -0
  155. package/dist/components/SelectionControl/SelectionControlLabel/SelectionControlLabel.d.ts.map +1 -1
  156. package/dist/components/SelectionControl/SelectionControlLabel/SelectionControlLabel.js +3 -1
  157. package/dist/components/SelectionControl/SelectionControlLabel/SelectionControlLabel.js.map +1 -1
  158. package/dist/components/SimpleCell/SimpleCell.d.ts.map +1 -1
  159. package/dist/components/SimpleCell/SimpleCell.js +29 -8
  160. package/dist/components/SimpleCell/SimpleCell.js.map +1 -1
  161. package/dist/components/Skeleton/Skeleton.js +1 -1
  162. package/dist/components/Skeleton/Skeleton.js.map +1 -1
  163. package/dist/components/Tabs/Tabs.d.ts.map +1 -1
  164. package/dist/components/Tabs/Tabs.js +19 -9
  165. package/dist/components/Tabs/Tabs.js.map +1 -1
  166. package/dist/components/Tabs/TabsController.d.ts +2 -2
  167. package/dist/components/Tabs/TabsController.d.ts.map +1 -1
  168. package/dist/components/Tabs/TabsController.js.map +1 -1
  169. package/dist/components/Tabs/TabsControllerContext.d.ts +5 -0
  170. package/dist/components/Tabs/TabsControllerContext.d.ts.map +1 -0
  171. package/dist/components/Tabs/TabsControllerContext.js +4 -0
  172. package/dist/components/Tabs/TabsControllerContext.js.map +1 -0
  173. package/dist/components/Tabs/TabsModeContext.d.ts +0 -2
  174. package/dist/components/Tabs/TabsModeContext.d.ts.map +1 -1
  175. package/dist/components/Tabs/TabsModeContext.js +1 -2
  176. package/dist/components/Tabs/TabsModeContext.js.map +1 -1
  177. package/dist/components/TabsItem/TabsItem.d.ts.map +1 -1
  178. package/dist/components/TabsItem/TabsItem.js +3 -1
  179. package/dist/components/TabsItem/TabsItem.js.map +1 -1
  180. package/dist/components/Tooltip/Tooltip.d.ts +1 -1
  181. package/dist/components/Tooltip/Tooltip.d.ts.map +1 -1
  182. package/dist/components/Tooltip/Tooltip.js.map +1 -1
  183. package/dist/components/Tooltip/useTooltip.d.ts +1 -1
  184. package/dist/components/Tooltip/useTooltip.d.ts.map +1 -1
  185. package/dist/components/Tooltip/useTooltip.js +3 -1
  186. package/dist/components/Tooltip/useTooltip.js.map +1 -1
  187. package/dist/components/Typography/Caption/Caption.d.ts +2 -0
  188. package/dist/components/Typography/Caption/Caption.d.ts.map +1 -1
  189. package/dist/components/Typography/Caption/Caption.js +4 -1
  190. package/dist/components/Typography/Caption/Caption.js.map +1 -1
  191. package/dist/components/Typography/Footnote/Footnote.d.ts +2 -0
  192. package/dist/components/Typography/Footnote/Footnote.d.ts.map +1 -1
  193. package/dist/components/Typography/Footnote/Footnote.js +4 -1
  194. package/dist/components/Typography/Footnote/Footnote.js.map +1 -1
  195. package/dist/components/Typography/Typography.d.ts +1 -0
  196. package/dist/components/Typography/Typography.d.ts.map +1 -1
  197. package/dist/components/Typography/Typography.js +7 -1
  198. package/dist/components/Typography/Typography.js.map +1 -1
  199. package/dist/components/View/View.d.ts.map +1 -1
  200. package/dist/components/View/View.js +2 -1
  201. package/dist/components/View/View.js.map +1 -1
  202. package/dist/components/View/ViewInfinite.d.ts.map +1 -1
  203. package/dist/components/View/ViewInfinite.js +2 -1
  204. package/dist/components/View/ViewInfinite.js.map +1 -1
  205. package/dist/components.css +1 -1
  206. package/dist/components.css.map +1 -1
  207. package/dist/cssm/components/Banner/Banner.module.css +1 -6
  208. package/dist/cssm/components/Calendar/Calendar.js +6 -6
  209. package/dist/cssm/components/Calendar/Calendar.js.map +1 -1
  210. package/dist/cssm/components/CalendarDays/CalendarDays.js +3 -3
  211. package/dist/cssm/components/CalendarDays/CalendarDays.js.map +1 -1
  212. package/dist/cssm/components/CalendarRange/CalendarRange.js +16 -14
  213. package/dist/cssm/components/CalendarRange/CalendarRange.js.map +1 -1
  214. package/dist/cssm/components/CalendarRange/utils.js +6 -5
  215. package/dist/cssm/components/CalendarRange/utils.js.map +1 -1
  216. package/dist/cssm/components/Cell/Cell.js +3 -1
  217. package/dist/cssm/components/Cell/Cell.js.map +1 -1
  218. package/dist/cssm/components/Checkbox/Checkbox.js +2 -1
  219. package/dist/cssm/components/Checkbox/Checkbox.js.map +1 -1
  220. package/dist/cssm/components/Checkbox/CheckboxSimple/CheckboxSimple.js +4 -2
  221. package/dist/cssm/components/Checkbox/CheckboxSimple/CheckboxSimple.js.map +1 -1
  222. package/dist/cssm/components/Checkbox/CheckboxSimple/CheckboxSimple.module.css +11 -2
  223. package/dist/cssm/components/ChipsInputBase/Chip/Chip.js +6 -2
  224. package/dist/cssm/components/ChipsInputBase/Chip/Chip.js.map +1 -1
  225. package/dist/cssm/components/ChipsInputBase/Chip/Chip.module.css +8 -1
  226. package/dist/cssm/components/ChipsInputBase/types.js.map +1 -1
  227. package/dist/cssm/components/ContentBadge/ContentBadge.js +14 -8
  228. package/dist/cssm/components/ContentBadge/ContentBadge.js.map +1 -1
  229. package/dist/cssm/components/ContentCard/ContentCard.js.map +1 -1
  230. package/dist/cssm/components/CustomSelect/CustomSelect.js +154 -421
  231. package/dist/cssm/components/CustomSelect/CustomSelect.js.map +1 -1
  232. package/dist/cssm/components/CustomSelect/CustomSelectInput/CustomSelectInput.js +22 -4
  233. package/dist/cssm/components/CustomSelect/CustomSelectInput/CustomSelectInput.js.map +1 -1
  234. package/dist/cssm/components/CustomSelect/CustomSelectInput/CustomSelectInput.module.css +12 -0
  235. package/dist/cssm/components/CustomSelect/helpers.js +62 -0
  236. package/dist/cssm/components/CustomSelect/helpers.js.map +1 -0
  237. package/dist/cssm/components/CustomSelect/hooks/useAfterItems.js +58 -0
  238. package/dist/cssm/components/CustomSelect/hooks/useAfterItems.js.map +1 -0
  239. package/dist/cssm/components/CustomSelect/hooks/useDropdownOpenedController.js +60 -0
  240. package/dist/cssm/components/CustomSelect/hooks/useDropdownOpenedController.js.map +1 -0
  241. package/dist/cssm/components/CustomSelect/hooks/useFocusedOptionController.js +52 -0
  242. package/dist/cssm/components/CustomSelect/hooks/useFocusedOptionController.js.map +1 -0
  243. package/dist/cssm/components/CustomSelect/hooks/useInputKeyboardController.js +78 -0
  244. package/dist/cssm/components/CustomSelect/hooks/useInputKeyboardController.js.map +1 -0
  245. package/dist/cssm/components/CustomSelect/hooks/useInputValueController.js +43 -0
  246. package/dist/cssm/components/CustomSelect/hooks/useInputValueController.js.map +1 -0
  247. package/dist/cssm/components/CustomSelect/hooks/useScrollListController.js +37 -0
  248. package/dist/cssm/components/CustomSelect/hooks/useScrollListController.js.map +1 -0
  249. package/dist/cssm/components/CustomSelect/hooks/useSelectedOptionController.js +81 -0
  250. package/dist/cssm/components/CustomSelect/hooks/useSelectedOptionController.js.map +1 -0
  251. package/dist/cssm/components/CustomSelect/types.js +3 -0
  252. package/dist/cssm/components/CustomSelect/types.js.map +1 -0
  253. package/dist/cssm/components/CustomSelectDropdown/CustomSelectDropdown.js +1 -0
  254. package/dist/cssm/components/CustomSelectDropdown/CustomSelectDropdown.js.map +1 -1
  255. package/dist/cssm/components/DateInput/DateInput.js +3 -2
  256. package/dist/cssm/components/DateInput/DateInput.js.map +1 -1
  257. package/dist/cssm/components/DateRangeInput/DateRangeInput.js +4 -4
  258. package/dist/cssm/components/DateRangeInput/DateRangeInput.js.map +1 -1
  259. package/dist/cssm/components/ModalCard/ModalCard.js +2 -1
  260. package/dist/cssm/components/ModalCard/ModalCard.js.map +1 -1
  261. package/dist/cssm/components/ModalCard/ModalCardInternal.js +3 -2
  262. package/dist/cssm/components/ModalCard/ModalCardInternal.js.map +1 -1
  263. package/dist/cssm/components/ModalCard/types.js.map +1 -1
  264. package/dist/cssm/components/ModalOutlet/ModalOutlet.js +2 -2
  265. package/dist/cssm/components/ModalOutlet/ModalOutlet.js.map +1 -1
  266. package/dist/cssm/components/ModalOutlet/ModalOutlet.module.css +4 -0
  267. package/dist/cssm/components/ModalOverlay/ModalOverlay.module.css +1 -1
  268. package/dist/cssm/components/ModalPage/ModalPage.js +2 -1
  269. package/dist/cssm/components/ModalPage/ModalPage.js.map +1 -1
  270. package/dist/cssm/components/ModalPage/ModalPage.module.css +1 -0
  271. package/dist/cssm/components/ModalPage/ModalPageInternal.js +3 -2
  272. package/dist/cssm/components/ModalPage/ModalPageInternal.js.map +1 -1
  273. package/dist/cssm/components/ModalPage/types.js.map +1 -1
  274. package/dist/cssm/components/ModalRoot/ModalRoot.js +4 -2
  275. package/dist/cssm/components/ModalRoot/ModalRoot.js.map +1 -1
  276. package/dist/cssm/components/ModalRoot/types.js.map +1 -1
  277. package/dist/cssm/components/ModalRoot/useModalManager.js +2 -1
  278. package/dist/cssm/components/ModalRoot/useModalManager.js.map +1 -1
  279. package/dist/cssm/components/OnboardingTooltip/OnboardingTooltip.js +3 -2
  280. package/dist/cssm/components/OnboardingTooltip/OnboardingTooltip.js.map +1 -1
  281. package/dist/cssm/components/Popover/Popover.js.map +1 -1
  282. package/dist/cssm/components/Popover/usePopover.js +2 -1
  283. package/dist/cssm/components/Popover/usePopover.js.map +1 -1
  284. package/dist/cssm/components/Popper/Popper.js +2 -1
  285. package/dist/cssm/components/Popper/Popper.js.map +1 -1
  286. package/dist/cssm/components/Select/Select.js +1 -1
  287. package/dist/cssm/components/Select/Select.js.map +1 -1
  288. package/dist/cssm/components/SelectionControl/SelectionControl.js +16 -6
  289. package/dist/cssm/components/SelectionControl/SelectionControl.js.map +1 -1
  290. package/dist/cssm/components/SelectionControl/SelectionControl.module.css +6 -3
  291. package/dist/cssm/components/SelectionControl/SelectionControlContext.js +7 -0
  292. package/dist/cssm/components/SelectionControl/SelectionControlContext.js.map +1 -0
  293. package/dist/cssm/components/SelectionControl/SelectionControlLabel/SelectionControlLabel.js +3 -1
  294. package/dist/cssm/components/SelectionControl/SelectionControlLabel/SelectionControlLabel.js.map +1 -1
  295. package/dist/cssm/components/SelectionControl/SelectionControlLabel/SelectionControlLabel.module.css +6 -3
  296. package/dist/cssm/components/SimpleCell/SimpleCell.js +29 -8
  297. package/dist/cssm/components/SimpleCell/SimpleCell.js.map +1 -1
  298. package/dist/cssm/components/Skeleton/Skeleton.js +1 -1
  299. package/dist/cssm/components/Skeleton/Skeleton.js.map +1 -1
  300. package/dist/cssm/components/Slider/SliderThumb/SliderThumb.module.css +2 -1
  301. package/dist/cssm/components/Tabs/Tabs.js +19 -9
  302. package/dist/cssm/components/Tabs/Tabs.js.map +1 -1
  303. package/dist/cssm/components/Tabs/TabsController.js.map +1 -1
  304. package/dist/cssm/components/Tabs/TabsControllerContext.js +4 -0
  305. package/dist/cssm/components/Tabs/TabsControllerContext.js.map +1 -0
  306. package/dist/cssm/components/Tabs/TabsModeContext.js +1 -2
  307. package/dist/cssm/components/Tabs/TabsModeContext.js.map +1 -1
  308. package/dist/cssm/components/TabsItem/TabsItem.js +3 -1
  309. package/dist/cssm/components/TabsItem/TabsItem.js.map +1 -1
  310. package/dist/cssm/components/Tooltip/Tooltip.js.map +1 -1
  311. package/dist/cssm/components/Tooltip/useTooltip.js +2 -1
  312. package/dist/cssm/components/Tooltip/useTooltip.js.map +1 -1
  313. package/dist/cssm/components/Typography/Caption/Caption.js +4 -1
  314. package/dist/cssm/components/Typography/Caption/Caption.js.map +1 -1
  315. package/dist/cssm/components/Typography/Footnote/Footnote.js +4 -1
  316. package/dist/cssm/components/Typography/Footnote/Footnote.js.map +1 -1
  317. package/dist/cssm/components/Typography/Typography.js +7 -1
  318. package/dist/cssm/components/Typography/Typography.js.map +1 -1
  319. package/dist/cssm/components/View/View.js +2 -1
  320. package/dist/cssm/components/View/View.js.map +1 -1
  321. package/dist/cssm/components/View/View.module.css +1 -1
  322. package/dist/cssm/components/View/ViewInfinite.js +2 -1
  323. package/dist/cssm/components/View/ViewInfinite.js.map +1 -1
  324. package/dist/cssm/components/VisuallyHidden/VisuallyHidden.module.css +0 -2
  325. package/dist/cssm/hooks/useCalendar.js +6 -4
  326. package/dist/cssm/hooks/useCalendar.js.map +1 -1
  327. package/dist/cssm/hooks/useFloatingElement.js +3 -2
  328. package/dist/cssm/hooks/useFloatingElement.js.map +1 -1
  329. package/dist/cssm/hooks/useTodayDate.js +3 -2
  330. package/dist/cssm/hooks/useTodayDate.js.map +1 -1
  331. package/dist/cssm/index.js.map +1 -1
  332. package/dist/cssm/lib/accessibility.js +8 -0
  333. package/dist/cssm/lib/accessibility.js.map +1 -1
  334. package/dist/cssm/lib/calendar.js +9 -7
  335. package/dist/cssm/lib/calendar.js.map +1 -1
  336. package/dist/cssm/lib/date.js +66 -3
  337. package/dist/cssm/lib/date.js.map +1 -1
  338. package/dist/cssm/lib/floating/useFloatingMiddlewaresBootstrap/index.js +18 -8
  339. package/dist/cssm/lib/floating/useFloatingMiddlewaresBootstrap/index.js.map +1 -1
  340. package/dist/cssm/lib/floating/useFloatingWithInteractions/types.js.map +1 -1
  341. package/dist/cssm/lib/touch/UIPanGestureRecognizer.js +2 -2
  342. package/dist/cssm/lib/touch/UIPanGestureRecognizer.js.map +1 -1
  343. package/dist/cssm/lib/utils.js +1 -0
  344. package/dist/cssm/lib/utils.js.map +1 -1
  345. package/dist/cssm/styles/themes.css +1 -1
  346. package/dist/hooks/useCalendar.d.ts.map +1 -1
  347. package/dist/hooks/useCalendar.js +6 -4
  348. package/dist/hooks/useCalendar.js.map +1 -1
  349. package/dist/hooks/useFloatingElement.d.ts +1 -1
  350. package/dist/hooks/useFloatingElement.d.ts.map +1 -1
  351. package/dist/hooks/useFloatingElement.js +3 -2
  352. package/dist/hooks/useFloatingElement.js.map +1 -1
  353. package/dist/hooks/useTodayDate.d.ts.map +1 -1
  354. package/dist/hooks/useTodayDate.js +3 -2
  355. package/dist/hooks/useTodayDate.js.map +1 -1
  356. package/dist/index.d.ts +4 -2
  357. package/dist/index.d.ts.map +1 -1
  358. package/dist/index.js.map +1 -1
  359. package/dist/lib/accessibility.d.ts +1 -1
  360. package/dist/lib/accessibility.d.ts.map +1 -1
  361. package/dist/lib/accessibility.js +8 -0
  362. package/dist/lib/accessibility.js.map +1 -1
  363. package/dist/lib/calendar.d.ts.map +1 -1
  364. package/dist/lib/calendar.js +9 -7
  365. package/dist/lib/calendar.js.map +1 -1
  366. package/dist/lib/date.d.ts +31 -1
  367. package/dist/lib/date.d.ts.map +1 -1
  368. package/dist/lib/date.js +67 -3
  369. package/dist/lib/date.js.map +1 -1
  370. package/dist/lib/floating/useFloatingMiddlewaresBootstrap/index.d.ts +6 -1
  371. package/dist/lib/floating/useFloatingMiddlewaresBootstrap/index.d.ts.map +1 -1
  372. package/dist/lib/floating/useFloatingMiddlewaresBootstrap/index.js +18 -8
  373. package/dist/lib/floating/useFloatingMiddlewaresBootstrap/index.js.map +1 -1
  374. package/dist/lib/floating/useFloatingWithInteractions/types.d.ts +2 -0
  375. package/dist/lib/floating/useFloatingWithInteractions/types.d.ts.map +1 -1
  376. package/dist/lib/floating/useFloatingWithInteractions/types.js.map +1 -1
  377. package/dist/lib/touch/UIPanGestureRecognizer.d.ts.map +1 -1
  378. package/dist/lib/touch/UIPanGestureRecognizer.js +2 -2
  379. package/dist/lib/touch/UIPanGestureRecognizer.js.map +1 -1
  380. package/dist/lib/utils.d.ts +1 -0
  381. package/dist/lib/utils.d.ts.map +1 -1
  382. package/dist/lib/utils.js +1 -0
  383. package/dist/lib/utils.js.map +1 -1
  384. package/dist/vkui.css +1 -1
  385. package/dist/vkui.css.map +1 -1
  386. package/package.json +6 -7
  387. package/src/components/Banner/Banner.module.css +1 -6
  388. package/src/components/Banner/Banner.module.css.d.ts.map +1 -1
  389. package/src/components/Calendar/Calendar.tsx +6 -6
  390. package/src/components/CalendarDays/CalendarDays.tsx +3 -3
  391. package/src/components/CalendarRange/CalendarRange.tsx +15 -20
  392. package/src/components/CalendarRange/utils.ts +7 -6
  393. package/src/components/Cell/Cell.tsx +3 -0
  394. package/src/components/Checkbox/Checkbox.tsx +6 -0
  395. package/src/components/Checkbox/CheckboxSimple/CheckboxSimple.module.css +7 -2
  396. package/src/components/Checkbox/CheckboxSimple/CheckboxSimple.module.css.d.ts.map +1 -1
  397. package/src/components/Checkbox/CheckboxSimple/CheckboxSimple.tsx +12 -3
  398. package/src/components/ChipsInputBase/Chip/Chip.module.css +8 -1
  399. package/src/components/ChipsInputBase/Chip/Chip.module.css.d.ts.map +1 -1
  400. package/src/components/ChipsInputBase/Chip/Chip.tsx +55 -1
  401. package/src/components/ChipsInputBase/types.ts +2 -45
  402. package/src/components/ContentBadge/ContentBadge.tsx +18 -12
  403. package/src/components/ContentCard/ContentCard.tsx +1 -1
  404. package/src/components/CustomSelect/CustomSelect.tsx +216 -562
  405. package/src/components/CustomSelect/CustomSelectInput/CustomSelectInput.module.css +12 -0
  406. package/src/components/CustomSelect/CustomSelectInput/CustomSelectInput.module.css.d.ts.map +1 -1
  407. package/src/components/CustomSelect/CustomSelectInput/CustomSelectInput.tsx +25 -2
  408. package/src/components/CustomSelect/helpers.ts +103 -0
  409. package/src/components/CustomSelect/hooks/useAfterItems.tsx +89 -0
  410. package/src/components/CustomSelect/hooks/useDropdownOpenedController.ts +61 -0
  411. package/src/components/CustomSelect/hooks/useFocusedOptionController.ts +86 -0
  412. package/src/components/CustomSelect/hooks/useInputKeyboardController.ts +96 -0
  413. package/src/components/CustomSelect/hooks/useInputValueController.ts +58 -0
  414. package/src/components/CustomSelect/hooks/useScrollListController.ts +46 -0
  415. package/src/components/CustomSelect/hooks/useSelectedOptionController.ts +132 -0
  416. package/src/components/CustomSelect/types.ts +38 -0
  417. package/src/components/CustomSelectDropdown/CustomSelectDropdown.tsx +1 -0
  418. package/src/components/DateInput/DateInput.tsx +9 -3
  419. package/src/components/DateRangeInput/DateRangeInput.tsx +9 -6
  420. package/src/components/ModalCard/ModalCard.tsx +2 -0
  421. package/src/components/ModalCard/ModalCardInternal.tsx +8 -2
  422. package/src/components/ModalCard/types.ts +6 -0
  423. package/src/components/ModalOutlet/ModalOutlet.module.css +4 -0
  424. package/src/components/ModalOutlet/ModalOutlet.module.css.d.ts.map +1 -1
  425. package/src/components/ModalOutlet/ModalOutlet.tsx +8 -1
  426. package/src/components/ModalOverlay/ModalOverlay.module.css +1 -1
  427. package/src/components/ModalPage/ModalPage.module.css +1 -0
  428. package/src/components/ModalPage/ModalPage.module.css.d.ts.map +1 -1
  429. package/src/components/ModalPage/ModalPage.tsx +2 -0
  430. package/src/components/ModalPage/ModalPageInternal.tsx +8 -2
  431. package/src/components/ModalPage/types.ts +6 -0
  432. package/src/components/ModalRoot/ModalRoot.tsx +19 -6
  433. package/src/components/ModalRoot/types.ts +5 -0
  434. package/src/components/ModalRoot/useModalManager.tsx +4 -0
  435. package/src/components/OnboardingTooltip/OnboardingTooltip.tsx +3 -0
  436. package/src/components/Popover/Popover.tsx +1 -0
  437. package/src/components/Popover/usePopover.tsx +2 -0
  438. package/src/components/Popper/Popper.tsx +3 -0
  439. package/src/components/Select/Select.tsx +5 -5
  440. package/src/components/SelectionControl/SelectionControl.module.css +6 -3
  441. package/src/components/SelectionControl/SelectionControl.module.css.d.ts.map +1 -1
  442. package/src/components/SelectionControl/SelectionControl.tsx +30 -8
  443. package/src/components/SelectionControl/SelectionControlContext.ts +7 -0
  444. package/src/components/SelectionControl/SelectionControlLabel/SelectionControlLabel.module.css +6 -3
  445. package/src/components/SelectionControl/SelectionControlLabel/SelectionControlLabel.module.css.d.ts.map +1 -1
  446. package/src/components/SelectionControl/SelectionControlLabel/SelectionControlLabel.tsx +7 -1
  447. package/src/components/SimpleCell/SimpleCell.tsx +5 -0
  448. package/src/components/Skeleton/Skeleton.tsx +1 -1
  449. package/src/components/Slider/SliderThumb/SliderThumb.module.css +1 -1
  450. package/src/components/Tabs/Tabs.tsx +16 -12
  451. package/src/components/Tabs/TabsController.ts +2 -2
  452. package/src/components/Tabs/TabsControllerContext.ts +7 -0
  453. package/src/components/Tabs/TabsModeContext.ts +0 -3
  454. package/src/components/TabsItem/TabsItem.tsx +5 -9
  455. package/src/components/Tooltip/Tooltip.tsx +1 -0
  456. package/src/components/Tooltip/useTooltip.tsx +2 -0
  457. package/src/components/Typography/Caption/Caption.tsx +14 -6
  458. package/src/components/Typography/Footnote/Footnote.tsx +10 -6
  459. package/src/components/Typography/Typography.tsx +9 -2
  460. package/src/components/View/View.module.css +1 -1
  461. package/src/components/View/View.tsx +2 -1
  462. package/src/components/View/ViewInfinite.tsx +2 -1
  463. package/src/components/VisuallyHidden/VisuallyHidden.module.css +0 -2
  464. package/src/components/VisuallyHidden/VisuallyHidden.module.css.d.ts.map +1 -1
  465. package/src/hooks/useCalendar.ts +6 -4
  466. package/src/hooks/useFloatingElement.tsx +2 -0
  467. package/src/hooks/useTodayDate.ts +3 -2
  468. package/src/index.ts +5 -3
  469. package/src/lib/accessibility.ts +4 -0
  470. package/src/lib/calendar.ts +8 -12
  471. package/src/lib/date.ts +82 -3
  472. package/src/lib/floating/useFloatingMiddlewaresBootstrap/index.ts +23 -10
  473. package/src/lib/floating/useFloatingWithInteractions/types.ts +2 -0
  474. package/src/lib/touch/UIPanGestureRecognizer.ts +2 -2
  475. package/src/lib/utils.ts +3 -0
@@ -47,7 +47,7 @@
47
47
 
48
48
  .subtitle,
49
49
  .extraSubtitle {
50
- color: var(--vkui--color_text_subhead);
50
+ opacity: 0.72;
51
51
  }
52
52
 
53
53
  .bg {
@@ -117,11 +117,6 @@
117
117
  color: var(--vkui--color_text_contrast);
118
118
  }
119
119
 
120
- .inverted .subtitle {
121
- color: var(--vkui--color_text_contrast);
122
- opacity: 0.72;
123
- }
124
-
125
120
  /**
126
121
  * Size "m"
127
122
  */
@@ -2,12 +2,12 @@
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import * as React from "react";
4
4
  import { classNames, isSameDate } from "@vkontakte/vkjs";
5
- import { isSameDay, isSameMonth, startOfMonth } from "date-fns";
5
+ import { startOfMonth } from "date-fns";
6
6
  import { useCalendar } from "../../hooks/useCalendar.js";
7
7
  import { useCustomEnsuredControl } from "../../hooks/useEnsuredControl.js";
8
8
  import { Keys, pressedKey } from "../../lib/accessibility.js";
9
9
  import { clamp, isFirstDay, isLastDay, navigateDate, NAVIGATION_KEYS, setTimeEqual } from "../../lib/calendar.js";
10
- import { convertDateFromTimeZone, convertDateToTimeZone } from "../../lib/date.js";
10
+ import { convertDateFromTimeZone, convertDateToTimeZone, isSameMonth } from "../../lib/date.js";
11
11
  import { isHTMLElement } from "../../lib/dom.js";
12
12
  import { useIsomorphicLayoutEffect } from "../../lib/useIsomorphicLayoutEffect.js";
13
13
  import { warnOnce } from "../../lib/warnOnce.js";
@@ -106,7 +106,7 @@ const warn = warnOnce('Calendar');
106
106
  minDateTime
107
107
  ]);
108
108
  const onDayFocus = React.useCallback((date)=>{
109
- if (focusedDay && isSameDay(focusedDay, date)) {
109
+ if (focusedDay && isSameDate(focusedDay, date)) {
110
110
  return;
111
111
  }
112
112
  setFocusedDay(date);
@@ -119,7 +119,7 @@ const warn = warnOnce('Calendar');
119
119
  setFocusedDay
120
120
  ]);
121
121
  // activeDay это день в календаре соответствующий значению в инпуте
122
- const isDayActive = React.useCallback((day)=>Boolean(timeZonedValue && isSameDay(day, timeZonedValue)), [
122
+ const isDayActive = React.useCallback((day)=>Boolean(timeZonedValue && isSameDate(day, timeZonedValue)), [
123
123
  timeZonedValue
124
124
  ]);
125
125
  const isFocusableDayInViewDateMonth = focusableDay && isSameMonth(focusableDay, viewDate);
@@ -132,7 +132,7 @@ const warn = warnOnce('Calendar');
132
132
  */ const isDayFocusable = React.useCallback((day)=>{
133
133
  // если focusableDay день находится среди дней открытого сейчас месяца, то такой день получит tabIndex="0",
134
134
  if (isFocusableDayInViewDateMonth) {
135
- return isSameDay(focusableDay, day);
135
+ return isSameDate(focusableDay, day);
136
136
  }
137
137
  // при открытии календаря focusableDay не определён,
138
138
  // поэтому tabIndex="0" будет у дня, соответствующего дню в инпуте
@@ -141,7 +141,7 @@ const warn = warnOnce('Calendar');
141
141
  }
142
142
  // при переключении месяца любая навигация с помощью Tab начинается
143
143
  // с первого дня месяца.
144
- return isSameDay(startOfMonth(viewDate), day);
144
+ return isSameDate(startOfMonth(viewDate), day);
145
145
  }, [
146
146
  focusableDay,
147
147
  viewDate,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/Calendar/Calendar.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { classNames, isSameDate } from '@vkontakte/vkjs';\nimport { isSameDay, isSameMonth, startOfMonth } from 'date-fns';\nimport { useCalendar } from '../../hooks/useCalendar';\nimport { useCustomEnsuredControl } from '../../hooks/useEnsuredControl';\nimport { Keys, pressedKey } from '../../lib/accessibility';\nimport {\n clamp,\n isFirstDay,\n isLastDay,\n navigateDate,\n NAVIGATION_KEYS,\n setTimeEqual,\n} from '../../lib/calendar';\nimport { convertDateFromTimeZone, convertDateToTimeZone } from '../../lib/date';\nimport { isHTMLElement } from '../../lib/dom';\nimport { useIsomorphicLayoutEffect } from '../../lib/useIsomorphicLayoutEffect';\nimport { warnOnce } from '../../lib/warnOnce';\nimport type { HTMLAttributesWithRootRef } from '../../types';\nimport {\n CalendarDays,\n type CalendarDaysProps,\n type CalendarDaysTestsProps,\n} from '../CalendarDays/CalendarDays';\nimport {\n CalendarHeader,\n type CalendarHeaderProps,\n type CalendarHeaderTestsProps,\n} from '../CalendarHeader/CalendarHeader';\nimport {\n type CalendarDoneButtonProps,\n CalendarTime,\n type CalendarTimeProps,\n type CalendarTimeTestsProps,\n} from '../CalendarTime/CalendarTime';\nimport { RootComponent } from '../RootComponent/RootComponent';\nimport styles from './Calendar.module.css';\n\nexport type CalendarTestsProps = CalendarDaysTestsProps &\n CalendarHeaderTestsProps &\n CalendarTimeTestsProps;\n\nexport interface CalendarProps\n extends Omit<HTMLAttributesWithRootRef<HTMLDivElement>, 'onChange' | 'defaultValue'>,\n Pick<CalendarTimeProps, 'changeHoursLabel' | 'changeMinutesLabel'>,\n Pick<\n CalendarHeaderProps,\n | 'prevMonthLabel'\n | 'nextMonthLabel'\n | 'changeMonthLabel'\n | 'changeYearLabel'\n | 'onNextMonth'\n | 'onPrevMonth'\n | 'prevMonthIcon'\n | 'nextMonthIcon'\n | 'prevMonthProps'\n | 'nextMonthProps'\n >,\n Pick<CalendarDaysProps, 'dayProps' | 'listenDayChangesForUpdate' | 'renderDayContent'>,\n CalendarDoneButtonProps,\n CalendarTestsProps {\n /**\n * Текущая выбранная дата.\n */\n value?: Date | null;\n /**\n * Начальная дата при монтировании.\n */\n defaultValue?: Date | null;\n /**\n * Запрещает выбор даты в прошлом.\n * Применяется, если не заданы `shouldDisableDate` и `disableFuture`.\n */\n disablePast?: boolean;\n /**\n * Запрещает выбор даты в будущем.\n * Применяется, если не задано `shouldDisableDate`.\n */\n disableFuture?: boolean;\n /**\n * Включает выбор времени.\n */\n enableTime?: boolean;\n /**\n * Отключает селекторы выбора месяца/года.\n */\n disablePickers?: boolean;\n /**\n * `aria-label` для изменения дня.\n *\n * @deprecated Будет удалeно в **VKUI v8**.\n * Использовалось для задания aria-label для контейнера дней в календаре.\n * Теперь этот контейнер является таблицей (с помощью role=\"grid\") и\n * в aria-label рендерится текущий открытый в календаре месяц и год.\n */\n changeDayLabel?: string;\n /**\n * День недели, с которого начинается неделя.\n */\n weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6;\n /**\n * Показывать дни соседних месяцев.\n */\n showNeighboringMonth?: boolean;\n /**\n * Размер календаря.\n */\n size?: 's' | 'm';\n /**\n * Обработчик изменения выбранной даты.\n */\n onChange?: (value?: Date) => void; // TODO [>=8]: поменять тип на `(value?: Date | null) => void`\n /**\n * Функция для проверки запрета выбора даты.\n */\n shouldDisableDate?: (value: Date) => boolean;\n /**\n * Дата отображаемого месяца.\n * При использовании обновление даты должно происходить вне компонента.\n */\n viewDate?: Date;\n /**\n * Обработчик изменения даты в шапке календаря.\n */\n onHeaderChange?: (value: Date) => void;\n /**\n * Минимальные дата и время, которые можно выбрать.\n * Применяется, если не заданы `shouldDisableDate` и `disablePast`/`disableFuture`.\n */\n minDateTime?: Date;\n /**\n * Максимальные дата и время, которые можно выбрать.\n * Применяется, если не заданы `shouldDisableDate` и `disablePast`/`disableFuture`.\n */\n maxDateTime?: Date;\n /**\n * Часовой пояс для отображения даты.\n */\n timezone?: string;\n}\n\nconst warn = warnOnce('Calendar');\n\n/**\n * @see https://vkui.io/components/calendar\n */\nexport const Calendar = ({\n getRootRef,\n 'value': valueProp,\n defaultValue,\n onChange,\n disablePast,\n disableFuture,\n shouldDisableDate,\n onDoneButtonClick,\n enableTime = false,\n doneButtonText,\n doneButtonDisabled,\n doneButtonShow,\n DoneButton,\n weekStartsOn = 1,\n disablePickers,\n 'aria-label': ariaLabel = 'Календарь',\n changeHoursLabel = 'Изменить час',\n changeMinutesLabel = 'Изменить минуту',\n prevMonthLabel = 'Предыдущий месяц',\n nextMonthLabel = 'Следующий месяц',\n changeMonthLabel = 'Изменить месяц',\n changeYearLabel = 'Изменить год',\n showNeighboringMonth,\n size = 'm',\n 'viewDate': externalViewDate,\n onHeaderChange,\n onNextMonth,\n onPrevMonth,\n prevMonthIcon,\n nextMonthIcon,\n prevMonthProps,\n nextMonthProps,\n dayProps,\n listenDayChangesForUpdate,\n renderDayContent,\n minDateTime,\n maxDateTime,\n timezone,\n minutesTestId,\n hoursTestId,\n doneButtonTestId,\n prevMonthButtonTestId,\n nextMonthButtonTestId,\n monthDropdownTestId,\n yearDropdownTestId,\n dayTestId,\n ...props\n}: CalendarProps): React.ReactNode => {\n const _onChange = React.useCallback(\n (date: Date | null | undefined) => {\n onChange?.(convertDateFromTimeZone(date, timezone) || undefined);\n },\n [onChange, timezone],\n );\n\n const [value, updateValue] = useCustomEnsuredControl<Date | null | undefined>({\n value: valueProp,\n defaultValue,\n onChange: _onChange,\n });\n\n const timeZonedValue: Date | null | undefined = React.useMemo(\n () => convertDateToTimeZone(value, timezone),\n [timezone, value],\n );\n\n const {\n viewDate,\n setViewDate,\n setPrevMonth,\n setNextMonth,\n focusedDay,\n setFocusedDay,\n isDayFocused,\n isDayDisabled,\n isMonthDisabled,\n isYearDisabled,\n } = useCalendar({\n value: timeZonedValue,\n disableFuture,\n disablePast,\n shouldDisableDate,\n onHeaderChange,\n onNextMonth,\n onPrevMonth,\n minDateTime,\n maxDateTime,\n });\n // соотвествует дню, на котором можно сфокусироваться с помощью Tab\n const [focusableDay, setFocusableDay] = React.useState<Date>();\n\n useIsomorphicLayoutEffect(() => {\n if (timeZonedValue) {\n setViewDate(timeZonedValue);\n }\n }, [timeZonedValue]);\n\n if (process.env.NODE_ENV === 'development' && !disablePickers && size === 's') {\n warn(\"Нельзя включить селекты выбора месяца/года, если размер календаря 's'\", 'error');\n }\n\n if (process.env.NODE_ENV === 'development' && enableTime && size === 's') {\n warn(\"Нельзя включить выбор времени, если размер календаря 's'\", 'error');\n }\n\n const handleKeyDown = React.useCallback(\n (event: React.KeyboardEvent) => {\n const key = pressedKey(event);\n if (key && NAVIGATION_KEYS.includes(key)) {\n event.preventDefault();\n\n const newFocusedDay = navigateDate(focusedDay ?? timeZonedValue, key);\n\n if (newFocusedDay && !isSameMonth(newFocusedDay, viewDate)) {\n setViewDate(newFocusedDay);\n }\n setFocusedDay(newFocusedDay);\n setFocusableDay(newFocusedDay);\n\n return;\n }\n\n if (key === Keys.TAB) {\n setFocusedDay(undefined);\n setFocusableDay(focusedDay);\n\n return;\n }\n\n if ((key === Keys.ENTER || key === Keys.SPACE) && isHTMLElement(event.target)) {\n event.preventDefault();\n event.target.click?.();\n }\n },\n [focusedDay, setFocusedDay, setFocusableDay, setViewDate, timeZonedValue, viewDate],\n );\n\n const onDayChange = React.useCallback(\n (date: Date) => {\n let actualDate = setTimeEqual(date, timeZonedValue);\n if (minDateTime || maxDateTime) {\n actualDate = clamp(actualDate, { min: minDateTime, max: maxDateTime });\n }\n updateValue(actualDate);\n },\n [timeZonedValue, updateValue, maxDateTime, minDateTime],\n );\n\n const onDayFocus = React.useCallback(\n (date: Date) => {\n if (focusedDay && isSameDay(focusedDay, date)) {\n return;\n }\n\n setFocusedDay(date);\n if (!focusableDay || !isSameDate(date, focusableDay)) {\n setFocusableDay(date);\n }\n },\n [focusableDay, focusedDay, setFocusedDay],\n );\n\n // activeDay это день в календаре соответствующий значению в инпуте\n const isDayActive = React.useCallback(\n (day: Date) => Boolean(timeZonedValue && isSameDay(day, timeZonedValue)),\n [timeZonedValue],\n );\n\n const isFocusableDayInViewDateMonth = focusableDay && isSameMonth(focusableDay, viewDate);\n const isInputValueDateInViewDateMonth = timeZonedValue && isSameMonth(timeZonedValue, viewDate);\n /**\n * Функция позволяет проверить является ли день в календаре днём на который\n * можно попасть с помощью Tab.\n * Единственный день в таблице календаря у которого есть tabIndex=\"0\"\n * Чтобы на него можно было попасть из заголовка календаря.\n */\n const isDayFocusable = React.useCallback(\n (day: Date) => {\n // если focusableDay день находится среди дней открытого сейчас месяца, то такой день получит tabIndex=\"0\",\n if (isFocusableDayInViewDateMonth) {\n return isSameDay(focusableDay, day);\n }\n\n // при открытии календаря focusableDay не определён,\n // поэтому tabIndex=\"0\" будет у дня, соответствующего дню в инпуте\n if (isInputValueDateInViewDateMonth) {\n return isDayActive(day);\n }\n\n // при переключении месяца любая навигация с помощью Tab начинается\n // с первого дня месяца.\n return isSameDay(startOfMonth(viewDate), day);\n },\n [\n focusableDay,\n viewDate,\n isDayActive,\n isFocusableDayInViewDateMonth,\n isInputValueDateInViewDateMonth,\n ],\n );\n\n return (\n <RootComponent\n aria-label={ariaLabel}\n {...props}\n baseClassName={classNames(styles.host, size === 's' && styles.sizeS)}\n getRootRef={getRootRef}\n >\n <CalendarHeader\n viewDate={externalViewDate || viewDate}\n onChange={setViewDate}\n onNextMonth={setNextMonth}\n onPrevMonth={setPrevMonth}\n disablePickers={disablePickers || size === 's'}\n className={styles.header}\n prevMonthLabel={prevMonthLabel}\n nextMonthLabel={nextMonthLabel}\n changeMonthLabel={changeMonthLabel}\n changeYearLabel={changeYearLabel}\n prevMonthIcon={prevMonthIcon}\n nextMonthIcon={nextMonthIcon}\n prevMonthProps={prevMonthProps}\n nextMonthProps={nextMonthProps}\n isMonthDisabled={isMonthDisabled}\n isYearDisabled={isYearDisabled}\n nextMonthButtonTestId={nextMonthButtonTestId}\n prevMonthButtonTestId={prevMonthButtonTestId}\n monthDropdownTestId={monthDropdownTestId}\n yearDropdownTestId={yearDropdownTestId}\n />\n <CalendarDays\n viewDate={externalViewDate || viewDate}\n value={timeZonedValue}\n weekStartsOn={weekStartsOn}\n onKeyDown={handleKeyDown}\n onDayChange={onDayChange}\n isDayActive={isDayActive}\n onDayFocus={onDayFocus}\n isDayFocused={isDayFocused}\n isDayFocusable={isDayFocusable}\n isDaySelectionStart={isFirstDay}\n isDaySelectionEnd={isLastDay}\n isDayDisabled={isDayDisabled}\n showNeighboringMonth={showNeighboringMonth}\n size={size}\n dayProps={dayProps}\n listenDayChangesForUpdate={listenDayChangesForUpdate}\n renderDayContent={renderDayContent}\n dayTestId={dayTestId}\n />\n {enableTime && timeZonedValue && size !== 's' && (\n <div className={styles.time}>\n <CalendarTime\n value={timeZonedValue}\n onChange={updateValue}\n onDoneButtonClick={onDoneButtonClick}\n doneButtonText={doneButtonText}\n doneButtonDisabled={doneButtonDisabled}\n doneButtonShow={doneButtonShow}\n DoneButton={DoneButton}\n changeHoursLabel={changeHoursLabel}\n changeMinutesLabel={changeMinutesLabel}\n isDayDisabled={minDateTime || maxDateTime ? isDayDisabled : undefined}\n minutesTestId={minutesTestId}\n hoursTestId={hoursTestId}\n doneButtonTestId={doneButtonTestId}\n />\n </div>\n )}\n </RootComponent>\n );\n};\n"],"names":["React","classNames","isSameDate","isSameDay","isSameMonth","startOfMonth","useCalendar","useCustomEnsuredControl","Keys","pressedKey","clamp","isFirstDay","isLastDay","navigateDate","NAVIGATION_KEYS","setTimeEqual","convertDateFromTimeZone","convertDateToTimeZone","isHTMLElement","useIsomorphicLayoutEffect","warnOnce","CalendarDays","CalendarHeader","CalendarTime","RootComponent","styles","warn","Calendar","getRootRef","valueProp","defaultValue","onChange","disablePast","disableFuture","shouldDisableDate","onDoneButtonClick","enableTime","doneButtonText","doneButtonDisabled","doneButtonShow","DoneButton","weekStartsOn","disablePickers","ariaLabel","changeHoursLabel","changeMinutesLabel","prevMonthLabel","nextMonthLabel","changeMonthLabel","changeYearLabel","showNeighboringMonth","size","externalViewDate","onHeaderChange","onNextMonth","onPrevMonth","prevMonthIcon","nextMonthIcon","prevMonthProps","nextMonthProps","dayProps","listenDayChangesForUpdate","renderDayContent","minDateTime","maxDateTime","timezone","minutesTestId","hoursTestId","doneButtonTestId","prevMonthButtonTestId","nextMonthButtonTestId","monthDropdownTestId","yearDropdownTestId","dayTestId","props","_onChange","useCallback","date","undefined","value","updateValue","timeZonedValue","useMemo","viewDate","setViewDate","setPrevMonth","setNextMonth","focusedDay","setFocusedDay","isDayFocused","isDayDisabled","isMonthDisabled","isYearDisabled","focusableDay","setFocusableDay","useState","process","env","NODE_ENV","handleKeyDown","event","key","includes","preventDefault","newFocusedDay","TAB","ENTER","SPACE","target","click","onDayChange","actualDate","min","max","onDayFocus","isDayActive","day","Boolean","isFocusableDayInViewDateMonth","isInputValueDateInViewDateMonth","isDayFocusable","aria-label","baseClassName","host","sizeS","className","header","onKeyDown","isDaySelectionStart","isDaySelectionEnd","div","time"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/components/Calendar/Calendar.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { classNames, isSameDate } from '@vkontakte/vkjs';\nimport { startOfMonth } from 'date-fns';\nimport { useCalendar } from '../../hooks/useCalendar';\nimport { useCustomEnsuredControl } from '../../hooks/useEnsuredControl';\nimport { Keys, pressedKey } from '../../lib/accessibility';\nimport {\n clamp,\n isFirstDay,\n isLastDay,\n navigateDate,\n NAVIGATION_KEYS,\n setTimeEqual,\n} from '../../lib/calendar';\nimport { convertDateFromTimeZone, convertDateToTimeZone, isSameMonth } from '../../lib/date';\nimport { isHTMLElement } from '../../lib/dom';\nimport { useIsomorphicLayoutEffect } from '../../lib/useIsomorphicLayoutEffect';\nimport { warnOnce } from '../../lib/warnOnce';\nimport type { HTMLAttributesWithRootRef } from '../../types';\nimport {\n CalendarDays,\n type CalendarDaysProps,\n type CalendarDaysTestsProps,\n} from '../CalendarDays/CalendarDays';\nimport {\n CalendarHeader,\n type CalendarHeaderProps,\n type CalendarHeaderTestsProps,\n} from '../CalendarHeader/CalendarHeader';\nimport {\n type CalendarDoneButtonProps,\n CalendarTime,\n type CalendarTimeProps,\n type CalendarTimeTestsProps,\n} from '../CalendarTime/CalendarTime';\nimport { RootComponent } from '../RootComponent/RootComponent';\nimport styles from './Calendar.module.css';\n\nexport type CalendarTestsProps = CalendarDaysTestsProps &\n CalendarHeaderTestsProps &\n CalendarTimeTestsProps;\n\nexport interface CalendarProps\n extends Omit<HTMLAttributesWithRootRef<HTMLDivElement>, 'onChange' | 'defaultValue'>,\n Pick<CalendarTimeProps, 'changeHoursLabel' | 'changeMinutesLabel'>,\n Pick<\n CalendarHeaderProps,\n | 'prevMonthLabel'\n | 'nextMonthLabel'\n | 'changeMonthLabel'\n | 'changeYearLabel'\n | 'onNextMonth'\n | 'onPrevMonth'\n | 'prevMonthIcon'\n | 'nextMonthIcon'\n | 'prevMonthProps'\n | 'nextMonthProps'\n >,\n Pick<CalendarDaysProps, 'dayProps' | 'listenDayChangesForUpdate' | 'renderDayContent'>,\n CalendarDoneButtonProps,\n CalendarTestsProps {\n /**\n * Текущая выбранная дата.\n */\n value?: Date | null;\n /**\n * Начальная дата при монтировании.\n */\n defaultValue?: Date | null;\n /**\n * Запрещает выбор даты в прошлом.\n * Применяется, если не заданы `shouldDisableDate` и `disableFuture`.\n */\n disablePast?: boolean;\n /**\n * Запрещает выбор даты в будущем.\n * Применяется, если не задано `shouldDisableDate`.\n */\n disableFuture?: boolean;\n /**\n * Включает выбор времени.\n */\n enableTime?: boolean;\n /**\n * Отключает селекторы выбора месяца/года.\n */\n disablePickers?: boolean;\n /**\n * `aria-label` для изменения дня.\n *\n * @deprecated Будет удалeно в **VKUI v8**.\n * Использовалось для задания aria-label для контейнера дней в календаре.\n * Теперь этот контейнер является таблицей (с помощью role=\"grid\") и\n * в aria-label рендерится текущий открытый в календаре месяц и год.\n */\n changeDayLabel?: string;\n /**\n * День недели, с которого начинается неделя.\n */\n weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6;\n /**\n * Показывать дни соседних месяцев.\n */\n showNeighboringMonth?: boolean;\n /**\n * Размер календаря.\n */\n size?: 's' | 'm';\n /**\n * Обработчик изменения выбранной даты.\n */\n onChange?: (value?: Date) => void; // TODO [>=8]: поменять тип на `(value?: Date | null) => void`\n /**\n * Функция для проверки запрета выбора даты.\n */\n shouldDisableDate?: (value: Date) => boolean;\n /**\n * Дата отображаемого месяца.\n * При использовании обновление даты должно происходить вне компонента.\n */\n viewDate?: Date;\n /**\n * Обработчик изменения даты в шапке календаря.\n */\n onHeaderChange?: (value: Date) => void;\n /**\n * Минимальные дата и время, которые можно выбрать.\n * Применяется, если не заданы `shouldDisableDate` и `disablePast`/`disableFuture`.\n */\n minDateTime?: Date;\n /**\n * Максимальные дата и время, которые можно выбрать.\n * Применяется, если не заданы `shouldDisableDate` и `disablePast`/`disableFuture`.\n */\n maxDateTime?: Date;\n /**\n * Часовой пояс для отображения даты.\n */\n timezone?: string;\n}\n\nconst warn = warnOnce('Calendar');\n\n/**\n * @see https://vkui.io/components/calendar\n */\nexport const Calendar = ({\n getRootRef,\n 'value': valueProp,\n defaultValue,\n onChange,\n disablePast,\n disableFuture,\n shouldDisableDate,\n onDoneButtonClick,\n enableTime = false,\n doneButtonText,\n doneButtonDisabled,\n doneButtonShow,\n DoneButton,\n weekStartsOn = 1,\n disablePickers,\n 'aria-label': ariaLabel = 'Календарь',\n changeHoursLabel = 'Изменить час',\n changeMinutesLabel = 'Изменить минуту',\n prevMonthLabel = 'Предыдущий месяц',\n nextMonthLabel = 'Следующий месяц',\n changeMonthLabel = 'Изменить месяц',\n changeYearLabel = 'Изменить год',\n showNeighboringMonth,\n size = 'm',\n 'viewDate': externalViewDate,\n onHeaderChange,\n onNextMonth,\n onPrevMonth,\n prevMonthIcon,\n nextMonthIcon,\n prevMonthProps,\n nextMonthProps,\n dayProps,\n listenDayChangesForUpdate,\n renderDayContent,\n minDateTime,\n maxDateTime,\n timezone,\n minutesTestId,\n hoursTestId,\n doneButtonTestId,\n prevMonthButtonTestId,\n nextMonthButtonTestId,\n monthDropdownTestId,\n yearDropdownTestId,\n dayTestId,\n ...props\n}: CalendarProps): React.ReactNode => {\n const _onChange = React.useCallback(\n (date: Date | null | undefined) => {\n onChange?.(convertDateFromTimeZone(date, timezone) || undefined);\n },\n [onChange, timezone],\n );\n\n const [value, updateValue] = useCustomEnsuredControl<Date | null | undefined>({\n value: valueProp,\n defaultValue,\n onChange: _onChange,\n });\n\n const timeZonedValue: Date | null | undefined = React.useMemo(\n () => convertDateToTimeZone(value, timezone),\n [timezone, value],\n );\n\n const {\n viewDate,\n setViewDate,\n setPrevMonth,\n setNextMonth,\n focusedDay,\n setFocusedDay,\n isDayFocused,\n isDayDisabled,\n isMonthDisabled,\n isYearDisabled,\n } = useCalendar({\n value: timeZonedValue,\n disableFuture,\n disablePast,\n shouldDisableDate,\n onHeaderChange,\n onNextMonth,\n onPrevMonth,\n minDateTime,\n maxDateTime,\n });\n // соотвествует дню, на котором можно сфокусироваться с помощью Tab\n const [focusableDay, setFocusableDay] = React.useState<Date>();\n\n useIsomorphicLayoutEffect(() => {\n if (timeZonedValue) {\n setViewDate(timeZonedValue);\n }\n }, [timeZonedValue]);\n\n if (process.env.NODE_ENV === 'development' && !disablePickers && size === 's') {\n warn(\"Нельзя включить селекты выбора месяца/года, если размер календаря 's'\", 'error');\n }\n\n if (process.env.NODE_ENV === 'development' && enableTime && size === 's') {\n warn(\"Нельзя включить выбор времени, если размер календаря 's'\", 'error');\n }\n\n const handleKeyDown = React.useCallback(\n (event: React.KeyboardEvent) => {\n const key = pressedKey(event);\n if (key && NAVIGATION_KEYS.includes(key)) {\n event.preventDefault();\n\n const newFocusedDay = navigateDate(focusedDay ?? timeZonedValue, key);\n\n if (newFocusedDay && !isSameMonth(newFocusedDay, viewDate)) {\n setViewDate(newFocusedDay);\n }\n setFocusedDay(newFocusedDay);\n setFocusableDay(newFocusedDay);\n\n return;\n }\n\n if (key === Keys.TAB) {\n setFocusedDay(undefined);\n setFocusableDay(focusedDay);\n\n return;\n }\n\n if ((key === Keys.ENTER || key === Keys.SPACE) && isHTMLElement(event.target)) {\n event.preventDefault();\n event.target.click?.();\n }\n },\n [focusedDay, setFocusedDay, setFocusableDay, setViewDate, timeZonedValue, viewDate],\n );\n\n const onDayChange = React.useCallback(\n (date: Date) => {\n let actualDate = setTimeEqual(date, timeZonedValue);\n if (minDateTime || maxDateTime) {\n actualDate = clamp(actualDate, { min: minDateTime, max: maxDateTime });\n }\n updateValue(actualDate);\n },\n [timeZonedValue, updateValue, maxDateTime, minDateTime],\n );\n\n const onDayFocus = React.useCallback(\n (date: Date) => {\n if (focusedDay && isSameDate(focusedDay, date)) {\n return;\n }\n\n setFocusedDay(date);\n if (!focusableDay || !isSameDate(date, focusableDay)) {\n setFocusableDay(date);\n }\n },\n [focusableDay, focusedDay, setFocusedDay],\n );\n\n // activeDay это день в календаре соответствующий значению в инпуте\n const isDayActive = React.useCallback(\n (day: Date) => Boolean(timeZonedValue && isSameDate(day, timeZonedValue)),\n [timeZonedValue],\n );\n\n const isFocusableDayInViewDateMonth = focusableDay && isSameMonth(focusableDay, viewDate);\n const isInputValueDateInViewDateMonth = timeZonedValue && isSameMonth(timeZonedValue, viewDate);\n /**\n * Функция позволяет проверить является ли день в календаре днём на который\n * можно попасть с помощью Tab.\n * Единственный день в таблице календаря у которого есть tabIndex=\"0\"\n * Чтобы на него можно было попасть из заголовка календаря.\n */\n const isDayFocusable = React.useCallback(\n (day: Date) => {\n // если focusableDay день находится среди дней открытого сейчас месяца, то такой день получит tabIndex=\"0\",\n if (isFocusableDayInViewDateMonth) {\n return isSameDate(focusableDay, day);\n }\n\n // при открытии календаря focusableDay не определён,\n // поэтому tabIndex=\"0\" будет у дня, соответствующего дню в инпуте\n if (isInputValueDateInViewDateMonth) {\n return isDayActive(day);\n }\n\n // при переключении месяца любая навигация с помощью Tab начинается\n // с первого дня месяца.\n return isSameDate(startOfMonth(viewDate), day);\n },\n [\n focusableDay,\n viewDate,\n isDayActive,\n isFocusableDayInViewDateMonth,\n isInputValueDateInViewDateMonth,\n ],\n );\n\n return (\n <RootComponent\n aria-label={ariaLabel}\n {...props}\n baseClassName={classNames(styles.host, size === 's' && styles.sizeS)}\n getRootRef={getRootRef}\n >\n <CalendarHeader\n viewDate={externalViewDate || viewDate}\n onChange={setViewDate}\n onNextMonth={setNextMonth}\n onPrevMonth={setPrevMonth}\n disablePickers={disablePickers || size === 's'}\n className={styles.header}\n prevMonthLabel={prevMonthLabel}\n nextMonthLabel={nextMonthLabel}\n changeMonthLabel={changeMonthLabel}\n changeYearLabel={changeYearLabel}\n prevMonthIcon={prevMonthIcon}\n nextMonthIcon={nextMonthIcon}\n prevMonthProps={prevMonthProps}\n nextMonthProps={nextMonthProps}\n isMonthDisabled={isMonthDisabled}\n isYearDisabled={isYearDisabled}\n nextMonthButtonTestId={nextMonthButtonTestId}\n prevMonthButtonTestId={prevMonthButtonTestId}\n monthDropdownTestId={monthDropdownTestId}\n yearDropdownTestId={yearDropdownTestId}\n />\n <CalendarDays\n viewDate={externalViewDate || viewDate}\n value={timeZonedValue}\n weekStartsOn={weekStartsOn}\n onKeyDown={handleKeyDown}\n onDayChange={onDayChange}\n isDayActive={isDayActive}\n onDayFocus={onDayFocus}\n isDayFocused={isDayFocused}\n isDayFocusable={isDayFocusable}\n isDaySelectionStart={isFirstDay}\n isDaySelectionEnd={isLastDay}\n isDayDisabled={isDayDisabled}\n showNeighboringMonth={showNeighboringMonth}\n size={size}\n dayProps={dayProps}\n listenDayChangesForUpdate={listenDayChangesForUpdate}\n renderDayContent={renderDayContent}\n dayTestId={dayTestId}\n />\n {enableTime && timeZonedValue && size !== 's' && (\n <div className={styles.time}>\n <CalendarTime\n value={timeZonedValue}\n onChange={updateValue}\n onDoneButtonClick={onDoneButtonClick}\n doneButtonText={doneButtonText}\n doneButtonDisabled={doneButtonDisabled}\n doneButtonShow={doneButtonShow}\n DoneButton={DoneButton}\n changeHoursLabel={changeHoursLabel}\n changeMinutesLabel={changeMinutesLabel}\n isDayDisabled={minDateTime || maxDateTime ? isDayDisabled : undefined}\n minutesTestId={minutesTestId}\n hoursTestId={hoursTestId}\n doneButtonTestId={doneButtonTestId}\n />\n </div>\n )}\n </RootComponent>\n );\n};\n"],"names":["React","classNames","isSameDate","startOfMonth","useCalendar","useCustomEnsuredControl","Keys","pressedKey","clamp","isFirstDay","isLastDay","navigateDate","NAVIGATION_KEYS","setTimeEqual","convertDateFromTimeZone","convertDateToTimeZone","isSameMonth","isHTMLElement","useIsomorphicLayoutEffect","warnOnce","CalendarDays","CalendarHeader","CalendarTime","RootComponent","styles","warn","Calendar","getRootRef","valueProp","defaultValue","onChange","disablePast","disableFuture","shouldDisableDate","onDoneButtonClick","enableTime","doneButtonText","doneButtonDisabled","doneButtonShow","DoneButton","weekStartsOn","disablePickers","ariaLabel","changeHoursLabel","changeMinutesLabel","prevMonthLabel","nextMonthLabel","changeMonthLabel","changeYearLabel","showNeighboringMonth","size","externalViewDate","onHeaderChange","onNextMonth","onPrevMonth","prevMonthIcon","nextMonthIcon","prevMonthProps","nextMonthProps","dayProps","listenDayChangesForUpdate","renderDayContent","minDateTime","maxDateTime","timezone","minutesTestId","hoursTestId","doneButtonTestId","prevMonthButtonTestId","nextMonthButtonTestId","monthDropdownTestId","yearDropdownTestId","dayTestId","props","_onChange","useCallback","date","undefined","value","updateValue","timeZonedValue","useMemo","viewDate","setViewDate","setPrevMonth","setNextMonth","focusedDay","setFocusedDay","isDayFocused","isDayDisabled","isMonthDisabled","isYearDisabled","focusableDay","setFocusableDay","useState","process","env","NODE_ENV","handleKeyDown","event","key","includes","preventDefault","newFocusedDay","TAB","ENTER","SPACE","target","click","onDayChange","actualDate","min","max","onDayFocus","isDayActive","day","Boolean","isFocusableDayInViewDateMonth","isInputValueDateInViewDateMonth","isDayFocusable","aria-label","baseClassName","host","sizeS","className","header","onKeyDown","isDaySelectionStart","isDaySelectionEnd","div","time"],"mappings":"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"}
@@ -1,10 +1,10 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import * as React from "react";
4
- import { classNames } from "@vkontakte/vkjs";
5
- import { isSameDay, isSameMonth } from "date-fns";
4
+ import { classNames, isSameDate } from "@vkontakte/vkjs";
6
5
  import { useTodayDate } from "../../hooks/useTodayDate.js";
7
6
  import { getDaysNames, getWeeks } from "../../lib/calendar.js";
7
+ import { isSameMonth } from "../../lib/date.js";
8
8
  import { CalendarDay } from "../CalendarDay/CalendarDay.js";
9
9
  import { useConfigProvider } from "../ConfigProvider/ConfigProviderContext.js";
10
10
  import { RootComponent } from "../RootComponent/RootComponent.js";
@@ -64,7 +64,7 @@ export const CalendarDays = ({ viewDate, value, weekStartsOn, onDayChange, isDay
64
64
  children: week.map((day, i)=>{
65
65
  const sameMonth = isSameMonth(day, viewDate);
66
66
  const isHidden = !showNeighboringMonth && !sameMonth;
67
- const isToday = isSameDay(day, now);
67
+ const isToday = isSameDate(day, now);
68
68
  const isActive = isDayActive(day);
69
69
  const isFocused = isDayFocused(day);
70
70
  return /*#__PURE__*/ _jsx(CalendarDay, {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/CalendarDays/CalendarDays.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { isSameDay, isSameMonth } from 'date-fns';\nimport { useTodayDate } from '../../hooks/useTodayDate';\nimport { getDaysNames, getWeeks } from '../../lib/calendar';\nimport type { HTMLAttributesWithRootRef } from '../../types';\nimport {\n CalendarDay,\n type CalendarDayElementProps,\n type CalendarDayProps,\n type CalendarDayTestsProps,\n} from '../CalendarDay/CalendarDay';\nimport { useConfigProvider } from '../ConfigProvider/ConfigProviderContext';\nimport { RootComponent } from '../RootComponent/RootComponent';\nimport { Footnote } from '../Typography/Footnote/Footnote';\nimport { VisuallyHidden } from '../VisuallyHidden/VisuallyHidden';\nimport styles from './CalendarDays.module.css';\n\nexport type CalendarDaysTestsProps = {\n /**\n * Передает атрибут `data-testid` для дня в календаре.\n */\n dayTestId?: CalendarDayTestsProps['testId'];\n};\n\nexport interface CalendarDaysProps\n extends Omit<HTMLAttributesWithRootRef<HTMLDivElement>, 'onChange'>,\n Pick<CalendarDayProps, 'renderDayContent'>,\n CalendarDaysTestsProps {\n /**\n * Выбранная дата или диапазон дат.\n */\n value?: Date | Array<Date | null> | null;\n /**\n * Дата, определяющая отображаемый месяц.\n */\n viewDate: Date;\n /**\n * День недели, с которого начинается неделя (0 - воскресенье, 6 - суббота).\n */\n weekStartsOn: 0 | 1 | 2 | 3 | 4 | 5 | 6;\n /**\n * Показывать дни соседних месяцев.\n */\n showNeighboringMonth?: boolean;\n /**\n * Размер календаря.\n */\n size?: 's' | 'm';\n /**\n * Дополнительные свойства для элементов дней.\n */\n dayProps?: CalendarDayElementProps;\n /**\n * Следить за изменениями дней для обновления UI.\n */\n listenDayChangesForUpdate?: boolean;\n /**\n * Обработчик изменения выбранного дня.\n */\n onDayChange: (value: Date) => void;\n /**\n * Проверяет, заблокирован ли день для выбора.\n */\n isDayDisabled: (value: Date) => boolean;\n /**\n * Определяет, является ли день началом выделенного диапазона.\n */\n isDaySelectionStart: (value: Date, dayOfWeek: number) => boolean;\n /**\n * Определяет, является ли день концом выделенного диапазона.\n */\n isDaySelectionEnd: (value: Date, dayOfWeek: number) => boolean;\n /**\n * Определяет начало диапазона при наведении (подсветка).\n */\n isHintedDaySelectionStart?: (value: Date, dayOfWeek: number) => boolean;\n /**\n * Определяет конец диапазона при наведении (подсветка).\n */\n isHintedDaySelectionEnd?: (value: Date, dayOfWeek: number) => boolean;\n /**\n * Проверяет, является ли день активным (текущая дата).\n */\n isDayActive: (value: Date) => boolean;\n /**\n * Проверяет, подсвечен ли день (при наведении).\n */\n isDayHinted?: (value: Date) => boolean;\n /**\n * Проверяет, возможно ли сфокусироваться на дне с клавиатуры.\n */\n isDayFocusable?: (value: Date) => boolean;\n /**\n * Проверяет, выбран ли день.\n */\n isDaySelected?: (value: Date) => boolean;\n /**\n * Проверяет, находится ли день в фокусе.\n */\n isDayFocused: (value: Date) => boolean;\n /**\n * Обработчик события 'pointerenter' на элементе дня.\n */\n onDayEnter?: (value: Date) => void;\n /**\n * Обработчик события 'pointerleave' на элементе дня.\n */\n onDayLeave?: (value: Date) => void;\n /**\n * Обработчик события `focus` на элементе дня.\n */\n onDayFocus?: (value: Date) => void;\n}\n\nexport const CalendarDays = ({\n viewDate,\n value,\n weekStartsOn,\n onDayChange,\n isDaySelected,\n isDayActive,\n isDaySelectionEnd,\n isDaySelectionStart,\n onDayEnter,\n onDayLeave,\n onDayFocus,\n isDayHinted,\n isHintedDaySelectionStart,\n isHintedDaySelectionEnd,\n isDayFocused,\n isDayFocusable,\n isDayDisabled,\n size,\n showNeighboringMonth = false,\n dayProps,\n listenDayChangesForUpdate = false,\n getRootRef,\n renderDayContent,\n dayTestId,\n ...props\n}: CalendarDaysProps): React.ReactNode => {\n const { locale } = useConfigProvider();\n const now = useTodayDate(listenDayChangesForUpdate);\n\n const weeks = React.useMemo(() => getWeeks(viewDate, weekStartsOn), [weekStartsOn, viewDate]);\n\n const daysNames = React.useMemo(\n () => getDaysNames(now, weekStartsOn, locale),\n [locale, now, weekStartsOn],\n );\n\n const handleDayChange = React.useCallback(\n (date: Date) => {\n onDayChange(date);\n },\n [onDayChange],\n );\n\n const viewDateLabelId = React.useId();\n const currentMonthLabel = value\n ? new Intl.DateTimeFormat(locale, {\n year: 'numeric',\n month: 'long',\n }).format(viewDate)\n : null;\n\n return (\n <React.Fragment>\n {/*\n * Нельзя помещать текст currentMonthLabel внутрь role=\"grid\" или с помощью aria-label,\n * иначе пользователи NVDA не смогут ходить по таблице\n * с помощью горячих клавиш <Ctrl+Alt+стрелочки>.\n * Имеется ввиду связка (применение которой визуально не видно):\n * - из заголовка календаря прыжок в таблицу с помощью клавиши <T>\n * - переход по ячейкам с помощью <Ctrl+Alrt+стрелочки>\n * NVDA будет говорить, что пользователь вне ячейки таблицы.\n * Также важно оставить aria-live=\"polite\". Так NVDA зачитывает текущий\n * месяц и год при переключении месяца и года в заголовке календаря.\n */}\n <VisuallyHidden aria-live=\"polite\" id={viewDateLabelId}>\n {currentMonthLabel}\n </VisuallyHidden>\n <RootComponent\n role=\"grid\"\n {...props}\n baseClassName={styles.host}\n aria-labelledby={viewDateLabelId}\n >\n <div\n role=\"row\"\n aria-rowindex={1}\n className={classNames(styles.row, size === 's' && styles.rowSizeS)}\n >\n {daysNames.map(({ short: shortDayName, long: longDayName }) => (\n <Footnote\n role=\"columnheader\"\n aria-label={longDayName}\n key={shortDayName}\n className={styles.weekday}\n >\n {shortDayName}\n </Footnote>\n ))}\n </div>\n\n {weeks.map((week, i) => (\n <div\n role=\"row\"\n aria-rowindex={i + 2}\n className={classNames(styles.row, size === 's' && styles.rowSizeS)}\n key={i}\n >\n {week.map((day, i) => {\n const sameMonth = isSameMonth(day, viewDate);\n const isHidden = !showNeighboringMonth && !sameMonth;\n const isToday = isSameDay(day, now);\n const isActive = isDayActive(day);\n const isFocused = isDayFocused(day);\n return (\n <CalendarDay\n role=\"gridcell\"\n aria-current={isToday ? 'date' : undefined}\n aria-selected={isActive ? 'true' : 'false'}\n aria-colindex={i + 1}\n tabIndex={isDayFocusable?.(day) ? 0 : -1}\n key={day.toISOString()}\n day={day}\n today={isToday}\n active={isActive}\n onChange={handleDayChange}\n hidden={isHidden}\n disabled={isDayDisabled(day)}\n selectionStart={isDaySelectionStart(day, i)}\n selectionEnd={isDaySelectionEnd(day, i)}\n hintedSelectionStart={isHintedDaySelectionStart?.(day, i)}\n hintedSelectionEnd={isHintedDaySelectionEnd?.(day, i)}\n selected={isDaySelected?.(day)}\n focused={isFocused}\n onEnter={onDayEnter}\n onLeave={onDayLeave}\n onFocus={onDayFocus}\n hinted={isDayHinted?.(day)}\n sameMonth={sameMonth}\n size={size}\n renderDayContent={renderDayContent}\n testId={dayTestId}\n {...dayProps}\n className={classNames(dayProps?.className, styles.rowDay)}\n />\n );\n })}\n </div>\n ))}\n </RootComponent>\n </React.Fragment>\n );\n};\n"],"names":["React","classNames","isSameDay","isSameMonth","useTodayDate","getDaysNames","getWeeks","CalendarDay","useConfigProvider","RootComponent","Footnote","VisuallyHidden","styles","CalendarDays","viewDate","value","weekStartsOn","onDayChange","isDaySelected","isDayActive","isDaySelectionEnd","isDaySelectionStart","onDayEnter","onDayLeave","onDayFocus","isDayHinted","isHintedDaySelectionStart","isHintedDaySelectionEnd","isDayFocused","isDayFocusable","isDayDisabled","size","showNeighboringMonth","dayProps","listenDayChangesForUpdate","getRootRef","renderDayContent","dayTestId","props","locale","now","weeks","useMemo","daysNames","handleDayChange","useCallback","date","viewDateLabelId","useId","currentMonthLabel","Intl","DateTimeFormat","year","month","format","Fragment","aria-live","id","role","baseClassName","host","aria-labelledby","div","aria-rowindex","className","row","rowSizeS","map","short","shortDayName","long","longDayName","aria-label","weekday","week","i","day","sameMonth","isHidden","isToday","isActive","isFocused","aria-current","undefined","aria-selected","aria-colindex","tabIndex","today","active","onChange","hidden","disabled","selectionStart","selectionEnd","hintedSelectionStart","hintedSelectionEnd","selected","focused","onEnter","onLeave","onFocus","hinted","testId","rowDay","toISOString"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/components/CalendarDays/CalendarDays.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { classNames, isSameDate } from '@vkontakte/vkjs';\nimport { useTodayDate } from '../../hooks/useTodayDate';\nimport { getDaysNames, getWeeks } from '../../lib/calendar';\nimport { isSameMonth } from '../../lib/date';\nimport type { HTMLAttributesWithRootRef } from '../../types';\nimport {\n CalendarDay,\n type CalendarDayElementProps,\n type CalendarDayProps,\n type CalendarDayTestsProps,\n} from '../CalendarDay/CalendarDay';\nimport { useConfigProvider } from '../ConfigProvider/ConfigProviderContext';\nimport { RootComponent } from '../RootComponent/RootComponent';\nimport { Footnote } from '../Typography/Footnote/Footnote';\nimport { VisuallyHidden } from '../VisuallyHidden/VisuallyHidden';\nimport styles from './CalendarDays.module.css';\n\nexport type CalendarDaysTestsProps = {\n /**\n * Передает атрибут `data-testid` для дня в календаре.\n */\n dayTestId?: CalendarDayTestsProps['testId'];\n};\n\nexport interface CalendarDaysProps\n extends Omit<HTMLAttributesWithRootRef<HTMLDivElement>, 'onChange'>,\n Pick<CalendarDayProps, 'renderDayContent'>,\n CalendarDaysTestsProps {\n /**\n * Выбранная дата или диапазон дат.\n */\n value?: Date | Array<Date | null> | null;\n /**\n * Дата, определяющая отображаемый месяц.\n */\n viewDate: Date;\n /**\n * День недели, с которого начинается неделя (0 - воскресенье, 6 - суббота).\n */\n weekStartsOn: 0 | 1 | 2 | 3 | 4 | 5 | 6;\n /**\n * Показывать дни соседних месяцев.\n */\n showNeighboringMonth?: boolean;\n /**\n * Размер календаря.\n */\n size?: 's' | 'm';\n /**\n * Дополнительные свойства для элементов дней.\n */\n dayProps?: CalendarDayElementProps;\n /**\n * Следить за изменениями дней для обновления UI.\n */\n listenDayChangesForUpdate?: boolean;\n /**\n * Обработчик изменения выбранного дня.\n */\n onDayChange: (value: Date) => void;\n /**\n * Проверяет, заблокирован ли день для выбора.\n */\n isDayDisabled: (value: Date) => boolean;\n /**\n * Определяет, является ли день началом выделенного диапазона.\n */\n isDaySelectionStart: (value: Date, dayOfWeek: number) => boolean;\n /**\n * Определяет, является ли день концом выделенного диапазона.\n */\n isDaySelectionEnd: (value: Date, dayOfWeek: number) => boolean;\n /**\n * Определяет начало диапазона при наведении (подсветка).\n */\n isHintedDaySelectionStart?: (value: Date, dayOfWeek: number) => boolean;\n /**\n * Определяет конец диапазона при наведении (подсветка).\n */\n isHintedDaySelectionEnd?: (value: Date, dayOfWeek: number) => boolean;\n /**\n * Проверяет, является ли день активным (текущая дата).\n */\n isDayActive: (value: Date) => boolean;\n /**\n * Проверяет, подсвечен ли день (при наведении).\n */\n isDayHinted?: (value: Date) => boolean;\n /**\n * Проверяет, возможно ли сфокусироваться на дне с клавиатуры.\n */\n isDayFocusable?: (value: Date) => boolean;\n /**\n * Проверяет, выбран ли день.\n */\n isDaySelected?: (value: Date) => boolean;\n /**\n * Проверяет, находится ли день в фокусе.\n */\n isDayFocused: (value: Date) => boolean;\n /**\n * Обработчик события 'pointerenter' на элементе дня.\n */\n onDayEnter?: (value: Date) => void;\n /**\n * Обработчик события 'pointerleave' на элементе дня.\n */\n onDayLeave?: (value: Date) => void;\n /**\n * Обработчик события `focus` на элементе дня.\n */\n onDayFocus?: (value: Date) => void;\n}\n\nexport const CalendarDays = ({\n viewDate,\n value,\n weekStartsOn,\n onDayChange,\n isDaySelected,\n isDayActive,\n isDaySelectionEnd,\n isDaySelectionStart,\n onDayEnter,\n onDayLeave,\n onDayFocus,\n isDayHinted,\n isHintedDaySelectionStart,\n isHintedDaySelectionEnd,\n isDayFocused,\n isDayFocusable,\n isDayDisabled,\n size,\n showNeighboringMonth = false,\n dayProps,\n listenDayChangesForUpdate = false,\n getRootRef,\n renderDayContent,\n dayTestId,\n ...props\n}: CalendarDaysProps): React.ReactNode => {\n const { locale } = useConfigProvider();\n const now = useTodayDate(listenDayChangesForUpdate);\n\n const weeks = React.useMemo(() => getWeeks(viewDate, weekStartsOn), [weekStartsOn, viewDate]);\n\n const daysNames = React.useMemo(\n () => getDaysNames(now, weekStartsOn, locale),\n [locale, now, weekStartsOn],\n );\n\n const handleDayChange = React.useCallback(\n (date: Date) => {\n onDayChange(date);\n },\n [onDayChange],\n );\n\n const viewDateLabelId = React.useId();\n const currentMonthLabel = value\n ? new Intl.DateTimeFormat(locale, {\n year: 'numeric',\n month: 'long',\n }).format(viewDate)\n : null;\n\n return (\n <React.Fragment>\n {/*\n * Нельзя помещать текст currentMonthLabel внутрь role=\"grid\" или с помощью aria-label,\n * иначе пользователи NVDA не смогут ходить по таблице\n * с помощью горячих клавиш <Ctrl+Alt+стрелочки>.\n * Имеется ввиду связка (применение которой визуально не видно):\n * - из заголовка календаря прыжок в таблицу с помощью клавиши <T>\n * - переход по ячейкам с помощью <Ctrl+Alrt+стрелочки>\n * NVDA будет говорить, что пользователь вне ячейки таблицы.\n * Также важно оставить aria-live=\"polite\". Так NVDA зачитывает текущий\n * месяц и год при переключении месяца и года в заголовке календаря.\n */}\n <VisuallyHidden aria-live=\"polite\" id={viewDateLabelId}>\n {currentMonthLabel}\n </VisuallyHidden>\n <RootComponent\n role=\"grid\"\n {...props}\n baseClassName={styles.host}\n aria-labelledby={viewDateLabelId}\n >\n <div\n role=\"row\"\n aria-rowindex={1}\n className={classNames(styles.row, size === 's' && styles.rowSizeS)}\n >\n {daysNames.map(({ short: shortDayName, long: longDayName }) => (\n <Footnote\n role=\"columnheader\"\n aria-label={longDayName}\n key={shortDayName}\n className={styles.weekday}\n >\n {shortDayName}\n </Footnote>\n ))}\n </div>\n\n {weeks.map((week, i) => (\n <div\n role=\"row\"\n aria-rowindex={i + 2}\n className={classNames(styles.row, size === 's' && styles.rowSizeS)}\n key={i}\n >\n {week.map((day, i) => {\n const sameMonth = isSameMonth(day, viewDate);\n const isHidden = !showNeighboringMonth && !sameMonth;\n const isToday = isSameDate(day, now);\n const isActive = isDayActive(day);\n const isFocused = isDayFocused(day);\n return (\n <CalendarDay\n role=\"gridcell\"\n aria-current={isToday ? 'date' : undefined}\n aria-selected={isActive ? 'true' : 'false'}\n aria-colindex={i + 1}\n tabIndex={isDayFocusable?.(day) ? 0 : -1}\n key={day.toISOString()}\n day={day}\n today={isToday}\n active={isActive}\n onChange={handleDayChange}\n hidden={isHidden}\n disabled={isDayDisabled(day)}\n selectionStart={isDaySelectionStart(day, i)}\n selectionEnd={isDaySelectionEnd(day, i)}\n hintedSelectionStart={isHintedDaySelectionStart?.(day, i)}\n hintedSelectionEnd={isHintedDaySelectionEnd?.(day, i)}\n selected={isDaySelected?.(day)}\n focused={isFocused}\n onEnter={onDayEnter}\n onLeave={onDayLeave}\n onFocus={onDayFocus}\n hinted={isDayHinted?.(day)}\n sameMonth={sameMonth}\n size={size}\n renderDayContent={renderDayContent}\n testId={dayTestId}\n {...dayProps}\n className={classNames(dayProps?.className, styles.rowDay)}\n />\n );\n })}\n </div>\n ))}\n </RootComponent>\n </React.Fragment>\n );\n};\n"],"names":["React","classNames","isSameDate","useTodayDate","getDaysNames","getWeeks","isSameMonth","CalendarDay","useConfigProvider","RootComponent","Footnote","VisuallyHidden","styles","CalendarDays","viewDate","value","weekStartsOn","onDayChange","isDaySelected","isDayActive","isDaySelectionEnd","isDaySelectionStart","onDayEnter","onDayLeave","onDayFocus","isDayHinted","isHintedDaySelectionStart","isHintedDaySelectionEnd","isDayFocused","isDayFocusable","isDayDisabled","size","showNeighboringMonth","dayProps","listenDayChangesForUpdate","getRootRef","renderDayContent","dayTestId","props","locale","now","weeks","useMemo","daysNames","handleDayChange","useCallback","date","viewDateLabelId","useId","currentMonthLabel","Intl","DateTimeFormat","year","month","format","Fragment","aria-live","id","role","baseClassName","host","aria-labelledby","div","aria-rowindex","className","row","rowSizeS","map","short","shortDayName","long","longDayName","aria-label","weekday","week","i","day","sameMonth","isHidden","isToday","isActive","isFocused","aria-current","undefined","aria-selected","aria-colindex","tabIndex","today","active","onChange","hidden","disabled","selectionStart","selectionEnd","hintedSelectionStart","hintedSelectionEnd","selected","focused","onEnter","onLeave","onFocus","hinted","testId","rowDay","toISOString"],"mappings":"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"}
@@ -1,10 +1,12 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import * as React from "react";
4
- import { addMonths, endOfDay, isAfter, isBefore, isSameDay, isWithinInterval, startOfDay, subMonths } from "date-fns";
4
+ import { isSameDate } from "@vkontakte/vkjs";
5
+ import { addMonths, startOfDay, subMonths } from "date-fns";
5
6
  import { useCalendar } from "../../hooks/useCalendar.js";
6
7
  import { useCustomEnsuredControl } from "../../hooks/useEnsuredControl.js";
7
8
  import { isFirstDay, isLastDay } from "../../lib/calendar.js";
9
+ import { endOfDay, isWithinInterval } from "../../lib/date.js";
8
10
  import { CalendarDays } from "../CalendarDays/CalendarDays.js";
9
11
  import { CalendarHeader } from "../CalendarHeader/CalendarHeader.js";
10
12
  import { RootComponent } from "../RootComponent/RootComponent.js";
@@ -14,10 +16,10 @@ const getIsDaySelected = (day, value)=>{
14
16
  if (!value?.[0] || !value[1]) {
15
17
  return false;
16
18
  }
17
- return isWithinInterval(day, {
18
- start: startOfDay(value[0]),
19
- end: endOfDay(value[1])
20
- });
19
+ return isWithinInterval(day, [
20
+ startOfDay(value[0]),
21
+ endOfDay(value[1])
22
+ ]);
21
23
  };
22
24
  /**
23
25
  * @see https://vkui.io/components/calendar-range
@@ -58,17 +60,17 @@ const getIsDaySelected = (day, value)=>{
58
60
  ];
59
61
  }
60
62
  const [start] = value;
61
- if (start && isSameDay(date, start)) {
63
+ if (start && isSameDate(date, start)) {
62
64
  return [
63
65
  startOfDay(start),
64
66
  endOfDay(start)
65
67
  ];
66
- } else if (start && isBefore(date, start)) {
68
+ } else if (start && date < start) {
67
69
  return [
68
70
  startOfDay(date),
69
71
  endOfDay(start)
70
72
  ];
71
- } else if (start && isAfter(date, start)) {
73
+ } else if (start && date > start) {
72
74
  return [
73
75
  start,
74
76
  endOfDay(date)
@@ -88,19 +90,19 @@ const getIsDaySelected = (day, value)=>{
88
90
  const isDaySelected = React.useCallback((day)=>getIsDaySelected(day, value), [
89
91
  value
90
92
  ]);
91
- const isDayActive = React.useCallback((day)=>Boolean(value?.[0] && isSameDay(day, value[0]) || value?.[1] && isSameDay(day, value[1])), [
93
+ const isDayActive = React.useCallback((day)=>Boolean(value?.[0] && isSameDate(day, value[0]) || value?.[1] && isSameDate(day, value[1])), [
92
94
  value
93
95
  ]);
94
- const isDaySelectionEnd = React.useCallback((day, dayOfWeek)=>Boolean(isLastDay(day, dayOfWeek) || value?.[1] && isSameDay(day, value[1])), [
96
+ const isDaySelectionEnd = React.useCallback((day, dayOfWeek)=>Boolean(isLastDay(day, dayOfWeek) || value?.[1] && isSameDate(day, value[1])), [
95
97
  value
96
98
  ]);
97
- const isHintedDaySelectionEnd = React.useCallback((day, dayOfWeek)=>Boolean(isLastDay(day, dayOfWeek) || hintedDate?.[1] && isSameDay(day, hintedDate[1])), [
99
+ const isHintedDaySelectionEnd = React.useCallback((day, dayOfWeek)=>Boolean(isLastDay(day, dayOfWeek) || hintedDate?.[1] && isSameDate(day, hintedDate[1])), [
98
100
  hintedDate
99
101
  ]);
100
- const isDaySelectionStart = React.useCallback((day, dayOfWeek)=>Boolean(isFirstDay(day, dayOfWeek) || value?.[0] && isSameDay(day, value[0])), [
102
+ const isDaySelectionStart = React.useCallback((day, dayOfWeek)=>Boolean(isFirstDay(day, dayOfWeek) || value?.[0] && isSameDate(day, value[0])), [
101
103
  value
102
104
  ]);
103
- const isHintedDaySelectionStart = React.useCallback((day, dayOfWeek)=>Boolean(isFirstDay(day, dayOfWeek) || hintedDate?.[0] && isSameDay(day, hintedDate[0])), [
105
+ const isHintedDaySelectionStart = React.useCallback((day, dayOfWeek)=>Boolean(isFirstDay(day, dayOfWeek) || hintedDate?.[0] && isSameDate(day, hintedDate[0])), [
104
106
  hintedDate
105
107
  ]);
106
108
  const onDayEnter = React.useCallback((date)=>setHintedDate(getNewValue(date)), [
@@ -131,7 +133,7 @@ const getIsDaySelected = (day, value)=>{
131
133
  isDayActive
132
134
  });
133
135
  const onDayFocus = React.useCallback((date)=>{
134
- if (focusedDay && isSameDay(focusedDay, date)) {
136
+ if (focusedDay && isSameDate(focusedDay, date)) {
135
137
  return;
136
138
  }
137
139
  setFocusedDay(date);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/CalendarRange/CalendarRange.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport {\n addMonths,\n endOfDay,\n isAfter,\n isBefore,\n isSameDay,\n isWithinInterval,\n startOfDay,\n subMonths,\n} from 'date-fns';\nimport { useCalendar } from '../../hooks/useCalendar';\nimport { useCustomEnsuredControl } from '../../hooks/useEnsuredControl';\nimport { isFirstDay, isLastDay } from '../../lib/calendar';\nimport type { HTMLAttributesWithRootRef } from '../../types';\nimport {\n CalendarDays,\n type CalendarDaysProps,\n type CalendarDaysTestsProps,\n} from '../CalendarDays/CalendarDays';\nimport {\n CalendarHeader,\n type CalendarHeaderProps,\n type CalendarHeaderTestsProps,\n} from '../CalendarHeader/CalendarHeader';\nimport { RootComponent } from '../RootComponent/RootComponent';\nimport type { DateRangeType } from './types';\nimport { useCalendarKeyboardNavigation, useIsDayFocusable } from './utils';\nimport styles from './CalendarRange.module.css';\n\nexport type { DateRangeType };\n\nexport type CalendarRangeTestsProps = CalendarDaysTestsProps & {\n /**\n * Передает атрибуты `data-testid` для интерактивных элементов в заголовке календаря в левой части.\n */\n leftPartHeaderTestsData?: CalendarHeaderTestsProps;\n /**\n * Передает атрибуты `data-testid` для интерактивных элементов в заголовке календаря в правой части.\n */\n rightPartHeaderTestsData?: CalendarHeaderTestsProps;\n};\n\nexport interface CalendarRangeProps\n extends Omit<HTMLAttributesWithRootRef<HTMLDivElement>, 'onChange' | 'defaultValue'>,\n Pick<\n CalendarHeaderProps,\n | 'prevMonthLabel'\n | 'nextMonthLabel'\n | 'changeMonthLabel'\n | 'changeYearLabel'\n | 'prevMonthIcon'\n | 'nextMonthIcon'\n >,\n Pick<CalendarDaysProps, 'listenDayChangesForUpdate' | 'renderDayContent'>,\n CalendarRangeTestsProps {\n /**\n * Текущий выбранный промежуток.\n */\n value?: DateRangeType | null;\n /**\n * Начальный промежуток при монтировании.\n */\n defaultValue?: DateRangeType | null;\n /**\n * Запрещает выбор даты в прошлом.\n * Применяется, если не заданы `shouldDisableDate` и `disableFuture`.\n */\n disablePast?: boolean;\n /**\n * Запрещает выбор даты в будущем.\n * Применяется, если не задано `shouldDisableDate`.\n */\n disableFuture?: boolean;\n /**\n * Отключает селекторы выбора месяца/года.\n */\n disablePickers?: boolean;\n /**\n * `aria-label` для изменения дня.\n *\n * @deprecated Since 7.4.0.\n *\n * Будет удалeно в **VKUI v8**. Использовалось для задания aria-label для контейнера дней в календаре.\n * Теперь этот контейнер является таблицей (с помощью role=\"grid\") и\n * в aria-label рендерится текущий открытый в календаре месяц и год.\n */\n changeDayLabel?: string;\n /**\n * День недели, с которого начинается неделя.\n */\n weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6;\n /**\n * Обработчик изменения выбранного промежутка.\n */\n onChange?: (value: DateRangeType | undefined) => void; // TODO [>=8]: поменять тип на `(value?: DateRangeType | null) => void`\n /**\n * Функция для проверки запрета выбора даты.\n */\n shouldDisableDate?: (value: Date) => boolean;\n /**\n * @deprecated Свойство не используется.\n */\n onClose?: () => void;\n}\n\nconst getIsDaySelected = (day: Date, value?: DateRangeType | null) => {\n if (!value?.[0] || !value[1]) {\n return false;\n }\n\n return isWithinInterval(day, { start: startOfDay(value[0]), end: endOfDay(value[1]) });\n};\n\n/**\n * @see https://vkui.io/components/calendar-range\n */\nexport const CalendarRange = ({\n 'value': valueProp,\n defaultValue,\n onChange,\n disablePast,\n disableFuture,\n shouldDisableDate,\n weekStartsOn = 1,\n disablePickers,\n prevMonthLabel = 'Предыдущий месяц',\n nextMonthLabel = 'Следующий месяц',\n changeMonthLabel = 'Изменить месяц',\n changeYearLabel = 'Изменить год',\n 'aria-label': ariaLabel = 'Календарь',\n prevMonthIcon,\n nextMonthIcon,\n listenDayChangesForUpdate,\n renderDayContent,\n dayTestId,\n leftPartHeaderTestsData,\n rightPartHeaderTestsData,\n getRootRef,\n ...props\n}: CalendarRangeProps): React.ReactNode => {\n const _onChange = React.useCallback(\n (newValue: DateRangeType | null | undefined) => onChange?.(newValue || undefined),\n [onChange],\n );\n\n const [value, updateValue] = useCustomEnsuredControl<DateRangeType | null | undefined>({\n value: valueProp,\n defaultValue,\n onChange: _onChange,\n });\n\n const {\n viewDate,\n setViewDate,\n setPrevMonth,\n setNextMonth,\n focusedDay,\n setFocusedDay,\n isDayFocused,\n isDayDisabled,\n isMonthDisabled,\n isYearDisabled,\n } = useCalendar({ value, disableFuture, disablePast, shouldDisableDate });\n\n const [hintedDate, setHintedDate] = React.useState<DateRangeType>();\n const secondViewDate = addMonths(viewDate, 1);\n\n const {\n focusableDayOnFirstCalendar,\n focusableDayOnSecondCalendar,\n handleFirstCalendarKeyDown,\n handleSecondCalendarKeyDown,\n handleDayFocus,\n } = useCalendarKeyboardNavigation({\n focusedDay,\n setFocusedDay,\n value,\n viewDates: [viewDate, secondViewDate],\n setViewDate,\n });\n\n const getNewValue = React.useCallback(\n (date: Date): DateRangeType => {\n const isValueEmpty = !value || (value[0] === null && value[1] === null);\n const isRangeSelected = value && !!value[0] && !!value[1];\n if (isValueEmpty || isRangeSelected) {\n return [date, null];\n }\n\n const [start] = value;\n if (start && isSameDay(date, start)) {\n return [startOfDay(start), endOfDay(start)];\n } else if (start && isBefore(date, start)) {\n return [startOfDay(date), endOfDay(start)];\n } else if (start && isAfter(date, start)) {\n return [start, endOfDay(date)];\n }\n return value;\n },\n [value],\n );\n\n const onDayChange = React.useCallback(\n (date: Date) => {\n updateValue(getNewValue(date));\n setHintedDate(undefined);\n },\n [updateValue, getNewValue],\n );\n\n const isDaySelected = React.useCallback((day: Date) => getIsDaySelected(day, value), [value]);\n\n const isDayActive = React.useCallback(\n (day: Date) =>\n Boolean((value?.[0] && isSameDay(day, value[0])) || (value?.[1] && isSameDay(day, value[1]))),\n [value],\n );\n\n const isDaySelectionEnd = React.useCallback(\n (day: Date, dayOfWeek: number) =>\n Boolean(isLastDay(day, dayOfWeek) || (value?.[1] && isSameDay(day, value[1]))),\n [value],\n );\n\n const isHintedDaySelectionEnd = React.useCallback(\n (day: Date, dayOfWeek: number) =>\n Boolean(isLastDay(day, dayOfWeek) || (hintedDate?.[1] && isSameDay(day, hintedDate[1]))),\n [hintedDate],\n );\n\n const isDaySelectionStart = React.useCallback(\n (day: Date, dayOfWeek: number) =>\n Boolean(isFirstDay(day, dayOfWeek) || (value?.[0] && isSameDay(day, value[0]))),\n [value],\n );\n\n const isHintedDaySelectionStart = React.useCallback(\n (day: Date, dayOfWeek: number) =>\n Boolean(isFirstDay(day, dayOfWeek) || (hintedDate?.[0] && isSameDay(day, hintedDate[0]))),\n [hintedDate],\n );\n\n const onDayEnter = React.useCallback(\n (date: Date) => setHintedDate(getNewValue(date)),\n [setHintedDate, getNewValue],\n );\n\n const onDayLeave = React.useCallback(() => setHintedDate(undefined), [setHintedDate]);\n\n const isDayHinted = React.useCallback(\n (day: Date) => getIsDaySelected(day, hintedDate),\n [hintedDate],\n );\n\n const onRightPartViewDateChange = React.useCallback(\n (newDate: Date) => setViewDate(subMonths(newDate, 1)),\n [setViewDate],\n );\n\n const isDayFocusableInFirstCalendar = useIsDayFocusable({\n value,\n focusableDayOnFirstCalendar,\n focusableDayOnSecondCalendar,\n viewDate,\n isDayActive,\n });\n\n const isDayFocusableInSecondCalendar = useIsDayFocusable({\n value,\n focusableDayOnFirstCalendar,\n focusableDayOnSecondCalendar,\n viewDate: secondViewDate,\n isDayActive,\n });\n\n const onDayFocus = React.useCallback(\n (date: Date) => {\n if (focusedDay && isSameDay(focusedDay, date)) {\n return;\n }\n\n setFocusedDay(date);\n handleDayFocus(date);\n },\n [focusedDay, handleDayFocus, setFocusedDay],\n );\n\n return (\n <RootComponent\n aria-label={ariaLabel}\n {...props}\n baseClassName={styles.host}\n getRootRef={getRootRef}\n >\n <div className={styles.inner}>\n <CalendarHeader\n viewDate={viewDate}\n onChange={setViewDate}\n nextMonthHidden\n onPrevMonth={setPrevMonth}\n disablePickers={disablePickers}\n className={styles.header}\n prevMonthLabel={prevMonthLabel}\n nextMonthLabel={nextMonthLabel}\n changeMonthLabel={changeMonthLabel}\n changeYearLabel={changeYearLabel}\n prevMonthIcon={prevMonthIcon}\n isMonthDisabled={isMonthDisabled}\n isYearDisabled={isYearDisabled}\n {...leftPartHeaderTestsData}\n />\n <CalendarDays\n viewDate={viewDate}\n value={value}\n weekStartsOn={weekStartsOn}\n onKeyDown={handleFirstCalendarKeyDown}\n onDayFocus={onDayFocus}\n isDayFocused={isDayFocused}\n isDayFocusable={isDayFocusableInFirstCalendar}\n onDayChange={onDayChange}\n isDaySelected={isDaySelected}\n isDayActive={isDayActive}\n isDaySelectionEnd={isDaySelectionEnd}\n isDaySelectionStart={isDaySelectionStart}\n isDayHinted={isDayHinted}\n onDayEnter={onDayEnter}\n onDayLeave={onDayLeave}\n isHintedDaySelectionEnd={isHintedDaySelectionEnd}\n isHintedDaySelectionStart={isHintedDaySelectionStart}\n isDayDisabled={isDayDisabled}\n listenDayChangesForUpdate={listenDayChangesForUpdate}\n renderDayContent={renderDayContent}\n dayTestId={dayTestId}\n />\n </div>\n <div className={styles.inner}>\n <CalendarHeader\n viewDate={secondViewDate}\n onChange={onRightPartViewDateChange}\n prevMonthHidden\n onNextMonth={setNextMonth}\n disablePickers={disablePickers}\n className={styles.header}\n prevMonthLabel={prevMonthLabel}\n nextMonthLabel={nextMonthLabel}\n changeMonthLabel={changeMonthLabel}\n changeYearLabel={changeYearLabel}\n nextMonthIcon={nextMonthIcon}\n isMonthDisabled={isMonthDisabled}\n isYearDisabled={isYearDisabled}\n {...rightPartHeaderTestsData}\n />\n <CalendarDays\n viewDate={secondViewDate}\n value={value}\n weekStartsOn={weekStartsOn}\n onKeyDown={handleSecondCalendarKeyDown}\n onDayFocus={onDayFocus}\n isDayFocused={isDayFocused}\n isDayFocusable={isDayFocusableInSecondCalendar}\n onDayChange={onDayChange}\n isDaySelected={isDaySelected}\n isDayActive={isDayActive}\n isDaySelectionEnd={isDaySelectionEnd}\n isDaySelectionStart={isDaySelectionStart}\n isDayHinted={isDayHinted}\n onDayEnter={onDayEnter}\n onDayLeave={onDayLeave}\n isHintedDaySelectionEnd={isHintedDaySelectionEnd}\n isHintedDaySelectionStart={isHintedDaySelectionStart}\n isDayDisabled={isDayDisabled}\n listenDayChangesForUpdate={listenDayChangesForUpdate}\n renderDayContent={renderDayContent}\n dayTestId={dayTestId}\n />\n </div>\n </RootComponent>\n );\n};\n"],"names":["React","addMonths","endOfDay","isAfter","isBefore","isSameDay","isWithinInterval","startOfDay","subMonths","useCalendar","useCustomEnsuredControl","isFirstDay","isLastDay","CalendarDays","CalendarHeader","RootComponent","useCalendarKeyboardNavigation","useIsDayFocusable","styles","getIsDaySelected","day","value","start","end","CalendarRange","valueProp","defaultValue","onChange","disablePast","disableFuture","shouldDisableDate","weekStartsOn","disablePickers","prevMonthLabel","nextMonthLabel","changeMonthLabel","changeYearLabel","ariaLabel","prevMonthIcon","nextMonthIcon","listenDayChangesForUpdate","renderDayContent","dayTestId","leftPartHeaderTestsData","rightPartHeaderTestsData","getRootRef","props","_onChange","useCallback","newValue","undefined","updateValue","viewDate","setViewDate","setPrevMonth","setNextMonth","focusedDay","setFocusedDay","isDayFocused","isDayDisabled","isMonthDisabled","isYearDisabled","hintedDate","setHintedDate","useState","secondViewDate","focusableDayOnFirstCalendar","focusableDayOnSecondCalendar","handleFirstCalendarKeyDown","handleSecondCalendarKeyDown","handleDayFocus","viewDates","getNewValue","date","isValueEmpty","isRangeSelected","onDayChange","isDaySelected","isDayActive","Boolean","isDaySelectionEnd","dayOfWeek","isHintedDaySelectionEnd","isDaySelectionStart","isHintedDaySelectionStart","onDayEnter","onDayLeave","isDayHinted","onRightPartViewDateChange","newDate","isDayFocusableInFirstCalendar","isDayFocusableInSecondCalendar","onDayFocus","aria-label","baseClassName","host","div","className","inner","nextMonthHidden","onPrevMonth","header","onKeyDown","isDayFocusable","prevMonthHidden","onNextMonth"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/components/CalendarRange/CalendarRange.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { isSameDate } from '@vkontakte/vkjs';\nimport { addMonths, startOfDay, subMonths } from 'date-fns';\nimport { useCalendar } from '../../hooks/useCalendar';\nimport { useCustomEnsuredControl } from '../../hooks/useEnsuredControl';\nimport { isFirstDay, isLastDay } from '../../lib/calendar';\nimport { endOfDay, isWithinInterval } from '../../lib/date';\nimport type { HTMLAttributesWithRootRef } from '../../types';\nimport {\n CalendarDays,\n type CalendarDaysProps,\n type CalendarDaysTestsProps,\n} from '../CalendarDays/CalendarDays';\nimport {\n CalendarHeader,\n type CalendarHeaderProps,\n type CalendarHeaderTestsProps,\n} from '../CalendarHeader/CalendarHeader';\nimport { RootComponent } from '../RootComponent/RootComponent';\nimport type { DateRangeType } from './types';\nimport { useCalendarKeyboardNavigation, useIsDayFocusable } from './utils';\nimport styles from './CalendarRange.module.css';\n\nexport type { DateRangeType };\n\nexport type CalendarRangeTestsProps = CalendarDaysTestsProps & {\n /**\n * Передает атрибуты `data-testid` для интерактивных элементов в заголовке календаря в левой части.\n */\n leftPartHeaderTestsData?: CalendarHeaderTestsProps;\n /**\n * Передает атрибуты `data-testid` для интерактивных элементов в заголовке календаря в правой части.\n */\n rightPartHeaderTestsData?: CalendarHeaderTestsProps;\n};\n\nexport interface CalendarRangeProps\n extends Omit<HTMLAttributesWithRootRef<HTMLDivElement>, 'onChange' | 'defaultValue'>,\n Pick<\n CalendarHeaderProps,\n | 'prevMonthLabel'\n | 'nextMonthLabel'\n | 'changeMonthLabel'\n | 'changeYearLabel'\n | 'prevMonthIcon'\n | 'nextMonthIcon'\n >,\n Pick<CalendarDaysProps, 'listenDayChangesForUpdate' | 'renderDayContent'>,\n CalendarRangeTestsProps {\n /**\n * Текущий выбранный промежуток.\n */\n value?: DateRangeType | null;\n /**\n * Начальный промежуток при монтировании.\n */\n defaultValue?: DateRangeType | null;\n /**\n * Запрещает выбор даты в прошлом.\n * Применяется, если не заданы `shouldDisableDate` и `disableFuture`.\n */\n disablePast?: boolean;\n /**\n * Запрещает выбор даты в будущем.\n * Применяется, если не задано `shouldDisableDate`.\n */\n disableFuture?: boolean;\n /**\n * Отключает селекторы выбора месяца/года.\n */\n disablePickers?: boolean;\n /**\n * `aria-label` для изменения дня.\n *\n * @deprecated Since 7.4.0.\n *\n * Будет удалeно в **VKUI v8**. Использовалось для задания aria-label для контейнера дней в календаре.\n * Теперь этот контейнер является таблицей (с помощью role=\"grid\") и\n * в aria-label рендерится текущий открытый в календаре месяц и год.\n */\n changeDayLabel?: string;\n /**\n * День недели, с которого начинается неделя.\n */\n weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6;\n /**\n * Обработчик изменения выбранного промежутка.\n */\n onChange?: (value: DateRangeType | undefined) => void; // TODO [>=8]: поменять тип на `(value?: DateRangeType | null) => void`\n /**\n * Функция для проверки запрета выбора даты.\n */\n shouldDisableDate?: (value: Date) => boolean;\n /**\n * @deprecated Свойство не используется.\n */\n onClose?: () => void;\n}\n\nconst getIsDaySelected = (day: Date, value?: DateRangeType | null) => {\n if (!value?.[0] || !value[1]) {\n return false;\n }\n\n return isWithinInterval(day, [startOfDay(value[0]), endOfDay(value[1])]);\n};\n\n/**\n * @see https://vkui.io/components/calendar-range\n */\nexport const CalendarRange = ({\n 'value': valueProp,\n defaultValue,\n onChange,\n disablePast,\n disableFuture,\n shouldDisableDate,\n weekStartsOn = 1,\n disablePickers,\n prevMonthLabel = 'Предыдущий месяц',\n nextMonthLabel = 'Следующий месяц',\n changeMonthLabel = 'Изменить месяц',\n changeYearLabel = 'Изменить год',\n 'aria-label': ariaLabel = 'Календарь',\n prevMonthIcon,\n nextMonthIcon,\n listenDayChangesForUpdate,\n renderDayContent,\n dayTestId,\n leftPartHeaderTestsData,\n rightPartHeaderTestsData,\n getRootRef,\n ...props\n}: CalendarRangeProps): React.ReactNode => {\n const _onChange = React.useCallback(\n (newValue: DateRangeType | null | undefined) => onChange?.(newValue || undefined),\n [onChange],\n );\n\n const [value, updateValue] = useCustomEnsuredControl<DateRangeType | null | undefined>({\n value: valueProp,\n defaultValue,\n onChange: _onChange,\n });\n\n const {\n viewDate,\n setViewDate,\n setPrevMonth,\n setNextMonth,\n focusedDay,\n setFocusedDay,\n isDayFocused,\n isDayDisabled,\n isMonthDisabled,\n isYearDisabled,\n } = useCalendar({ value, disableFuture, disablePast, shouldDisableDate });\n\n const [hintedDate, setHintedDate] = React.useState<DateRangeType>();\n const secondViewDate = addMonths(viewDate, 1);\n\n const {\n focusableDayOnFirstCalendar,\n focusableDayOnSecondCalendar,\n handleFirstCalendarKeyDown,\n handleSecondCalendarKeyDown,\n handleDayFocus,\n } = useCalendarKeyboardNavigation({\n focusedDay,\n setFocusedDay,\n value,\n viewDates: [viewDate, secondViewDate],\n setViewDate,\n });\n\n const getNewValue = React.useCallback(\n (date: Date): DateRangeType => {\n const isValueEmpty = !value || (value[0] === null && value[1] === null);\n const isRangeSelected = value && !!value[0] && !!value[1];\n if (isValueEmpty || isRangeSelected) {\n return [date, null];\n }\n\n const [start] = value;\n if (start && isSameDate(date, start)) {\n return [startOfDay(start), endOfDay(start)];\n } else if (start && date < start) {\n return [startOfDay(date), endOfDay(start)];\n } else if (start && date > start) {\n return [start, endOfDay(date)];\n }\n return value;\n },\n [value],\n );\n\n const onDayChange = React.useCallback(\n (date: Date) => {\n updateValue(getNewValue(date));\n setHintedDate(undefined);\n },\n [updateValue, getNewValue],\n );\n\n const isDaySelected = React.useCallback((day: Date) => getIsDaySelected(day, value), [value]);\n\n const isDayActive = React.useCallback(\n (day: Date) =>\n Boolean(\n (value?.[0] && isSameDate(day, value[0])) || (value?.[1] && isSameDate(day, value[1])),\n ),\n [value],\n );\n\n const isDaySelectionEnd = React.useCallback(\n (day: Date, dayOfWeek: number) =>\n Boolean(isLastDay(day, dayOfWeek) || (value?.[1] && isSameDate(day, value[1]))),\n [value],\n );\n\n const isHintedDaySelectionEnd = React.useCallback(\n (day: Date, dayOfWeek: number) =>\n Boolean(isLastDay(day, dayOfWeek) || (hintedDate?.[1] && isSameDate(day, hintedDate[1]))),\n [hintedDate],\n );\n\n const isDaySelectionStart = React.useCallback(\n (day: Date, dayOfWeek: number) =>\n Boolean(isFirstDay(day, dayOfWeek) || (value?.[0] && isSameDate(day, value[0]))),\n [value],\n );\n\n const isHintedDaySelectionStart = React.useCallback(\n (day: Date, dayOfWeek: number) =>\n Boolean(isFirstDay(day, dayOfWeek) || (hintedDate?.[0] && isSameDate(day, hintedDate[0]))),\n [hintedDate],\n );\n\n const onDayEnter = React.useCallback(\n (date: Date) => setHintedDate(getNewValue(date)),\n [setHintedDate, getNewValue],\n );\n\n const onDayLeave = React.useCallback(() => setHintedDate(undefined), [setHintedDate]);\n\n const isDayHinted = React.useCallback(\n (day: Date) => getIsDaySelected(day, hintedDate),\n [hintedDate],\n );\n\n const onRightPartViewDateChange = React.useCallback(\n (newDate: Date) => setViewDate(subMonths(newDate, 1)),\n [setViewDate],\n );\n\n const isDayFocusableInFirstCalendar = useIsDayFocusable({\n value,\n focusableDayOnFirstCalendar,\n focusableDayOnSecondCalendar,\n viewDate,\n isDayActive,\n });\n\n const isDayFocusableInSecondCalendar = useIsDayFocusable({\n value,\n focusableDayOnFirstCalendar,\n focusableDayOnSecondCalendar,\n viewDate: secondViewDate,\n isDayActive,\n });\n\n const onDayFocus = React.useCallback(\n (date: Date) => {\n if (focusedDay && isSameDate(focusedDay, date)) {\n return;\n }\n\n setFocusedDay(date);\n handleDayFocus(date);\n },\n [focusedDay, handleDayFocus, setFocusedDay],\n );\n\n return (\n <RootComponent\n aria-label={ariaLabel}\n {...props}\n baseClassName={styles.host}\n getRootRef={getRootRef}\n >\n <div className={styles.inner}>\n <CalendarHeader\n viewDate={viewDate}\n onChange={setViewDate}\n nextMonthHidden\n onPrevMonth={setPrevMonth}\n disablePickers={disablePickers}\n className={styles.header}\n prevMonthLabel={prevMonthLabel}\n nextMonthLabel={nextMonthLabel}\n changeMonthLabel={changeMonthLabel}\n changeYearLabel={changeYearLabel}\n prevMonthIcon={prevMonthIcon}\n isMonthDisabled={isMonthDisabled}\n isYearDisabled={isYearDisabled}\n {...leftPartHeaderTestsData}\n />\n <CalendarDays\n viewDate={viewDate}\n value={value}\n weekStartsOn={weekStartsOn}\n onKeyDown={handleFirstCalendarKeyDown}\n onDayFocus={onDayFocus}\n isDayFocused={isDayFocused}\n isDayFocusable={isDayFocusableInFirstCalendar}\n onDayChange={onDayChange}\n isDaySelected={isDaySelected}\n isDayActive={isDayActive}\n isDaySelectionEnd={isDaySelectionEnd}\n isDaySelectionStart={isDaySelectionStart}\n isDayHinted={isDayHinted}\n onDayEnter={onDayEnter}\n onDayLeave={onDayLeave}\n isHintedDaySelectionEnd={isHintedDaySelectionEnd}\n isHintedDaySelectionStart={isHintedDaySelectionStart}\n isDayDisabled={isDayDisabled}\n listenDayChangesForUpdate={listenDayChangesForUpdate}\n renderDayContent={renderDayContent}\n dayTestId={dayTestId}\n />\n </div>\n <div className={styles.inner}>\n <CalendarHeader\n viewDate={secondViewDate}\n onChange={onRightPartViewDateChange}\n prevMonthHidden\n onNextMonth={setNextMonth}\n disablePickers={disablePickers}\n className={styles.header}\n prevMonthLabel={prevMonthLabel}\n nextMonthLabel={nextMonthLabel}\n changeMonthLabel={changeMonthLabel}\n changeYearLabel={changeYearLabel}\n nextMonthIcon={nextMonthIcon}\n isMonthDisabled={isMonthDisabled}\n isYearDisabled={isYearDisabled}\n {...rightPartHeaderTestsData}\n />\n <CalendarDays\n viewDate={secondViewDate}\n value={value}\n weekStartsOn={weekStartsOn}\n onKeyDown={handleSecondCalendarKeyDown}\n onDayFocus={onDayFocus}\n isDayFocused={isDayFocused}\n isDayFocusable={isDayFocusableInSecondCalendar}\n onDayChange={onDayChange}\n isDaySelected={isDaySelected}\n isDayActive={isDayActive}\n isDaySelectionEnd={isDaySelectionEnd}\n isDaySelectionStart={isDaySelectionStart}\n isDayHinted={isDayHinted}\n onDayEnter={onDayEnter}\n onDayLeave={onDayLeave}\n isHintedDaySelectionEnd={isHintedDaySelectionEnd}\n isHintedDaySelectionStart={isHintedDaySelectionStart}\n isDayDisabled={isDayDisabled}\n listenDayChangesForUpdate={listenDayChangesForUpdate}\n renderDayContent={renderDayContent}\n dayTestId={dayTestId}\n />\n </div>\n </RootComponent>\n );\n};\n"],"names":["React","isSameDate","addMonths","startOfDay","subMonths","useCalendar","useCustomEnsuredControl","isFirstDay","isLastDay","endOfDay","isWithinInterval","CalendarDays","CalendarHeader","RootComponent","useCalendarKeyboardNavigation","useIsDayFocusable","styles","getIsDaySelected","day","value","CalendarRange","valueProp","defaultValue","onChange","disablePast","disableFuture","shouldDisableDate","weekStartsOn","disablePickers","prevMonthLabel","nextMonthLabel","changeMonthLabel","changeYearLabel","ariaLabel","prevMonthIcon","nextMonthIcon","listenDayChangesForUpdate","renderDayContent","dayTestId","leftPartHeaderTestsData","rightPartHeaderTestsData","getRootRef","props","_onChange","useCallback","newValue","undefined","updateValue","viewDate","setViewDate","setPrevMonth","setNextMonth","focusedDay","setFocusedDay","isDayFocused","isDayDisabled","isMonthDisabled","isYearDisabled","hintedDate","setHintedDate","useState","secondViewDate","focusableDayOnFirstCalendar","focusableDayOnSecondCalendar","handleFirstCalendarKeyDown","handleSecondCalendarKeyDown","handleDayFocus","viewDates","getNewValue","date","isValueEmpty","isRangeSelected","start","onDayChange","isDaySelected","isDayActive","Boolean","isDaySelectionEnd","dayOfWeek","isHintedDaySelectionEnd","isDaySelectionStart","isHintedDaySelectionStart","onDayEnter","onDayLeave","isDayHinted","onRightPartViewDateChange","newDate","isDayFocusableInFirstCalendar","isDayFocusableInSecondCalendar","onDayFocus","aria-label","baseClassName","host","div","className","inner","nextMonthHidden","onPrevMonth","header","onKeyDown","isDayFocusable","prevMonthHidden","onNextMonth"],"mappings":"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"}
@@ -1,8 +1,9 @@
1
1
  import * as React from "react";
2
2
  import { isSameDate } from "@vkontakte/vkjs";
3
- import { isAfter, isBefore, isSameDay, isSameMonth, startOfMonth } from "date-fns";
3
+ import { startOfMonth } from "date-fns";
4
4
  import { Keys, pressedKey } from "../../lib/accessibility.js";
5
5
  import { navigateDate, NAVIGATION_KEYS } from "../../lib/calendar.js";
6
+ import { isSameMonth } from "../../lib/date.js";
6
7
  import { isHTMLElement } from "../../lib/dom.js";
7
8
  export function useCalendarKeyboardNavigation({ focusedDay, value, setFocusedDay, viewDates: [firstCalendarViewDate, secondCalendarViewDate], setViewDate }) {
8
9
  // соотвествует дню, на котором можно сфокусироваться с помощью Tab
@@ -22,13 +23,13 @@ export function useCalendarKeyboardNavigation({ focusedDay, value, setFocusedDay
22
23
  if (isFirst) {
23
24
  if (isSameMonth(newFocusedDay, firstCalendarViewDate)) {
24
25
  setFocusableDayOnFirstCalendar(newFocusedDay);
25
- } else if (isAfter(newFocusedDay, firstCalendarViewDate)) {
26
+ } else if (newFocusedDay > firstCalendarViewDate) {
26
27
  setFocusableDayOnSecondCalendar(newFocusedDay);
27
28
  }
28
29
  } else {
29
30
  if (isSameMonth(newFocusedDay, secondCalendarViewDate)) {
30
31
  setFocusableDayOnSecondCalendar(newFocusedDay);
31
- } else if (isBefore(newFocusedDay, secondCalendarViewDate)) {
32
+ } else if (newFocusedDay < secondCalendarViewDate) {
32
33
  setFocusableDayOnFirstCalendar(newFocusedDay);
33
34
  }
34
35
  }
@@ -98,7 +99,7 @@ export function useCalendarKeyboardNavigation({ focusedDay, value, setFocusedDay
98
99
  const isDayFocusable = React.useCallback((day)=>{
99
100
  // если focusableDay день находится среди дней открытого сейчас месяца, то такой день получит tabIndex="0",
100
101
  if (isCalendarHasFocusableDay) {
101
- return Boolean(focusableDayOnFirstCalendar && isSameDay(focusableDayOnFirstCalendar, day) || focusableDayOnSecondCalendar && isSameDay(focusableDayOnSecondCalendar, day));
102
+ return Boolean(focusableDayOnFirstCalendar && isSameDate(focusableDayOnFirstCalendar, day) || focusableDayOnSecondCalendar && isSameDate(focusableDayOnSecondCalendar, day));
102
103
  }
103
104
  // при открытии календаря focusableDay не определён,
104
105
  // поэтому tabIndex="0" будет у дня, соответствующего дню в инпуте
@@ -107,7 +108,7 @@ export function useCalendarKeyboardNavigation({ focusedDay, value, setFocusedDay
107
108
  }
108
109
  // при переключении месяца любая навигация с помощью Tab начинается
109
110
  // с первого дня месяца.
110
- return isSameDay(startOfMonth(viewDate), day);
111
+ return isSameDate(startOfMonth(viewDate), day);
111
112
  }, [
112
113
  isCalendarHasFocusableDay,
113
114
  isValueVisibleOnCalendar,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/CalendarRange/utils.ts"],"sourcesContent":["import * as React from 'react';\nimport { isSameDate } from '@vkontakte/vkjs';\nimport { isAfter, isBefore, isSameDay, isSameMonth, startOfMonth } from 'date-fns';\nimport { Keys, pressedKey } from '../../lib/accessibility';\nimport { navigateDate, NAVIGATION_KEYS } from '../../lib/calendar';\nimport { isHTMLElement } from '../../lib/dom';\nimport type { DateRangeType } from './types';\n\nexport function useCalendarKeyboardNavigation({\n focusedDay,\n value,\n setFocusedDay,\n viewDates: [firstCalendarViewDate, secondCalendarViewDate],\n setViewDate,\n}: {\n focusedDay: Date | undefined;\n setViewDate: (date: Date) => void;\n setFocusedDay: React.Dispatch<React.SetStateAction<Date | undefined>>;\n viewDates: [Date, Date];\n value: DateRangeType | null | undefined;\n}) {\n // соотвествует дню, на котором можно сфокусироваться с помощью Tab\n const [focusableDayOnFirstCalendar, setFocusableDayOnFirstCalendar] = React.useState<Date>();\n const [focusableDayOnSecondCalendar, setFocusableDayOnSecondCalendar] = React.useState<Date>();\n\n const handleCalendarKeyDown = React.useCallback(\n (event: React.KeyboardEvent, isFirst: boolean) => {\n const key = pressedKey(event);\n if (!key) {\n return;\n }\n\n if (NAVIGATION_KEYS.includes(key)) {\n event.preventDefault();\n\n const newFocusedDay = navigateDate(focusedDay ?? value?.[0], key);\n\n if (\n newFocusedDay &&\n !isSameMonth(newFocusedDay, firstCalendarViewDate) &&\n !isSameMonth(newFocusedDay, secondCalendarViewDate)\n ) {\n setViewDate(newFocusedDay);\n }\n\n if (isFirst) {\n if (isSameMonth(newFocusedDay, firstCalendarViewDate)) {\n setFocusableDayOnFirstCalendar(newFocusedDay);\n } else if (isAfter(newFocusedDay, firstCalendarViewDate)) {\n setFocusableDayOnSecondCalendar(newFocusedDay);\n }\n } else {\n if (isSameMonth(newFocusedDay, secondCalendarViewDate)) {\n setFocusableDayOnSecondCalendar(newFocusedDay);\n } else if (isBefore(newFocusedDay, secondCalendarViewDate)) {\n setFocusableDayOnFirstCalendar(newFocusedDay);\n }\n }\n\n setFocusedDay(newFocusedDay);\n\n return;\n }\n\n if (key === Keys.TAB) {\n setFocusedDay(undefined);\n if (isFirst) {\n setFocusableDayOnFirstCalendar(focusedDay);\n } else {\n setFocusableDayOnSecondCalendar(focusedDay);\n }\n\n return;\n }\n\n if ((key === Keys.ENTER || key === Keys.SPACE) && isHTMLElement(event.target)) {\n event.preventDefault();\n event.target.click?.();\n }\n },\n [focusedDay, value, firstCalendarViewDate, secondCalendarViewDate, setFocusedDay, setViewDate],\n );\n\n const handleFirstCalendarKeyDown = React.useCallback(\n (event: React.KeyboardEvent) => {\n handleCalendarKeyDown(event, true);\n },\n [handleCalendarKeyDown],\n );\n\n const handleSecondCalendarKeyDown = React.useCallback(\n (event: React.KeyboardEvent) => {\n handleCalendarKeyDown(event, false);\n },\n [handleCalendarKeyDown],\n );\n\n const handleDayFocus = React.useCallback(\n (value: Date) => {\n if (\n isSameMonth(firstCalendarViewDate, value) &&\n (!focusableDayOnFirstCalendar || !isSameDate(focusableDayOnFirstCalendar, value))\n ) {\n setFocusableDayOnFirstCalendar(value);\n }\n if (\n isSameMonth(secondCalendarViewDate, value) &&\n (!focusableDayOnSecondCalendar || !isSameDate(focusableDayOnSecondCalendar, value))\n ) {\n setFocusableDayOnSecondCalendar(value);\n }\n },\n [\n firstCalendarViewDate,\n focusableDayOnFirstCalendar,\n focusableDayOnSecondCalendar,\n secondCalendarViewDate,\n ],\n );\n\n return {\n focusableDayOnFirstCalendar,\n focusableDayOnSecondCalendar,\n handleFirstCalendarKeyDown,\n handleSecondCalendarKeyDown,\n handleDayFocus,\n };\n}\n\n/**\n * Возвращает функцию, которая позволяет проверить является ли день в календаре днём на который\n * можно попасть с помощью Tab.\n * Единственный день в таблице календаря у которого есть tabIndex=\"0\"\n * Чтобы на него можно было попасть из заголовка календаря.\n */\nexport function useIsDayFocusable({\n value,\n focusableDayOnFirstCalendar,\n focusableDayOnSecondCalendar,\n viewDate,\n isDayActive,\n}: {\n value: DateRangeType | null | undefined;\n focusableDayOnFirstCalendar: Date | undefined;\n focusableDayOnSecondCalendar: Date | undefined;\n viewDate: Date;\n isDayActive: (date: Date) => boolean;\n}) {\n const isValueVisibleOnCalendar = Boolean(\n value &&\n ((value[0] && isSameMonth(value[0], viewDate)) ||\n (value[1] && isSameMonth(value[1], viewDate))),\n );\n\n const isCalendarHasFocusableDay = Boolean(\n (focusableDayOnFirstCalendar && isSameMonth(focusableDayOnFirstCalendar, viewDate)) ||\n (focusableDayOnSecondCalendar && isSameMonth(focusableDayOnSecondCalendar, viewDate)),\n );\n\n const isDayFocusable = React.useCallback(\n (day: Date) => {\n // если focusableDay день находится среди дней открытого сейчас месяца, то такой день получит tabIndex=\"0\",\n if (isCalendarHasFocusableDay) {\n return Boolean(\n (focusableDayOnFirstCalendar && isSameDay(focusableDayOnFirstCalendar, day)) ||\n (focusableDayOnSecondCalendar && isSameDay(focusableDayOnSecondCalendar, day)),\n );\n }\n\n // при открытии календаря focusableDay не определён,\n // поэтому tabIndex=\"0\" будет у дня, соответствующего дню в инпуте\n if (isValueVisibleOnCalendar) {\n return isDayActive(day);\n }\n\n // при переключении месяца любая навигация с помощью Tab начинается\n // с первого дня месяца.\n return isSameDay(startOfMonth(viewDate), day);\n },\n [\n isCalendarHasFocusableDay,\n isValueVisibleOnCalendar,\n viewDate,\n isDayActive,\n focusableDayOnFirstCalendar,\n focusableDayOnSecondCalendar,\n ],\n );\n return isDayFocusable;\n}\n"],"names":["React","isSameDate","isAfter","isBefore","isSameDay","isSameMonth","startOfMonth","Keys","pressedKey","navigateDate","NAVIGATION_KEYS","isHTMLElement","useCalendarKeyboardNavigation","focusedDay","value","setFocusedDay","viewDates","firstCalendarViewDate","secondCalendarViewDate","setViewDate","focusableDayOnFirstCalendar","setFocusableDayOnFirstCalendar","useState","focusableDayOnSecondCalendar","setFocusableDayOnSecondCalendar","handleCalendarKeyDown","useCallback","event","isFirst","key","includes","preventDefault","newFocusedDay","TAB","undefined","ENTER","SPACE","target","click","handleFirstCalendarKeyDown","handleSecondCalendarKeyDown","handleDayFocus","useIsDayFocusable","viewDate","isDayActive","isValueVisibleOnCalendar","Boolean","isCalendarHasFocusableDay","isDayFocusable","day"],"mappings":"AAAA,YAAYA,WAAW,QAAQ;AAC/B,SAASC,UAAU,QAAQ,kBAAkB;AAC7C,SAASC,OAAO,EAAEC,QAAQ,EAAEC,SAAS,EAAEC,WAAW,EAAEC,YAAY,QAAQ,WAAW;AACnF,SAASC,IAAI,EAAEC,UAAU,QAAQ,6BAA0B;AAC3D,SAASC,YAAY,EAAEC,eAAe,QAAQ,wBAAqB;AACnE,SAASC,aAAa,QAAQ,mBAAgB;AAG9C,OAAO,SAASC,8BAA8B,EAC5CC,UAAU,EACVC,KAAK,EACLC,aAAa,EACbC,WAAW,CAACC,uBAAuBC,uBAAuB,EAC1DC,WAAW,EAOZ;IACC,mEAAmE;IACnE,MAAM,CAACC,6BAA6BC,+BAA+B,GAAGrB,MAAMsB,QAAQ;IACpF,MAAM,CAACC,8BAA8BC,gCAAgC,GAAGxB,MAAMsB,QAAQ;IAEtF,MAAMG,wBAAwBzB,MAAM0B,WAAW,CAC7C,CAACC,OAA4BC;QAC3B,MAAMC,MAAMrB,WAAWmB;QACvB,IAAI,CAACE,KAAK;YACR;QACF;QAEA,IAAInB,gBAAgBoB,QAAQ,CAACD,MAAM;YACjCF,MAAMI,cAAc;YAEpB,MAAMC,gBAAgBvB,aAAaI,cAAcC,OAAO,CAAC,EAAE,EAAEe;YAE7D,IACEG,iBACA,CAAC3B,YAAY2B,eAAef,0BAC5B,CAACZ,YAAY2B,eAAed,yBAC5B;gBACAC,YAAYa;YACd;YAEA,IAAIJ,SAAS;gBACX,IAAIvB,YAAY2B,eAAef,wBAAwB;oBACrDI,+BAA+BW;gBACjC,OAAO,IAAI9B,QAAQ8B,eAAef,wBAAwB;oBACxDO,gCAAgCQ;gBAClC;YACF,OAAO;gBACL,IAAI3B,YAAY2B,eAAed,yBAAyB;oBACtDM,gCAAgCQ;gBAClC,OAAO,IAAI7B,SAAS6B,eAAed,yBAAyB;oBAC1DG,+BAA+BW;gBACjC;YACF;YAEAjB,cAAciB;YAEd;QACF;QAEA,IAAIH,QAAQtB,KAAK0B,GAAG,EAAE;YACpBlB,cAAcmB;YACd,IAAIN,SAAS;gBACXP,+BAA+BR;YACjC,OAAO;gBACLW,gCAAgCX;YAClC;YAEA;QACF;QAEA,IAAI,AAACgB,CAAAA,QAAQtB,KAAK4B,KAAK,IAAIN,QAAQtB,KAAK6B,KAAK,AAAD,KAAMzB,cAAcgB,MAAMU,MAAM,GAAG;YAC7EV,MAAMI,cAAc;YACpBJ,MAAMU,MAAM,CAACC,KAAK;QACpB;IACF,GACA;QAACzB;QAAYC;QAAOG;QAAuBC;QAAwBH;QAAeI;KAAY;IAGhG,MAAMoB,6BAA6BvC,MAAM0B,WAAW,CAClD,CAACC;QACCF,sBAAsBE,OAAO;IAC/B,GACA;QAACF;KAAsB;IAGzB,MAAMe,8BAA8BxC,MAAM0B,WAAW,CACnD,CAACC;QACCF,sBAAsBE,OAAO;IAC/B,GACA;QAACF;KAAsB;IAGzB,MAAMgB,iBAAiBzC,MAAM0B,WAAW,CACtC,CAACZ;QACC,IACET,YAAYY,uBAAuBH,UAClC,CAAA,CAACM,+BAA+B,CAACnB,WAAWmB,6BAA6BN,MAAK,GAC/E;YACAO,+BAA+BP;QACjC;QACA,IACET,YAAYa,wBAAwBJ,UACnC,CAAA,CAACS,gCAAgC,CAACtB,WAAWsB,8BAA8BT,MAAK,GACjF;YACAU,gCAAgCV;QAClC;IACF,GACA;QACEG;QACAG;QACAG;QACAL;KACD;IAGH,OAAO;QACLE;QACAG;QACAgB;QACAC;QACAC;IACF;AACF;AAEA;;;;;CAKC,GACD,OAAO,SAASC,kBAAkB,EAChC5B,KAAK,EACLM,2BAA2B,EAC3BG,4BAA4B,EAC5BoB,QAAQ,EACRC,WAAW,EAOZ;IACC,MAAMC,2BAA2BC,QAC/BhC,SACG,CAAA,AAACA,KAAK,CAAC,EAAE,IAAIT,YAAYS,KAAK,CAAC,EAAE,EAAE6B,aACjC7B,KAAK,CAAC,EAAE,IAAIT,YAAYS,KAAK,CAAC,EAAE,EAAE6B,SAAS;IAGlD,MAAMI,4BAA4BD,QAChC,AAAC1B,+BAA+Bf,YAAYe,6BAA6BuB,aACtEpB,gCAAgClB,YAAYkB,8BAA8BoB;IAG/E,MAAMK,iBAAiBhD,MAAM0B,WAAW,CACtC,CAACuB;QACC,2GAA2G;QAC3G,IAAIF,2BAA2B;YAC7B,OAAOD,QACL,AAAC1B,+BAA+BhB,UAAUgB,6BAA6B6B,QACpE1B,gCAAgCnB,UAAUmB,8BAA8B0B;QAE/E;QAEA,oDAAoD;QACpD,kEAAkE;QAClE,IAAIJ,0BAA0B;YAC5B,OAAOD,YAAYK;QACrB;QAEA,mEAAmE;QACnE,wBAAwB;QACxB,OAAO7C,UAAUE,aAAaqC,WAAWM;IAC3C,GACA;QACEF;QACAF;QACAF;QACAC;QACAxB;QACAG;KACD;IAEH,OAAOyB;AACT"}
1
+ {"version":3,"sources":["../../../../src/components/CalendarRange/utils.ts"],"sourcesContent":["import * as React from 'react';\nimport { isSameDate } from '@vkontakte/vkjs';\nimport { startOfMonth } from 'date-fns';\nimport { Keys, pressedKey } from '../../lib/accessibility';\nimport { navigateDate, NAVIGATION_KEYS } from '../../lib/calendar';\nimport { isSameMonth } from '../../lib/date';\nimport { isHTMLElement } from '../../lib/dom';\nimport type { DateRangeType } from './types';\n\nexport function useCalendarKeyboardNavigation({\n focusedDay,\n value,\n setFocusedDay,\n viewDates: [firstCalendarViewDate, secondCalendarViewDate],\n setViewDate,\n}: {\n focusedDay: Date | undefined;\n setViewDate: (date: Date) => void;\n setFocusedDay: React.Dispatch<React.SetStateAction<Date | undefined>>;\n viewDates: [Date, Date];\n value: DateRangeType | null | undefined;\n}) {\n // соотвествует дню, на котором можно сфокусироваться с помощью Tab\n const [focusableDayOnFirstCalendar, setFocusableDayOnFirstCalendar] = React.useState<Date>();\n const [focusableDayOnSecondCalendar, setFocusableDayOnSecondCalendar] = React.useState<Date>();\n\n const handleCalendarKeyDown = React.useCallback(\n (event: React.KeyboardEvent, isFirst: boolean) => {\n const key = pressedKey(event);\n if (!key) {\n return;\n }\n\n if (NAVIGATION_KEYS.includes(key)) {\n event.preventDefault();\n\n const newFocusedDay = navigateDate(focusedDay ?? value?.[0], key);\n\n if (\n newFocusedDay &&\n !isSameMonth(newFocusedDay, firstCalendarViewDate) &&\n !isSameMonth(newFocusedDay, secondCalendarViewDate)\n ) {\n setViewDate(newFocusedDay);\n }\n\n if (isFirst) {\n if (isSameMonth(newFocusedDay, firstCalendarViewDate)) {\n setFocusableDayOnFirstCalendar(newFocusedDay);\n } else if (newFocusedDay > firstCalendarViewDate) {\n setFocusableDayOnSecondCalendar(newFocusedDay);\n }\n } else {\n if (isSameMonth(newFocusedDay, secondCalendarViewDate)) {\n setFocusableDayOnSecondCalendar(newFocusedDay);\n } else if (newFocusedDay < secondCalendarViewDate) {\n setFocusableDayOnFirstCalendar(newFocusedDay);\n }\n }\n\n setFocusedDay(newFocusedDay);\n\n return;\n }\n\n if (key === Keys.TAB) {\n setFocusedDay(undefined);\n if (isFirst) {\n setFocusableDayOnFirstCalendar(focusedDay);\n } else {\n setFocusableDayOnSecondCalendar(focusedDay);\n }\n\n return;\n }\n\n if ((key === Keys.ENTER || key === Keys.SPACE) && isHTMLElement(event.target)) {\n event.preventDefault();\n event.target.click?.();\n }\n },\n [focusedDay, value, firstCalendarViewDate, secondCalendarViewDate, setFocusedDay, setViewDate],\n );\n\n const handleFirstCalendarKeyDown = React.useCallback(\n (event: React.KeyboardEvent) => {\n handleCalendarKeyDown(event, true);\n },\n [handleCalendarKeyDown],\n );\n\n const handleSecondCalendarKeyDown = React.useCallback(\n (event: React.KeyboardEvent) => {\n handleCalendarKeyDown(event, false);\n },\n [handleCalendarKeyDown],\n );\n\n const handleDayFocus = React.useCallback(\n (value: Date) => {\n if (\n isSameMonth(firstCalendarViewDate, value) &&\n (!focusableDayOnFirstCalendar || !isSameDate(focusableDayOnFirstCalendar, value))\n ) {\n setFocusableDayOnFirstCalendar(value);\n }\n if (\n isSameMonth(secondCalendarViewDate, value) &&\n (!focusableDayOnSecondCalendar || !isSameDate(focusableDayOnSecondCalendar, value))\n ) {\n setFocusableDayOnSecondCalendar(value);\n }\n },\n [\n firstCalendarViewDate,\n focusableDayOnFirstCalendar,\n focusableDayOnSecondCalendar,\n secondCalendarViewDate,\n ],\n );\n\n return {\n focusableDayOnFirstCalendar,\n focusableDayOnSecondCalendar,\n handleFirstCalendarKeyDown,\n handleSecondCalendarKeyDown,\n handleDayFocus,\n };\n}\n\n/**\n * Возвращает функцию, которая позволяет проверить является ли день в календаре днём на который\n * можно попасть с помощью Tab.\n * Единственный день в таблице календаря у которого есть tabIndex=\"0\"\n * Чтобы на него можно было попасть из заголовка календаря.\n */\nexport function useIsDayFocusable({\n value,\n focusableDayOnFirstCalendar,\n focusableDayOnSecondCalendar,\n viewDate,\n isDayActive,\n}: {\n value: DateRangeType | null | undefined;\n focusableDayOnFirstCalendar: Date | undefined;\n focusableDayOnSecondCalendar: Date | undefined;\n viewDate: Date;\n isDayActive: (date: Date) => boolean;\n}) {\n const isValueVisibleOnCalendar = Boolean(\n value &&\n ((value[0] && isSameMonth(value[0], viewDate)) ||\n (value[1] && isSameMonth(value[1], viewDate))),\n );\n\n const isCalendarHasFocusableDay = Boolean(\n (focusableDayOnFirstCalendar && isSameMonth(focusableDayOnFirstCalendar, viewDate)) ||\n (focusableDayOnSecondCalendar && isSameMonth(focusableDayOnSecondCalendar, viewDate)),\n );\n\n const isDayFocusable = React.useCallback(\n (day: Date) => {\n // если focusableDay день находится среди дней открытого сейчас месяца, то такой день получит tabIndex=\"0\",\n if (isCalendarHasFocusableDay) {\n return Boolean(\n (focusableDayOnFirstCalendar && isSameDate(focusableDayOnFirstCalendar, day)) ||\n (focusableDayOnSecondCalendar && isSameDate(focusableDayOnSecondCalendar, day)),\n );\n }\n\n // при открытии календаря focusableDay не определён,\n // поэтому tabIndex=\"0\" будет у дня, соответствующего дню в инпуте\n if (isValueVisibleOnCalendar) {\n return isDayActive(day);\n }\n\n // при переключении месяца любая навигация с помощью Tab начинается\n // с первого дня месяца.\n return isSameDate(startOfMonth(viewDate), day);\n },\n [\n isCalendarHasFocusableDay,\n isValueVisibleOnCalendar,\n viewDate,\n isDayActive,\n focusableDayOnFirstCalendar,\n focusableDayOnSecondCalendar,\n ],\n );\n return isDayFocusable;\n}\n"],"names":["React","isSameDate","startOfMonth","Keys","pressedKey","navigateDate","NAVIGATION_KEYS","isSameMonth","isHTMLElement","useCalendarKeyboardNavigation","focusedDay","value","setFocusedDay","viewDates","firstCalendarViewDate","secondCalendarViewDate","setViewDate","focusableDayOnFirstCalendar","setFocusableDayOnFirstCalendar","useState","focusableDayOnSecondCalendar","setFocusableDayOnSecondCalendar","handleCalendarKeyDown","useCallback","event","isFirst","key","includes","preventDefault","newFocusedDay","TAB","undefined","ENTER","SPACE","target","click","handleFirstCalendarKeyDown","handleSecondCalendarKeyDown","handleDayFocus","useIsDayFocusable","viewDate","isDayActive","isValueVisibleOnCalendar","Boolean","isCalendarHasFocusableDay","isDayFocusable","day"],"mappings":"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"}
@@ -12,11 +12,12 @@ import { DEFAULT_DRAGGABLE_LABEL } from "./constants.js";
12
12
  import styles from "./Cell.module.css";
13
13
  /**
14
14
  * @see https://vkui.io/components/cell
15
- */ export const Cell = ({ mode, onRemove, removePlaceholder = 'Удалить', onDragFinish, before, after, disabled, draggable, Component: ComponentProps, onChange, name, value, checked, defaultChecked, getRootRef, draggerLabel = DEFAULT_DRAGGABLE_LABEL, className, style, toggleButtonTestId, removeButtonTestId, ...restProps })=>{
15
+ */ export const Cell = ({ mode, onRemove, removePlaceholder = 'Удалить', onDragFinish, before, after, disabled, draggable, Component: ComponentProps, onChange, name, value, checked, defaultChecked, getRootRef, draggerLabel = DEFAULT_DRAGGABLE_LABEL, className, style, toggleButtonTestId, removeButtonTestId, href: hrefProp, ...restProps })=>{
16
16
  const [dragging, setDragging] = React.useState(false);
17
17
  const selectable = mode === 'selectable';
18
18
  const removable = mode === 'removable';
19
19
  const Component = selectable ? 'label' : ComponentProps;
20
+ const href = selectable ? undefined : hrefProp;
20
21
  const platform = usePlatform();
21
22
  const rootElRef = useExternRef(getRootRef);
22
23
  const dragger = draggable ? /*#__PURE__*/ _jsx(CellDragger, {
@@ -47,6 +48,7 @@ import styles from "./Cell.module.css";
47
48
  hasActive: hasActive,
48
49
  hasHover: hasActive && !removable,
49
50
  disabled,
51
+ href,
50
52
  ...restProps,
51
53
  className: styles.content,
52
54
  // чтобы свойство, если не определено, не присутствовало в