@vkontakte/vkui 6.7.2 → 6.7.4

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 (296) hide show
  1. package/dist/cjs/components/BaseGallery/BaseGallery.d.ts.map +1 -1
  2. package/dist/cjs/components/BaseGallery/BaseGallery.js +5 -2
  3. package/dist/cjs/components/BaseGallery/BaseGallery.js.map +1 -1
  4. package/dist/cjs/components/BaseGallery/CarouselBase/CarouselBase.d.ts.map +1 -1
  5. package/dist/cjs/components/BaseGallery/CarouselBase/CarouselBase.js +5 -1
  6. package/dist/cjs/components/BaseGallery/CarouselBase/CarouselBase.js.map +1 -1
  7. package/dist/cjs/components/Button/Button.d.ts +1 -0
  8. package/dist/cjs/components/Button/Button.d.ts.map +1 -1
  9. package/dist/cjs/components/Button/Button.js.map +1 -1
  10. package/dist/cjs/components/Calendar/Calendar.d.ts +6 -6
  11. package/dist/cjs/components/Calendar/Calendar.d.ts.map +1 -1
  12. package/dist/cjs/components/Calendar/Calendar.js +25 -5
  13. package/dist/cjs/components/Calendar/Calendar.js.map +1 -1
  14. package/dist/cjs/components/CalendarDay/CalendarDay.d.ts +4 -1
  15. package/dist/cjs/components/CalendarDay/CalendarDay.d.ts.map +1 -1
  16. package/dist/cjs/components/CalendarDay/CalendarDay.js +5 -3
  17. package/dist/cjs/components/CalendarDay/CalendarDay.js.map +1 -1
  18. package/dist/cjs/components/CalendarDays/CalendarDays.d.ts +6 -3
  19. package/dist/cjs/components/CalendarDays/CalendarDays.d.ts.map +1 -1
  20. package/dist/cjs/components/CalendarDays/CalendarDays.js +5 -3
  21. package/dist/cjs/components/CalendarDays/CalendarDays.js.map +1 -1
  22. package/dist/cjs/components/CalendarHeader/CalendarHeader.d.ts +8 -2
  23. package/dist/cjs/components/CalendarHeader/CalendarHeader.d.ts.map +1 -1
  24. package/dist/cjs/components/CalendarHeader/CalendarHeader.js +14 -6
  25. package/dist/cjs/components/CalendarHeader/CalendarHeader.js.map +1 -1
  26. package/dist/cjs/components/CalendarRange/CalendarRange.d.ts +8 -4
  27. package/dist/cjs/components/CalendarRange/CalendarRange.d.ts.map +1 -1
  28. package/dist/cjs/components/CalendarRange/CalendarRange.js +13 -8
  29. package/dist/cjs/components/CalendarRange/CalendarRange.js.map +1 -1
  30. package/dist/cjs/components/CalendarTime/CalendarTime.d.ts +9 -2
  31. package/dist/cjs/components/CalendarTime/CalendarTime.d.ts.map +1 -1
  32. package/dist/cjs/components/CalendarTime/CalendarTime.js +10 -5
  33. package/dist/cjs/components/CalendarTime/CalendarTime.js.map +1 -1
  34. package/dist/cjs/components/Clickable/useState.d.ts +1 -1
  35. package/dist/cjs/components/Clickable/useState.d.ts.map +1 -1
  36. package/dist/cjs/components/Clickable/useState.js +12 -19
  37. package/dist/cjs/components/Clickable/useState.js.map +1 -1
  38. package/dist/cjs/components/CustomSelect/CustomSelect.d.ts.map +1 -1
  39. package/dist/cjs/components/CustomSelect/CustomSelect.js +3 -18
  40. package/dist/cjs/components/CustomSelect/CustomSelect.js.map +1 -1
  41. package/dist/cjs/components/DateInput/DateInput.d.ts +12 -3
  42. package/dist/cjs/components/DateInput/DateInput.d.ts.map +1 -1
  43. package/dist/cjs/components/DateInput/DateInput.js +26 -11
  44. package/dist/cjs/components/DateInput/DateInput.js.map +1 -1
  45. package/dist/cjs/components/DateRangeInput/DateRangeInput.d.ts +15 -3
  46. package/dist/cjs/components/DateRangeInput/DateRangeInput.d.ts.map +1 -1
  47. package/dist/cjs/components/DateRangeInput/DateRangeInput.js +22 -11
  48. package/dist/cjs/components/DateRangeInput/DateRangeInput.js.map +1 -1
  49. package/dist/cjs/components/FocusTrap/FocusTrap.d.ts +1 -1
  50. package/dist/cjs/components/FocusTrap/FocusTrap.d.ts.map +1 -1
  51. package/dist/cjs/components/FocusTrap/FocusTrap.js +50 -41
  52. package/dist/cjs/components/FocusTrap/FocusTrap.js.map +1 -1
  53. package/dist/cjs/components/FormItem/FormItem.d.ts +0 -2
  54. package/dist/cjs/components/FormItem/FormItem.d.ts.map +1 -1
  55. package/dist/cjs/components/FormItem/FormItem.js.map +1 -1
  56. package/dist/cjs/components/Gallery/Gallery.d.ts +1 -1
  57. package/dist/cjs/components/Gallery/Gallery.d.ts.map +1 -1
  58. package/dist/cjs/components/Gallery/Gallery.js +12 -3
  59. package/dist/cjs/components/Gallery/Gallery.js.map +1 -1
  60. package/dist/cjs/components/Gallery/hooks.d.ts +9 -1
  61. package/dist/cjs/components/Gallery/hooks.d.ts.map +1 -1
  62. package/dist/cjs/components/Gallery/hooks.js +43 -25
  63. package/dist/cjs/components/Gallery/hooks.js.map +1 -1
  64. package/dist/cjs/components/HorizontalScroll/HorizontalScroll.d.ts.map +1 -1
  65. package/dist/cjs/components/HorizontalScroll/HorizontalScroll.js +19 -26
  66. package/dist/cjs/components/HorizontalScroll/HorizontalScroll.js.map +1 -1
  67. package/dist/cjs/components/Popover/Popover.js +1 -1
  68. package/dist/cjs/components/Popover/Popover.js.map +1 -1
  69. package/dist/cjs/hooks/useDateInput.d.ts +2 -1
  70. package/dist/cjs/hooks/useDateInput.d.ts.map +1 -1
  71. package/dist/cjs/hooks/useDateInput.js +29 -9
  72. package/dist/cjs/hooks/useDateInput.js.map +1 -1
  73. package/dist/cjs/lib/floating/customResizeObserver.d.ts.map +1 -1
  74. package/dist/cjs/lib/floating/customResizeObserver.js +0 -1
  75. package/dist/cjs/lib/floating/customResizeObserver.js.map +1 -1
  76. package/dist/cjs/lib/floating/types/component.d.ts +2 -2
  77. package/dist/cjs/lib/floating/types/component.d.ts.map +1 -1
  78. package/dist/cjs/lib/floating/useFloatingWithInteractions/index.d.ts +1 -0
  79. package/dist/cjs/lib/floating/useFloatingWithInteractions/index.d.ts.map +1 -1
  80. package/dist/cjs/lib/floating/useFloatingWithInteractions/index.js.map +1 -1
  81. package/dist/cjs/lib/floating/useFloatingWithInteractions/types.d.ts +2 -1
  82. package/dist/cjs/lib/floating/useFloatingWithInteractions/types.d.ts.map +1 -1
  83. package/dist/cjs/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.d.ts.map +1 -1
  84. package/dist/cjs/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.js +14 -1
  85. package/dist/cjs/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.js.map +1 -1
  86. package/dist/components/BaseGallery/BaseGallery.d.ts.map +1 -1
  87. package/dist/components/BaseGallery/BaseGallery.js +5 -2
  88. package/dist/components/BaseGallery/BaseGallery.js.map +1 -1
  89. package/dist/components/BaseGallery/CarouselBase/CarouselBase.d.ts.map +1 -1
  90. package/dist/components/BaseGallery/CarouselBase/CarouselBase.js +5 -1
  91. package/dist/components/BaseGallery/CarouselBase/CarouselBase.js.map +1 -1
  92. package/dist/components/Button/Button.d.ts +1 -0
  93. package/dist/components/Button/Button.d.ts.map +1 -1
  94. package/dist/components/Button/Button.js.map +1 -1
  95. package/dist/components/Calendar/Calendar.d.ts +6 -6
  96. package/dist/components/Calendar/Calendar.d.ts.map +1 -1
  97. package/dist/components/Calendar/Calendar.js +25 -5
  98. package/dist/components/Calendar/Calendar.js.map +1 -1
  99. package/dist/components/CalendarDay/CalendarDay.d.ts +4 -1
  100. package/dist/components/CalendarDay/CalendarDay.d.ts.map +1 -1
  101. package/dist/components/CalendarDay/CalendarDay.js +5 -3
  102. package/dist/components/CalendarDay/CalendarDay.js.map +1 -1
  103. package/dist/components/CalendarDays/CalendarDays.d.ts +6 -3
  104. package/dist/components/CalendarDays/CalendarDays.d.ts.map +1 -1
  105. package/dist/components/CalendarDays/CalendarDays.js +5 -3
  106. package/dist/components/CalendarDays/CalendarDays.js.map +1 -1
  107. package/dist/components/CalendarHeader/CalendarHeader.d.ts +8 -2
  108. package/dist/components/CalendarHeader/CalendarHeader.d.ts.map +1 -1
  109. package/dist/components/CalendarHeader/CalendarHeader.js +14 -6
  110. package/dist/components/CalendarHeader/CalendarHeader.js.map +1 -1
  111. package/dist/components/CalendarRange/CalendarRange.d.ts +8 -4
  112. package/dist/components/CalendarRange/CalendarRange.d.ts.map +1 -1
  113. package/dist/components/CalendarRange/CalendarRange.js +13 -8
  114. package/dist/components/CalendarRange/CalendarRange.js.map +1 -1
  115. package/dist/components/CalendarTime/CalendarTime.d.ts +9 -2
  116. package/dist/components/CalendarTime/CalendarTime.d.ts.map +1 -1
  117. package/dist/components/CalendarTime/CalendarTime.js +10 -5
  118. package/dist/components/CalendarTime/CalendarTime.js.map +1 -1
  119. package/dist/components/Clickable/useState.d.ts +1 -1
  120. package/dist/components/Clickable/useState.d.ts.map +1 -1
  121. package/dist/components/Clickable/useState.js +12 -19
  122. package/dist/components/Clickable/useState.js.map +1 -1
  123. package/dist/components/CustomSelect/CustomSelect.d.ts.map +1 -1
  124. package/dist/components/CustomSelect/CustomSelect.js +3 -18
  125. package/dist/components/CustomSelect/CustomSelect.js.map +1 -1
  126. package/dist/components/DateInput/DateInput.d.ts +12 -3
  127. package/dist/components/DateInput/DateInput.d.ts.map +1 -1
  128. package/dist/components/DateInput/DateInput.js +26 -11
  129. package/dist/components/DateInput/DateInput.js.map +1 -1
  130. package/dist/components/DateRangeInput/DateRangeInput.d.ts +15 -3
  131. package/dist/components/DateRangeInput/DateRangeInput.d.ts.map +1 -1
  132. package/dist/components/DateRangeInput/DateRangeInput.js +22 -11
  133. package/dist/components/DateRangeInput/DateRangeInput.js.map +1 -1
  134. package/dist/components/FocusTrap/FocusTrap.d.ts +1 -1
  135. package/dist/components/FocusTrap/FocusTrap.d.ts.map +1 -1
  136. package/dist/components/FocusTrap/FocusTrap.js +51 -42
  137. package/dist/components/FocusTrap/FocusTrap.js.map +1 -1
  138. package/dist/components/FormItem/FormItem.d.ts +0 -2
  139. package/dist/components/FormItem/FormItem.d.ts.map +1 -1
  140. package/dist/components/FormItem/FormItem.js.map +1 -1
  141. package/dist/components/Gallery/Gallery.d.ts +1 -1
  142. package/dist/components/Gallery/Gallery.d.ts.map +1 -1
  143. package/dist/components/Gallery/Gallery.js +12 -3
  144. package/dist/components/Gallery/Gallery.js.map +1 -1
  145. package/dist/components/Gallery/hooks.d.ts +9 -1
  146. package/dist/components/Gallery/hooks.d.ts.map +1 -1
  147. package/dist/components/Gallery/hooks.js +43 -25
  148. package/dist/components/Gallery/hooks.js.map +1 -1
  149. package/dist/components/HorizontalScroll/HorizontalScroll.d.ts.map +1 -1
  150. package/dist/components/HorizontalScroll/HorizontalScroll.js +20 -27
  151. package/dist/components/HorizontalScroll/HorizontalScroll.js.map +1 -1
  152. package/dist/components/Popover/Popover.js +1 -1
  153. package/dist/components/Popover/Popover.js.map +1 -1
  154. package/dist/components.css +1 -1
  155. package/dist/components.css.map +1 -1
  156. package/dist/components.js.tmp +382 -230
  157. package/dist/cssm/components/BaseGallery/BaseGallery.d.ts.map +1 -1
  158. package/dist/cssm/components/BaseGallery/BaseGallery.js +3 -1
  159. package/dist/cssm/components/BaseGallery/BaseGallery.js.map +1 -1
  160. package/dist/cssm/components/BaseGallery/CarouselBase/CarouselBase.d.ts.map +1 -1
  161. package/dist/cssm/components/BaseGallery/CarouselBase/CarouselBase.js +5 -1
  162. package/dist/cssm/components/BaseGallery/CarouselBase/CarouselBase.js.map +1 -1
  163. package/dist/cssm/components/Button/Button.d.ts +1 -0
  164. package/dist/cssm/components/Button/Button.d.ts.map +1 -1
  165. package/dist/cssm/components/Button/Button.js +1 -0
  166. package/dist/cssm/components/Button/Button.js.map +1 -1
  167. package/dist/cssm/components/Calendar/Calendar.d.ts +6 -6
  168. package/dist/cssm/components/Calendar/Calendar.d.ts.map +1 -1
  169. package/dist/cssm/components/Calendar/Calendar.js +14 -4
  170. package/dist/cssm/components/Calendar/Calendar.js.map +1 -1
  171. package/dist/cssm/components/CalendarDay/CalendarDay.d.ts +4 -1
  172. package/dist/cssm/components/CalendarDay/CalendarDay.d.ts.map +1 -1
  173. package/dist/cssm/components/CalendarDay/CalendarDay.js +2 -1
  174. package/dist/cssm/components/CalendarDay/CalendarDay.js.map +1 -1
  175. package/dist/cssm/components/CalendarDays/CalendarDays.d.ts +6 -3
  176. package/dist/cssm/components/CalendarDays/CalendarDays.d.ts.map +1 -1
  177. package/dist/cssm/components/CalendarDays/CalendarDays.js +2 -1
  178. package/dist/cssm/components/CalendarDays/CalendarDays.js.map +1 -1
  179. package/dist/cssm/components/CalendarHeader/CalendarHeader.d.ts +8 -2
  180. package/dist/cssm/components/CalendarHeader/CalendarHeader.d.ts.map +1 -1
  181. package/dist/cssm/components/CalendarHeader/CalendarHeader.js +7 -3
  182. package/dist/cssm/components/CalendarHeader/CalendarHeader.js.map +1 -1
  183. package/dist/cssm/components/CalendarRange/CalendarRange.d.ts +8 -4
  184. package/dist/cssm/components/CalendarRange/CalendarRange.d.ts.map +1 -1
  185. package/dist/cssm/components/CalendarRange/CalendarRange.js +9 -5
  186. package/dist/cssm/components/CalendarRange/CalendarRange.js.map +1 -1
  187. package/dist/cssm/components/CalendarTime/CalendarTime.d.ts +9 -2
  188. package/dist/cssm/components/CalendarTime/CalendarTime.d.ts.map +1 -1
  189. package/dist/cssm/components/CalendarTime/CalendarTime.js +10 -5
  190. package/dist/cssm/components/CalendarTime/CalendarTime.js.map +1 -1
  191. package/dist/cssm/components/CalendarTime/CalendarTime.module.css +4 -0
  192. package/dist/cssm/components/Clickable/useState.d.ts +1 -1
  193. package/dist/cssm/components/Clickable/useState.d.ts.map +1 -1
  194. package/dist/cssm/components/Clickable/useState.js +10 -11
  195. package/dist/cssm/components/Clickable/useState.js.map +1 -1
  196. package/dist/cssm/components/CustomSelect/CustomSelect.d.ts.map +1 -1
  197. package/dist/cssm/components/CustomSelect/CustomSelect.js +3 -18
  198. package/dist/cssm/components/CustomSelect/CustomSelect.js.map +1 -1
  199. package/dist/cssm/components/DateInput/DateInput.d.ts +12 -3
  200. package/dist/cssm/components/DateInput/DateInput.d.ts.map +1 -1
  201. package/dist/cssm/components/DateInput/DateInput.js +18 -9
  202. package/dist/cssm/components/DateInput/DateInput.js.map +1 -1
  203. package/dist/cssm/components/DateRangeInput/DateRangeInput.d.ts +15 -3
  204. package/dist/cssm/components/DateRangeInput/DateRangeInput.d.ts.map +1 -1
  205. package/dist/cssm/components/DateRangeInput/DateRangeInput.js +17 -9
  206. package/dist/cssm/components/DateRangeInput/DateRangeInput.js.map +1 -1
  207. package/dist/cssm/components/FocusTrap/FocusTrap.d.ts +1 -1
  208. package/dist/cssm/components/FocusTrap/FocusTrap.d.ts.map +1 -1
  209. package/dist/cssm/components/FocusTrap/FocusTrap.js +51 -42
  210. package/dist/cssm/components/FocusTrap/FocusTrap.js.map +1 -1
  211. package/dist/cssm/components/FormItem/FormItem.d.ts +0 -2
  212. package/dist/cssm/components/FormItem/FormItem.d.ts.map +1 -1
  213. package/dist/cssm/components/FormItem/FormItem.js.map +1 -1
  214. package/dist/cssm/components/FormLayoutGroup/FormLayoutGroup.module.css +1 -0
  215. package/dist/cssm/components/Gallery/Gallery.d.ts +1 -1
  216. package/dist/cssm/components/Gallery/Gallery.d.ts.map +1 -1
  217. package/dist/cssm/components/Gallery/Gallery.js +9 -2
  218. package/dist/cssm/components/Gallery/Gallery.js.map +1 -1
  219. package/dist/cssm/components/Gallery/hooks.d.ts +9 -1
  220. package/dist/cssm/components/Gallery/hooks.d.ts.map +1 -1
  221. package/dist/cssm/components/Gallery/hooks.js +43 -25
  222. package/dist/cssm/components/Gallery/hooks.js.map +1 -1
  223. package/dist/cssm/components/HorizontalScroll/HorizontalScroll.d.ts.map +1 -1
  224. package/dist/cssm/components/HorizontalScroll/HorizontalScroll.js +20 -27
  225. package/dist/cssm/components/HorizontalScroll/HorizontalScroll.js.map +1 -1
  226. package/dist/cssm/components/Popover/Popover.js +1 -1
  227. package/dist/cssm/components/Popover/Popover.js.map +1 -1
  228. package/dist/cssm/hooks/useDateInput.d.ts +2 -1
  229. package/dist/cssm/hooks/useDateInput.d.ts.map +1 -1
  230. package/dist/cssm/hooks/useDateInput.js +30 -9
  231. package/dist/cssm/hooks/useDateInput.js.map +1 -1
  232. package/dist/cssm/lib/floating/customResizeObserver.d.ts.map +1 -1
  233. package/dist/cssm/lib/floating/customResizeObserver.js +0 -1
  234. package/dist/cssm/lib/floating/customResizeObserver.js.map +1 -1
  235. package/dist/cssm/lib/floating/types/component.d.ts +2 -2
  236. package/dist/cssm/lib/floating/types/component.d.ts.map +1 -1
  237. package/dist/cssm/lib/floating/types/component.js.map +1 -1
  238. package/dist/cssm/lib/floating/useFloatingWithInteractions/index.d.ts +1 -0
  239. package/dist/cssm/lib/floating/useFloatingWithInteractions/index.d.ts.map +1 -1
  240. package/dist/cssm/lib/floating/useFloatingWithInteractions/index.js.map +1 -1
  241. package/dist/cssm/lib/floating/useFloatingWithInteractions/types.d.ts +2 -1
  242. package/dist/cssm/lib/floating/useFloatingWithInteractions/types.d.ts.map +1 -1
  243. package/dist/cssm/lib/floating/useFloatingWithInteractions/types.js.map +1 -1
  244. package/dist/cssm/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.d.ts.map +1 -1
  245. package/dist/cssm/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.js +14 -1
  246. package/dist/cssm/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.js.map +1 -1
  247. package/dist/hooks/useDateInput.d.ts +2 -1
  248. package/dist/hooks/useDateInput.d.ts.map +1 -1
  249. package/dist/hooks/useDateInput.js +30 -9
  250. package/dist/hooks/useDateInput.js.map +1 -1
  251. package/dist/lib/floating/customResizeObserver.d.ts.map +1 -1
  252. package/dist/lib/floating/customResizeObserver.js +0 -1
  253. package/dist/lib/floating/customResizeObserver.js.map +1 -1
  254. package/dist/lib/floating/types/component.d.ts +2 -2
  255. package/dist/lib/floating/types/component.d.ts.map +1 -1
  256. package/dist/lib/floating/types/component.js.map +1 -1
  257. package/dist/lib/floating/useFloatingWithInteractions/index.d.ts +1 -0
  258. package/dist/lib/floating/useFloatingWithInteractions/index.d.ts.map +1 -1
  259. package/dist/lib/floating/useFloatingWithInteractions/index.js.map +1 -1
  260. package/dist/lib/floating/useFloatingWithInteractions/types.d.ts +2 -1
  261. package/dist/lib/floating/useFloatingWithInteractions/types.d.ts.map +1 -1
  262. package/dist/lib/floating/useFloatingWithInteractions/types.js.map +1 -1
  263. package/dist/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.d.ts.map +1 -1
  264. package/dist/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.js +14 -1
  265. package/dist/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.js.map +1 -1
  266. package/dist/vkui.css +1 -1
  267. package/dist/vkui.css.map +1 -1
  268. package/dist/vkui.js.tmp +382 -230
  269. package/package.json +1 -1
  270. package/src/components/BaseGallery/BaseGallery.tsx +8 -1
  271. package/src/components/BaseGallery/CarouselBase/CarouselBase.tsx +6 -1
  272. package/src/components/Button/Button.tsx +1 -0
  273. package/src/components/Calendar/Calendar.tsx +49 -6
  274. package/src/components/CalendarDay/CalendarDay.tsx +7 -1
  275. package/src/components/CalendarDays/CalendarDays.tsx +9 -1
  276. package/src/components/CalendarHeader/CalendarHeader.tsx +21 -1
  277. package/src/components/CalendarRange/CalendarRange.tsx +24 -3
  278. package/src/components/CalendarTime/CalendarTime.module.css +4 -0
  279. package/src/components/CalendarTime/CalendarTime.tsx +39 -10
  280. package/src/components/Clickable/useState.tsx +30 -27
  281. package/src/components/CustomSelect/CustomSelect.tsx +4 -17
  282. package/src/components/DateInput/DateInput.tsx +32 -3
  283. package/src/components/DateRangeInput/DateRangeInput.tsx +28 -1
  284. package/src/components/FocusTrap/FocusTrap.tsx +75 -45
  285. package/src/components/FormItem/FormItem.tsx +0 -2
  286. package/src/components/FormLayoutGroup/FormLayoutGroup.module.css +1 -0
  287. package/src/components/Gallery/Gallery.tsx +10 -1
  288. package/src/components/Gallery/hooks.ts +49 -33
  289. package/src/components/HorizontalScroll/HorizontalScroll.tsx +23 -28
  290. package/src/components/Popover/Popover.tsx +1 -1
  291. package/src/hooks/useDateInput.ts +23 -6
  292. package/src/lib/floating/customResizeObserver.ts +0 -1
  293. package/src/lib/floating/types/component.ts +2 -1
  294. package/src/lib/floating/useFloatingWithInteractions/index.ts +2 -0
  295. package/src/lib/floating/useFloatingWithInteractions/types.ts +3 -1
  296. package/src/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.ts +15 -3
@@ -2,6 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import * as React from 'react';
3
3
  import { Icon16Clear, Icon20CalendarOutline } from '@vkontakte/icons';
4
4
  import { classNames } from '@vkontakte/vkjs';
5
+ import { startOfDay, startOfMinute } from 'date-fns';
5
6
  import { useAdaptivity } from '../../hooks/useAdaptivity';
6
7
  import { useDateInput } from '../../hooks/useDateInput';
7
8
  import { useExternRef } from '../../hooks/useExternRef';
@@ -68,7 +69,7 @@ const getInternalValue = (value)=>{
68
69
  };
69
70
  /**
70
71
  * @see https://vkcom.github.io/VKUI/#/DateInput
71
- */ export const DateInput = ({ enableTime, shouldDisableDate, disableFuture, disablePast, minDateTime, maxDateTime, value, onChange, calendarPlacement = 'bottom-start', style, className, doneButtonText, closeOnChange = true, disablePickers, getRootRef, name, autoFocus, disabled, onClick, onFocus, prevMonthLabel = 'Предыдущий месяц', nextMonthLabel = 'Следующий месяц', showNeighboringMonth, size, changeMonthLabel = 'Изменить месяц', changeYearLabel = 'Изменить год', changeDayLabel = 'Изменить день', changeHoursLabel = 'Изменить час', changeMinutesLabel = 'Изменить минуту', clearFieldLabel = 'Очистить поле', showCalendarLabel = 'Показать календарь', viewDate, onHeaderChange, onNextMonth, onPrevMonth, prevMonthIcon, nextMonthIcon, disableCalendar = false, renderDayContent, ...props })=>{
72
+ */ export const DateInput = ({ enableTime, shouldDisableDate, disableFuture, disablePast, minDateTime, maxDateTime, value, onChange, calendarPlacement = 'bottom-start', style, className, doneButtonText, closeOnChange = true, disablePickers, getRootRef, name, autoFocus, disabled, onClick, onFocus, prevMonthLabel = 'Предыдущий месяц', nextMonthLabel = 'Следующий месяц', showNeighboringMonth, size, changeMonthLabel = 'Изменить месяц', changeYearLabel = 'Изменить год', changeDayLabel = 'Изменить день', changeHoursLabel = 'Изменить час', changeMinutesLabel = 'Изменить минуту', clearFieldLabel = 'Очистить поле', showCalendarLabel = 'Показать календарь', viewDate, onHeaderChange, onNextMonth, onPrevMonth, prevMonthIcon, nextMonthIcon, disableCalendar = false, renderDayContent, onCalendarOpenChanged, calendarTestsProps, dayFieldTestId, monthFieldTestId, yearFieldTestId, hourFieldTestId, minuteFieldTestId, ...props })=>{
72
73
  const daysRef = React.useRef(null);
73
74
  const monthsRef = React.useRef(null);
74
75
  const yearsRef = React.useRef(null);
@@ -88,7 +89,8 @@ const getInternalValue = (value)=>{
88
89
  mask += ' HH:mm';
89
90
  }
90
91
  if (isMatch(formattedValue, mask)) {
91
- onChange?.(parse(formattedValue, mask, value ?? new Date()));
92
+ const now = new Date();
93
+ onChange?.(parse(formattedValue, mask, value ?? (enableTime ? startOfMinute(now) : startOfDay(now))));
92
94
  }
93
95
  }, [
94
96
  enableTime,
@@ -118,7 +120,8 @@ const getInternalValue = (value)=>{
118
120
  onChange,
119
121
  onInternalValueChange,
120
122
  getInternalValue,
121
- value
123
+ value,
124
+ onCalendarOpenChanged
122
125
  });
123
126
  const { sizeY = 'none' } = useAdaptivity();
124
127
  const handleRootRef = useExternRef(rootRef, getRootRef);
@@ -173,7 +176,8 @@ const getInternalValue = (value)=>{
173
176
  index: 0,
174
177
  onElementSelect: setFocusedElement,
175
178
  value: internalValue[0],
176
- label: changeDayLabel
179
+ label: changeDayLabel,
180
+ "data-testid": dayFieldTestId
177
181
  }),
178
182
  /*#__PURE__*/ _jsx(InputLikeDivider, {
179
183
  children: "."
@@ -184,7 +188,8 @@ const getInternalValue = (value)=>{
184
188
  index: 1,
185
189
  onElementSelect: setFocusedElement,
186
190
  value: internalValue[1],
187
- label: changeMonthLabel
191
+ label: changeMonthLabel,
192
+ "data-testid": monthFieldTestId
188
193
  }),
189
194
  /*#__PURE__*/ _jsx(InputLikeDivider, {
190
195
  children: "."
@@ -195,7 +200,8 @@ const getInternalValue = (value)=>{
195
200
  index: 2,
196
201
  onElementSelect: setFocusedElement,
197
202
  value: internalValue[2],
198
- label: changeYearLabel
203
+ label: changeYearLabel,
204
+ "data-testid": yearFieldTestId
199
205
  }),
200
206
  enableTime && /*#__PURE__*/ _jsxs(React.Fragment, {
201
207
  children: [
@@ -209,7 +215,8 @@ const getInternalValue = (value)=>{
209
215
  index: 3,
210
216
  onElementSelect: setFocusedElement,
211
217
  value: internalValue[3],
212
- label: changeHoursLabel
218
+ label: changeHoursLabel,
219
+ "data-testid": hourFieldTestId
213
220
  }),
214
221
  /*#__PURE__*/ _jsx(InputLikeDivider, {
215
222
  children: ":"
@@ -220,7 +227,8 @@ const getInternalValue = (value)=>{
220
227
  index: 4,
221
228
  onElementSelect: setFocusedElement,
222
229
  value: internalValue[4],
223
- label: changeMinutesLabel
230
+ label: changeMinutesLabel,
231
+ "data-testid": minuteFieldTestId
224
232
  })
225
233
  ]
226
234
  })
@@ -259,7 +267,8 @@ const getInternalValue = (value)=>{
259
267
  prevMonthIcon: prevMonthIcon,
260
268
  nextMonthIcon: nextMonthIcon,
261
269
  minDateTime: minDateTime,
262
- maxDateTime: maxDateTime
270
+ maxDateTime: maxDateTime,
271
+ ...calendarTestsProps
263
272
  })
264
273
  })
265
274
  ]
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/DateInput/DateInput.tsx"],"sourcesContent":["import * as React from 'react';\nimport { Icon16Clear, Icon20CalendarOutline } from '@vkontakte/icons';\nimport { classNames } from '@vkontakte/vkjs';\nimport { useAdaptivity } from '../../hooks/useAdaptivity';\nimport { useDateInput } from '../../hooks/useDateInput';\nimport { useExternRef } from '../../hooks/useExternRef';\nimport { callMultiple } from '../../lib/callMultiple';\nimport { format, isMatch, parse } from '../../lib/date';\nimport type { PlacementWithAuto } from '../../lib/floating';\nimport type { HasRootRef } from '../../types';\nimport { Calendar, type CalendarProps } from '../Calendar/Calendar';\nimport { FormField, type FormFieldProps } from '../FormField/FormField';\nimport { IconButton } from '../IconButton/IconButton';\nimport { InputLike } from '../InputLike/InputLike';\nimport { InputLikeDivider } from '../InputLike/InputLikeDivider';\nimport { Popper } from '../Popper/Popper';\nimport { Text } from '../Typography/Text/Text';\nimport '../InputLike/InputLike.module.css'; // Reorder css\nimport styles from './DateInput.module.css';\n\nconst sizeYClassNames = {\n none: styles['DateInput--sizeY-none'],\n compact: styles['DateInput--sizeY-compact'],\n};\n\nexport interface DateInputProps\n extends Omit<React.InputHTMLAttributes<HTMLDivElement>, 'value' | 'onChange' | 'size'>,\n Pick<\n CalendarProps,\n | 'disablePast'\n | 'disableFuture'\n | 'enableTime'\n | 'shouldDisableDate'\n | 'onChange'\n | 'value'\n | 'doneButtonText'\n | 'weekStartsOn'\n | 'disablePickers'\n | 'changeHoursLabel'\n | 'changeMinutesLabel'\n | 'prevMonthLabel'\n | 'nextMonthLabel'\n | 'changeMonthLabel'\n | 'changeYearLabel'\n | 'changeDayLabel'\n | 'showNeighboringMonth'\n | 'size'\n | 'viewDate'\n | 'onHeaderChange'\n | 'onNextMonth'\n | 'onPrevMonth'\n | 'prevMonthIcon'\n | 'nextMonthIcon'\n | 'minDateTime'\n | 'maxDateTime'\n | 'renderDayContent'\n >,\n HasRootRef<HTMLDivElement>,\n Omit<FormFieldProps, 'maxHeight'> {\n calendarPlacement?: PlacementWithAuto;\n closeOnChange?: boolean;\n clearFieldLabel?: string;\n showCalendarLabel?: string;\n disableCalendar?: boolean;\n}\n\nconst elementsConfig = (index: number) => {\n let length = 2;\n let min = 1;\n let max = 0;\n\n switch (index) {\n case 0:\n max = 31;\n break;\n case 1:\n max = 12;\n break;\n case 2:\n max = 2100;\n min = 1900;\n length = 4;\n break;\n case 3:\n max = 23;\n break;\n case 4:\n max = 59;\n break;\n }\n\n return { length, min, max };\n};\n\nconst getInternalValue = (value: CalendarProps['value']) => {\n const newValue = ['', '', '', '', ''];\n if (value) {\n newValue[0] = String(value.getDate()).padStart(2, '0');\n newValue[1] = String(value.getMonth() + 1).padStart(2, '0');\n newValue[2] = String(value.getFullYear()).padStart(4, '0');\n newValue[3] = String(value.getHours()).padStart(2, '0');\n newValue[4] = String(value.getMinutes()).padStart(2, '0');\n }\n return newValue;\n};\n\n/**\n * @see https://vkcom.github.io/VKUI/#/DateInput\n */\nexport const DateInput = ({\n enableTime,\n shouldDisableDate,\n disableFuture,\n disablePast,\n minDateTime,\n maxDateTime,\n value,\n onChange,\n calendarPlacement = 'bottom-start',\n style,\n className,\n doneButtonText,\n closeOnChange = true,\n disablePickers,\n getRootRef,\n name,\n autoFocus,\n disabled,\n onClick,\n onFocus,\n prevMonthLabel = 'Предыдущий месяц',\n nextMonthLabel = 'Следующий месяц',\n showNeighboringMonth,\n size,\n changeMonthLabel = 'Изменить месяц',\n changeYearLabel = 'Изменить год',\n changeDayLabel = 'Изменить день',\n changeHoursLabel = 'Изменить час',\n changeMinutesLabel = 'Изменить минуту',\n clearFieldLabel = 'Очистить поле',\n showCalendarLabel = 'Показать календарь',\n viewDate,\n onHeaderChange,\n onNextMonth,\n onPrevMonth,\n prevMonthIcon,\n nextMonthIcon,\n disableCalendar = false,\n renderDayContent,\n ...props\n}: DateInputProps): React.ReactNode => {\n const daysRef = React.useRef<HTMLSpanElement>(null);\n const monthsRef = React.useRef<HTMLSpanElement>(null);\n const yearsRef = React.useRef<HTMLSpanElement>(null);\n const hoursRef = React.useRef<HTMLSpanElement>(null);\n const minutesRef = React.useRef<HTMLSpanElement>(null);\n\n const maxElement = enableTime ? 4 : 2;\n\n const onInternalValueChange = React.useCallback(\n (internalValue: string[]) => {\n for (let i = 0; i <= maxElement; i += 1) {\n if (internalValue[i].length < elementsConfig(i).length) {\n return;\n }\n }\n\n let formattedValue = `${internalValue[0]}.${internalValue[1]}.${internalValue[2]}`;\n let mask = 'dd.MM.yyyy';\n if (enableTime) {\n formattedValue += ` ${internalValue[3]}:${internalValue[4]}`;\n mask += ' HH:mm';\n }\n\n if (isMatch(formattedValue, mask)) {\n onChange?.(parse(formattedValue, mask, value ?? new Date()));\n }\n },\n [enableTime, maxElement, onChange, value],\n );\n\n const refs = React.useMemo(\n () => [daysRef, monthsRef, yearsRef, hoursRef, minutesRef],\n [daysRef, monthsRef, yearsRef, hoursRef, minutesRef],\n );\n\n const {\n rootRef,\n calendarRef,\n open,\n openCalendar,\n internalValue,\n handleKeyDown,\n setFocusedElement,\n handleFieldEnter,\n clear,\n removeFocusFromField,\n } = useDateInput({\n maxElement,\n refs,\n autoFocus,\n disabled,\n elementsConfig,\n onChange,\n onInternalValueChange,\n getInternalValue,\n value,\n });\n\n const { sizeY = 'none' } = useAdaptivity();\n\n const handleRootRef = useExternRef(rootRef, getRootRef);\n\n const onCalendarChange = React.useCallback(\n (value?: Date | undefined) => {\n onChange?.(value);\n if (closeOnChange && !enableTime) {\n removeFocusFromField();\n }\n },\n [onChange, removeFocusFromField, closeOnChange, enableTime],\n );\n\n return (\n <FormField\n style={style}\n className={classNames(sizeY !== 'regular' && sizeYClassNames[sizeY], className)}\n getRootRef={handleRootRef}\n after={\n value ? (\n <IconButton hoverMode=\"opacity\" label={clearFieldLabel} onClick={clear}>\n <Icon16Clear />\n </IconButton>\n ) : (\n <IconButton hoverMode=\"opacity\" label={showCalendarLabel} onClick={openCalendar}>\n <Icon20CalendarOutline />\n </IconButton>\n )\n }\n disabled={disabled}\n onClick={callMultiple(handleFieldEnter, onClick)}\n onFocus={callMultiple(handleFieldEnter, onFocus)}\n {...props}\n >\n <input\n type=\"hidden\"\n name={name}\n value={value ? format(value, enableTime ? \"dd.MM.yyyy'T'HH:mm\" : 'dd.MM.yyyy') : ''}\n />\n <Text\n className={styles['DateInput__input']}\n onKeyDown={handleKeyDown}\n // Инцидент: в PR https://github.com/VKCOM/VKUI/pull/6649 стабильно ломается порядок стилей\n // из-за чего `.Typography--normalize` перебивает стили.\n normalize={false}\n Component=\"span\" // для <span> нормализация не нужна\n >\n <InputLike\n length={2}\n getRootRef={daysRef}\n index={0}\n onElementSelect={setFocusedElement}\n value={internalValue[0]}\n label={changeDayLabel}\n />\n <InputLikeDivider>.</InputLikeDivider>\n <InputLike\n length={2}\n getRootRef={monthsRef}\n index={1}\n onElementSelect={setFocusedElement}\n value={internalValue[1]}\n label={changeMonthLabel}\n />\n <InputLikeDivider>.</InputLikeDivider>\n <InputLike\n length={4}\n getRootRef={yearsRef}\n index={2}\n onElementSelect={setFocusedElement}\n value={internalValue[2]}\n label={changeYearLabel}\n />\n {enableTime && (\n <React.Fragment>\n <InputLikeDivider className={styles['DateInput__input--time-divider']}>\n {' '}\n </InputLikeDivider>\n <InputLike\n length={2}\n getRootRef={hoursRef}\n index={3}\n onElementSelect={setFocusedElement}\n value={internalValue[3]}\n label={changeHoursLabel}\n />\n <InputLikeDivider>:</InputLikeDivider>\n <InputLike\n length={2}\n getRootRef={minutesRef}\n index={4}\n onElementSelect={setFocusedElement}\n value={internalValue[4]}\n label={changeMinutesLabel}\n />\n </React.Fragment>\n )}\n </Text>\n {open && !disableCalendar && (\n <Popper\n targetRef={rootRef}\n offsetByMainAxis={8}\n placement={calendarPlacement}\n autoUpdateOnTargetResize\n >\n <Calendar\n value={value}\n onChange={onCalendarChange}\n enableTime={enableTime}\n disablePast={disablePast}\n disableFuture={disableFuture}\n shouldDisableDate={shouldDisableDate}\n onClose={removeFocusFromField}\n getRootRef={calendarRef}\n doneButtonText={doneButtonText}\n disablePickers={disablePickers}\n changeHoursLabel={changeHoursLabel}\n changeMinutesLabel={changeMinutesLabel}\n prevMonthLabel={prevMonthLabel}\n nextMonthLabel={nextMonthLabel}\n changeMonthLabel={changeMonthLabel}\n changeYearLabel={changeYearLabel}\n changeDayLabel={changeDayLabel}\n showNeighboringMonth={showNeighboringMonth}\n renderDayContent={renderDayContent}\n size={size}\n viewDate={viewDate}\n onHeaderChange={onHeaderChange}\n onNextMonth={onNextMonth}\n onPrevMonth={onPrevMonth}\n prevMonthIcon={prevMonthIcon}\n nextMonthIcon={nextMonthIcon}\n minDateTime={minDateTime}\n maxDateTime={maxDateTime}\n />\n </Popper>\n )}\n </FormField>\n );\n};\n"],"names":["React","Icon16Clear","Icon20CalendarOutline","classNames","useAdaptivity","useDateInput","useExternRef","callMultiple","format","isMatch","parse","Calendar","FormField","IconButton","InputLike","InputLikeDivider","Popper","Text","styles","sizeYClassNames","none","compact","elementsConfig","index","length","min","max","getInternalValue","value","newValue","String","getDate","padStart","getMonth","getFullYear","getHours","getMinutes","DateInput","enableTime","shouldDisableDate","disableFuture","disablePast","minDateTime","maxDateTime","onChange","calendarPlacement","style","className","doneButtonText","closeOnChange","disablePickers","getRootRef","name","autoFocus","disabled","onClick","onFocus","prevMonthLabel","nextMonthLabel","showNeighboringMonth","size","changeMonthLabel","changeYearLabel","changeDayLabel","changeHoursLabel","changeMinutesLabel","clearFieldLabel","showCalendarLabel","viewDate","onHeaderChange","onNextMonth","onPrevMonth","prevMonthIcon","nextMonthIcon","disableCalendar","renderDayContent","props","daysRef","useRef","monthsRef","yearsRef","hoursRef","minutesRef","maxElement","onInternalValueChange","useCallback","internalValue","i","formattedValue","mask","Date","refs","useMemo","rootRef","calendarRef","open","openCalendar","handleKeyDown","setFocusedElement","handleFieldEnter","clear","removeFocusFromField","sizeY","handleRootRef","onCalendarChange","after","hoverMode","label","input","type","onKeyDown","normalize","Component","onElementSelect","Fragment","targetRef","offsetByMainAxis","placement","autoUpdateOnTargetResize","onClose"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/components/DateInput/DateInput.tsx"],"sourcesContent":["import * as React from 'react';\nimport { Icon16Clear, Icon20CalendarOutline } from '@vkontakte/icons';\nimport { classNames } from '@vkontakte/vkjs';\nimport { startOfDay, startOfMinute } from 'date-fns';\nimport { useAdaptivity } from '../../hooks/useAdaptivity';\nimport { useDateInput } from '../../hooks/useDateInput';\nimport { useExternRef } from '../../hooks/useExternRef';\nimport { callMultiple } from '../../lib/callMultiple';\nimport { format, isMatch, parse } from '../../lib/date';\nimport type { PlacementWithAuto } from '../../lib/floating';\nimport type { HasRootRef } from '../../types';\nimport { Calendar, type CalendarProps, type CalendarTestsProps } from '../Calendar/Calendar';\nimport { FormField, type FormFieldProps } from '../FormField/FormField';\nimport { IconButton } from '../IconButton/IconButton';\nimport { InputLike } from '../InputLike/InputLike';\nimport { InputLikeDivider } from '../InputLike/InputLikeDivider';\nimport { Popper } from '../Popper/Popper';\nimport { Text } from '../Typography/Text/Text';\nimport '../InputLike/InputLike.module.css'; // Reorder css\nimport styles from './DateInput.module.css';\n\nconst sizeYClassNames = {\n none: styles['DateInput--sizeY-none'],\n compact: styles['DateInput--sizeY-compact'],\n};\n\nexport type DateInputPropsTestsProps = {\n dayFieldTestId?: string;\n monthFieldTestId?: string;\n yearFieldTestId?: string;\n hourFieldTestId?: string;\n minuteFieldTestId?: string;\n};\n\nexport interface DateInputProps\n extends Omit<React.InputHTMLAttributes<HTMLDivElement>, 'value' | 'onChange' | 'size'>,\n Pick<\n CalendarProps,\n | 'disablePast'\n | 'disableFuture'\n | 'enableTime'\n | 'shouldDisableDate'\n | 'onChange'\n | 'value'\n | 'doneButtonText'\n | 'weekStartsOn'\n | 'disablePickers'\n | 'changeHoursLabel'\n | 'changeMinutesLabel'\n | 'prevMonthLabel'\n | 'nextMonthLabel'\n | 'changeMonthLabel'\n | 'changeYearLabel'\n | 'changeDayLabel'\n | 'showNeighboringMonth'\n | 'size'\n | 'viewDate'\n | 'onHeaderChange'\n | 'onNextMonth'\n | 'onPrevMonth'\n | 'prevMonthIcon'\n | 'nextMonthIcon'\n | 'minDateTime'\n | 'maxDateTime'\n | 'renderDayContent'\n >,\n HasRootRef<HTMLDivElement>,\n Omit<FormFieldProps, 'maxHeight'>,\n DateInputPropsTestsProps {\n calendarTestsProps?: CalendarTestsProps;\n calendarPlacement?: PlacementWithAuto;\n closeOnChange?: boolean;\n clearFieldLabel?: string;\n showCalendarLabel?: string;\n disableCalendar?: boolean;\n onCalendarOpenChanged?: (opened: boolean) => void;\n}\n\nconst elementsConfig = (index: number) => {\n let length = 2;\n let min = 1;\n let max = 0;\n\n switch (index) {\n case 0:\n max = 31;\n break;\n case 1:\n max = 12;\n break;\n case 2:\n max = 2100;\n min = 1900;\n length = 4;\n break;\n case 3:\n max = 23;\n break;\n case 4:\n max = 59;\n break;\n }\n\n return { length, min, max };\n};\n\nconst getInternalValue = (value: CalendarProps['value']) => {\n const newValue = ['', '', '', '', ''];\n if (value) {\n newValue[0] = String(value.getDate()).padStart(2, '0');\n newValue[1] = String(value.getMonth() + 1).padStart(2, '0');\n newValue[2] = String(value.getFullYear()).padStart(4, '0');\n newValue[3] = String(value.getHours()).padStart(2, '0');\n newValue[4] = String(value.getMinutes()).padStart(2, '0');\n }\n return newValue;\n};\n\n/**\n * @see https://vkcom.github.io/VKUI/#/DateInput\n */\nexport const DateInput = ({\n enableTime,\n shouldDisableDate,\n disableFuture,\n disablePast,\n minDateTime,\n maxDateTime,\n value,\n onChange,\n calendarPlacement = 'bottom-start',\n style,\n className,\n doneButtonText,\n closeOnChange = true,\n disablePickers,\n getRootRef,\n name,\n autoFocus,\n disabled,\n onClick,\n onFocus,\n prevMonthLabel = 'Предыдущий месяц',\n nextMonthLabel = 'Следующий месяц',\n showNeighboringMonth,\n size,\n changeMonthLabel = 'Изменить месяц',\n changeYearLabel = 'Изменить год',\n changeDayLabel = 'Изменить день',\n changeHoursLabel = 'Изменить час',\n changeMinutesLabel = 'Изменить минуту',\n clearFieldLabel = 'Очистить поле',\n showCalendarLabel = 'Показать календарь',\n viewDate,\n onHeaderChange,\n onNextMonth,\n onPrevMonth,\n prevMonthIcon,\n nextMonthIcon,\n disableCalendar = false,\n renderDayContent,\n onCalendarOpenChanged,\n calendarTestsProps,\n dayFieldTestId,\n monthFieldTestId,\n yearFieldTestId,\n hourFieldTestId,\n minuteFieldTestId,\n ...props\n}: DateInputProps): React.ReactNode => {\n const daysRef = React.useRef<HTMLSpanElement>(null);\n const monthsRef = React.useRef<HTMLSpanElement>(null);\n const yearsRef = React.useRef<HTMLSpanElement>(null);\n const hoursRef = React.useRef<HTMLSpanElement>(null);\n const minutesRef = React.useRef<HTMLSpanElement>(null);\n\n const maxElement = enableTime ? 4 : 2;\n\n const onInternalValueChange = React.useCallback(\n (internalValue: string[]) => {\n for (let i = 0; i <= maxElement; i += 1) {\n if (internalValue[i].length < elementsConfig(i).length) {\n return;\n }\n }\n\n let formattedValue = `${internalValue[0]}.${internalValue[1]}.${internalValue[2]}`;\n let mask = 'dd.MM.yyyy';\n if (enableTime) {\n formattedValue += ` ${internalValue[3]}:${internalValue[4]}`;\n mask += ' HH:mm';\n }\n\n if (isMatch(formattedValue, mask)) {\n const now = new Date();\n onChange?.(\n parse(formattedValue, mask, value ?? (enableTime ? startOfMinute(now) : startOfDay(now))),\n );\n }\n },\n [enableTime, maxElement, onChange, value],\n );\n\n const refs = React.useMemo(\n () => [daysRef, monthsRef, yearsRef, hoursRef, minutesRef],\n [daysRef, monthsRef, yearsRef, hoursRef, minutesRef],\n );\n\n const {\n rootRef,\n calendarRef,\n open,\n openCalendar,\n internalValue,\n handleKeyDown,\n setFocusedElement,\n handleFieldEnter,\n clear,\n removeFocusFromField,\n } = useDateInput({\n maxElement,\n refs,\n autoFocus,\n disabled,\n elementsConfig,\n onChange,\n onInternalValueChange,\n getInternalValue,\n value,\n onCalendarOpenChanged,\n });\n\n const { sizeY = 'none' } = useAdaptivity();\n\n const handleRootRef = useExternRef(rootRef, getRootRef);\n\n const onCalendarChange = React.useCallback(\n (value?: Date | undefined) => {\n onChange?.(value);\n if (closeOnChange && !enableTime) {\n removeFocusFromField();\n }\n },\n [onChange, removeFocusFromField, closeOnChange, enableTime],\n );\n\n return (\n <FormField\n style={style}\n className={classNames(sizeY !== 'regular' && sizeYClassNames[sizeY], className)}\n getRootRef={handleRootRef}\n after={\n value ? (\n <IconButton hoverMode=\"opacity\" label={clearFieldLabel} onClick={clear}>\n <Icon16Clear />\n </IconButton>\n ) : (\n <IconButton hoverMode=\"opacity\" label={showCalendarLabel} onClick={openCalendar}>\n <Icon20CalendarOutline />\n </IconButton>\n )\n }\n disabled={disabled}\n onClick={callMultiple(handleFieldEnter, onClick)}\n onFocus={callMultiple(handleFieldEnter, onFocus)}\n {...props}\n >\n <input\n type=\"hidden\"\n name={name}\n value={value ? format(value, enableTime ? \"dd.MM.yyyy'T'HH:mm\" : 'dd.MM.yyyy') : ''}\n />\n <Text\n className={styles['DateInput__input']}\n onKeyDown={handleKeyDown}\n // Инцидент: в PR https://github.com/VKCOM/VKUI/pull/6649 стабильно ломается порядок стилей\n // из-за чего `.Typography--normalize` перебивает стили.\n normalize={false}\n Component=\"span\" // для <span> нормализация не нужна\n >\n <InputLike\n length={2}\n getRootRef={daysRef}\n index={0}\n onElementSelect={setFocusedElement}\n value={internalValue[0]}\n label={changeDayLabel}\n data-testid={dayFieldTestId}\n />\n <InputLikeDivider>.</InputLikeDivider>\n <InputLike\n length={2}\n getRootRef={monthsRef}\n index={1}\n onElementSelect={setFocusedElement}\n value={internalValue[1]}\n label={changeMonthLabel}\n data-testid={monthFieldTestId}\n />\n <InputLikeDivider>.</InputLikeDivider>\n <InputLike\n length={4}\n getRootRef={yearsRef}\n index={2}\n onElementSelect={setFocusedElement}\n value={internalValue[2]}\n label={changeYearLabel}\n data-testid={yearFieldTestId}\n />\n {enableTime && (\n <React.Fragment>\n <InputLikeDivider className={styles['DateInput__input--time-divider']}>\n {' '}\n </InputLikeDivider>\n <InputLike\n length={2}\n getRootRef={hoursRef}\n index={3}\n onElementSelect={setFocusedElement}\n value={internalValue[3]}\n label={changeHoursLabel}\n data-testid={hourFieldTestId}\n />\n <InputLikeDivider>:</InputLikeDivider>\n <InputLike\n length={2}\n getRootRef={minutesRef}\n index={4}\n onElementSelect={setFocusedElement}\n value={internalValue[4]}\n label={changeMinutesLabel}\n data-testid={minuteFieldTestId}\n />\n </React.Fragment>\n )}\n </Text>\n {open && !disableCalendar && (\n <Popper\n targetRef={rootRef}\n offsetByMainAxis={8}\n placement={calendarPlacement}\n autoUpdateOnTargetResize\n >\n <Calendar\n value={value}\n onChange={onCalendarChange}\n enableTime={enableTime}\n disablePast={disablePast}\n disableFuture={disableFuture}\n shouldDisableDate={shouldDisableDate}\n onClose={removeFocusFromField}\n getRootRef={calendarRef}\n doneButtonText={doneButtonText}\n disablePickers={disablePickers}\n changeHoursLabel={changeHoursLabel}\n changeMinutesLabel={changeMinutesLabel}\n prevMonthLabel={prevMonthLabel}\n nextMonthLabel={nextMonthLabel}\n changeMonthLabel={changeMonthLabel}\n changeYearLabel={changeYearLabel}\n changeDayLabel={changeDayLabel}\n showNeighboringMonth={showNeighboringMonth}\n renderDayContent={renderDayContent}\n size={size}\n viewDate={viewDate}\n onHeaderChange={onHeaderChange}\n onNextMonth={onNextMonth}\n onPrevMonth={onPrevMonth}\n prevMonthIcon={prevMonthIcon}\n nextMonthIcon={nextMonthIcon}\n minDateTime={minDateTime}\n maxDateTime={maxDateTime}\n {...calendarTestsProps}\n />\n </Popper>\n )}\n </FormField>\n );\n};\n"],"names":["React","Icon16Clear","Icon20CalendarOutline","classNames","startOfDay","startOfMinute","useAdaptivity","useDateInput","useExternRef","callMultiple","format","isMatch","parse","Calendar","FormField","IconButton","InputLike","InputLikeDivider","Popper","Text","styles","sizeYClassNames","none","compact","elementsConfig","index","length","min","max","getInternalValue","value","newValue","String","getDate","padStart","getMonth","getFullYear","getHours","getMinutes","DateInput","enableTime","shouldDisableDate","disableFuture","disablePast","minDateTime","maxDateTime","onChange","calendarPlacement","style","className","doneButtonText","closeOnChange","disablePickers","getRootRef","name","autoFocus","disabled","onClick","onFocus","prevMonthLabel","nextMonthLabel","showNeighboringMonth","size","changeMonthLabel","changeYearLabel","changeDayLabel","changeHoursLabel","changeMinutesLabel","clearFieldLabel","showCalendarLabel","viewDate","onHeaderChange","onNextMonth","onPrevMonth","prevMonthIcon","nextMonthIcon","disableCalendar","renderDayContent","onCalendarOpenChanged","calendarTestsProps","dayFieldTestId","monthFieldTestId","yearFieldTestId","hourFieldTestId","minuteFieldTestId","props","daysRef","useRef","monthsRef","yearsRef","hoursRef","minutesRef","maxElement","onInternalValueChange","useCallback","internalValue","i","formattedValue","mask","now","Date","refs","useMemo","rootRef","calendarRef","open","openCalendar","handleKeyDown","setFocusedElement","handleFieldEnter","clear","removeFocusFromField","sizeY","handleRootRef","onCalendarChange","after","hoverMode","label","input","type","onKeyDown","normalize","Component","onElementSelect","data-testid","Fragment","targetRef","offsetByMainAxis","placement","autoUpdateOnTargetResize","onClose"],"mappings":"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"}
@@ -1,11 +1,22 @@
1
1
  import * as React from 'react';
2
2
  import type { PlacementWithAuto } from '../../lib/floating';
3
3
  import type { HasRootRef } from '../../types';
4
- import { type CalendarRangeProps } from '../CalendarRange/CalendarRange';
4
+ import { type CalendarRangeProps, type CalendarRangeTestsProps } from '../CalendarRange/CalendarRange';
5
5
  import { type FormFieldProps } from '../FormField/FormField';
6
- export interface DateRangeInputProps extends Omit<React.InputHTMLAttributes<HTMLDivElement>, 'value' | 'onChange'>, Pick<CalendarRangeProps, 'disablePast' | 'disableFuture' | 'shouldDisableDate' | 'onChange' | 'value' | 'weekStartsOn' | 'disablePickers' | 'prevMonthLabel' | 'nextMonthLabel' | 'changeMonthLabel' | 'changeYearLabel' | 'changeDayLabel' | 'prevMonthIcon' | 'nextMonthIcon' | 'renderDayContent'>, HasRootRef<HTMLDivElement>, Omit<FormFieldProps, 'maxHeight'> {
6
+ type DateTestsProps = {
7
+ day?: string;
8
+ month?: string;
9
+ year?: string;
10
+ };
11
+ export type DateRangeInputTestsProps = {
12
+ startDateTestsProps?: DateTestsProps;
13
+ endDateTestsProps?: DateTestsProps;
14
+ };
15
+ export interface DateRangeInputProps extends Omit<React.InputHTMLAttributes<HTMLDivElement>, 'value' | 'onChange'>, Pick<CalendarRangeProps, 'disablePast' | 'disableFuture' | 'shouldDisableDate' | 'onChange' | 'value' | 'weekStartsOn' | 'disablePickers' | 'prevMonthLabel' | 'nextMonthLabel' | 'changeMonthLabel' | 'changeYearLabel' | 'changeDayLabel' | 'prevMonthIcon' | 'nextMonthIcon' | 'renderDayContent'>, HasRootRef<HTMLDivElement>, Omit<FormFieldProps, 'maxHeight'>, DateRangeInputTestsProps {
16
+ calendarTestsProps?: CalendarRangeTestsProps;
7
17
  calendarPlacement?: PlacementWithAuto;
8
18
  closeOnChange?: boolean;
19
+ onCalendarOpenChanged?: (opened: boolean) => void;
9
20
  clearFieldLabel?: string;
10
21
  showCalendarLabel?: string;
11
22
  changeStartDayLabel?: string;
@@ -19,5 +30,6 @@ export interface DateRangeInputProps extends Omit<React.InputHTMLAttributes<HTML
19
30
  /**
20
31
  * @see https://vkcom.github.io/VKUI/#/DateRangeInput
21
32
  */
22
- export declare const DateRangeInput: ({ shouldDisableDate, disableFuture, disablePast, value, onChange, calendarPlacement, style, className, closeOnChange, disablePickers, getRootRef, name, autoFocus, disabled, onClick, onFocus, prevMonthLabel, nextMonthLabel, changeDayLabel, changeMonthLabel, changeYearLabel, changeStartDayLabel, changeStartMonthLabel, changeStartYearLabel, changeEndDayLabel, changeEndMonthLabel, changeEndYearLabel, clearFieldLabel, showCalendarLabel, prevMonthIcon, nextMonthIcon, disableCalendar, renderDayContent, ...props }: DateRangeInputProps) => React.ReactNode;
33
+ export declare const DateRangeInput: ({ shouldDisableDate, disableFuture, disablePast, value, onChange, calendarPlacement, style, className, closeOnChange, disablePickers, getRootRef, name, autoFocus, disabled, onClick, onFocus, prevMonthLabel, nextMonthLabel, changeDayLabel, changeMonthLabel, changeYearLabel, changeStartDayLabel, changeStartMonthLabel, changeStartYearLabel, changeEndDayLabel, changeEndMonthLabel, changeEndYearLabel, clearFieldLabel, showCalendarLabel, prevMonthIcon, nextMonthIcon, disableCalendar, onCalendarOpenChanged, renderDayContent, calendarTestsProps, startDateTestsProps, endDateTestsProps, ...props }: DateRangeInputProps) => React.ReactNode;
34
+ export {};
23
35
  //# sourceMappingURL=DateRangeInput.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"DateRangeInput.d.ts","sourceRoot":"","sources":["../../../../src/components/DateRangeInput/DateRangeInput.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAS/B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAEL,KAAK,kBAAkB,EAExB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAa,KAAK,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAexE,MAAM,WAAW,mBACf,SAAQ,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,cAAc,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC,EAC3E,IAAI,CACF,kBAAkB,EAChB,aAAa,GACb,eAAe,GACf,mBAAmB,GACnB,UAAU,GACV,OAAO,GACP,cAAc,GACd,gBAAgB,GAChB,gBAAgB,GAChB,gBAAgB,GAChB,kBAAkB,GAClB,iBAAiB,GACjB,gBAAgB,GAChB,eAAe,GACf,eAAe,GACf,kBAAkB,CACrB,EACD,UAAU,CAAC,cAAc,CAAC,EAC1B,IAAI,CAAC,cAAc,EAAE,WAAW,CAAC;IACnC,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AA0CD;;GAEG;AACH,eAAO,MAAM,cAAc,ogBAmCxB,mBAAmB,KAAG,KAAK,CAAC,SAgN9B,CAAC"}
1
+ {"version":3,"file":"DateRangeInput.d.ts","sourceRoot":"","sources":["../../../../src/components/DateRangeInput/DateRangeInput.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAS/B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAEL,KAAK,kBAAkB,EACvB,KAAK,uBAAuB,EAE7B,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAa,KAAK,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAexE,KAAK,cAAc,GAAG;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,mBAAmB,CAAC,EAAE,cAAc,CAAC;IACrC,iBAAiB,CAAC,EAAE,cAAc,CAAC;CACpC,CAAC;AAEF,MAAM,WAAW,mBACf,SAAQ,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,cAAc,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC,EAC3E,IAAI,CACF,kBAAkB,EAChB,aAAa,GACb,eAAe,GACf,mBAAmB,GACnB,UAAU,GACV,OAAO,GACP,cAAc,GACd,gBAAgB,GAChB,gBAAgB,GAChB,gBAAgB,GAChB,kBAAkB,GAClB,iBAAiB,GACjB,gBAAgB,GAChB,eAAe,GACf,eAAe,GACf,kBAAkB,CACrB,EACD,UAAU,CAAC,cAAc,CAAC,EAC1B,IAAI,CAAC,cAAc,EAAE,WAAW,CAAC,EACjC,wBAAwB;IAC1B,kBAAkB,CAAC,EAAE,uBAAuB,CAAC;IAC7C,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,qBAAqB,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IAClD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AA0CD;;GAEG;AACH,eAAO,MAAM,cAAc,ulBAuCxB,mBAAmB,KAAG,KAAK,CAAC,SAwN9B,CAAC"}
@@ -71,7 +71,7 @@ const getInternalValue = (value)=>{
71
71
  };
72
72
  /**
73
73
  * @see https://vkcom.github.io/VKUI/#/DateRangeInput
74
- */ export const DateRangeInput = ({ shouldDisableDate, disableFuture, disablePast, value, onChange, calendarPlacement = 'bottom-start', style, className, closeOnChange = true, disablePickers, getRootRef, name, autoFocus, disabled, onClick, onFocus, prevMonthLabel = 'Предыдущий месяц', nextMonthLabel = 'Следующий месяц', changeDayLabel = 'Изменить день', changeMonthLabel = 'Изменить месяц', changeYearLabel = 'Изменить год', changeStartDayLabel = 'Изменить день начала', changeStartMonthLabel = 'Изменить месяц начала', changeStartYearLabel = 'Изменить год начала', changeEndDayLabel = 'Изменить день окончания', changeEndMonthLabel = 'Изменить месяц окончания', changeEndYearLabel = 'Изменить год окончания', clearFieldLabel = 'Очистить поле', showCalendarLabel = 'Показать календарь', prevMonthIcon, nextMonthIcon, disableCalendar = false, renderDayContent, ...props })=>{
74
+ */ export const DateRangeInput = ({ shouldDisableDate, disableFuture, disablePast, value, onChange, calendarPlacement = 'bottom-start', style, className, closeOnChange = true, disablePickers, getRootRef, name, autoFocus, disabled, onClick, onFocus, prevMonthLabel = 'Предыдущий месяц', nextMonthLabel = 'Следующий месяц', changeDayLabel = 'Изменить день', changeMonthLabel = 'Изменить месяц', changeYearLabel = 'Изменить год', changeStartDayLabel = 'Изменить день начала', changeStartMonthLabel = 'Изменить месяц начала', changeStartYearLabel = 'Изменить год начала', changeEndDayLabel = 'Изменить день окончания', changeEndMonthLabel = 'Изменить месяц окончания', changeEndYearLabel = 'Изменить год окончания', clearFieldLabel = 'Очистить поле', showCalendarLabel = 'Показать календарь', prevMonthIcon, nextMonthIcon, disableCalendar = false, onCalendarOpenChanged, renderDayContent, calendarTestsProps, startDateTestsProps, endDateTestsProps, ...props })=>{
75
75
  const daysStartRef = React.useRef(null);
76
76
  const monthsStartRef = React.useRef(null);
77
77
  const yearsStartRef = React.useRef(null);
@@ -141,7 +141,8 @@ const getInternalValue = (value)=>{
141
141
  onChange,
142
142
  onInternalValueChange,
143
143
  getInternalValue,
144
- value
144
+ value,
145
+ onCalendarOpenChanged
145
146
  });
146
147
  const { sizeY = 'none' } = useAdaptivity();
147
148
  const handleRootRef = useExternRef(rootRef, getRootRef);
@@ -199,7 +200,8 @@ const getInternalValue = (value)=>{
199
200
  index: 0,
200
201
  onElementSelect: setFocusedElement,
201
202
  value: internalValue[0],
202
- label: changeStartDayLabel
203
+ label: changeStartDayLabel,
204
+ "data-testid": startDateTestsProps?.day
203
205
  }),
204
206
  /*#__PURE__*/ _jsx(InputLikeDivider, {
205
207
  children: "."
@@ -210,7 +212,8 @@ const getInternalValue = (value)=>{
210
212
  index: 1,
211
213
  onElementSelect: setFocusedElement,
212
214
  value: internalValue[1],
213
- label: changeStartMonthLabel
215
+ label: changeStartMonthLabel,
216
+ "data-testid": startDateTestsProps?.month
214
217
  }),
215
218
  /*#__PURE__*/ _jsx(InputLikeDivider, {
216
219
  children: "."
@@ -221,7 +224,8 @@ const getInternalValue = (value)=>{
221
224
  index: 2,
222
225
  onElementSelect: setFocusedElement,
223
226
  value: internalValue[2],
224
- label: changeStartYearLabel
227
+ label: changeStartYearLabel,
228
+ "data-testid": startDateTestsProps?.year
225
229
  }),
226
230
  /*#__PURE__*/ _jsx(InputLikeDivider, {
227
231
  children: ' — '
@@ -232,7 +236,8 @@ const getInternalValue = (value)=>{
232
236
  index: 3,
233
237
  onElementSelect: setFocusedElement,
234
238
  value: internalValue[3],
235
- label: changeEndDayLabel
239
+ label: changeEndDayLabel,
240
+ "data-testid": endDateTestsProps?.day
236
241
  }),
237
242
  /*#__PURE__*/ _jsx(InputLikeDivider, {
238
243
  children: "."
@@ -243,7 +248,8 @@ const getInternalValue = (value)=>{
243
248
  index: 4,
244
249
  onElementSelect: setFocusedElement,
245
250
  value: internalValue[4],
246
- label: changeEndMonthLabel
251
+ label: changeEndMonthLabel,
252
+ "data-testid": endDateTestsProps?.month
247
253
  }),
248
254
  /*#__PURE__*/ _jsx(InputLikeDivider, {
249
255
  children: "."
@@ -254,7 +260,8 @@ const getInternalValue = (value)=>{
254
260
  index: 5,
255
261
  onElementSelect: setFocusedElement,
256
262
  value: internalValue[5],
257
- label: changeEndYearLabel
263
+ label: changeEndYearLabel,
264
+ "data-testid": endDateTestsProps?.year
258
265
  })
259
266
  ]
260
267
  }),
@@ -278,7 +285,8 @@ const getInternalValue = (value)=>{
278
285
  changeDayLabel: changeDayLabel,
279
286
  prevMonthIcon: prevMonthIcon,
280
287
  nextMonthIcon: nextMonthIcon,
281
- renderDayContent: renderDayContent
288
+ renderDayContent: renderDayContent,
289
+ ...calendarTestsProps
282
290
  })
283
291
  })
284
292
  ]
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/DateRangeInput/DateRangeInput.tsx"],"sourcesContent":["import * as React from 'react';\nimport { Icon16Clear, Icon20CalendarOutline } from '@vkontakte/icons';\nimport { classNames } from '@vkontakte/vkjs';\nimport { isAfter } from 'date-fns';\nimport { useAdaptivity } from '../../hooks/useAdaptivity';\nimport { useDateInput } from '../../hooks/useDateInput';\nimport { useExternRef } from '../../hooks/useExternRef';\nimport { callMultiple } from '../../lib/callMultiple';\nimport { format, isMatch, parse } from '../../lib/date';\nimport type { PlacementWithAuto } from '../../lib/floating';\nimport type { HasRootRef } from '../../types';\nimport {\n CalendarRange,\n type CalendarRangeProps,\n type DateRangeType,\n} from '../CalendarRange/CalendarRange';\nimport { FormField, type FormFieldProps } from '../FormField/FormField';\nimport { IconButton } from '../IconButton/IconButton';\nimport { InputLike } from '../InputLike/InputLike';\nimport { InputLikeDivider } from '../InputLike/InputLikeDivider';\nimport { Popper } from '../Popper/Popper';\nimport { Text } from '../Typography/Text/Text';\nimport { VisuallyHidden } from '../VisuallyHidden/VisuallyHidden';\nimport styles from './DateRangeInput.module.css';\nimport dateInputStyles from '../DateInput/DateInput.module.css';\n\nconst sizeYClassNames = {\n none: styles['DateRangeInput--sizeY-none'],\n compact: styles['DateRangeInput--sizeY-compact'],\n};\n\nexport interface DateRangeInputProps\n extends Omit<React.InputHTMLAttributes<HTMLDivElement>, 'value' | 'onChange'>,\n Pick<\n CalendarRangeProps,\n | 'disablePast'\n | 'disableFuture'\n | 'shouldDisableDate'\n | 'onChange'\n | 'value'\n | 'weekStartsOn'\n | 'disablePickers'\n | 'prevMonthLabel'\n | 'nextMonthLabel'\n | 'changeMonthLabel'\n | 'changeYearLabel'\n | 'changeDayLabel'\n | 'prevMonthIcon'\n | 'nextMonthIcon'\n | 'renderDayContent'\n >,\n HasRootRef<HTMLDivElement>,\n Omit<FormFieldProps, 'maxHeight'> {\n calendarPlacement?: PlacementWithAuto;\n closeOnChange?: boolean;\n clearFieldLabel?: string;\n showCalendarLabel?: string;\n changeStartDayLabel?: string;\n changeStartMonthLabel?: string;\n changeStartYearLabel?: string;\n changeEndDayLabel?: string;\n changeEndMonthLabel?: string;\n changeEndYearLabel?: string;\n disableCalendar?: boolean;\n}\n\nconst elementsConfig = (index: number) => {\n let length = 2;\n let min = 1;\n let max = 0;\n\n switch (index) {\n case 0:\n case 3:\n max = 31;\n break;\n case 1:\n case 4:\n max = 12;\n break;\n case 2:\n case 5:\n max = 2100;\n min = 1900;\n length = 4;\n break;\n }\n\n return { length, min, max };\n};\n\nconst getInternalValue = (value: CalendarRangeProps['value']) => {\n const newValue = ['', '', '', '', '', ''];\n if (value?.[0]) {\n newValue[0] = String(value[0].getDate()).padStart(2, '0');\n newValue[1] = String(value[0].getMonth() + 1).padStart(2, '0');\n newValue[2] = String(value[0].getFullYear()).padStart(4, '0');\n }\n if (value?.[1]) {\n newValue[3] = String(value[1].getDate()).padStart(2, '0');\n newValue[4] = String(value[1].getMonth() + 1).padStart(2, '0');\n newValue[5] = String(value[1].getFullYear()).padStart(4, '0');\n }\n return newValue;\n};\n\n/**\n * @see https://vkcom.github.io/VKUI/#/DateRangeInput\n */\nexport const DateRangeInput = ({\n shouldDisableDate,\n disableFuture,\n disablePast,\n value,\n onChange,\n calendarPlacement = 'bottom-start',\n style,\n className,\n closeOnChange = true,\n disablePickers,\n getRootRef,\n name,\n autoFocus,\n disabled,\n onClick,\n onFocus,\n prevMonthLabel = 'Предыдущий месяц',\n nextMonthLabel = 'Следующий месяц',\n changeDayLabel = 'Изменить день',\n changeMonthLabel = 'Изменить месяц',\n changeYearLabel = 'Изменить год',\n changeStartDayLabel = 'Изменить день начала',\n changeStartMonthLabel = 'Изменить месяц начала',\n changeStartYearLabel = 'Изменить год начала',\n changeEndDayLabel = 'Изменить день окончания',\n changeEndMonthLabel = 'Изменить месяц окончания',\n changeEndYearLabel = 'Изменить год окончания',\n clearFieldLabel = 'Очистить поле',\n showCalendarLabel = 'Показать календарь',\n prevMonthIcon,\n nextMonthIcon,\n disableCalendar = false,\n renderDayContent,\n ...props\n}: DateRangeInputProps): React.ReactNode => {\n const daysStartRef = React.useRef<HTMLSpanElement>(null);\n const monthsStartRef = React.useRef<HTMLSpanElement>(null);\n const yearsStartRef = React.useRef<HTMLSpanElement>(null);\n const daysEndRef = React.useRef<HTMLSpanElement>(null);\n const monthsEndRef = React.useRef<HTMLSpanElement>(null);\n const yearsEndRef = React.useRef<HTMLSpanElement>(null);\n\n const onInternalValueChange = React.useCallback(\n (internalValue: string[]) => {\n let isStartValid = true;\n let isEndValid = true;\n for (let i = 0; i <= 2; i += 1) {\n if (internalValue[i].length < elementsConfig(i).length) {\n isStartValid = false;\n }\n }\n for (let i = 3; i <= 5; i += 1) {\n if (internalValue[i].length < elementsConfig(i).length) {\n isEndValid = false;\n }\n }\n const formattedStartValue = `${internalValue[0]}.${internalValue[1]}.${internalValue[2]}`;\n const formattedEndValue = `${internalValue[3]}.${internalValue[4]}.${internalValue[5]}`;\n const mask = 'dd.MM.yyyy';\n\n if (!isMatch(formattedStartValue, mask)) {\n isStartValid = false;\n }\n if (!isMatch(formattedEndValue, mask)) {\n isEndValid = false;\n }\n\n if (!isStartValid && !isEndValid) {\n return;\n }\n\n const valueExists = Array.isArray(value);\n const now = new Date();\n const start = isStartValid\n ? parse(formattedStartValue, mask, (valueExists && value?.[0]) || now)\n : null;\n const end = isEndValid\n ? parse(formattedEndValue, mask, (valueExists && value?.[1]) || now)\n : null;\n if (start && end && isAfter(end, start)) {\n onChange?.([start, end]);\n }\n },\n [onChange, value],\n );\n\n const refs = React.useMemo(\n () => [daysStartRef, monthsStartRef, yearsStartRef, daysEndRef, monthsEndRef, yearsEndRef],\n [daysStartRef, monthsStartRef, yearsStartRef, daysEndRef, monthsEndRef, yearsEndRef],\n );\n\n const {\n rootRef,\n calendarRef,\n open,\n openCalendar,\n closeCalendar,\n internalValue,\n handleKeyDown,\n setFocusedElement,\n handleFieldEnter,\n clear,\n removeFocusFromField,\n } = useDateInput({\n maxElement: 5,\n refs,\n autoFocus,\n disabled,\n elementsConfig,\n onChange,\n onInternalValueChange,\n getInternalValue,\n value,\n });\n\n const { sizeY = 'none' } = useAdaptivity();\n\n const handleRootRef = useExternRef(rootRef, getRootRef);\n\n const onCalendarChange = React.useCallback(\n (newValue: DateRangeType | undefined) => {\n onChange?.(newValue);\n if (closeOnChange && newValue?.[1] && newValue[1] !== value?.[1]) {\n removeFocusFromField();\n }\n },\n [onChange, closeOnChange, value, removeFocusFromField],\n );\n\n return (\n <FormField\n style={style}\n className={classNames(sizeY !== 'regular' && sizeYClassNames[sizeY], className)}\n getRootRef={handleRootRef}\n after={\n value ? (\n <IconButton hoverMode=\"opacity\" onClick={clear}>\n <VisuallyHidden>{clearFieldLabel}</VisuallyHidden>\n <Icon16Clear />\n </IconButton>\n ) : (\n <IconButton hoverMode=\"opacity\" onClick={openCalendar}>\n <VisuallyHidden>{showCalendarLabel}</VisuallyHidden>\n <Icon20CalendarOutline />\n </IconButton>\n )\n }\n disabled={disabled}\n onClick={callMultiple(handleFieldEnter, onClick)}\n onFocus={callMultiple(handleFieldEnter, onFocus)}\n {...props}\n >\n <input\n type=\"hidden\"\n name={name}\n value={\n value\n ? `${value[0] ? format(value[0], 'dd.MM.yyyy') : ''} - ${\n value[1] ? format(value[1], 'dd.MM.yyyy') : ''\n }`\n : ''\n }\n />\n <Text className={dateInputStyles['DateInput__input']} onKeyDown={handleKeyDown}>\n <InputLike\n length={2}\n getRootRef={daysStartRef}\n index={0}\n onElementSelect={setFocusedElement}\n value={internalValue[0]}\n label={changeStartDayLabel}\n />\n <InputLikeDivider>.</InputLikeDivider>\n <InputLike\n length={2}\n getRootRef={monthsStartRef}\n index={1}\n onElementSelect={setFocusedElement}\n value={internalValue[1]}\n label={changeStartMonthLabel}\n />\n <InputLikeDivider>.</InputLikeDivider>\n <InputLike\n length={4}\n getRootRef={yearsStartRef}\n index={2}\n onElementSelect={setFocusedElement}\n value={internalValue[2]}\n label={changeStartYearLabel}\n />\n <InputLikeDivider>{' — '}</InputLikeDivider>\n <InputLike\n length={2}\n getRootRef={daysEndRef}\n index={3}\n onElementSelect={setFocusedElement}\n value={internalValue[3]}\n label={changeEndDayLabel}\n />\n <InputLikeDivider>.</InputLikeDivider>\n <InputLike\n length={2}\n getRootRef={monthsEndRef}\n index={4}\n onElementSelect={setFocusedElement}\n value={internalValue[4]}\n label={changeEndMonthLabel}\n />\n <InputLikeDivider>.</InputLikeDivider>\n <InputLike\n length={4}\n getRootRef={yearsEndRef}\n index={5}\n onElementSelect={setFocusedElement}\n value={internalValue[5]}\n label={changeEndYearLabel}\n />\n </Text>\n {open && !disableCalendar && (\n <Popper targetRef={rootRef} offsetByMainAxis={8} placement={calendarPlacement}>\n <CalendarRange\n value={value}\n onChange={onCalendarChange}\n disablePast={disablePast}\n disableFuture={disableFuture}\n shouldDisableDate={shouldDisableDate}\n onClose={closeCalendar}\n getRootRef={calendarRef}\n disablePickers={disablePickers}\n prevMonthLabel={prevMonthLabel}\n nextMonthLabel={nextMonthLabel}\n changeMonthLabel={changeMonthLabel}\n changeYearLabel={changeYearLabel}\n changeDayLabel={changeDayLabel}\n prevMonthIcon={prevMonthIcon}\n nextMonthIcon={nextMonthIcon}\n renderDayContent={renderDayContent}\n />\n </Popper>\n )}\n </FormField>\n );\n};\n"],"names":["React","Icon16Clear","Icon20CalendarOutline","classNames","isAfter","useAdaptivity","useDateInput","useExternRef","callMultiple","format","isMatch","parse","CalendarRange","FormField","IconButton","InputLike","InputLikeDivider","Popper","Text","VisuallyHidden","styles","dateInputStyles","sizeYClassNames","none","compact","elementsConfig","index","length","min","max","getInternalValue","value","newValue","String","getDate","padStart","getMonth","getFullYear","DateRangeInput","shouldDisableDate","disableFuture","disablePast","onChange","calendarPlacement","style","className","closeOnChange","disablePickers","getRootRef","name","autoFocus","disabled","onClick","onFocus","prevMonthLabel","nextMonthLabel","changeDayLabel","changeMonthLabel","changeYearLabel","changeStartDayLabel","changeStartMonthLabel","changeStartYearLabel","changeEndDayLabel","changeEndMonthLabel","changeEndYearLabel","clearFieldLabel","showCalendarLabel","prevMonthIcon","nextMonthIcon","disableCalendar","renderDayContent","props","daysStartRef","useRef","monthsStartRef","yearsStartRef","daysEndRef","monthsEndRef","yearsEndRef","onInternalValueChange","useCallback","internalValue","isStartValid","isEndValid","i","formattedStartValue","formattedEndValue","mask","valueExists","Array","isArray","now","Date","start","end","refs","useMemo","rootRef","calendarRef","open","openCalendar","closeCalendar","handleKeyDown","setFocusedElement","handleFieldEnter","clear","removeFocusFromField","maxElement","sizeY","handleRootRef","onCalendarChange","after","hoverMode","input","type","onKeyDown","onElementSelect","label","targetRef","offsetByMainAxis","placement","onClose"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/components/DateRangeInput/DateRangeInput.tsx"],"sourcesContent":["import * as React from 'react';\nimport { Icon16Clear, Icon20CalendarOutline } from '@vkontakte/icons';\nimport { classNames } from '@vkontakte/vkjs';\nimport { isAfter } from 'date-fns';\nimport { useAdaptivity } from '../../hooks/useAdaptivity';\nimport { useDateInput } from '../../hooks/useDateInput';\nimport { useExternRef } from '../../hooks/useExternRef';\nimport { callMultiple } from '../../lib/callMultiple';\nimport { format, isMatch, parse } from '../../lib/date';\nimport type { PlacementWithAuto } from '../../lib/floating';\nimport type { HasRootRef } from '../../types';\nimport {\n CalendarRange,\n type CalendarRangeProps,\n type CalendarRangeTestsProps,\n type DateRangeType,\n} from '../CalendarRange/CalendarRange';\nimport { FormField, type FormFieldProps } from '../FormField/FormField';\nimport { IconButton } from '../IconButton/IconButton';\nimport { InputLike } from '../InputLike/InputLike';\nimport { InputLikeDivider } from '../InputLike/InputLikeDivider';\nimport { Popper } from '../Popper/Popper';\nimport { Text } from '../Typography/Text/Text';\nimport { VisuallyHidden } from '../VisuallyHidden/VisuallyHidden';\nimport styles from './DateRangeInput.module.css';\nimport dateInputStyles from '../DateInput/DateInput.module.css';\n\nconst sizeYClassNames = {\n none: styles['DateRangeInput--sizeY-none'],\n compact: styles['DateRangeInput--sizeY-compact'],\n};\n\ntype DateTestsProps = {\n day?: string;\n month?: string;\n year?: string;\n};\n\nexport type DateRangeInputTestsProps = {\n startDateTestsProps?: DateTestsProps;\n endDateTestsProps?: DateTestsProps;\n};\n\nexport interface DateRangeInputProps\n extends Omit<React.InputHTMLAttributes<HTMLDivElement>, 'value' | 'onChange'>,\n Pick<\n CalendarRangeProps,\n | 'disablePast'\n | 'disableFuture'\n | 'shouldDisableDate'\n | 'onChange'\n | 'value'\n | 'weekStartsOn'\n | 'disablePickers'\n | 'prevMonthLabel'\n | 'nextMonthLabel'\n | 'changeMonthLabel'\n | 'changeYearLabel'\n | 'changeDayLabel'\n | 'prevMonthIcon'\n | 'nextMonthIcon'\n | 'renderDayContent'\n >,\n HasRootRef<HTMLDivElement>,\n Omit<FormFieldProps, 'maxHeight'>,\n DateRangeInputTestsProps {\n calendarTestsProps?: CalendarRangeTestsProps;\n calendarPlacement?: PlacementWithAuto;\n closeOnChange?: boolean;\n onCalendarOpenChanged?: (opened: boolean) => void;\n clearFieldLabel?: string;\n showCalendarLabel?: string;\n changeStartDayLabel?: string;\n changeStartMonthLabel?: string;\n changeStartYearLabel?: string;\n changeEndDayLabel?: string;\n changeEndMonthLabel?: string;\n changeEndYearLabel?: string;\n disableCalendar?: boolean;\n}\n\nconst elementsConfig = (index: number) => {\n let length = 2;\n let min = 1;\n let max = 0;\n\n switch (index) {\n case 0:\n case 3:\n max = 31;\n break;\n case 1:\n case 4:\n max = 12;\n break;\n case 2:\n case 5:\n max = 2100;\n min = 1900;\n length = 4;\n break;\n }\n\n return { length, min, max };\n};\n\nconst getInternalValue = (value: CalendarRangeProps['value']) => {\n const newValue = ['', '', '', '', '', ''];\n if (value?.[0]) {\n newValue[0] = String(value[0].getDate()).padStart(2, '0');\n newValue[1] = String(value[0].getMonth() + 1).padStart(2, '0');\n newValue[2] = String(value[0].getFullYear()).padStart(4, '0');\n }\n if (value?.[1]) {\n newValue[3] = String(value[1].getDate()).padStart(2, '0');\n newValue[4] = String(value[1].getMonth() + 1).padStart(2, '0');\n newValue[5] = String(value[1].getFullYear()).padStart(4, '0');\n }\n return newValue;\n};\n\n/**\n * @see https://vkcom.github.io/VKUI/#/DateRangeInput\n */\nexport const DateRangeInput = ({\n shouldDisableDate,\n disableFuture,\n disablePast,\n value,\n onChange,\n calendarPlacement = 'bottom-start',\n style,\n className,\n closeOnChange = true,\n disablePickers,\n getRootRef,\n name,\n autoFocus,\n disabled,\n onClick,\n onFocus,\n prevMonthLabel = 'Предыдущий месяц',\n nextMonthLabel = 'Следующий месяц',\n changeDayLabel = 'Изменить день',\n changeMonthLabel = 'Изменить месяц',\n changeYearLabel = 'Изменить год',\n changeStartDayLabel = 'Изменить день начала',\n changeStartMonthLabel = 'Изменить месяц начала',\n changeStartYearLabel = 'Изменить год начала',\n changeEndDayLabel = 'Изменить день окончания',\n changeEndMonthLabel = 'Изменить месяц окончания',\n changeEndYearLabel = 'Изменить год окончания',\n clearFieldLabel = 'Очистить поле',\n showCalendarLabel = 'Показать календарь',\n prevMonthIcon,\n nextMonthIcon,\n disableCalendar = false,\n onCalendarOpenChanged,\n renderDayContent,\n calendarTestsProps,\n startDateTestsProps,\n endDateTestsProps,\n ...props\n}: DateRangeInputProps): React.ReactNode => {\n const daysStartRef = React.useRef<HTMLSpanElement>(null);\n const monthsStartRef = React.useRef<HTMLSpanElement>(null);\n const yearsStartRef = React.useRef<HTMLSpanElement>(null);\n const daysEndRef = React.useRef<HTMLSpanElement>(null);\n const monthsEndRef = React.useRef<HTMLSpanElement>(null);\n const yearsEndRef = React.useRef<HTMLSpanElement>(null);\n\n const onInternalValueChange = React.useCallback(\n (internalValue: string[]) => {\n let isStartValid = true;\n let isEndValid = true;\n for (let i = 0; i <= 2; i += 1) {\n if (internalValue[i].length < elementsConfig(i).length) {\n isStartValid = false;\n }\n }\n for (let i = 3; i <= 5; i += 1) {\n if (internalValue[i].length < elementsConfig(i).length) {\n isEndValid = false;\n }\n }\n const formattedStartValue = `${internalValue[0]}.${internalValue[1]}.${internalValue[2]}`;\n const formattedEndValue = `${internalValue[3]}.${internalValue[4]}.${internalValue[5]}`;\n const mask = 'dd.MM.yyyy';\n\n if (!isMatch(formattedStartValue, mask)) {\n isStartValid = false;\n }\n if (!isMatch(formattedEndValue, mask)) {\n isEndValid = false;\n }\n\n if (!isStartValid && !isEndValid) {\n return;\n }\n\n const valueExists = Array.isArray(value);\n const now = new Date();\n const start = isStartValid\n ? parse(formattedStartValue, mask, (valueExists && value?.[0]) || now)\n : null;\n const end = isEndValid\n ? parse(formattedEndValue, mask, (valueExists && value?.[1]) || now)\n : null;\n if (start && end && isAfter(end, start)) {\n onChange?.([start, end]);\n }\n },\n [onChange, value],\n );\n\n const refs = React.useMemo(\n () => [daysStartRef, monthsStartRef, yearsStartRef, daysEndRef, monthsEndRef, yearsEndRef],\n [daysStartRef, monthsStartRef, yearsStartRef, daysEndRef, monthsEndRef, yearsEndRef],\n );\n\n const {\n rootRef,\n calendarRef,\n open,\n openCalendar,\n closeCalendar,\n internalValue,\n handleKeyDown,\n setFocusedElement,\n handleFieldEnter,\n clear,\n removeFocusFromField,\n } = useDateInput({\n maxElement: 5,\n refs,\n autoFocus,\n disabled,\n elementsConfig,\n onChange,\n onInternalValueChange,\n getInternalValue,\n value,\n onCalendarOpenChanged,\n });\n\n const { sizeY = 'none' } = useAdaptivity();\n\n const handleRootRef = useExternRef(rootRef, getRootRef);\n\n const onCalendarChange = React.useCallback(\n (newValue: DateRangeType | undefined) => {\n onChange?.(newValue);\n if (closeOnChange && newValue?.[1] && newValue[1] !== value?.[1]) {\n removeFocusFromField();\n }\n },\n [onChange, closeOnChange, value, removeFocusFromField],\n );\n\n return (\n <FormField\n style={style}\n className={classNames(sizeY !== 'regular' && sizeYClassNames[sizeY], className)}\n getRootRef={handleRootRef}\n after={\n value ? (\n <IconButton hoverMode=\"opacity\" onClick={clear}>\n <VisuallyHidden>{clearFieldLabel}</VisuallyHidden>\n <Icon16Clear />\n </IconButton>\n ) : (\n <IconButton hoverMode=\"opacity\" onClick={openCalendar}>\n <VisuallyHidden>{showCalendarLabel}</VisuallyHidden>\n <Icon20CalendarOutline />\n </IconButton>\n )\n }\n disabled={disabled}\n onClick={callMultiple(handleFieldEnter, onClick)}\n onFocus={callMultiple(handleFieldEnter, onFocus)}\n {...props}\n >\n <input\n type=\"hidden\"\n name={name}\n value={\n value\n ? `${value[0] ? format(value[0], 'dd.MM.yyyy') : ''} - ${\n value[1] ? format(value[1], 'dd.MM.yyyy') : ''\n }`\n : ''\n }\n />\n <Text className={dateInputStyles['DateInput__input']} onKeyDown={handleKeyDown}>\n <InputLike\n length={2}\n getRootRef={daysStartRef}\n index={0}\n onElementSelect={setFocusedElement}\n value={internalValue[0]}\n label={changeStartDayLabel}\n data-testid={startDateTestsProps?.day}\n />\n <InputLikeDivider>.</InputLikeDivider>\n <InputLike\n length={2}\n getRootRef={monthsStartRef}\n index={1}\n onElementSelect={setFocusedElement}\n value={internalValue[1]}\n label={changeStartMonthLabel}\n data-testid={startDateTestsProps?.month}\n />\n <InputLikeDivider>.</InputLikeDivider>\n <InputLike\n length={4}\n getRootRef={yearsStartRef}\n index={2}\n onElementSelect={setFocusedElement}\n value={internalValue[2]}\n label={changeStartYearLabel}\n data-testid={startDateTestsProps?.year}\n />\n <InputLikeDivider>{' — '}</InputLikeDivider>\n <InputLike\n length={2}\n getRootRef={daysEndRef}\n index={3}\n onElementSelect={setFocusedElement}\n value={internalValue[3]}\n label={changeEndDayLabel}\n data-testid={endDateTestsProps?.day}\n />\n <InputLikeDivider>.</InputLikeDivider>\n <InputLike\n length={2}\n getRootRef={monthsEndRef}\n index={4}\n onElementSelect={setFocusedElement}\n value={internalValue[4]}\n label={changeEndMonthLabel}\n data-testid={endDateTestsProps?.month}\n />\n <InputLikeDivider>.</InputLikeDivider>\n <InputLike\n length={4}\n getRootRef={yearsEndRef}\n index={5}\n onElementSelect={setFocusedElement}\n value={internalValue[5]}\n label={changeEndYearLabel}\n data-testid={endDateTestsProps?.year}\n />\n </Text>\n {open && !disableCalendar && (\n <Popper targetRef={rootRef} offsetByMainAxis={8} placement={calendarPlacement}>\n <CalendarRange\n value={value}\n onChange={onCalendarChange}\n disablePast={disablePast}\n disableFuture={disableFuture}\n shouldDisableDate={shouldDisableDate}\n onClose={closeCalendar}\n getRootRef={calendarRef}\n disablePickers={disablePickers}\n prevMonthLabel={prevMonthLabel}\n nextMonthLabel={nextMonthLabel}\n changeMonthLabel={changeMonthLabel}\n changeYearLabel={changeYearLabel}\n changeDayLabel={changeDayLabel}\n prevMonthIcon={prevMonthIcon}\n nextMonthIcon={nextMonthIcon}\n renderDayContent={renderDayContent}\n {...calendarTestsProps}\n />\n </Popper>\n )}\n </FormField>\n );\n};\n"],"names":["React","Icon16Clear","Icon20CalendarOutline","classNames","isAfter","useAdaptivity","useDateInput","useExternRef","callMultiple","format","isMatch","parse","CalendarRange","FormField","IconButton","InputLike","InputLikeDivider","Popper","Text","VisuallyHidden","styles","dateInputStyles","sizeYClassNames","none","compact","elementsConfig","index","length","min","max","getInternalValue","value","newValue","String","getDate","padStart","getMonth","getFullYear","DateRangeInput","shouldDisableDate","disableFuture","disablePast","onChange","calendarPlacement","style","className","closeOnChange","disablePickers","getRootRef","name","autoFocus","disabled","onClick","onFocus","prevMonthLabel","nextMonthLabel","changeDayLabel","changeMonthLabel","changeYearLabel","changeStartDayLabel","changeStartMonthLabel","changeStartYearLabel","changeEndDayLabel","changeEndMonthLabel","changeEndYearLabel","clearFieldLabel","showCalendarLabel","prevMonthIcon","nextMonthIcon","disableCalendar","onCalendarOpenChanged","renderDayContent","calendarTestsProps","startDateTestsProps","endDateTestsProps","props","daysStartRef","useRef","monthsStartRef","yearsStartRef","daysEndRef","monthsEndRef","yearsEndRef","onInternalValueChange","useCallback","internalValue","isStartValid","isEndValid","i","formattedStartValue","formattedEndValue","mask","valueExists","Array","isArray","now","Date","start","end","refs","useMemo","rootRef","calendarRef","open","openCalendar","closeCalendar","handleKeyDown","setFocusedElement","handleFieldEnter","clear","removeFocusFromField","maxElement","sizeY","handleRootRef","onCalendarChange","after","hoverMode","input","type","onKeyDown","onElementSelect","label","data-testid","day","month","year","targetRef","offsetByMainAxis","placement","onClose"],"mappings":"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"}
@@ -2,7 +2,7 @@ import { type AllHTMLAttributes } from 'react';
2
2
  import type { HasComponent, HasRootRef } from '../../types';
3
3
  export interface FocusTrapProps<T extends HTMLElement = HTMLElement> extends Omit<AllHTMLAttributes<T>, 'autoFocus'>, HasRootRef<T>, HasComponent {
4
4
  autoFocus?: boolean | 'root';
5
- restoreFocus?: boolean | (() => boolean);
5
+ restoreFocus?: boolean | (() => boolean | HTMLElement);
6
6
  mount?: boolean;
7
7
  timeout?: number;
8
8
  onClose?: () => void;
@@ -1 +1 @@
1
- {"version":3,"file":"FocusTrap.d.ts","sourceRoot":"","sources":["../../../../src/components/FocusTrap/FocusTrap.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,iBAAiB,EAAiC,MAAM,OAAO,CAAC;AAa9E,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAG5D,MAAM,WAAW,cAAc,CAAC,CAAC,SAAS,WAAW,GAAG,WAAW,CACjE,SAAQ,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,EAC7C,UAAU,CAAC,CAAC,CAAC,EACb,YAAY;IACd,SAAS,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC7B,YAAY,CAAC,EAAE,OAAO,GAAG,CAAC,MAAM,OAAO,CAAC,CAAC;IACzC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;GAEG;AACH,eAAO,MAAM,SAAS,GAAI,CAAC,SAAS,WAAW,+HAW5C,cAAc,CAAC,CAAC,CAAC,KAAG,KAAK,CAAC,SAiM5B,CAAC"}
1
+ {"version":3,"file":"FocusTrap.d.ts","sourceRoot":"","sources":["../../../../src/components/FocusTrap/FocusTrap.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,iBAAiB,EAAoC,MAAM,OAAO,CAAC;AAcjF,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAqE5D,MAAM,WAAW,cAAc,CAAC,CAAC,SAAS,WAAW,GAAG,WAAW,CACjE,SAAQ,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,EAC7C,UAAU,CAAC,CAAC,CAAC,EACb,YAAY;IACd,SAAS,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC7B,YAAY,CAAC,EAAE,OAAO,GAAG,CAAC,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC;IACvD,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;GAEG;AACH,eAAO,MAAM,SAAS,GAAI,CAAC,SAAS,WAAW,+HAW5C,cAAc,CAAC,CAAC,CAAC,KAAG,KAAK,CAAC,SA4J5B,CAAC"}
@@ -1,19 +1,68 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
- import { useCallback, useRef, useState } from 'react';
2
+ import { useRef, useState } from 'react';
3
3
  import { arraysEquals } from '../../helpers/array';
4
4
  import { useExternRef } from '../../hooks/useExternRef';
5
5
  import { useMutationObserver } from '../../hooks/useMutationObserver';
6
+ import { useStableCallback } from '../../hooks/useStableCallback';
6
7
  import { FOCUSABLE_ELEMENTS_LIST, Keys, pressedKey } from '../../lib/accessibility';
7
8
  import { contains, getActiveElementByAnotherElement, getWindow, isHTMLElement, useDOM } from '../../lib/dom';
8
9
  import { useIsomorphicLayoutEffect } from '../../lib/useIsomorphicLayoutEffect';
9
10
  const FOCUSABLE_ELEMENTS = FOCUSABLE_ELEMENTS_LIST.join();
11
+ const useRestoreFocus = ({ restoreFocus, timeout, mount, ref })=>{
12
+ const restoreFocusRef = useRef(restoreFocus);
13
+ restoreFocusRef.current = restoreFocus;
14
+ const [restoreFocusTo, setRestoreFocusTo] = useState(null);
15
+ const restoreFocusImpl = useStableCallback(()=>{
16
+ const shouldRestoreFocus = typeof restoreFocusRef.current === 'function' ? restoreFocusRef.current() : restoreFocusRef.current;
17
+ if (!shouldRestoreFocus) {
18
+ return;
19
+ }
20
+ setTimeout(()=>{
21
+ const restoreFocusElement = isHTMLElement(shouldRestoreFocus) && shouldRestoreFocus || isHTMLElement(restoreFocusTo) && restoreFocusTo || null;
22
+ if (restoreFocusElement) {
23
+ restoreFocusElement.focus();
24
+ setRestoreFocusTo(null);
25
+ }
26
+ }, timeout);
27
+ });
28
+ useIsomorphicLayoutEffect(function calculateRestoreFocusTo() {
29
+ if (!ref.current || !restoreFocusRef.current || !mount) {
30
+ setRestoreFocusTo(null);
31
+ return;
32
+ }
33
+ setRestoreFocusTo(getActiveElementByAnotherElement(ref.current));
34
+ }, [
35
+ ref,
36
+ mount
37
+ ]);
38
+ useIsomorphicLayoutEffect(function tryToRestoreFocusOnUnmount() {
39
+ return ()=>{
40
+ restoreFocusImpl();
41
+ };
42
+ }, [
43
+ restoreFocusImpl
44
+ ]);
45
+ useIsomorphicLayoutEffect(function tryToRestoreFocusWhenFakeUnmount() {
46
+ if (!mount) {
47
+ restoreFocusImpl();
48
+ }
49
+ }, [
50
+ mount,
51
+ restoreFocusImpl
52
+ ]);
53
+ };
10
54
  /**
11
55
  * @see https://vkcom.github.io/VKUI/#/FocusTrap
12
56
  */ export const FocusTrap = ({ Component = 'div', onClose, autoFocus = true, restoreFocus = true, disabled = false, mount = true, timeout = 0, getRootRef, children, ...restProps })=>{
13
57
  const ref = useExternRef(getRootRef);
14
58
  const { document } = useDOM();
15
59
  const focusableNodesRef = useRef([]);
16
- const [restoreFocusTo, setRestoreFocusTo] = useState(null);
60
+ useRestoreFocus({
61
+ restoreFocus,
62
+ timeout,
63
+ mount,
64
+ ref
65
+ });
17
66
  const focusNodeByIndex = (nodeIndex)=>{
18
67
  const element = focusableNodesRef.current[nodeIndex];
19
68
  if (element) {
@@ -84,46 +133,6 @@ const FOCUSABLE_ELEMENTS = FOCUSABLE_ELEMENTS_LIST.join();
84
133
  timeout,
85
134
  disabled
86
135
  ]);
87
- const restoreFocusImpl = useCallback(()=>{
88
- const shouldRestoreFocus = typeof restoreFocus === 'function' ? restoreFocus() : restoreFocus;
89
- if (!restoreFocusTo || !isHTMLElement(restoreFocusTo) || !shouldRestoreFocus) {
90
- return;
91
- }
92
- setTimeout(()=>{
93
- if (restoreFocusTo) {
94
- restoreFocusTo.focus();
95
- setRestoreFocusTo(null);
96
- }
97
- }, timeout);
98
- }, [
99
- restoreFocus,
100
- restoreFocusTo,
101
- timeout
102
- ]);
103
- useIsomorphicLayoutEffect(function calculateRestoreFocusTo() {
104
- if (!ref.current || !restoreFocus || !mount) {
105
- setRestoreFocusTo(null);
106
- return;
107
- }
108
- setRestoreFocusTo(getActiveElementByAnotherElement(ref.current));
109
- }, [
110
- ref,
111
- mount,
112
- restoreFocus
113
- ]);
114
- useIsomorphicLayoutEffect(function tryToRestoreFocusOnUnmount() {
115
- return ()=>restoreFocusImpl();
116
- }, [
117
- restoreFocusImpl
118
- ]);
119
- useIsomorphicLayoutEffect(function tryToRestoreFocusWhenFakeUnmount() {
120
- if (!mount) {
121
- restoreFocusImpl();
122
- }
123
- }, [
124
- mount,
125
- restoreFocusImpl
126
- ]);
127
136
  useIsomorphicLayoutEffect(()=>{
128
137
  if (!ref.current) {
129
138
  return;