@vkontakte/vkui 7.3.8 → 7.4.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 (351) hide show
  1. package/dist/components/ActionSheet/ActionSheet.d.ts +1 -1
  2. package/dist/components/ActionSheet/ActionSheet.d.ts.map +1 -1
  3. package/dist/components/ActionSheet/ActionSheet.js.map +1 -1
  4. package/dist/components/AppRoot/ScrollContext.js +2 -2
  5. package/dist/components/AppRoot/ScrollContext.js.map +1 -1
  6. package/dist/components/Banner/Banner.d.ts +2 -2
  7. package/dist/components/Banner/Banner.d.ts.map +1 -1
  8. package/dist/components/Banner/Banner.js.map +1 -1
  9. package/dist/components/Button/Button.d.ts +2 -2
  10. package/dist/components/Button/Button.d.ts.map +1 -1
  11. package/dist/components/Button/Button.js.map +1 -1
  12. package/dist/components/Calendar/Calendar.d.ts.map +1 -1
  13. package/dist/components/Calendar/Calendar.js +9 -7
  14. package/dist/components/Calendar/Calendar.js.map +1 -1
  15. package/dist/components/CalendarRange/CalendarRange.d.ts +9 -2
  16. package/dist/components/CalendarRange/CalendarRange.d.ts.map +1 -1
  17. package/dist/components/CalendarRange/CalendarRange.js +48 -35
  18. package/dist/components/CalendarRange/CalendarRange.js.map +1 -1
  19. package/dist/components/CalendarRange/types.d.ts +2 -0
  20. package/dist/components/CalendarRange/types.d.ts.map +1 -0
  21. package/dist/components/CalendarRange/types.js +3 -0
  22. package/dist/components/CalendarRange/types.js.map +1 -0
  23. package/dist/components/CalendarRange/utils.d.ts +29 -0
  24. package/dist/components/CalendarRange/utils.d.ts.map +1 -0
  25. package/dist/components/CalendarRange/utils.js +123 -0
  26. package/dist/components/CalendarRange/utils.js.map +1 -0
  27. package/dist/components/Checkbox/Checkbox.d.ts +2 -2
  28. package/dist/components/Checkbox/Checkbox.d.ts.map +1 -1
  29. package/dist/components/Checkbox/Checkbox.js.map +1 -1
  30. package/dist/components/ChipsInput/useChipsInput.d.ts.map +1 -1
  31. package/dist/components/ChipsInput/useChipsInput.js +21 -2
  32. package/dist/components/ChipsInput/useChipsInput.js.map +1 -1
  33. package/dist/components/ChipsInputBase/types.d.ts +5 -1
  34. package/dist/components/ChipsInputBase/types.d.ts.map +1 -1
  35. package/dist/components/ChipsInputBase/types.js.map +1 -1
  36. package/dist/components/Clickable/Clickable.d.ts +4 -0
  37. package/dist/components/Clickable/Clickable.d.ts.map +1 -1
  38. package/dist/components/Clickable/Clickable.js +9 -5
  39. package/dist/components/Clickable/Clickable.js.map +1 -1
  40. package/dist/components/Clickable/RealClickable.d.ts +1 -1
  41. package/dist/components/Clickable/RealClickable.d.ts.map +1 -1
  42. package/dist/components/Clickable/RealClickable.js +3 -2
  43. package/dist/components/Clickable/RealClickable.js.map +1 -1
  44. package/dist/components/ContentCard/ContentCard.d.ts +2 -2
  45. package/dist/components/ContentCard/ContentCard.d.ts.map +1 -1
  46. package/dist/components/ContentCard/ContentCard.js.map +1 -1
  47. package/dist/components/CustomSelect/CustomSelect.d.ts +4 -1
  48. package/dist/components/CustomSelect/CustomSelect.d.ts.map +1 -1
  49. package/dist/components/CustomSelect/CustomSelect.js.map +1 -1
  50. package/dist/components/DateInput/DateInput.d.ts +1 -1
  51. package/dist/components/DateInput/DateInput.d.ts.map +1 -1
  52. package/dist/components/DateInput/DateInput.js +48 -50
  53. package/dist/components/DateInput/DateInput.js.map +1 -1
  54. package/dist/components/DateRangeInput/DateRangeInput.d.ts +22 -2
  55. package/dist/components/DateRangeInput/DateRangeInput.d.ts.map +1 -1
  56. package/dist/components/DateRangeInput/DateRangeInput.js +159 -66
  57. package/dist/components/DateRangeInput/DateRangeInput.js.map +1 -1
  58. package/dist/components/FocusTrap/FocusTrap.d.ts +1 -1
  59. package/dist/components/FocusTrap/FocusTrap.d.ts.map +1 -1
  60. package/dist/components/FocusTrap/FocusTrap.js +6 -3
  61. package/dist/components/FocusTrap/FocusTrap.js.map +1 -1
  62. package/dist/components/HorizontalCell/HorizontalCell.d.ts +2 -2
  63. package/dist/components/HorizontalCell/HorizontalCell.d.ts.map +1 -1
  64. package/dist/components/HorizontalCell/HorizontalCell.js.map +1 -1
  65. package/dist/components/HorizontalScroll/HorizontalCellShowMore/HorizontalCellShowMore.d.ts +2 -2
  66. package/dist/components/HorizontalScroll/HorizontalCellShowMore/HorizontalCellShowMore.d.ts.map +1 -1
  67. package/dist/components/HorizontalScroll/HorizontalCellShowMore/HorizontalCellShowMore.js.map +1 -1
  68. package/dist/components/IconButton/IconButton.d.ts +2 -2
  69. package/dist/components/IconButton/IconButton.d.ts.map +1 -1
  70. package/dist/components/IconButton/IconButton.js.map +1 -1
  71. package/dist/components/InputLike/InputLike.d.ts +1 -1
  72. package/dist/components/InputLike/InputLike.d.ts.map +1 -1
  73. package/dist/components/InputLike/InputLike.js +7 -6
  74. package/dist/components/InputLike/InputLike.js.map +1 -1
  75. package/dist/components/Link/Link.d.ts +2 -2
  76. package/dist/components/Link/Link.d.ts.map +1 -1
  77. package/dist/components/Link/Link.js +2 -1
  78. package/dist/components/Link/Link.js.map +1 -1
  79. package/dist/components/MiniInfoCell/MiniInfoCell.d.ts.map +1 -1
  80. package/dist/components/MiniInfoCell/MiniInfoCell.js +1 -8
  81. package/dist/components/MiniInfoCell/MiniInfoCell.js.map +1 -1
  82. package/dist/components/ModalOutsideButton/ModalOutsideButton.d.ts +2 -2
  83. package/dist/components/ModalOutsideButton/ModalOutsideButton.d.ts.map +1 -1
  84. package/dist/components/ModalOutsideButton/ModalOutsideButton.js.map +1 -1
  85. package/dist/components/NumberInputLike/NumberInputLike.d.ts +8 -0
  86. package/dist/components/NumberInputLike/NumberInputLike.d.ts.map +1 -0
  87. package/dist/components/NumberInputLike/NumberInputLike.js +45 -0
  88. package/dist/components/NumberInputLike/NumberInputLike.js.map +1 -0
  89. package/dist/components/Pagination/PaginationPage/PaginationPageButton.d.ts +2 -2
  90. package/dist/components/Pagination/PaginationPage/PaginationPageButton.d.ts.map +1 -1
  91. package/dist/components/Pagination/PaginationPage/PaginationPageButton.js.map +1 -1
  92. package/dist/components/PanelHeader/PanelHeader.d.ts +3 -1
  93. package/dist/components/PanelHeader/PanelHeader.d.ts.map +1 -1
  94. package/dist/components/PanelHeader/PanelHeader.js.map +1 -1
  95. package/dist/components/PanelHeaderButton/PanelHeaderButton.d.ts +2 -2
  96. package/dist/components/PanelHeaderButton/PanelHeaderButton.d.ts.map +1 -1
  97. package/dist/components/PanelHeaderButton/PanelHeaderButton.js.map +1 -1
  98. package/dist/components/Radio/Radio.d.ts +2 -2
  99. package/dist/components/Radio/Radio.d.ts.map +1 -1
  100. package/dist/components/Radio/Radio.js.map +1 -1
  101. package/dist/components/Removable/Removable.d.ts +1 -4
  102. package/dist/components/Removable/Removable.d.ts.map +1 -1
  103. package/dist/components/Removable/Removable.js +39 -116
  104. package/dist/components/Removable/Removable.js.map +1 -1
  105. package/dist/components/Removable/RemovableIos.d.ts +10 -0
  106. package/dist/components/Removable/RemovableIos.d.ts.map +1 -0
  107. package/dist/components/Removable/RemovableIos.js +124 -0
  108. package/dist/components/Removable/RemovableIos.js.map +1 -0
  109. package/dist/components/RichCell/RichCell.d.ts +2 -2
  110. package/dist/components/RichCell/RichCell.d.ts.map +1 -1
  111. package/dist/components/RichCell/RichCell.js.map +1 -1
  112. package/dist/components/ScreenSpinner/ScreenSpinner.d.ts.map +1 -1
  113. package/dist/components/ScreenSpinner/ScreenSpinner.js +4 -2
  114. package/dist/components/ScreenSpinner/ScreenSpinner.js.map +1 -1
  115. package/dist/components/ScreenSpinner/ScreenSpinnerContainer.d.ts +2 -2
  116. package/dist/components/ScreenSpinner/ScreenSpinnerContainer.d.ts.map +1 -1
  117. package/dist/components/ScreenSpinner/ScreenSpinnerContainer.js +4 -3
  118. package/dist/components/ScreenSpinner/ScreenSpinnerContainer.js.map +1 -1
  119. package/dist/components/SelectionControl/SelectionControl.d.ts +2 -2
  120. package/dist/components/SelectionControl/SelectionControl.d.ts.map +1 -1
  121. package/dist/components/SelectionControl/SelectionControl.js.map +1 -1
  122. package/dist/components/SimpleCell/SimpleCell.d.ts +2 -2
  123. package/dist/components/SimpleCell/SimpleCell.d.ts.map +1 -1
  124. package/dist/components/SimpleCell/SimpleCell.js.map +1 -1
  125. package/dist/components/Skeleton/Skeleton.d.ts +5 -1
  126. package/dist/components/Skeleton/Skeleton.d.ts.map +1 -1
  127. package/dist/components/Skeleton/Skeleton.js +7 -4
  128. package/dist/components/Skeleton/Skeleton.js.map +1 -1
  129. package/dist/components/Spinner/Spinner.d.ts +5 -1
  130. package/dist/components/Spinner/Spinner.d.ts.map +1 -1
  131. package/dist/components/Spinner/Spinner.js +6 -3
  132. package/dist/components/Spinner/Spinner.js.map +1 -1
  133. package/dist/components/SubnavigationButton/SubnavigationButton.d.ts +2 -2
  134. package/dist/components/SubnavigationButton/SubnavigationButton.d.ts.map +1 -1
  135. package/dist/components/SubnavigationButton/SubnavigationButton.js.map +1 -1
  136. package/dist/components/Tabs/Tabs.d.ts +13 -9
  137. package/dist/components/Tabs/Tabs.d.ts.map +1 -1
  138. package/dist/components/Tabs/Tabs.js +14 -10
  139. package/dist/components/Tabs/Tabs.js.map +1 -1
  140. package/dist/components/Tabs/TabsController.d.ts +7 -0
  141. package/dist/components/Tabs/TabsController.d.ts.map +1 -0
  142. package/dist/components/Tabs/TabsController.js +19 -0
  143. package/dist/components/Tabs/TabsController.js.map +1 -0
  144. package/dist/components/Tabs/TabsModeContext.d.ts +13 -0
  145. package/dist/components/Tabs/TabsModeContext.d.ts.map +1 -0
  146. package/dist/components/Tabs/TabsModeContext.js +11 -0
  147. package/dist/components/Tabs/TabsModeContext.js.map +1 -0
  148. package/dist/components/TabsItem/TabsItem.d.ts +3 -3
  149. package/dist/components/TabsItem/TabsItem.d.ts.map +1 -1
  150. package/dist/components/TabsItem/TabsItem.js +21 -6
  151. package/dist/components/TabsItem/TabsItem.js.map +1 -1
  152. package/dist/components/Tappable/Tappable.d.ts +1 -0
  153. package/dist/components/Tappable/Tappable.d.ts.map +1 -1
  154. package/dist/components/Tappable/Tappable.js.map +1 -1
  155. package/dist/components/ToolButton/ToolButton.d.ts +2 -2
  156. package/dist/components/ToolButton/ToolButton.d.ts.map +1 -1
  157. package/dist/components/ToolButton/ToolButton.js.map +1 -1
  158. package/dist/components/View/ViewInfinite.js.map +1 -1
  159. package/dist/components.css +1 -1
  160. package/dist/components.css.map +1 -1
  161. package/dist/cssm/components/ActionSheet/ActionSheet.js.map +1 -1
  162. package/dist/cssm/components/AppRoot/ScrollContext.js +2 -2
  163. package/dist/cssm/components/AppRoot/ScrollContext.js.map +1 -1
  164. package/dist/cssm/components/Banner/Banner.js.map +1 -1
  165. package/dist/cssm/components/Button/Button.js.map +1 -1
  166. package/dist/cssm/components/Calendar/Calendar.js +9 -7
  167. package/dist/cssm/components/Calendar/Calendar.js.map +1 -1
  168. package/dist/cssm/components/CalendarRange/CalendarRange.js +44 -31
  169. package/dist/cssm/components/CalendarRange/CalendarRange.js.map +1 -1
  170. package/dist/cssm/components/CalendarRange/types.js +3 -0
  171. package/dist/cssm/components/CalendarRange/types.js.map +1 -0
  172. package/dist/cssm/components/CalendarRange/utils.js +122 -0
  173. package/dist/cssm/components/CalendarRange/utils.js.map +1 -0
  174. package/dist/cssm/components/Checkbox/Checkbox.js.map +1 -1
  175. package/dist/cssm/components/ChipsInput/useChipsInput.js +21 -2
  176. package/dist/cssm/components/ChipsInput/useChipsInput.js.map +1 -1
  177. package/dist/cssm/components/ChipsInputBase/types.js.map +1 -1
  178. package/dist/cssm/components/Clickable/Clickable.js +4 -3
  179. package/dist/cssm/components/Clickable/Clickable.js.map +1 -1
  180. package/dist/cssm/components/Clickable/RealClickable.js +1 -1
  181. package/dist/cssm/components/Clickable/RealClickable.js.map +1 -1
  182. package/dist/cssm/components/ContentCard/ContentCard.js.map +1 -1
  183. package/dist/cssm/components/CustomSelect/CustomSelect.js.map +1 -1
  184. package/dist/cssm/components/DateInput/DateInput.js +45 -46
  185. package/dist/cssm/components/DateInput/DateInput.js.map +1 -1
  186. package/dist/cssm/components/DateRangeInput/DateRangeInput.js +148 -58
  187. package/dist/cssm/components/DateRangeInput/DateRangeInput.js.map +1 -1
  188. package/dist/cssm/components/FocusTrap/FocusTrap.js +4 -2
  189. package/dist/cssm/components/FocusTrap/FocusTrap.js.map +1 -1
  190. package/dist/cssm/components/HorizontalCell/HorizontalCell.js.map +1 -1
  191. package/dist/cssm/components/HorizontalScroll/HorizontalCellShowMore/HorizontalCellShowMore.js.map +1 -1
  192. package/dist/cssm/components/IconButton/IconButton.js.map +1 -1
  193. package/dist/cssm/components/InputLike/InputLike.js +3 -3
  194. package/dist/cssm/components/InputLike/InputLike.js.map +1 -1
  195. package/dist/cssm/components/Link/Link.js +1 -0
  196. package/dist/cssm/components/Link/Link.js.map +1 -1
  197. package/dist/cssm/components/MiniInfoCell/MiniInfoCell.js +1 -8
  198. package/dist/cssm/components/MiniInfoCell/MiniInfoCell.js.map +1 -1
  199. package/dist/cssm/components/ModalOutsideButton/ModalOutsideButton.js.map +1 -1
  200. package/dist/cssm/components/NumberInputLike/NumberInputLike.js +33 -0
  201. package/dist/cssm/components/NumberInputLike/NumberInputLike.js.map +1 -0
  202. package/dist/cssm/components/Pagination/PaginationPage/PaginationPageButton.js.map +1 -1
  203. package/dist/cssm/components/PanelHeader/PanelHeader.js.map +1 -1
  204. package/dist/cssm/components/PanelHeaderButton/PanelHeaderButton.js.map +1 -1
  205. package/dist/cssm/components/Radio/Radio.js.map +1 -1
  206. package/dist/cssm/components/Removable/Removable.js +39 -115
  207. package/dist/cssm/components/Removable/Removable.js.map +1 -1
  208. package/dist/cssm/components/Removable/Removable.module.css +9 -0
  209. package/dist/cssm/components/Removable/RemovableIos.js +118 -0
  210. package/dist/cssm/components/Removable/RemovableIos.js.map +1 -0
  211. package/dist/cssm/components/RichCell/RichCell.js.map +1 -1
  212. package/dist/cssm/components/ScreenSpinner/ScreenSpinner.js +2 -1
  213. package/dist/cssm/components/ScreenSpinner/ScreenSpinner.js.map +1 -1
  214. package/dist/cssm/components/ScreenSpinner/ScreenSpinnerContainer.js +3 -2
  215. package/dist/cssm/components/ScreenSpinner/ScreenSpinnerContainer.js.map +1 -1
  216. package/dist/cssm/components/SelectionControl/SelectionControl.js.map +1 -1
  217. package/dist/cssm/components/SimpleCell/SimpleCell.js.map +1 -1
  218. package/dist/cssm/components/Skeleton/Skeleton.js +6 -3
  219. package/dist/cssm/components/Skeleton/Skeleton.js.map +1 -1
  220. package/dist/cssm/components/Spinner/Spinner.js +5 -2
  221. package/dist/cssm/components/Spinner/Spinner.js.map +1 -1
  222. package/dist/cssm/components/SubnavigationButton/SubnavigationButton.js.map +1 -1
  223. package/dist/cssm/components/Tabs/Tabs.js +10 -9
  224. package/dist/cssm/components/Tabs/Tabs.js.map +1 -1
  225. package/dist/cssm/components/Tabs/TabsController.js +19 -0
  226. package/dist/cssm/components/Tabs/TabsController.js.map +1 -0
  227. package/dist/cssm/components/Tabs/TabsModeContext.js +11 -0
  228. package/dist/cssm/components/Tabs/TabsModeContext.js.map +1 -0
  229. package/dist/cssm/components/TabsItem/TabsItem.js +17 -4
  230. package/dist/cssm/components/TabsItem/TabsItem.js.map +1 -1
  231. package/dist/cssm/components/Tappable/Tappable.js.map +1 -1
  232. package/dist/cssm/components/ToolButton/ToolButton.js.map +1 -1
  233. package/dist/cssm/components/View/ViewInfinite.js.map +1 -1
  234. package/dist/cssm/hooks/useCalendar.js +0 -10
  235. package/dist/cssm/hooks/useCalendar.js.map +1 -1
  236. package/dist/cssm/hooks/useDateInput.js +28 -17
  237. package/dist/cssm/hooks/useDateInput.js.map +1 -1
  238. package/dist/cssm/hooks/useEventListener.js.map +1 -1
  239. package/dist/cssm/hooks/useExternRef.js.map +1 -1
  240. package/dist/cssm/hooks/useFocusTrap.js +2 -2
  241. package/dist/cssm/hooks/useFocusTrap.js.map +1 -1
  242. package/dist/cssm/hooks/useMutationObserver.js +6 -5
  243. package/dist/cssm/hooks/useMutationObserver.js.map +1 -1
  244. package/dist/cssm/lib/dom.js +7 -1
  245. package/dist/cssm/lib/dom.js.map +1 -1
  246. package/dist/cssm/lib/floating/customResizeObserver.js.map +1 -1
  247. package/dist/cssm/lib/floating/index.js.map +1 -1
  248. package/dist/cssm/lib/floating/types/common.js.map +1 -1
  249. package/dist/cssm/lib/sheet/controllers/BottomSheetController.js.map +1 -1
  250. package/dist/cssm/lib/sheet/controllers/CSSTransitionController.js.map +1 -1
  251. package/dist/cssm/styles/animationVisibilityDelay.js +10 -0
  252. package/dist/cssm/styles/animationVisibilityDelay.js.map +1 -0
  253. package/dist/cssm/styles/animationVisibilityDelay.module.css +13 -0
  254. package/dist/cssm/styles/themes.css +4 -2
  255. package/dist/hooks/useCalendar.d.ts +0 -3
  256. package/dist/hooks/useCalendar.d.ts.map +1 -1
  257. package/dist/hooks/useCalendar.js +0 -10
  258. package/dist/hooks/useCalendar.js.map +1 -1
  259. package/dist/hooks/useDateInput.d.ts.map +1 -1
  260. package/dist/hooks/useDateInput.js +29 -18
  261. package/dist/hooks/useDateInput.js.map +1 -1
  262. package/dist/hooks/useEventListener.js.map +1 -1
  263. package/dist/hooks/useExternRef.js.map +1 -1
  264. package/dist/hooks/useFocusTrap.d.ts +5 -1
  265. package/dist/hooks/useFocusTrap.d.ts.map +1 -1
  266. package/dist/hooks/useFocusTrap.js +2 -2
  267. package/dist/hooks/useFocusTrap.js.map +1 -1
  268. package/dist/hooks/useMutationObserver.d.ts +2 -1
  269. package/dist/hooks/useMutationObserver.d.ts.map +1 -1
  270. package/dist/hooks/useMutationObserver.js +6 -5
  271. package/dist/hooks/useMutationObserver.js.map +1 -1
  272. package/dist/lib/dom.d.ts.map +1 -1
  273. package/dist/lib/dom.js +7 -1
  274. package/dist/lib/dom.js.map +1 -1
  275. package/dist/lib/floating/customResizeObserver.js.map +1 -1
  276. package/dist/lib/floating/index.d.ts +1 -1
  277. package/dist/lib/floating/index.d.ts.map +1 -1
  278. package/dist/lib/floating/index.js.map +1 -1
  279. package/dist/lib/floating/types/common.d.ts +1 -1
  280. package/dist/lib/floating/types/common.d.ts.map +1 -1
  281. package/dist/lib/floating/types/common.js.map +1 -1
  282. package/dist/lib/sheet/controllers/BottomSheetController.js.map +1 -1
  283. package/dist/lib/sheet/controllers/CSSTransitionController.js.map +1 -1
  284. package/dist/styles/animationVisibilityDelay.d.ts +3 -0
  285. package/dist/styles/animationVisibilityDelay.d.ts.map +1 -0
  286. package/dist/styles/animationVisibilityDelay.js +10 -0
  287. package/dist/styles/animationVisibilityDelay.js.map +1 -0
  288. package/dist/vkui.css +1 -1
  289. package/dist/vkui.css.map +1 -1
  290. package/package.json +3 -6
  291. package/src/components/ActionSheet/ActionSheet.tsx +4 -1
  292. package/src/components/AppRoot/AppRoot.mdx +1 -1
  293. package/src/components/AppRoot/ScrollContext.tsx +2 -2
  294. package/src/components/Banner/Banner.tsx +2 -2
  295. package/src/components/Button/Button.tsx +2 -2
  296. package/src/components/Calendar/Calendar.tsx +8 -7
  297. package/src/components/CalendarRange/CalendarRange.tsx +65 -42
  298. package/src/components/CalendarRange/types.ts +1 -0
  299. package/src/components/CalendarRange/utils.ts +190 -0
  300. package/src/components/Checkbox/Checkbox.tsx +2 -2
  301. package/src/components/ChipsInput/useChipsInput.ts +23 -2
  302. package/src/components/ChipsInputBase/types.ts +5 -1
  303. package/src/components/Clickable/Clickable.tsx +12 -4
  304. package/src/components/Clickable/RealClickable.tsx +1 -0
  305. package/src/components/ContentCard/ContentCard.tsx +2 -2
  306. package/src/components/CustomSelect/CustomSelect.tsx +11 -7
  307. package/src/components/DateInput/DateInput.tsx +41 -43
  308. package/src/components/DateRangeInput/DateRangeInput.tsx +183 -65
  309. package/src/components/FocusTrap/FocusTrap.tsx +3 -0
  310. package/src/components/FormItem/FormItemTop/FormItemTop.mdx +1 -1
  311. package/src/components/HorizontalCell/HorizontalCell.tsx +2 -2
  312. package/src/components/HorizontalScroll/HorizontalCellShowMore/HorizontalCellShowMore.tsx +2 -2
  313. package/src/components/IconButton/IconButton.tsx +2 -2
  314. package/src/components/InputLike/InputLike.tsx +4 -3
  315. package/src/components/Link/Link.tsx +3 -2
  316. package/src/components/MiniInfoCell/MiniInfoCell.tsx +2 -7
  317. package/src/components/ModalOutsideButton/ModalOutsideButton.tsx +2 -2
  318. package/src/components/NumberInputLike/NumberInputLike.tsx +56 -0
  319. package/src/components/Pagination/PaginationPage/PaginationPageButton.tsx +2 -2
  320. package/src/components/PanelHeader/PanelHeader.tsx +3 -1
  321. package/src/components/PanelHeaderButton/PanelHeaderButton.tsx +2 -2
  322. package/src/components/Radio/Radio.tsx +2 -2
  323. package/src/components/Removable/Removable.module.css +9 -0
  324. package/src/components/Removable/Removable.module.css.d.ts.map +1 -1
  325. package/src/components/Removable/Removable.tsx +50 -120
  326. package/src/components/Removable/RemovableIos.tsx +135 -0
  327. package/src/components/RichCell/RichCell.tsx +2 -2
  328. package/src/components/ScreenSpinner/ScreenSpinner.tsx +8 -1
  329. package/src/components/ScreenSpinner/ScreenSpinnerContainer.tsx +4 -1
  330. package/src/components/SelectionControl/SelectionControl.tsx +2 -2
  331. package/src/components/SimpleCell/SimpleCell.tsx +2 -2
  332. package/src/components/Skeleton/Skeleton.tsx +15 -2
  333. package/src/components/Spinner/Spinner.tsx +13 -1
  334. package/src/components/SubnavigationButton/SubnavigationButton.tsx +2 -2
  335. package/src/components/Tabs/Tabs.tsx +23 -19
  336. package/src/components/Tabs/TabsController.ts +37 -0
  337. package/src/components/Tabs/TabsModeContext.ts +24 -0
  338. package/src/components/TabsItem/TabsItem.tsx +22 -5
  339. package/src/components/Tappable/Tappable.tsx +5 -0
  340. package/src/components/ToolButton/ToolButton.tsx +2 -2
  341. package/src/components/UnstyledTextField/UnstyledTextField.mdx +1 -1
  342. package/src/hooks/useCalendar.ts +0 -12
  343. package/src/hooks/useDateInput.ts +21 -12
  344. package/src/hooks/useFocusTrap.ts +10 -1
  345. package/src/hooks/useMutationObserver.ts +7 -4
  346. package/src/lib/dom.tsx +7 -1
  347. package/src/lib/floating/index.ts +2 -0
  348. package/src/lib/floating/types/common.ts +2 -0
  349. package/src/styles/animationVisibilityDelay.module.css +13 -0
  350. package/src/styles/animationVisibilityDelay.module.css.d.ts.map +1 -0
  351. package/src/styles/animationVisibilityDelay.ts +13 -0
@@ -57,7 +57,13 @@ export function getTransformedParentCoords(element) {
57
57
  let parentNode = element.parentNode;
58
58
  while(parentNode !== null){
59
59
  if (isHTMLElement(parentNode)) {
60
- const { transform, willChange } = getComputedStyle(parentNode);
60
+ let { transform, willChange } = getComputedStyle(parentNode);
61
+ if (transform === '') {
62
+ transform = 'unset';
63
+ }
64
+ if (willChange === '') {
65
+ willChange = 'unset';
66
+ }
61
67
  if (!TRANSFORM_DEFAULT_VALUES.includes(transform) || !WILL_CHANGE_DEFAULT_VALUES.includes(willChange)) {
62
68
  const { x, y } = parentNode.getBoundingClientRect();
63
69
  return {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/dom.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { canUseDOM } from '@vkontakte/vkjs';\nimport { rectToClientRect } from '@vkontakte/vkui-floating-ui/core';\nimport {\n getParentNode,\n getWindow,\n isElement,\n isHTMLElement,\n isLastTraversableNode,\n isOverflowElement,\n} from '@vkontakte/vkui-floating-ui/utils/dom';\n\nexport {\n getWindow,\n getNodeScroll,\n isHTMLElement,\n isElement,\n getParentNode,\n} from '@vkontakte/vkui-floating-ui/utils/dom';\n\nexport { canUseDOM, canUseEventListeners, onDOMLoaded } from '@vkontakte/vkjs';\nexport interface DOMContextInterface {\n /**\n * @ignore\n */\n window?: Window;\n /**\n * @ignore\n */\n document?: Document;\n}\n\nexport type DOMProps = DOMContextInterface;\n\n/* eslint-disable no-restricted-globals */\nconst getDOM = (): DOMContextInterface => ({\n window: canUseDOM ? window : undefined,\n document: canUseDOM ? document : undefined,\n});\n/* eslint-enable no-restricted-globals */\n\nexport const DOMContext: React.Context<DOMContextInterface> =\n React.createContext<DOMContextInterface>(getDOM());\n\nexport const useDOM = (): DOMContextInterface => {\n return React.useContext(DOMContext);\n};\n\n/**\n * В случае, если используется DOMContext, при проверке 'node instanceOf Window' – Window может быть\n * другим объектом.\n */\nexport const isWindow = (\n node: Element | Window | VisualViewport | undefined | null,\n): node is Window => {\n return node !== null && node !== undefined && 'navigator' in node;\n};\n\nexport const isBody = (\n node: Element | Window | VisualViewport | undefined | null,\n): node is HTMLBodyElement => {\n return node !== null && node !== undefined && 'tagName' in node && node.tagName === 'BODY';\n};\n\nexport const isDocumentElement = (\n node: Element | Window | VisualViewport | undefined | null,\n): node is HTMLHtmlElement => {\n return node !== null && node !== undefined && 'tagName' in node && node.tagName === 'HTML';\n};\n\nexport function withDOM<Props>(\n Component: React.ComponentType<Props & DOMProps>,\n): React.ComponentType<Props> {\n const WithDOM = (props: Props) => {\n const dom = useDOM();\n return <Component {...props} {...dom} />;\n };\n return WithDOM;\n}\n\nexport function blurActiveElement(document: Document | undefined): void {\n if (document && document.activeElement) {\n (document.activeElement as HTMLElement).blur();\n }\n}\n\nexport const TRANSFORM_DEFAULT_VALUES: string[] = ['none', 'initial', 'inherit', 'unset'];\nexport const WILL_CHANGE_DEFAULT_VALUES: string[] = ['auto', 'initial', 'inherit', 'unset'];\nexport function getTransformedParentCoords(element: Element): {\n x: number;\n y: number;\n} {\n let parentNode = element.parentNode;\n while (parentNode !== null) {\n if (isHTMLElement(parentNode)) {\n const { transform, willChange } = getComputedStyle(parentNode);\n if (\n !TRANSFORM_DEFAULT_VALUES.includes(transform) ||\n !WILL_CHANGE_DEFAULT_VALUES.includes(willChange)\n ) {\n const { x, y } = parentNode.getBoundingClientRect();\n return { x, y };\n }\n }\n parentNode = parentNode.parentNode;\n }\n return { x: 0, y: 0 };\n}\n\nexport const getBoundingClientRect = (node: Element | Window, isFixedStrategy = false) => {\n const element = isWindow(node) ? node.document.documentElement : node;\n const clientRect = element.getBoundingClientRect();\n\n if (isDocumentElement(element)) {\n /**\n * Если на странице не используется `html, body { height: 100% }` (или `height: 100vh`), то\n * `height`, полученный из `document.documentElement.getBoundingClientRect()`, будет возвращать\n * `scrollHeight`, а не `clientHeight`. Поэтому перебиваем `height` на `clientHeight`.\n */\n clientRect.height = element.clientHeight;\n }\n\n let offsetX = 0;\n let offsetY = 0;\n if (isFixedStrategy) {\n const { x, y } = getTransformedParentCoords(element);\n offsetX = x;\n offsetY = y;\n }\n\n return rectToClientRect({\n x: clientRect.left - offsetX,\n y: clientRect.top - offsetY,\n width: clientRect.width,\n height: clientRect.height,\n }) as DOMRect;\n};\n\nexport const getRelativeBoundingClientRect = (parent: Element, child: Element) => {\n const parentRect = getBoundingClientRect(parent);\n const childRect = getBoundingClientRect(child);\n return rectToClientRect({\n x: childRect.left - parentRect.left,\n y: childRect.top - parentRect.top,\n width: childRect.width,\n height: childRect.height,\n }) as DOMRect;\n};\n\n/**\n * Переписанный `getNearestOverflowAncestor` из @floating-ui/utils/dom.\n *\n * [1] добавляем ноду, на которой нужно остановить рекурсию\n * [2] document.body подменяем на window, т.к. на document.body нельзя применить скролл.\n *\n * @link https://github.com/floating-ui/floating-ui/blob/%40floating-ui/dom%401.6.3/packages/utils/src/dom.ts#L143\n */\nexport function getNearestOverflowAncestor(node: Node): HTMLElement | Window | null;\nexport function getNearestOverflowAncestor(node: Node, terminalNode: Node): HTMLElement | null;\nexport function getNearestOverflowAncestor(node: Node, terminalNode?: any): any {\n const parentNode = getParentNode(node);\n\n if (terminalNode === parentNode) {\n return null; /* [1] */\n }\n\n if (isLastTraversableNode(parentNode)) {\n return getWindow(parentNode); /* [2] */\n }\n\n if (isHTMLElement(parentNode) && isOverflowElement(parentNode)) {\n return parentNode;\n }\n\n return getNearestOverflowAncestor(parentNode, terminalNode);\n}\n\nexport const getScrollHeight = (node: Element | Window): number => {\n return isWindow(node) ? node.document.documentElement.scrollHeight : node.scrollHeight;\n};\n\nexport const getScrollRect = (\n node: Element | Window,\n): {\n relative: DOMRect;\n edges: {\n y: [number, number];\n };\n} => {\n const window = isElement(node) ? getWindow(node) : node;\n const scrollElRect = getBoundingClientRect(node);\n\n const edgeTop = window.scrollY + scrollElRect.top;\n const edgeBottom = edgeTop + scrollElRect.height;\n const y: [number, number] = [edgeTop, edgeBottom];\n\n return {\n relative: scrollElRect,\n edges: { y },\n };\n};\n\nexport const getDocumentBody = (node?: any): HTMLElement => getWindow(node).document.body;\n\nexport const getActiveElementByAnotherElement = (el: Element | null): Element | null =>\n el ? el.ownerDocument.activeElement : null;\n\nexport const contains = (parent?: Element | null, child?: Element | null): boolean => {\n return parent && child ? parent.contains(child) : false;\n};\n\nexport const getFirstTouchEventData = (\n event: UIEvent | React.UIEvent<HTMLElement>,\n): {\n screenX: number;\n screenY: number;\n clientX: number;\n clientY: number;\n pageX: number;\n pageY: number;\n} => {\n let dataRaw = (function resolveData() {\n switch (event.type) {\n case 'touchend':\n return (event as TouchEvent).changedTouches[0];\n case 'touchstart':\n case 'touchmove':\n case 'touchcancel':\n return (event as TouchEvent).touches[0];\n case 'mousedown':\n case 'mousemove':\n case 'mouseup':\n case 'mouseleave':\n return event as MouseEvent;\n default:\n return { screenX: 0, screenY: 0, clientX: 0, clientY: 0, pageX: 0, pageY: 0 };\n }\n })();\n /* istanbul ignore if */\n if (process.env.NODE_ENV === 'test') {\n dataRaw = dataRaw\n ? dataRaw\n : { screenX: 0, screenY: 0, clientX: 0, clientY: 0, pageX: 0, pageY: 0 };\n }\n return {\n screenX: dataRaw.screenX || 0,\n screenY: dataRaw.screenY || 0,\n clientX: dataRaw.clientX || 0,\n clientY: dataRaw.clientY || 0,\n pageX: dataRaw.pageX || 0,\n pageY: dataRaw.pageY || 0,\n };\n};\n\n/**\n * ⚠️ В частности, необходимо для iOS 15. Начиная с этой версии в Safari добавили\n * pull-to-refresh. CSS св-во `overflow-behavior` появился только с iOS 16.\n *\n * Во вторую очередь, полезна блокированием скролла, чтобы пользователь дождался обновления\n * данных.\n */\nexport const initializeBrowserGesturePreventionEffect = (window: Window): VoidFunction => {\n const options: AddEventListenerOptions & EventListenerOptions = { passive: false };\n const handleWindowTouchMove = (event: TouchEvent) => {\n event.preventDefault();\n event.stopPropagation();\n };\n\n window.document.documentElement.classList.add('vkui--disable-overscroll-behavior'); // eslint-disable-line no-restricted-properties\n window.addEventListener('touchmove', handleWindowTouchMove, options);\n\n return function dispose() {\n window.document.documentElement.classList.remove('vkui--disable-overscroll-behavior'); // eslint-disable-line no-restricted-properties\n window.removeEventListener('touchmove', handleWindowTouchMove, options);\n };\n};\n\nconst nonTextInputTypes = { button: true, submit: true, reset: true, color: true, file: true, image: true, checkbox: true, radio: true }; // prettier-ignore\n\nexport const isHTMLContentEditableElement = (\n el: Element | null,\n): el is HTMLInputElement | HTMLTextAreaElement | HTMLElement => {\n if (el === null) {\n return false;\n }\n\n if (el.tagName === 'INPUT') {\n // @ts-expect-error: TS2339 за счёт `tagName` удовлетворяемся, что это `HTMLInputElement`\n return !nonTextInputTypes[el.type]; // prettier-ignore\n }\n\n return (\n el.tagName === 'TEXTAREA' ||\n // eslint-disable-next-line no-restricted-properties\n el.closest('[contenteditable=true]') !== null\n );\n};\n\nexport type VisualViewport = {\n offsetTop: number;\n offsetLeft: number;\n width: number;\n height: number;\n};\n\n/**\n * Фоллбек `visualViewport` для **Safari 12**.\n */\nexport function getVisualViewport(win: Window): VisualViewport {\n const result: VisualViewport = { offsetTop: 0, offsetLeft: 0, width: 0, height: 0 };\n if (win.visualViewport) {\n const { offsetTop, offsetLeft, width, height } = win.visualViewport;\n result.offsetTop = Math.round(offsetTop);\n result.offsetLeft = offsetLeft;\n result.width = width;\n result.height = Math.round(height);\n\n return result;\n }\n\n // TODO[Safari@>=13] Удалить фоллбек\n result.offsetTop = win.pageYOffset;\n result.offsetLeft = win.pageXOffset;\n result.width = win.innerWidth; // note: вызывает reflow в отличии от visualViewport\n result.height = win.innerHeight; // note: вызывает reflow в отличии от visualViewport\n return result;\n}\n\nexport const hasSelectionWithRangeType = (node: unknown) => {\n const selection = getWindow(node).getSelection();\n return selection ? selection.type === 'Range' : false;\n};\n\nexport function isSVGElement(value: unknown): value is SVGElement {\n if (!canUseDOM) {\n return false;\n }\n\n return value instanceof SVGElement || value instanceof getWindow(value).SVGElement;\n}\n"],"names":["React","canUseDOM","rectToClientRect","getParentNode","getWindow","isElement","isHTMLElement","isLastTraversableNode","isOverflowElement","getNodeScroll","canUseEventListeners","onDOMLoaded","getDOM","window","undefined","document","DOMContext","createContext","useDOM","useContext","isWindow","node","isBody","tagName","isDocumentElement","withDOM","Component","WithDOM","props","dom","blurActiveElement","activeElement","blur","TRANSFORM_DEFAULT_VALUES","WILL_CHANGE_DEFAULT_VALUES","getTransformedParentCoords","element","parentNode","transform","willChange","getComputedStyle","includes","x","y","getBoundingClientRect","isFixedStrategy","documentElement","clientRect","height","clientHeight","offsetX","offsetY","left","top","width","getRelativeBoundingClientRect","parent","child","parentRect","childRect","getNearestOverflowAncestor","terminalNode","getScrollHeight","scrollHeight","getScrollRect","scrollElRect","edgeTop","scrollY","edgeBottom","relative","edges","getDocumentBody","body","getActiveElementByAnotherElement","el","ownerDocument","contains","getFirstTouchEventData","event","dataRaw","resolveData","type","changedTouches","touches","screenX","screenY","clientX","clientY","pageX","pageY","process","env","NODE_ENV","initializeBrowserGesturePreventionEffect","options","passive","handleWindowTouchMove","preventDefault","stopPropagation","classList","add","addEventListener","dispose","remove","removeEventListener","nonTextInputTypes","button","submit","reset","color","file","image","checkbox","radio","isHTMLContentEditableElement","closest","getVisualViewport","win","result","offsetTop","offsetLeft","visualViewport","Math","round","pageYOffset","pageXOffset","innerWidth","innerHeight","hasSelectionWithRangeType","selection","getSelection","isSVGElement","value","SVGElement"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/lib/dom.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { canUseDOM } from '@vkontakte/vkjs';\nimport { rectToClientRect } from '@vkontakte/vkui-floating-ui/core';\nimport {\n getParentNode,\n getWindow,\n isElement,\n isHTMLElement,\n isLastTraversableNode,\n isOverflowElement,\n} from '@vkontakte/vkui-floating-ui/utils/dom';\n\nexport {\n getWindow,\n getNodeScroll,\n isHTMLElement,\n isElement,\n getParentNode,\n} from '@vkontakte/vkui-floating-ui/utils/dom';\n\nexport { canUseDOM, canUseEventListeners, onDOMLoaded } from '@vkontakte/vkjs';\nexport interface DOMContextInterface {\n /**\n * @ignore\n */\n window?: Window;\n /**\n * @ignore\n */\n document?: Document;\n}\n\nexport type DOMProps = DOMContextInterface;\n\n/* eslint-disable no-restricted-globals */\nconst getDOM = (): DOMContextInterface => ({\n window: canUseDOM ? window : undefined,\n document: canUseDOM ? document : undefined,\n});\n/* eslint-enable no-restricted-globals */\n\nexport const DOMContext: React.Context<DOMContextInterface> =\n React.createContext<DOMContextInterface>(getDOM());\n\nexport const useDOM = (): DOMContextInterface => {\n return React.useContext(DOMContext);\n};\n\n/**\n * В случае, если используется DOMContext, при проверке 'node instanceOf Window' – Window может быть\n * другим объектом.\n */\nexport const isWindow = (\n node: Element | Window | VisualViewport | undefined | null,\n): node is Window => {\n return node !== null && node !== undefined && 'navigator' in node;\n};\n\nexport const isBody = (\n node: Element | Window | VisualViewport | undefined | null,\n): node is HTMLBodyElement => {\n return node !== null && node !== undefined && 'tagName' in node && node.tagName === 'BODY';\n};\n\nexport const isDocumentElement = (\n node: Element | Window | VisualViewport | undefined | null,\n): node is HTMLHtmlElement => {\n return node !== null && node !== undefined && 'tagName' in node && node.tagName === 'HTML';\n};\n\nexport function withDOM<Props>(\n Component: React.ComponentType<Props & DOMProps>,\n): React.ComponentType<Props> {\n const WithDOM = (props: Props) => {\n const dom = useDOM();\n return <Component {...props} {...dom} />;\n };\n return WithDOM;\n}\n\nexport function blurActiveElement(document: Document | undefined): void {\n if (document && document.activeElement) {\n (document.activeElement as HTMLElement).blur();\n }\n}\n\nexport const TRANSFORM_DEFAULT_VALUES: string[] = ['none', 'initial', 'inherit', 'unset'];\nexport const WILL_CHANGE_DEFAULT_VALUES: string[] = ['auto', 'initial', 'inherit', 'unset'];\nexport function getTransformedParentCoords(element: Element): {\n x: number;\n y: number;\n} {\n let parentNode = element.parentNode;\n while (parentNode !== null) {\n if (isHTMLElement(parentNode)) {\n let { transform, willChange } = getComputedStyle(parentNode);\n if (transform === '') {\n transform = 'unset';\n }\n if (willChange === '') {\n willChange = 'unset';\n }\n if (\n !TRANSFORM_DEFAULT_VALUES.includes(transform) ||\n !WILL_CHANGE_DEFAULT_VALUES.includes(willChange)\n ) {\n const { x, y } = parentNode.getBoundingClientRect();\n return { x, y };\n }\n }\n parentNode = parentNode.parentNode;\n }\n return { x: 0, y: 0 };\n}\n\nexport const getBoundingClientRect = (node: Element | Window, isFixedStrategy = false) => {\n const element = isWindow(node) ? node.document.documentElement : node;\n const clientRect = element.getBoundingClientRect();\n\n if (isDocumentElement(element)) {\n /**\n * Если на странице не используется `html, body { height: 100% }` (или `height: 100vh`), то\n * `height`, полученный из `document.documentElement.getBoundingClientRect()`, будет возвращать\n * `scrollHeight`, а не `clientHeight`. Поэтому перебиваем `height` на `clientHeight`.\n */\n clientRect.height = element.clientHeight;\n }\n\n let offsetX = 0;\n let offsetY = 0;\n if (isFixedStrategy) {\n const { x, y } = getTransformedParentCoords(element);\n offsetX = x;\n offsetY = y;\n }\n\n return rectToClientRect({\n x: clientRect.left - offsetX,\n y: clientRect.top - offsetY,\n width: clientRect.width,\n height: clientRect.height,\n }) as DOMRect;\n};\n\nexport const getRelativeBoundingClientRect = (parent: Element, child: Element) => {\n const parentRect = getBoundingClientRect(parent);\n const childRect = getBoundingClientRect(child);\n return rectToClientRect({\n x: childRect.left - parentRect.left,\n y: childRect.top - parentRect.top,\n width: childRect.width,\n height: childRect.height,\n }) as DOMRect;\n};\n\n/**\n * Переписанный `getNearestOverflowAncestor` из @floating-ui/utils/dom.\n *\n * [1] добавляем ноду, на которой нужно остановить рекурсию\n * [2] document.body подменяем на window, т.к. на document.body нельзя применить скролл.\n *\n * @link https://github.com/floating-ui/floating-ui/blob/%40floating-ui/dom%401.6.3/packages/utils/src/dom.ts#L143\n */\nexport function getNearestOverflowAncestor(node: Node): HTMLElement | Window | null;\nexport function getNearestOverflowAncestor(node: Node, terminalNode: Node): HTMLElement | null;\nexport function getNearestOverflowAncestor(node: Node, terminalNode?: any): any {\n const parentNode = getParentNode(node);\n\n if (terminalNode === parentNode) {\n return null; /* [1] */\n }\n\n if (isLastTraversableNode(parentNode)) {\n return getWindow(parentNode); /* [2] */\n }\n\n if (isHTMLElement(parentNode) && isOverflowElement(parentNode)) {\n return parentNode;\n }\n\n return getNearestOverflowAncestor(parentNode, terminalNode);\n}\n\nexport const getScrollHeight = (node: Element | Window): number => {\n return isWindow(node) ? node.document.documentElement.scrollHeight : node.scrollHeight;\n};\n\nexport const getScrollRect = (\n node: Element | Window,\n): {\n relative: DOMRect;\n edges: {\n y: [number, number];\n };\n} => {\n const window = isElement(node) ? getWindow(node) : node;\n const scrollElRect = getBoundingClientRect(node);\n\n const edgeTop = window.scrollY + scrollElRect.top;\n const edgeBottom = edgeTop + scrollElRect.height;\n const y: [number, number] = [edgeTop, edgeBottom];\n\n return {\n relative: scrollElRect,\n edges: { y },\n };\n};\n\nexport const getDocumentBody = (node?: any): HTMLElement => getWindow(node).document.body;\n\nexport const getActiveElementByAnotherElement = (el: Element | null): Element | null =>\n el ? el.ownerDocument.activeElement : null;\n\nexport const contains = (parent?: Element | null, child?: Element | null): boolean => {\n return parent && child ? parent.contains(child) : false;\n};\n\nexport const getFirstTouchEventData = (\n event: UIEvent | React.UIEvent<HTMLElement>,\n): {\n screenX: number;\n screenY: number;\n clientX: number;\n clientY: number;\n pageX: number;\n pageY: number;\n} => {\n let dataRaw = (function resolveData() {\n switch (event.type) {\n case 'touchend':\n return (event as TouchEvent).changedTouches[0];\n case 'touchstart':\n case 'touchmove':\n case 'touchcancel':\n return (event as TouchEvent).touches[0];\n case 'mousedown':\n case 'mousemove':\n case 'mouseup':\n case 'mouseleave':\n return event as MouseEvent;\n default:\n return { screenX: 0, screenY: 0, clientX: 0, clientY: 0, pageX: 0, pageY: 0 };\n }\n })();\n /* istanbul ignore if */\n if (process.env.NODE_ENV === 'test') {\n dataRaw = dataRaw\n ? dataRaw\n : { screenX: 0, screenY: 0, clientX: 0, clientY: 0, pageX: 0, pageY: 0 };\n }\n return {\n screenX: dataRaw.screenX || 0,\n screenY: dataRaw.screenY || 0,\n clientX: dataRaw.clientX || 0,\n clientY: dataRaw.clientY || 0,\n pageX: dataRaw.pageX || 0,\n pageY: dataRaw.pageY || 0,\n };\n};\n\n/**\n * ⚠️ В частности, необходимо для iOS 15. Начиная с этой версии в Safari добавили\n * pull-to-refresh. CSS св-во `overflow-behavior` появился только с iOS 16.\n *\n * Во вторую очередь, полезна блокированием скролла, чтобы пользователь дождался обновления\n * данных.\n */\nexport const initializeBrowserGesturePreventionEffect = (window: Window): VoidFunction => {\n const options: AddEventListenerOptions & EventListenerOptions = { passive: false };\n const handleWindowTouchMove = (event: TouchEvent) => {\n event.preventDefault();\n event.stopPropagation();\n };\n\n window.document.documentElement.classList.add('vkui--disable-overscroll-behavior'); // eslint-disable-line no-restricted-properties\n window.addEventListener('touchmove', handleWindowTouchMove, options);\n\n return function dispose() {\n window.document.documentElement.classList.remove('vkui--disable-overscroll-behavior'); // eslint-disable-line no-restricted-properties\n window.removeEventListener('touchmove', handleWindowTouchMove, options);\n };\n};\n\nconst nonTextInputTypes = { button: true, submit: true, reset: true, color: true, file: true, image: true, checkbox: true, radio: true }; // prettier-ignore\n\nexport const isHTMLContentEditableElement = (\n el: Element | null,\n): el is HTMLInputElement | HTMLTextAreaElement | HTMLElement => {\n if (el === null) {\n return false;\n }\n\n if (el.tagName === 'INPUT') {\n // @ts-expect-error: TS2339 за счёт `tagName` удовлетворяемся, что это `HTMLInputElement`\n return !nonTextInputTypes[el.type]; // prettier-ignore\n }\n\n return (\n el.tagName === 'TEXTAREA' ||\n // eslint-disable-next-line no-restricted-properties\n el.closest('[contenteditable=true]') !== null\n );\n};\n\nexport type VisualViewport = {\n offsetTop: number;\n offsetLeft: number;\n width: number;\n height: number;\n};\n\n/**\n * Фоллбек `visualViewport` для **Safari 12**.\n */\nexport function getVisualViewport(win: Window): VisualViewport {\n const result: VisualViewport = { offsetTop: 0, offsetLeft: 0, width: 0, height: 0 };\n if (win.visualViewport) {\n const { offsetTop, offsetLeft, width, height } = win.visualViewport;\n result.offsetTop = Math.round(offsetTop);\n result.offsetLeft = offsetLeft;\n result.width = width;\n result.height = Math.round(height);\n\n return result;\n }\n\n // TODO[Safari@>=13] Удалить фоллбек\n result.offsetTop = win.pageYOffset;\n result.offsetLeft = win.pageXOffset;\n result.width = win.innerWidth; // note: вызывает reflow в отличии от visualViewport\n result.height = win.innerHeight; // note: вызывает reflow в отличии от visualViewport\n return result;\n}\n\nexport const hasSelectionWithRangeType = (node: unknown) => {\n const selection = getWindow(node).getSelection();\n return selection ? selection.type === 'Range' : false;\n};\n\nexport function isSVGElement(value: unknown): value is SVGElement {\n if (!canUseDOM) {\n return false;\n }\n\n return value instanceof SVGElement || value instanceof getWindow(value).SVGElement;\n}\n"],"names":["React","canUseDOM","rectToClientRect","getParentNode","getWindow","isElement","isHTMLElement","isLastTraversableNode","isOverflowElement","getNodeScroll","canUseEventListeners","onDOMLoaded","getDOM","window","undefined","document","DOMContext","createContext","useDOM","useContext","isWindow","node","isBody","tagName","isDocumentElement","withDOM","Component","WithDOM","props","dom","blurActiveElement","activeElement","blur","TRANSFORM_DEFAULT_VALUES","WILL_CHANGE_DEFAULT_VALUES","getTransformedParentCoords","element","parentNode","transform","willChange","getComputedStyle","includes","x","y","getBoundingClientRect","isFixedStrategy","documentElement","clientRect","height","clientHeight","offsetX","offsetY","left","top","width","getRelativeBoundingClientRect","parent","child","parentRect","childRect","getNearestOverflowAncestor","terminalNode","getScrollHeight","scrollHeight","getScrollRect","scrollElRect","edgeTop","scrollY","edgeBottom","relative","edges","getDocumentBody","body","getActiveElementByAnotherElement","el","ownerDocument","contains","getFirstTouchEventData","event","dataRaw","resolveData","type","changedTouches","touches","screenX","screenY","clientX","clientY","pageX","pageY","process","env","NODE_ENV","initializeBrowserGesturePreventionEffect","options","passive","handleWindowTouchMove","preventDefault","stopPropagation","classList","add","addEventListener","dispose","remove","removeEventListener","nonTextInputTypes","button","submit","reset","color","file","image","checkbox","radio","isHTMLContentEditableElement","closest","getVisualViewport","win","result","offsetTop","offsetLeft","visualViewport","Math","round","pageYOffset","pageXOffset","innerWidth","innerHeight","hasSelectionWithRangeType","selection","getSelection","isSVGElement","value","SVGElement"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/lib/floating/customResizeObserver.ts"],"sourcesContent":["const defaultIframeStyles: Pick<\n CSSStyleDeclaration,\n | 'position'\n | 'left'\n | 'top'\n | 'zIndex'\n | 'width'\n | 'height'\n | 'pointerEvents'\n | 'opacity'\n | 'border'\n> = {\n position: 'absolute',\n left: '0',\n top: '0',\n zIndex: '-1',\n width: '100%',\n height: '100%',\n pointerEvents: 'none',\n opacity: '0',\n border: '0',\n};\n\n/*\n * Специальный CustomResizeObserver как fallback для ResizeObserver\n * Используется для вызова update() функции (перерисовка плавающего окна) floating-ui\n * при изменении размера reference или floating элементов.\n *\n * По умолчанию пытаемся нарисовать скрытый, абсолютно позиционированный относительно\n * наблюдаемого элемента iframe.\n * В случае же, если наблюдаемый элемент имеет position: static, то правильно спозиционировать\n * iframe у нас не получится, поэтому в такой ситуации мы используем MutationObserver.\n *\n * Использовать только MutationObserver мы не можем, потому что с помощью него нельзя отследить\n * изменение размера вызванное переполнением текста.\n *\n * Применяется только если нету поддержики или полифила ResizeObserver.\n * */\nexport class CustomResizeObserver {\n records: Array<{\n target: HTMLElement;\n iframe: HTMLIFrameElement;\n }> = [];\n mutationObserverFallback: MutationObserver | null = null;\n private readonly updateFunction: () => void;\n\n constructor(updateFunction: () => void) {\n this.updateFunction = updateFunction;\n }\n\n observe(element: HTMLElement): void {\n if (isPositioned(element)) {\n return this.observeUsingIframe(element);\n }\n return this.observeUsingMutationObserver(element);\n }\n\n appendToTheDOM(): void {\n for (let record of this.records) {\n record.target.appendChild(record.iframe);\n }\n\n for (let record of this.records) {\n if (record.iframe.contentWindow) {\n record.iframe.contentWindow.addEventListener('resize', this.updateFunction);\n }\n }\n }\n\n observeUsingIframe(element: HTMLElement): void {\n const iframe = element.ownerDocument.createElement('iframe');\n iframe.ariaHidden = 'true';\n iframe.tabIndex = -1;\n Object.assign(iframe.style, defaultIframeStyles);\n\n this.records.push({ target: element, iframe });\n }\n\n observeUsingMutationObserver(element: HTMLElement): void {\n if (!this.mutationObserverFallback) {\n this.mutationObserverFallback = new MutationObserver(this.updateFunction);\n }\n\n this.mutationObserverFallback.observe(element, {\n childList: true,\n subtree: true,\n });\n }\n\n disconnect(): void {\n this.records.map(({ target, iframe }) => {\n if (iframe.contentWindow) {\n iframe.contentWindow.removeEventListener('resize', this.updateFunction);\n }\n\n target.removeChild(iframe);\n });\n this.records = [];\n\n if (this.mutationObserverFallback) {\n this.mutationObserverFallback.disconnect();\n }\n this.mutationObserverFallback = null;\n }\n}\n\nfunction isPositioned(element: HTMLElement): boolean {\n return getComputedStyle(element).position !== 'static';\n}\n"],"names":["defaultIframeStyles","position","left","top","zIndex","width","height","pointerEvents","opacity","border","CustomResizeObserver","records","mutationObserverFallback","updateFunction","constructor","observe","element","isPositioned","observeUsingIframe","observeUsingMutationObserver","appendToTheDOM","record","target","appendChild","iframe","contentWindow","addEventListener","ownerDocument","createElement","ariaHidden","tabIndex","Object","assign","style","push","MutationObserver","childList","subtree","disconnect","map","removeEventListener","removeChild","getComputedStyle"],"mappings":"AAAA,MAAMA,sBAWF;IACFC,UAAU;IACVC,MAAM;IACNC,KAAK;IACLC,QAAQ;IACRC,OAAO;IACPC,QAAQ;IACRC,eAAe;IACfC,SAAS;IACTC,QAAQ;AACV;AAEA;;;;;;;;;;;;;;GAcG,GACH,OAAO,MAAMC;IACXC,UAGK,EAAE,CAAC;IACRC,2BAAoD,KAAK;IACxCC,eAA2B;IAE5CC,YAAYD,cAA0B,CAAE;QACtC,IAAI,CAACA,cAAc,GAAGA;IACxB;IAEAE,QAAQC,OAAoB,EAAQ;QAClC,IAAIC,aAAaD,UAAU;YACzB,OAAO,IAAI,CAACE,kBAAkB,CAACF;QACjC;QACA,OAAO,IAAI,CAACG,4BAA4B,CAACH;IAC3C;IAEAI,iBAAuB;QACrB,KAAK,IAAIC,UAAU,IAAI,CAACV,OAAO,CAAE;YAC/BU,OAAOC,MAAM,CAACC,WAAW,CAACF,OAAOG,MAAM;QACzC;QAEA,KAAK,IAAIH,UAAU,IAAI,CAACV,OAAO,CAAE;YAC/B,IAAIU,OAAOG,MAAM,CAACC,aAAa,EAAE;gBAC/BJ,OAAOG,MAAM,CAACC,aAAa,CAACC,gBAAgB,CAAC,UAAU,IAAI,CAACb,cAAc;YAC5E;QACF;IACF;IAEAK,mBAAmBF,OAAoB,EAAQ;QAC7C,MAAMQ,SAASR,QAAQW,aAAa,CAACC,aAAa,CAAC;QACnDJ,OAAOK,UAAU,GAAG;QACpBL,OAAOM,QAAQ,GAAG,CAAC;QACnBC,OAAOC,MAAM,CAACR,OAAOS,KAAK,EAAEjC;QAE5B,IAAI,CAACW,OAAO,CAACuB,IAAI,CAAC;YAAEZ,QAAQN;YAASQ;QAAO;IAC9C;IAEAL,6BAA6BH,OAAoB,EAAQ;QACvD,IAAI,CAAC,IAAI,CAACJ,wBAAwB,EAAE;YAClC,IAAI,CAACA,wBAAwB,GAAG,IAAIuB,iBAAiB,IAAI,CAACtB,cAAc;QAC1E;QAEA,IAAI,CAACD,wBAAwB,CAACG,OAAO,CAACC,SAAS;YAC7CoB,WAAW;YACXC,SAAS;QACX;IACF;IAEAC,aAAmB;QACjB,IAAI,CAAC3B,OAAO,CAAC4B,GAAG,CAAC,CAAC,EAAEjB,MAAM,EAAEE,MAAM,EAAE;YAClC,IAAIA,OAAOC,aAAa,EAAE;gBACxBD,OAAOC,aAAa,CAACe,mBAAmB,CAAC,UAAU,IAAI,CAAC3B,cAAc;YACxE;YAEAS,OAAOmB,WAAW,CAACjB;QACrB;QACA,IAAI,CAACb,OAAO,GAAG,EAAE;QAEjB,IAAI,IAAI,CAACC,wBAAwB,EAAE;YACjC,IAAI,CAACA,wBAAwB,CAAC0B,UAAU;QAC1C;QACA,IAAI,CAAC1B,wBAAwB,GAAG;IAClC;AACF;AAEA,SAASK,aAAaD,OAAoB;IACxC,OAAO0B,iBAAiB1B,SAASf,QAAQ,KAAK;AAChD"}
1
+ {"version":3,"sources":["../../../../src/lib/floating/customResizeObserver.ts"],"sourcesContent":["const defaultIframeStyles: Pick<\n CSSStyleDeclaration,\n | 'position'\n | 'left'\n | 'top'\n | 'zIndex'\n | 'width'\n | 'height'\n | 'pointerEvents'\n | 'opacity'\n | 'border'\n> = {\n position: 'absolute',\n left: '0',\n top: '0',\n zIndex: '-1',\n width: '100%',\n height: '100%',\n pointerEvents: 'none',\n opacity: '0',\n border: '0',\n};\n\n/*\n * Специальный CustomResizeObserver как fallback для ResizeObserver\n * Используется для вызова update() функции (перерисовка плавающего окна) floating-ui\n * при изменении размера reference или floating элементов.\n *\n * По умолчанию пытаемся нарисовать скрытый, абсолютно позиционированный относительно\n * наблюдаемого элемента iframe.\n * В случае же, если наблюдаемый элемент имеет position: static, то правильно спозиционировать\n * iframe у нас не получится, поэтому в такой ситуации мы используем MutationObserver.\n *\n * Использовать только MutationObserver мы не можем, потому что с помощью него нельзя отследить\n * изменение размера вызванное переполнением текста.\n *\n * Применяется только если нету поддержики или полифила ResizeObserver.\n * */\nexport class CustomResizeObserver {\n records: Array<{\n target: HTMLElement;\n iframe: HTMLIFrameElement;\n }> = [];\n mutationObserverFallback: MutationObserver | null = null;\n private readonly updateFunction: () => void;\n\n constructor(updateFunction: () => void) {\n this.updateFunction = updateFunction;\n }\n\n observe(element: HTMLElement): void {\n if (isPositioned(element)) {\n return this.observeUsingIframe(element);\n }\n return this.observeUsingMutationObserver(element);\n }\n\n appendToTheDOM(): void {\n for (let record of this.records) {\n record.target.appendChild(record.iframe);\n }\n\n for (let record of this.records) {\n if (record.iframe.contentWindow) {\n record.iframe.contentWindow.addEventListener('resize', this.updateFunction);\n }\n }\n }\n\n observeUsingIframe(element: HTMLElement): void {\n const iframe = element.ownerDocument.createElement('iframe');\n iframe.ariaHidden = 'true';\n iframe.tabIndex = -1;\n Object.assign(iframe.style, defaultIframeStyles);\n\n this.records.push({ target: element, iframe });\n }\n\n observeUsingMutationObserver(element: HTMLElement): void {\n if (!this.mutationObserverFallback) {\n this.mutationObserverFallback = new MutationObserver(this.updateFunction);\n }\n\n this.mutationObserverFallback.observe(element, {\n childList: true,\n subtree: true,\n });\n }\n\n disconnect(): void {\n this.records.map(({ target, iframe }) => {\n if (iframe.contentWindow) {\n iframe.contentWindow.removeEventListener('resize', this.updateFunction);\n }\n\n target.removeChild(iframe);\n });\n this.records = [];\n\n if (this.mutationObserverFallback) {\n this.mutationObserverFallback.disconnect();\n }\n this.mutationObserverFallback = null;\n }\n}\n\nfunction isPositioned(element: HTMLElement): boolean {\n return getComputedStyle(element).position !== 'static';\n}\n"],"names":["defaultIframeStyles","position","left","top","zIndex","width","height","pointerEvents","opacity","border","CustomResizeObserver","records","mutationObserverFallback","updateFunction","observe","element","isPositioned","observeUsingIframe","observeUsingMutationObserver","appendToTheDOM","record","target","appendChild","iframe","contentWindow","addEventListener","ownerDocument","createElement","ariaHidden","tabIndex","Object","assign","style","push","MutationObserver","childList","subtree","disconnect","map","removeEventListener","removeChild","getComputedStyle"],"mappings":"AAAA,MAAMA,sBAWF;IACFC,UAAU;IACVC,MAAM;IACNC,KAAK;IACLC,QAAQ;IACRC,OAAO;IACPC,QAAQ;IACRC,eAAe;IACfC,SAAS;IACTC,QAAQ;AACV;AAEA;;;;;;;;;;;;;;GAcG,GACH,OAAO,MAAMC;IACXC,UAGK,EAAE,CAAC;IACRC,2BAAoD,KAAK;IACxCC,eAA2B;IAE5C,YAAYA,cAA0B,CAAE;QACtC,IAAI,CAACA,cAAc,GAAGA;IACxB;IAEAC,QAAQC,OAAoB,EAAQ;QAClC,IAAIC,aAAaD,UAAU;YACzB,OAAO,IAAI,CAACE,kBAAkB,CAACF;QACjC;QACA,OAAO,IAAI,CAACG,4BAA4B,CAACH;IAC3C;IAEAI,iBAAuB;QACrB,KAAK,IAAIC,UAAU,IAAI,CAACT,OAAO,CAAE;YAC/BS,OAAOC,MAAM,CAACC,WAAW,CAACF,OAAOG,MAAM;QACzC;QAEA,KAAK,IAAIH,UAAU,IAAI,CAACT,OAAO,CAAE;YAC/B,IAAIS,OAAOG,MAAM,CAACC,aAAa,EAAE;gBAC/BJ,OAAOG,MAAM,CAACC,aAAa,CAACC,gBAAgB,CAAC,UAAU,IAAI,CAACZ,cAAc;YAC5E;QACF;IACF;IAEAI,mBAAmBF,OAAoB,EAAQ;QAC7C,MAAMQ,SAASR,QAAQW,aAAa,CAACC,aAAa,CAAC;QACnDJ,OAAOK,UAAU,GAAG;QACpBL,OAAOM,QAAQ,GAAG,CAAC;QACnBC,OAAOC,MAAM,CAACR,OAAOS,KAAK,EAAEhC;QAE5B,IAAI,CAACW,OAAO,CAACsB,IAAI,CAAC;YAAEZ,QAAQN;YAASQ;QAAO;IAC9C;IAEAL,6BAA6BH,OAAoB,EAAQ;QACvD,IAAI,CAAC,IAAI,CAACH,wBAAwB,EAAE;YAClC,IAAI,CAACA,wBAAwB,GAAG,IAAIsB,iBAAiB,IAAI,CAACrB,cAAc;QAC1E;QAEA,IAAI,CAACD,wBAAwB,CAACE,OAAO,CAACC,SAAS;YAC7CoB,WAAW;YACXC,SAAS;QACX;IACF;IAEAC,aAAmB;QACjB,IAAI,CAAC1B,OAAO,CAAC2B,GAAG,CAAC,CAAC,EAAEjB,MAAM,EAAEE,MAAM,EAAE;YAClC,IAAIA,OAAOC,aAAa,EAAE;gBACxBD,OAAOC,aAAa,CAACe,mBAAmB,CAAC,UAAU,IAAI,CAAC1B,cAAc;YACxE;YAEAQ,OAAOmB,WAAW,CAACjB;QACrB;QACA,IAAI,CAACZ,OAAO,GAAG,EAAE;QAEjB,IAAI,IAAI,CAACC,wBAAwB,EAAE;YACjC,IAAI,CAACA,wBAAwB,CAACyB,UAAU;QAC1C;QACA,IAAI,CAACzB,wBAAwB,GAAG;IAClC;AACF;AAEA,SAASI,aAAaD,OAAoB;IACxC,OAAO0B,iBAAiB1B,SAASd,QAAQ,KAAK;AAChD"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/lib/floating/index.ts"],"sourcesContent":["export type {\n UseFloatingOptions,\n Placement,\n VirtualElement,\n PlacementWithAuto,\n AutoPlacementType,\n UseFloatingMiddleware,\n OnPlacementChange,\n} from './types/common';\n\nexport type { FloatingComponentProps, FloatingContentRenderProp } from './types/component';\n\nexport {\n checkIsNotAutoPlacement,\n getAutoPlacementAlign,\n convertFloatingDataToReactCSSProperties,\n getArrowCoordsByMiddlewareData,\n} from './functions';\n\nexport {\n useFloating,\n offsetMiddleware,\n flipMiddleware,\n shiftMiddleware,\n autoPlacementMiddleware,\n arrowMiddleware,\n sizeMiddleware,\n hideMiddleware,\n getOverflowAncestors,\n autoUpdateFloatingElement,\n} from './adapters';\n\nexport {\n type UseFloatingMiddlewaresBootstrapOptions,\n useFloatingMiddlewaresBootstrap,\n} from './useFloatingMiddlewaresBootstrap';\n\nexport * from './useFloatingWithInteractions';\n\nexport { usePlacementChangeCallback } from './usePlacementChangeCallback';\n"],"names":["checkIsNotAutoPlacement","getAutoPlacementAlign","convertFloatingDataToReactCSSProperties","getArrowCoordsByMiddlewareData","useFloating","offsetMiddleware","flipMiddleware","shiftMiddleware","autoPlacementMiddleware","arrowMiddleware","sizeMiddleware","hideMiddleware","getOverflowAncestors","autoUpdateFloatingElement","useFloatingMiddlewaresBootstrap","usePlacementChangeCallback"],"mappings":"AAYA,SACEA,uBAAuB,EACvBC,qBAAqB,EACrBC,uCAAuC,EACvCC,8BAA8B,QACzB,iBAAc;AAErB,SACEC,WAAW,EACXC,gBAAgB,EAChBC,cAAc,EACdC,eAAe,EACfC,uBAAuB,EACvBC,eAAe,EACfC,cAAc,EACdC,cAAc,EACdC,oBAAoB,EACpBC,yBAAyB,QACpB,gBAAa;AAEpB,SAEEC,+BAA+B,QAC1B,6CAAoC;AAE3C,cAAc,yCAAgC;AAE9C,SAASC,0BAA0B,QAAQ,kCAA+B"}
1
+ {"version":3,"sources":["../../../../src/lib/floating/index.ts"],"sourcesContent":["export type {\n UseFloatingOptions,\n Placement,\n Side,\n Alignment,\n VirtualElement,\n PlacementWithAuto,\n AutoPlacementType,\n UseFloatingMiddleware,\n OnPlacementChange,\n} from './types/common';\n\nexport type { FloatingComponentProps, FloatingContentRenderProp } from './types/component';\n\nexport {\n checkIsNotAutoPlacement,\n getAutoPlacementAlign,\n convertFloatingDataToReactCSSProperties,\n getArrowCoordsByMiddlewareData,\n} from './functions';\n\nexport {\n useFloating,\n offsetMiddleware,\n flipMiddleware,\n shiftMiddleware,\n autoPlacementMiddleware,\n arrowMiddleware,\n sizeMiddleware,\n hideMiddleware,\n getOverflowAncestors,\n autoUpdateFloatingElement,\n} from './adapters';\n\nexport {\n type UseFloatingMiddlewaresBootstrapOptions,\n useFloatingMiddlewaresBootstrap,\n} from './useFloatingMiddlewaresBootstrap';\n\nexport * from './useFloatingWithInteractions';\n\nexport { usePlacementChangeCallback } from './usePlacementChangeCallback';\n"],"names":["checkIsNotAutoPlacement","getAutoPlacementAlign","convertFloatingDataToReactCSSProperties","getArrowCoordsByMiddlewareData","useFloating","offsetMiddleware","flipMiddleware","shiftMiddleware","autoPlacementMiddleware","arrowMiddleware","sizeMiddleware","hideMiddleware","getOverflowAncestors","autoUpdateFloatingElement","useFloatingMiddlewaresBootstrap","usePlacementChangeCallback"],"mappings":"AAcA,SACEA,uBAAuB,EACvBC,qBAAqB,EACrBC,uCAAuC,EACvCC,8BAA8B,QACzB,iBAAc;AAErB,SACEC,WAAW,EACXC,gBAAgB,EAChBC,cAAc,EACdC,eAAe,EACfC,uBAAuB,EACvBC,eAAe,EACfC,cAAc,EACdC,cAAc,EACdC,oBAAoB,EACpBC,yBAAyB,QACpB,gBAAa;AAEpB,SAEEC,+BAA+B,QAC1B,6CAAoC;AAE3C,cAAc,yCAAgC;AAE9C,SAASC,0BAA0B,QAAQ,kCAA+B"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/lib/floating/types/common.ts"],"sourcesContent":["import type {\n Placement,\n ReferenceType,\n UseFloatingReturn,\n} from '@vkontakte/vkui-floating-ui/react-dom';\n\nexport type AutoPlacementType = 'auto' | 'auto-start' | 'auto-end';\n\nexport type PlacementWithAuto = AutoPlacementType | Placement;\n\nexport type {\n VirtualElement,\n UseFloatingOptions,\n ReferenceType,\n ArrowOptions,\n UseFloatingReturn,\n Placement,\n Middleware as UseFloatingMiddleware,\n UseFloatingData,\n Strategy as FloatingPositionStrategy,\n} from '@vkontakte/vkui-floating-ui/react-dom';\n\nexport type UseFloatingRefs<RT extends ReferenceType = ReferenceType> =\n UseFloatingReturn<RT>['refs'];\n\nexport type OnPlacementChange = (nextPlacement: Placement) => void;\n"],"names":[],"mappings":"AAyBA,WAAmE"}
1
+ {"version":3,"sources":["../../../../../src/lib/floating/types/common.ts"],"sourcesContent":["import type {\n Placement,\n ReferenceType,\n UseFloatingReturn,\n} from '@vkontakte/vkui-floating-ui/react-dom';\n\nexport type AutoPlacementType = 'auto' | 'auto-start' | 'auto-end';\n\nexport type PlacementWithAuto = AutoPlacementType | Placement;\n\nexport type {\n VirtualElement,\n UseFloatingOptions,\n ReferenceType,\n ArrowOptions,\n UseFloatingReturn,\n Placement,\n Side,\n Alignment,\n Middleware as UseFloatingMiddleware,\n UseFloatingData,\n Strategy as FloatingPositionStrategy,\n} from '@vkontakte/vkui-floating-ui/react-dom';\n\nexport type UseFloatingRefs<RT extends ReferenceType = ReferenceType> =\n UseFloatingReturn<RT>['refs'];\n\nexport type OnPlacementChange = (nextPlacement: Placement) => void;\n"],"names":[],"mappings":"AA2BA,WAAmE"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/lib/sheet/controllers/BottomSheetController.ts"],"sourcesContent":["import { noop } from '@vkontakte/vkjs';\nimport { clamp } from '../../../helpers/math';\nimport { rubberbandIfOutOfBounds } from '../../animation';\nimport { getNearestOverflowAncestor, hasSelectionWithRangeType } from '../../dom';\nimport { UIPanGestureRecognizer } from '../../touch/UIPanGestureRecognizer';\nimport {\n BLOCK_SHEET_BEHAVIOR_DATA_ATTRIBUTE_KEY,\n DRAG_THRESHOLDS,\n DYNAMIC_SNAP_POINT_DATA,\n SNAP_POINT_DETENTS,\n} from '../constants';\nimport type { CSSTransitionController } from './CSSTransitionController';\n\nexport type SnapPointDetents = [number, number] | [number, number, number];\n\nexport type SnapPoint = 'auto' | { initial: number; detents: SnapPointDetents };\n\nexport type SnapPointChange = (snapPoint: number) => void;\n\nexport type BottomSheetControllerOptions = {\n sheetScrollEl: HTMLElement | null;\n sheetTransitionController: CSSTransitionController<string>;\n backdropTransitionController: CSSTransitionController | null;\n onSnapPointChange: SnapPointChange;\n onDismiss: VoidFunction;\n};\n\nexport class BottomSheetController {\n private readonly sheetEl: HTMLElement;\n\n constructor(\n sheetEl: HTMLElement,\n {\n sheetScrollEl,\n sheetTransitionController,\n backdropTransitionController,\n onSnapPointChange,\n onDismiss,\n }: BottomSheetControllerOptions,\n ) {\n this.sheetEl = sheetEl;\n this.onSnapPointChange = onSnapPointChange;\n this.onDismiss = onDismiss;\n this.panGestureRecognizer = new UIPanGestureRecognizer();\n this.sheetScrollEl = sheetScrollEl;\n this.sheetTransitionController = sheetTransitionController;\n this.backdropTransitionController = backdropTransitionController;\n }\n\n init(snapPoint: SnapPoint) {\n this.isInitialized = true;\n\n if (snapPoint === 'auto') {\n this.unit = 'px';\n this.currentSnapPoint = DYNAMIC_SNAP_POINT_DATA.IDLE_POINT_VALUE;\n this.snapPointDetents = [SNAP_POINT_DETENTS.MIN, DYNAMIC_SNAP_POINT_DATA.IDLE_POINT_VALUE];\n } else {\n this.unit = '%';\n this.currentSnapPoint = snapPoint.initial;\n this.snapPointDetents = snapPoint.detents;\n }\n }\n\n destroy() {\n this.isInitialized = false;\n this.pannedEl = null;\n this.sheetTransitionController.cleanup();\n this.backdropTransitionController?.cleanup();\n\n this.disableVerticalScrollBouncingDispose();\n this.disableVerticalScrollBouncingDispose = noop;\n }\n\n panStart(event: UIEvent) {\n if (\n !this.isInitialized ||\n this.panState !== 'idle' ||\n hasSelectionWithRangeType(event.target)\n ) {\n return;\n }\n\n this.panState = 'start';\n this.pannedEl = event.target as HTMLElement;\n this.panGestureRecognizer.setStartCoords(event);\n }\n\n panMove(event: UIEvent) {\n switch (this.panState) {\n case 'start':\n this.panGestureRecognizer.setInitialTimeOnce();\n this.panGestureRecognizer.setEndCoords(event);\n\n if (this.preventUntilPanGestureBecomesExpected()) {\n return;\n }\n\n if (this.preventImmediatelyIfPannedElIsNotValid()) {\n this.panState = 'idle';\n return;\n }\n\n if (this.preventUntilVerticalScrollingOnSheetScrollElBecomesExpected()) {\n return;\n }\n\n if (this.preventImmediatelyIfVerticalScrollingOnPannedElIsScrolled()) {\n this.panState = 'idle';\n return;\n }\n\n this.panState = 'moving';\n this.panGestureRecognizer.setStartCoords(event);\n\n this.sheetHeight = this.sheetEl.offsetHeight;\n\n this.disableVerticalScrollBouncingDispose =\n BottomSheetController.disableVerticalScrollBouncingIfNeeded(\n this.sheetScrollEl,\n this.pannedEl,\n );\n\n if (this.isDynamicSnapPoint) {\n this.currentSnapPoint = this.sheetHeight;\n this.snapPointDetents[DYNAMIC_SNAP_POINT_DATA.COMPUTED_INDEX] = this.sheetHeight;\n }\n break;\n case 'moving':\n this.panGestureRecognizer.setEndCoords(event);\n\n const { y1, y2 } = this.panGestureRecognizer;\n\n this.nextSnapPoint = rubberbandIfOutOfBounds(\n this.currentSnapPoint - ((y2 - y1) / this.sheetHeight) * this.currentSnapPoint,\n SNAP_POINT_DETENTS.MIN,\n this.isDynamicSnapPoint ? this.sheetHeight : SNAP_POINT_DETENTS.LARGE,\n );\n\n this.calculateSnapPoint(this.nextSnapPoint, true);\n break;\n }\n }\n\n panEnd() {\n switch (this.panState) {\n case 'moving':\n const prevCurrentSnapPoint = this.currentSnapPoint;\n this.currentSnapPoint = this.getSnapPointTo(this.nextSnapPoint);\n\n if (\n prevCurrentSnapPoint !== this.currentSnapPoint &&\n this.currentSnapPoint > SNAP_POINT_DETENTS.MIN\n ) {\n this.onSnapPointChange(this.currentSnapPoint);\n }\n\n this.calculateSnapPoint(this.currentSnapPoint);\n break;\n }\n\n this.panState = 'idle';\n this.panGestureRecognizer.reset();\n\n this.disableVerticalScrollBouncingDispose();\n this.disableVerticalScrollBouncingDispose = noop;\n }\n\n private isInitialized = false;\n private panState: 'idle' | 'start' | 'moving' = 'idle';\n private pannedEl: HTMLElement | null = null;\n private sheetHeight = 0;\n private rafId: number | null = null;\n private currentSnapPoint = 0;\n private nextSnapPoint = 0;\n private snapPointDetents: SnapPointDetents = [0, 0];\n private unit: 'px' | '%' = '%';\n private get isDynamicSnapPoint() {\n return this.unit === 'px';\n }\n private disableVerticalScrollBouncingDispose = noop;\n private readonly sheetScrollEl: HTMLElement | null;\n private readonly sheetTransitionController: CSSTransitionController<string>;\n private readonly backdropTransitionController: CSSTransitionController | null;\n private readonly panGestureRecognizer: UIPanGestureRecognizer;\n private readonly onSnapPointChange: SnapPointChange;\n private readonly onDismiss: VoidFunction;\n\n private calculateSnapPoint(nextSnapPoint: number, immediately = false) {\n if (this.rafId !== null) {\n cancelAnimationFrame(this.rafId);\n }\n\n if (nextSnapPoint <= SNAP_POINT_DETENTS.MIN) {\n this.sheetTransitionController.enableTransition();\n this.backdropTransitionController?.enableTransition();\n this.panState = 'idle';\n this.onDismiss();\n return;\n }\n\n const backdropOpacity = clamp(\n this.isDynamicSnapPoint\n ? nextSnapPoint / this.sheetHeight\n : (nextSnapPoint * 2) / SNAP_POINT_DETENTS.LARGE,\n 0,\n 1,\n );\n\n this.rafId = requestAnimationFrame(() => {\n if (immediately) {\n this.backdropTransitionController?.disableTransition().set(backdropOpacity);\n this.sheetTransitionController.disableTransition().set(`${nextSnapPoint}${this.unit}`);\n return;\n }\n\n if (this.isDynamicSnapPoint) {\n this.sheetTransitionController.cleanupOnTransitionEnd();\n }\n\n this.backdropTransitionController?.unset();\n this.sheetTransitionController.enableTransition().set(`${this.currentSnapPoint}${this.unit}`);\n });\n }\n\n private getSnapPointTo(nextSnapPoint: number) {\n const closestSnapPoint = BottomSheetController.getClosestSnapPoint(\n this.snapPointDetents,\n nextSnapPoint,\n );\n if (closestSnapPoint !== this.currentSnapPoint) {\n return closestSnapPoint;\n }\n\n const panDirection = this.panGestureRecognizer.direction();\n if (panDirection.axis !== 'y' || panDirection.direction === null) {\n return this.currentSnapPoint;\n }\n\n const velocity = this.panGestureRecognizer.velocity();\n if (Math.abs(velocity.y) < DRAG_THRESHOLDS.VELOCITY) {\n return this.currentSnapPoint;\n }\n\n const closestSnapPointByDirection = BottomSheetController.getClosestSnapPointByDirection(\n this.snapPointDetents,\n closestSnapPoint,\n panDirection.direction,\n );\n\n return closestSnapPointByDirection;\n }\n\n private preventUntilPanGestureBecomesExpected() {\n return (\n this.panGestureRecognizer.direction().axis === 'x' ||\n this.panGestureRecognizer.distance() < DRAG_THRESHOLDS.DISTANCE_FOR_MOVING_START\n );\n }\n\n private preventImmediatelyIfPannedElIsNotValid() {\n return (\n this.pannedEl === null ||\n // Элемент со специальным атрибутом\n this.pannedEl.closest(`[${BLOCK_SHEET_BEHAVIOR_DATA_ATTRIBUTE_KEY}=true]`) !== null || // eslint-disable-line no-restricted-properties\n // Элемент за пределами панели.\n !this.sheetEl.contains(this.pannedEl)\n );\n }\n\n private preventUntilVerticalScrollingOnSheetScrollElBecomesExpected() {\n if (\n this.sheetScrollEl === null ||\n !this.sheetScrollEl.contains(this.pannedEl) ||\n this.sheetScrollEl.scrollHeight <= this.sheetScrollEl.clientHeight\n ) {\n return false;\n }\n\n if (this.sheetScrollEl.scrollTop === 0) {\n return (\n this.panGestureRecognizer.direction().direction === -1 &&\n BottomSheetController.isLastSnapPointDetents(this.snapPointDetents, this.currentSnapPoint)\n );\n }\n\n return true;\n }\n\n private preventImmediatelyIfVerticalScrollingOnPannedElIsScrolled() {\n if (\n /* istanbul ignore next: покрываем TypeScript */\n this.pannedEl === null ||\n this.pannedEl === this.sheetEl ||\n this.pannedEl === this.sheetScrollEl\n ) {\n return false;\n }\n\n const overflowAncestor = getNearestOverflowAncestor(this.pannedEl, this.sheetEl);\n\n if (\n overflowAncestor === null ||\n this.sheetScrollEl === overflowAncestor ||\n overflowAncestor.scrollHeight <= overflowAncestor.clientHeight\n ) {\n return false;\n }\n\n return (\n overflowAncestor.scrollTop !== 0 || this.panGestureRecognizer.direction().direction === -1\n );\n }\n\n private static disableVerticalScrollBouncingIfNeeded(\n sheetScrollEl: HTMLElement | null,\n targetEl: HTMLElement | null,\n ) {\n if (\n sheetScrollEl !== null &&\n sheetScrollEl.scrollTop <= 0 &&\n sheetScrollEl.contains(targetEl) &&\n sheetScrollEl.scrollHeight > sheetScrollEl.clientHeight\n ) {\n sheetScrollEl.style.setProperty('overflow-y', 'hidden');\n return function dispose() {\n sheetScrollEl.style.removeProperty('overflow-y');\n };\n }\n return noop;\n }\n\n private static isLastSnapPointDetents(\n snapPointDetents: SnapPointDetents,\n currentY: number,\n ): boolean {\n return currentY === snapPointDetents[snapPointDetents.length - 1];\n }\n\n private static getClosestSnapPointByDirection(\n snapPointDetents: SnapPointDetents,\n currentY: number,\n direction: -1 | 1,\n ): number {\n const foundIndex = snapPointDetents.findIndex((i) => i === currentY);\n switch (direction) {\n case -1:\n return snapPointDetents[foundIndex + 1] ?? snapPointDetents[snapPointDetents.length - 1];\n case 1:\n return snapPointDetents[foundIndex - 1] ?? snapPointDetents[0];\n }\n }\n\n private static getClosestSnapPoint(snapPointDetents: SnapPointDetents, currentY: number) {\n let closest = snapPointDetents[0];\n let minDifference = Math.abs(snapPointDetents[0] - currentY);\n\n for (let i = 1; i < snapPointDetents.length; i += 1) {\n const difference = Math.abs(snapPointDetents[i] - currentY);\n if (difference < minDifference) {\n closest = snapPointDetents[i];\n minDifference = difference;\n }\n }\n\n return closest;\n }\n}\n"],"names":["noop","clamp","rubberbandIfOutOfBounds","getNearestOverflowAncestor","hasSelectionWithRangeType","UIPanGestureRecognizer","BLOCK_SHEET_BEHAVIOR_DATA_ATTRIBUTE_KEY","DRAG_THRESHOLDS","DYNAMIC_SNAP_POINT_DATA","SNAP_POINT_DETENTS","BottomSheetController","sheetEl","constructor","sheetScrollEl","sheetTransitionController","backdropTransitionController","onSnapPointChange","onDismiss","panGestureRecognizer","init","snapPoint","isInitialized","unit","currentSnapPoint","IDLE_POINT_VALUE","snapPointDetents","MIN","initial","detents","destroy","pannedEl","cleanup","disableVerticalScrollBouncingDispose","panStart","event","panState","target","setStartCoords","panMove","setInitialTimeOnce","setEndCoords","preventUntilPanGestureBecomesExpected","preventImmediatelyIfPannedElIsNotValid","preventUntilVerticalScrollingOnSheetScrollElBecomesExpected","preventImmediatelyIfVerticalScrollingOnPannedElIsScrolled","sheetHeight","offsetHeight","disableVerticalScrollBouncingIfNeeded","isDynamicSnapPoint","COMPUTED_INDEX","y1","y2","nextSnapPoint","LARGE","calculateSnapPoint","panEnd","prevCurrentSnapPoint","getSnapPointTo","reset","rafId","immediately","cancelAnimationFrame","enableTransition","backdropOpacity","requestAnimationFrame","disableTransition","set","cleanupOnTransitionEnd","unset","closestSnapPoint","getClosestSnapPoint","panDirection","direction","axis","velocity","Math","abs","y","VELOCITY","closestSnapPointByDirection","getClosestSnapPointByDirection","distance","DISTANCE_FOR_MOVING_START","closest","contains","scrollHeight","clientHeight","scrollTop","isLastSnapPointDetents","overflowAncestor","targetEl","style","setProperty","dispose","removeProperty","currentY","length","foundIndex","findIndex","i","minDifference","difference"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../src/lib/sheet/controllers/BottomSheetController.ts"],"sourcesContent":["import { noop } from '@vkontakte/vkjs';\nimport { clamp } from '../../../helpers/math';\nimport { rubberbandIfOutOfBounds } from '../../animation';\nimport { getNearestOverflowAncestor, hasSelectionWithRangeType } from '../../dom';\nimport { UIPanGestureRecognizer } from '../../touch/UIPanGestureRecognizer';\nimport {\n BLOCK_SHEET_BEHAVIOR_DATA_ATTRIBUTE_KEY,\n DRAG_THRESHOLDS,\n DYNAMIC_SNAP_POINT_DATA,\n SNAP_POINT_DETENTS,\n} from '../constants';\nimport type { CSSTransitionController } from './CSSTransitionController';\n\nexport type SnapPointDetents = [number, number] | [number, number, number];\n\nexport type SnapPoint = 'auto' | { initial: number; detents: SnapPointDetents };\n\nexport type SnapPointChange = (snapPoint: number) => void;\n\nexport type BottomSheetControllerOptions = {\n sheetScrollEl: HTMLElement | null;\n sheetTransitionController: CSSTransitionController<string>;\n backdropTransitionController: CSSTransitionController | null;\n onSnapPointChange: SnapPointChange;\n onDismiss: VoidFunction;\n};\n\nexport class BottomSheetController {\n private readonly sheetEl: HTMLElement;\n\n constructor(\n sheetEl: HTMLElement,\n {\n sheetScrollEl,\n sheetTransitionController,\n backdropTransitionController,\n onSnapPointChange,\n onDismiss,\n }: BottomSheetControllerOptions,\n ) {\n this.sheetEl = sheetEl;\n this.onSnapPointChange = onSnapPointChange;\n this.onDismiss = onDismiss;\n this.panGestureRecognizer = new UIPanGestureRecognizer();\n this.sheetScrollEl = sheetScrollEl;\n this.sheetTransitionController = sheetTransitionController;\n this.backdropTransitionController = backdropTransitionController;\n }\n\n init(snapPoint: SnapPoint) {\n this.isInitialized = true;\n\n if (snapPoint === 'auto') {\n this.unit = 'px';\n this.currentSnapPoint = DYNAMIC_SNAP_POINT_DATA.IDLE_POINT_VALUE;\n this.snapPointDetents = [SNAP_POINT_DETENTS.MIN, DYNAMIC_SNAP_POINT_DATA.IDLE_POINT_VALUE];\n } else {\n this.unit = '%';\n this.currentSnapPoint = snapPoint.initial;\n this.snapPointDetents = snapPoint.detents;\n }\n }\n\n destroy() {\n this.isInitialized = false;\n this.pannedEl = null;\n this.sheetTransitionController.cleanup();\n this.backdropTransitionController?.cleanup();\n\n this.disableVerticalScrollBouncingDispose();\n this.disableVerticalScrollBouncingDispose = noop;\n }\n\n panStart(event: UIEvent) {\n if (\n !this.isInitialized ||\n this.panState !== 'idle' ||\n hasSelectionWithRangeType(event.target)\n ) {\n return;\n }\n\n this.panState = 'start';\n this.pannedEl = event.target as HTMLElement;\n this.panGestureRecognizer.setStartCoords(event);\n }\n\n panMove(event: UIEvent) {\n switch (this.panState) {\n case 'start':\n this.panGestureRecognizer.setInitialTimeOnce();\n this.panGestureRecognizer.setEndCoords(event);\n\n if (this.preventUntilPanGestureBecomesExpected()) {\n return;\n }\n\n if (this.preventImmediatelyIfPannedElIsNotValid()) {\n this.panState = 'idle';\n return;\n }\n\n if (this.preventUntilVerticalScrollingOnSheetScrollElBecomesExpected()) {\n return;\n }\n\n if (this.preventImmediatelyIfVerticalScrollingOnPannedElIsScrolled()) {\n this.panState = 'idle';\n return;\n }\n\n this.panState = 'moving';\n this.panGestureRecognizer.setStartCoords(event);\n\n this.sheetHeight = this.sheetEl.offsetHeight;\n\n this.disableVerticalScrollBouncingDispose =\n BottomSheetController.disableVerticalScrollBouncingIfNeeded(\n this.sheetScrollEl,\n this.pannedEl,\n );\n\n if (this.isDynamicSnapPoint) {\n this.currentSnapPoint = this.sheetHeight;\n this.snapPointDetents[DYNAMIC_SNAP_POINT_DATA.COMPUTED_INDEX] = this.sheetHeight;\n }\n break;\n case 'moving':\n this.panGestureRecognizer.setEndCoords(event);\n\n const { y1, y2 } = this.panGestureRecognizer;\n\n this.nextSnapPoint = rubberbandIfOutOfBounds(\n this.currentSnapPoint - ((y2 - y1) / this.sheetHeight) * this.currentSnapPoint,\n SNAP_POINT_DETENTS.MIN,\n this.isDynamicSnapPoint ? this.sheetHeight : SNAP_POINT_DETENTS.LARGE,\n );\n\n this.calculateSnapPoint(this.nextSnapPoint, true);\n break;\n }\n }\n\n panEnd() {\n switch (this.panState) {\n case 'moving':\n const prevCurrentSnapPoint = this.currentSnapPoint;\n this.currentSnapPoint = this.getSnapPointTo(this.nextSnapPoint);\n\n if (\n prevCurrentSnapPoint !== this.currentSnapPoint &&\n this.currentSnapPoint > SNAP_POINT_DETENTS.MIN\n ) {\n this.onSnapPointChange(this.currentSnapPoint);\n }\n\n this.calculateSnapPoint(this.currentSnapPoint);\n break;\n }\n\n this.panState = 'idle';\n this.panGestureRecognizer.reset();\n\n this.disableVerticalScrollBouncingDispose();\n this.disableVerticalScrollBouncingDispose = noop;\n }\n\n private isInitialized = false;\n private panState: 'idle' | 'start' | 'moving' = 'idle';\n private pannedEl: HTMLElement | null = null;\n private sheetHeight = 0;\n private rafId: number | null = null;\n private currentSnapPoint = 0;\n private nextSnapPoint = 0;\n private snapPointDetents: SnapPointDetents = [0, 0];\n private unit: 'px' | '%' = '%';\n private get isDynamicSnapPoint() {\n return this.unit === 'px';\n }\n private disableVerticalScrollBouncingDispose = noop;\n private readonly sheetScrollEl: HTMLElement | null;\n private readonly sheetTransitionController: CSSTransitionController<string>;\n private readonly backdropTransitionController: CSSTransitionController | null;\n private readonly panGestureRecognizer: UIPanGestureRecognizer;\n private readonly onSnapPointChange: SnapPointChange;\n private readonly onDismiss: VoidFunction;\n\n private calculateSnapPoint(nextSnapPoint: number, immediately = false) {\n if (this.rafId !== null) {\n cancelAnimationFrame(this.rafId);\n }\n\n if (nextSnapPoint <= SNAP_POINT_DETENTS.MIN) {\n this.sheetTransitionController.enableTransition();\n this.backdropTransitionController?.enableTransition();\n this.panState = 'idle';\n this.onDismiss();\n return;\n }\n\n const backdropOpacity = clamp(\n this.isDynamicSnapPoint\n ? nextSnapPoint / this.sheetHeight\n : (nextSnapPoint * 2) / SNAP_POINT_DETENTS.LARGE,\n 0,\n 1,\n );\n\n this.rafId = requestAnimationFrame(() => {\n if (immediately) {\n this.backdropTransitionController?.disableTransition().set(backdropOpacity);\n this.sheetTransitionController.disableTransition().set(`${nextSnapPoint}${this.unit}`);\n return;\n }\n\n if (this.isDynamicSnapPoint) {\n this.sheetTransitionController.cleanupOnTransitionEnd();\n }\n\n this.backdropTransitionController?.unset();\n this.sheetTransitionController.enableTransition().set(`${this.currentSnapPoint}${this.unit}`);\n });\n }\n\n private getSnapPointTo(nextSnapPoint: number) {\n const closestSnapPoint = BottomSheetController.getClosestSnapPoint(\n this.snapPointDetents,\n nextSnapPoint,\n );\n if (closestSnapPoint !== this.currentSnapPoint) {\n return closestSnapPoint;\n }\n\n const panDirection = this.panGestureRecognizer.direction();\n if (panDirection.axis !== 'y' || panDirection.direction === null) {\n return this.currentSnapPoint;\n }\n\n const velocity = this.panGestureRecognizer.velocity();\n if (Math.abs(velocity.y) < DRAG_THRESHOLDS.VELOCITY) {\n return this.currentSnapPoint;\n }\n\n const closestSnapPointByDirection = BottomSheetController.getClosestSnapPointByDirection(\n this.snapPointDetents,\n closestSnapPoint,\n panDirection.direction,\n );\n\n return closestSnapPointByDirection;\n }\n\n private preventUntilPanGestureBecomesExpected() {\n return (\n this.panGestureRecognizer.direction().axis === 'x' ||\n this.panGestureRecognizer.distance() < DRAG_THRESHOLDS.DISTANCE_FOR_MOVING_START\n );\n }\n\n private preventImmediatelyIfPannedElIsNotValid() {\n return (\n this.pannedEl === null ||\n // Элемент со специальным атрибутом\n this.pannedEl.closest(`[${BLOCK_SHEET_BEHAVIOR_DATA_ATTRIBUTE_KEY}=true]`) !== null || // eslint-disable-line no-restricted-properties\n // Элемент за пределами панели.\n !this.sheetEl.contains(this.pannedEl)\n );\n }\n\n private preventUntilVerticalScrollingOnSheetScrollElBecomesExpected() {\n if (\n this.sheetScrollEl === null ||\n !this.sheetScrollEl.contains(this.pannedEl) ||\n this.sheetScrollEl.scrollHeight <= this.sheetScrollEl.clientHeight\n ) {\n return false;\n }\n\n if (this.sheetScrollEl.scrollTop === 0) {\n return (\n this.panGestureRecognizer.direction().direction === -1 &&\n BottomSheetController.isLastSnapPointDetents(this.snapPointDetents, this.currentSnapPoint)\n );\n }\n\n return true;\n }\n\n private preventImmediatelyIfVerticalScrollingOnPannedElIsScrolled() {\n if (\n /* istanbul ignore next: покрываем TypeScript */\n this.pannedEl === null ||\n this.pannedEl === this.sheetEl ||\n this.pannedEl === this.sheetScrollEl\n ) {\n return false;\n }\n\n const overflowAncestor = getNearestOverflowAncestor(this.pannedEl, this.sheetEl);\n\n if (\n overflowAncestor === null ||\n this.sheetScrollEl === overflowAncestor ||\n overflowAncestor.scrollHeight <= overflowAncestor.clientHeight\n ) {\n return false;\n }\n\n return (\n overflowAncestor.scrollTop !== 0 || this.panGestureRecognizer.direction().direction === -1\n );\n }\n\n private static disableVerticalScrollBouncingIfNeeded(\n sheetScrollEl: HTMLElement | null,\n targetEl: HTMLElement | null,\n ) {\n if (\n sheetScrollEl !== null &&\n sheetScrollEl.scrollTop <= 0 &&\n sheetScrollEl.contains(targetEl) &&\n sheetScrollEl.scrollHeight > sheetScrollEl.clientHeight\n ) {\n sheetScrollEl.style.setProperty('overflow-y', 'hidden');\n return function dispose() {\n sheetScrollEl.style.removeProperty('overflow-y');\n };\n }\n return noop;\n }\n\n private static isLastSnapPointDetents(\n snapPointDetents: SnapPointDetents,\n currentY: number,\n ): boolean {\n return currentY === snapPointDetents[snapPointDetents.length - 1];\n }\n\n private static getClosestSnapPointByDirection(\n snapPointDetents: SnapPointDetents,\n currentY: number,\n direction: -1 | 1,\n ): number {\n const foundIndex = snapPointDetents.findIndex((i) => i === currentY);\n switch (direction) {\n case -1:\n return snapPointDetents[foundIndex + 1] ?? snapPointDetents[snapPointDetents.length - 1];\n case 1:\n return snapPointDetents[foundIndex - 1] ?? snapPointDetents[0];\n }\n }\n\n private static getClosestSnapPoint(snapPointDetents: SnapPointDetents, currentY: number) {\n let closest = snapPointDetents[0];\n let minDifference = Math.abs(snapPointDetents[0] - currentY);\n\n for (let i = 1; i < snapPointDetents.length; i += 1) {\n const difference = Math.abs(snapPointDetents[i] - currentY);\n if (difference < minDifference) {\n closest = snapPointDetents[i];\n minDifference = difference;\n }\n }\n\n return closest;\n }\n}\n"],"names":["noop","clamp","rubberbandIfOutOfBounds","getNearestOverflowAncestor","hasSelectionWithRangeType","UIPanGestureRecognizer","BLOCK_SHEET_BEHAVIOR_DATA_ATTRIBUTE_KEY","DRAG_THRESHOLDS","DYNAMIC_SNAP_POINT_DATA","SNAP_POINT_DETENTS","BottomSheetController","sheetEl","sheetScrollEl","sheetTransitionController","backdropTransitionController","onSnapPointChange","onDismiss","panGestureRecognizer","init","snapPoint","isInitialized","unit","currentSnapPoint","IDLE_POINT_VALUE","snapPointDetents","MIN","initial","detents","destroy","pannedEl","cleanup","disableVerticalScrollBouncingDispose","panStart","event","panState","target","setStartCoords","panMove","setInitialTimeOnce","setEndCoords","preventUntilPanGestureBecomesExpected","preventImmediatelyIfPannedElIsNotValid","preventUntilVerticalScrollingOnSheetScrollElBecomesExpected","preventImmediatelyIfVerticalScrollingOnPannedElIsScrolled","sheetHeight","offsetHeight","disableVerticalScrollBouncingIfNeeded","isDynamicSnapPoint","COMPUTED_INDEX","y1","y2","nextSnapPoint","LARGE","calculateSnapPoint","panEnd","prevCurrentSnapPoint","getSnapPointTo","reset","rafId","immediately","cancelAnimationFrame","enableTransition","backdropOpacity","requestAnimationFrame","disableTransition","set","cleanupOnTransitionEnd","unset","closestSnapPoint","getClosestSnapPoint","panDirection","direction","axis","velocity","Math","abs","y","VELOCITY","closestSnapPointByDirection","getClosestSnapPointByDirection","distance","DISTANCE_FOR_MOVING_START","closest","contains","scrollHeight","clientHeight","scrollTop","isLastSnapPointDetents","overflowAncestor","targetEl","style","setProperty","dispose","removeProperty","currentY","length","foundIndex","findIndex","i","minDifference","difference"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/lib/sheet/controllers/CSSTransitionController.ts"],"sourcesContent":["export type CSSTransitionControllerUnit = 'px' | '%' | '';\n\nexport class CSSTransitionController<V extends number | string = number> {\n public readonly el: HTMLElement;\n public readonly property: string;\n\n constructor(el: HTMLElement, property: string) {\n this.el = el;\n this.property = property;\n }\n\n set(to: V) {\n this.el.style.setProperty(this.property, `${to}`);\n return this;\n }\n\n unset() {\n return this.cleanup();\n }\n\n enableTransition() {\n this.el.style.removeProperty('transition');\n return this;\n }\n\n disableTransition() {\n this.el.style.setProperty('transition', 'none');\n return this;\n }\n\n cleanup() {\n this.el.removeEventListener('transitionend', this.handleTransitionEnd);\n this.el.style.removeProperty('transition');\n this.el.style.removeProperty(this.property);\n return this;\n }\n\n cleanupOnTransitionEnd() {\n this.el.addEventListener('transitionend', this.handleTransitionEnd, { once: true });\n return this;\n }\n\n private readonly handleTransitionEnd = () => {\n this.cleanup();\n return this;\n };\n}\n"],"names":["CSSTransitionController","el","property","constructor","set","to","style","setProperty","unset","cleanup","enableTransition","removeProperty","disableTransition","removeEventListener","handleTransitionEnd","cleanupOnTransitionEnd","addEventListener","once"],"mappings":"AAEA,OAAO,MAAMA;IACKC,GAAgB;IAChBC,SAAiB;IAEjCC,YAAYF,EAAe,EAAEC,QAAgB,CAAE;QAC7C,IAAI,CAACD,EAAE,GAAGA;QACV,IAAI,CAACC,QAAQ,GAAGA;IAClB;IAEAE,IAAIC,EAAK,EAAE;QACT,IAAI,CAACJ,EAAE,CAACK,KAAK,CAACC,WAAW,CAAC,IAAI,CAACL,QAAQ,EAAE,GAAGG,IAAI;QAChD,OAAO,IAAI;IACb;IAEAG,QAAQ;QACN,OAAO,IAAI,CAACC,OAAO;IACrB;IAEAC,mBAAmB;QACjB,IAAI,CAACT,EAAE,CAACK,KAAK,CAACK,cAAc,CAAC;QAC7B,OAAO,IAAI;IACb;IAEAC,oBAAoB;QAClB,IAAI,CAACX,EAAE,CAACK,KAAK,CAACC,WAAW,CAAC,cAAc;QACxC,OAAO,IAAI;IACb;IAEAE,UAAU;QACR,IAAI,CAACR,EAAE,CAACY,mBAAmB,CAAC,iBAAiB,IAAI,CAACC,mBAAmB;QACrE,IAAI,CAACb,EAAE,CAACK,KAAK,CAACK,cAAc,CAAC;QAC7B,IAAI,CAACV,EAAE,CAACK,KAAK,CAACK,cAAc,CAAC,IAAI,CAACT,QAAQ;QAC1C,OAAO,IAAI;IACb;IAEAa,yBAAyB;QACvB,IAAI,CAACd,EAAE,CAACe,gBAAgB,CAAC,iBAAiB,IAAI,CAACF,mBAAmB,EAAE;YAAEG,MAAM;QAAK;QACjF,OAAO,IAAI;IACb;IAEiBH,sBAAsB;QACrC,IAAI,CAACL,OAAO;QACZ,OAAO,IAAI;IACb,EAAE;AACJ"}
1
+ {"version":3,"sources":["../../../../../src/lib/sheet/controllers/CSSTransitionController.ts"],"sourcesContent":["export type CSSTransitionControllerUnit = 'px' | '%' | '';\n\nexport class CSSTransitionController<V extends number | string = number> {\n public readonly el: HTMLElement;\n public readonly property: string;\n\n constructor(el: HTMLElement, property: string) {\n this.el = el;\n this.property = property;\n }\n\n set(to: V) {\n this.el.style.setProperty(this.property, `${to}`);\n return this;\n }\n\n unset() {\n return this.cleanup();\n }\n\n enableTransition() {\n this.el.style.removeProperty('transition');\n return this;\n }\n\n disableTransition() {\n this.el.style.setProperty('transition', 'none');\n return this;\n }\n\n cleanup() {\n this.el.removeEventListener('transitionend', this.handleTransitionEnd);\n this.el.style.removeProperty('transition');\n this.el.style.removeProperty(this.property);\n return this;\n }\n\n cleanupOnTransitionEnd() {\n this.el.addEventListener('transitionend', this.handleTransitionEnd, { once: true });\n return this;\n }\n\n private readonly handleTransitionEnd = () => {\n this.cleanup();\n return this;\n };\n}\n"],"names":["CSSTransitionController","el","property","set","to","style","setProperty","unset","cleanup","enableTransition","removeProperty","disableTransition","removeEventListener","handleTransitionEnd","cleanupOnTransitionEnd","addEventListener","once"],"mappings":"AAEA,OAAO,MAAMA;IACKC,GAAgB;IAChBC,SAAiB;IAEjC,YAAYD,EAAe,EAAEC,QAAgB,CAAE;QAC7C,IAAI,CAACD,EAAE,GAAGA;QACV,IAAI,CAACC,QAAQ,GAAGA;IAClB;IAEAC,IAAIC,EAAK,EAAE;QACT,IAAI,CAACH,EAAE,CAACI,KAAK,CAACC,WAAW,CAAC,IAAI,CAACJ,QAAQ,EAAE,GAAGE,IAAI;QAChD,OAAO,IAAI;IACb;IAEAG,QAAQ;QACN,OAAO,IAAI,CAACC,OAAO;IACrB;IAEAC,mBAAmB;QACjB,IAAI,CAACR,EAAE,CAACI,KAAK,CAACK,cAAc,CAAC;QAC7B,OAAO,IAAI;IACb;IAEAC,oBAAoB;QAClB,IAAI,CAACV,EAAE,CAACI,KAAK,CAACC,WAAW,CAAC,cAAc;QACxC,OAAO,IAAI;IACb;IAEAE,UAAU;QACR,IAAI,CAACP,EAAE,CAACW,mBAAmB,CAAC,iBAAiB,IAAI,CAACC,mBAAmB;QACrE,IAAI,CAACZ,EAAE,CAACI,KAAK,CAACK,cAAc,CAAC;QAC7B,IAAI,CAACT,EAAE,CAACI,KAAK,CAACK,cAAc,CAAC,IAAI,CAACR,QAAQ;QAC1C,OAAO,IAAI;IACb;IAEAY,yBAAyB;QACvB,IAAI,CAACb,EAAE,CAACc,gBAAgB,CAAC,iBAAiB,IAAI,CAACF,mBAAmB,EAAE;YAAEG,MAAM;QAAK;QACjF,OAAO,IAAI;IACb;IAEiBH,sBAAsB;QACrC,IAAI,CAACL,OAAO;QACZ,OAAO,IAAI;IACb,EAAE;AACJ"}
@@ -0,0 +1,10 @@
1
+ export function animationVisibilityDelayStyles(delay) {
2
+ if (delay === undefined) {
3
+ return undefined;
4
+ }
5
+ return {
6
+ '--vkui_internal--animation_delay_visibility': `${delay}ms`
7
+ };
8
+ }
9
+
10
+ //# sourceMappingURL=animationVisibilityDelay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/styles/animationVisibilityDelay.ts"],"sourcesContent":["import { type CSSCustomProperties } from '../types';\n\nexport function animationVisibilityDelayStyles(\n delay: number | undefined,\n): CSSCustomProperties | undefined {\n if (delay === undefined) {\n return undefined;\n }\n\n return {\n '--vkui_internal--animation_delay_visibility': `${delay}ms`,\n };\n}\n"],"names":["animationVisibilityDelayStyles","delay","undefined"],"mappings":"AAEA,OAAO,SAASA,+BACdC,KAAyB;IAEzB,IAAIA,UAAUC,WAAW;QACvB,OAAOA;IACT;IAEA,OAAO;QACL,+CAA+C,GAAGD,MAAM,EAAE,CAAC;IAC7D;AACF"}
@@ -0,0 +1,13 @@
1
+ .visibilityDelay {
2
+ --vkui_internal--animation_delay_visibility: 200ms;
3
+
4
+ visibility: hidden;
5
+ animation: 0ms linear var(--vkui_internal--animation_delay_visibility) forwards
6
+ animation-styles-delay-visibility;
7
+ }
8
+
9
+ @keyframes animation-styles-delay-visibility {
10
+ to {
11
+ visibility: visible;
12
+ }
13
+ }
@@ -15,6 +15,7 @@
15
15
  :root, .vkui--vkBase--light, .vkui--vkBase--dark, .vkui--vkIOS--light, .vkui--vkIOS--dark, .vkui--vkCom--light, .vkui--vkCom--dark {
16
16
  --vkui--gradient_black: rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.02) 15%, rgba(0, 0, 0, 0.08) 30%, rgba(0, 0, 0, 0.32) 70%, rgba(0, 0, 0, 0.38) 85%, rgba(0, 0, 0, 0.4) 100%;
17
17
  --vkui--gradient_white: rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.05) 15%, rgba(255, 255, 255, 0.2) 30%, rgba(255, 255, 255, 0.8) 70%, rgba(255, 255, 255, 0.95) 85%, rgba(255, 255, 255, 1) 100%;
18
+ --vkui--blur_m: 16px;
18
19
  --vkui--font_weight_accent1: 600;
19
20
  --vkui--font_weight_accent2: 500;
20
21
  --vkui--font_weight_accent3: 400;
@@ -605,7 +606,8 @@
605
606
  --vkui--color_background_secondary--hover: #2C2C2D;
606
607
  --vkui--color_background_secondary--active: #353536;
607
608
  --vkui--color_background_secondary_alpha: rgba(255, 255, 255, 0.10);
608
- --vkui--color_background_secondary_alpha--active: rgba(255, 255, 255, 0.14);
609
+ --vkui--color_background_secondary_alpha--hover: rgba(255, 255, 255, 0.14);
610
+ --vkui--color_background_secondary_alpha--active: rgba(255, 255, 255, 0.18);
609
611
  --vkui--color_background_tertiary: #202021;
610
612
  --vkui--color_background_tertiary--hover: #29292A;
611
613
  --vkui--color_background_tertiary--active: #323233;
@@ -766,7 +768,6 @@
766
768
  --vkui--color_background_content_inverse: #FFFFFF;
767
769
  --vkui--color_background_content_inverse--hover: #EBEDF0;
768
770
  --vkui--color_background_content_inverse--active: #D7D8DB;
769
- --vkui--color_background_secondary_alpha--hover: rgba(255, 255, 255, 0.12);
770
771
  --vkui--color_background_tertiary_alpha: rgba(255, 255, 255, 0.03);
771
772
  --vkui--color_background_tertiary_alpha--hover: rgba(255, 255, 255, 0.07);
772
773
  --vkui--color_background_tertiary_alpha--active: rgba(255, 255, 255, 0.11);
@@ -1156,6 +1157,7 @@
1156
1157
  --vkui--color_background_secondary--hover: #3B3B3B;
1157
1158
  --vkui--color_background_secondary--active: #434343;
1158
1159
  --vkui--color_background_secondary_alpha: rgba(255, 255, 255, 0.08);
1160
+ --vkui--color_background_secondary_alpha--hover: rgba(255, 255, 255, 0.12);
1159
1161
  --vkui--color_background_secondary_alpha--active: rgba(255, 255, 255, 0.16);
1160
1162
  --vkui--color_background_tertiary: #292929;
1161
1163
  --vkui--color_background_tertiary--hover: #323232;
@@ -10,11 +10,8 @@ export declare function useCalendar({ value, disablePast, disableFuture, shouldD
10
10
  setNextMonth: () => void;
11
11
  focusedDay: Date | undefined;
12
12
  setFocusedDay: React.Dispatch<React.SetStateAction<Date | undefined>>;
13
- focusableDay: Date | undefined;
14
- setFocusableDay: React.Dispatch<React.SetStateAction<Date | undefined>>;
15
13
  isDayFocused: (day: Date) => boolean;
16
14
  isDayDisabled: (day: Date, withTime?: boolean) => boolean;
17
- resetSelectedDay: () => void;
18
15
  isMonthDisabled: (month: number, year?: number) => boolean;
19
16
  isYearDisabled: (year: number) => boolean;
20
17
  };
@@ -1 +1 @@
1
- {"version":3,"file":"useCalendar.d.ts","sourceRoot":"","sources":["../../src/hooks/useCalendar.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAGrE,MAAM,WAAW,uBACf,SAAQ,IAAI,CACV,aAAa,EACX,gBAAgB,GAChB,aAAa,GACb,aAAa,GACb,aAAa,GACb,aAAa,GACb,mBAAmB,GACnB,eAAe,GACf,aAAa,CAChB;IACD,KAAK,CAAC,EAAE,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;CAC1C;AAED,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,WAAW,EACX,aAAa,EACb,iBAAiB,EACjB,cAAc,EACd,WAAW,EACX,WAAW,EACX,WAAW,EACX,WAAW,GACZ,EAAE,uBAAuB,GAAG;IAC3B,QAAQ,EAAE,IAAI,CAAC;IACf,WAAW,EAAE,CAAC,KAAK,EAAE,IAAI,KAAK,IAAI,CAAC;IACnC,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,UAAU,EAAE,IAAI,GAAG,SAAS,CAAC;IAC7B,aAAa,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC;IACtE,YAAY,EAAE,IAAI,GAAG,SAAS,CAAC;IAC/B,eAAe,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC;IACxE,YAAY,EAAE,CAAC,GAAG,EAAE,IAAI,KAAK,OAAO,CAAC;IACrC,aAAa,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC;IAC1D,gBAAgB,EAAE,MAAM,IAAI,CAAC;IAC7B,eAAe,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;IAC3D,cAAc,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;CAC3C,CAyHA"}
1
+ {"version":3,"file":"useCalendar.d.ts","sourceRoot":"","sources":["../../src/hooks/useCalendar.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAGrE,MAAM,WAAW,uBACf,SAAQ,IAAI,CACV,aAAa,EACX,gBAAgB,GAChB,aAAa,GACb,aAAa,GACb,aAAa,GACb,aAAa,GACb,mBAAmB,GACnB,eAAe,GACf,aAAa,CAChB;IACD,KAAK,CAAC,EAAE,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;CAC1C;AAED,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,WAAW,EACX,aAAa,EACb,iBAAiB,EACjB,cAAc,EACd,WAAW,EACX,WAAW,EACX,WAAW,EACX,WAAW,GACZ,EAAE,uBAAuB,GAAG;IAC3B,QAAQ,EAAE,IAAI,CAAC;IACf,WAAW,EAAE,CAAC,KAAK,EAAE,IAAI,KAAK,IAAI,CAAC;IACnC,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,UAAU,EAAE,IAAI,GAAG,SAAS,CAAC;IAC7B,aAAa,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC;IACtE,YAAY,EAAE,CAAC,GAAG,EAAE,IAAI,KAAK,OAAO,CAAC;IACrC,aAAa,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC;IAC1D,eAAe,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;IAC3D,cAAc,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;CAC3C,CAgHA"}
@@ -7,8 +7,6 @@ export function useCalendar({ value, disablePast, disableFuture, shouldDisableDa
7
7
  // соответствует дню, на котором сейчас есть фокус
8
8
  // меняется при переключении дней с помощью стрелок
9
9
  const [focusedDay, setFocusedDay] = React.useState();
10
- // соотвествует дню, на котором можно сфокусироваться с помощью Tab
11
- const [focusableDay, setFocusableDay] = React.useState();
12
10
  const setPrevMonth = React.useCallback(()=>{
13
11
  onPrevMonth === null || onPrevMonth === void 0 ? void 0 : onPrevMonth();
14
12
  setViewDate(subMonths(viewDate, 1));
@@ -98,11 +96,6 @@ export function useCalendar({ value, disablePast, disableFuture, shouldDisableDa
98
96
  minDateTime,
99
97
  maxDateTime
100
98
  ]);
101
- const resetSelectedDay = React.useCallback(()=>{
102
- setFocusedDay(undefined);
103
- }, [
104
- setFocusedDay
105
- ]);
106
99
  return {
107
100
  viewDate,
108
101
  setViewDate: handleSetViewDate,
@@ -110,11 +103,8 @@ export function useCalendar({ value, disablePast, disableFuture, shouldDisableDa
110
103
  setNextMonth,
111
104
  focusedDay,
112
105
  setFocusedDay,
113
- focusableDay,
114
- setFocusableDay,
115
106
  isDayFocused,
116
107
  isDayDisabled,
117
- resetSelectedDay,
118
108
  isMonthDisabled,
119
109
  isYearDisabled
120
110
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/hooks/useCalendar.ts"],"sourcesContent":["import * as React from 'react';\nimport { addMonths, endOfDay, isAfter, isBefore, isSameDay, startOfDay, subMonths } from 'date-fns';\nimport type { CalendarProps } from '../components/Calendar/Calendar';\nimport { DEFAULT_MAX_YEAR, DEFAULT_MIN_YEAR, isDayMinMaxRestricted } from '../lib/calendar';\n\nexport interface UseCalendarDependencies\n extends Pick<\n CalendarProps,\n | 'onHeaderChange'\n | 'onNextMonth'\n | 'onPrevMonth'\n | 'minDateTime'\n | 'maxDateTime'\n | 'shouldDisableDate'\n | 'disableFuture'\n | 'disablePast'\n > {\n value?: Array<Date | null> | Date | null;\n}\n\nexport function useCalendar({\n value,\n disablePast,\n disableFuture,\n shouldDisableDate,\n onHeaderChange,\n onNextMonth,\n onPrevMonth,\n minDateTime,\n maxDateTime,\n}: UseCalendarDependencies): {\n viewDate: Date;\n setViewDate: (value: Date) => void;\n setPrevMonth: () => void;\n setNextMonth: () => void;\n focusedDay: Date | undefined;\n setFocusedDay: React.Dispatch<React.SetStateAction<Date | undefined>>;\n focusableDay: Date | undefined;\n setFocusableDay: React.Dispatch<React.SetStateAction<Date | undefined>>;\n isDayFocused: (day: Date) => boolean;\n isDayDisabled: (day: Date, withTime?: boolean) => boolean;\n resetSelectedDay: () => void;\n isMonthDisabled: (month: number, year?: number) => boolean;\n isYearDisabled: (year: number) => boolean;\n} {\n const [viewDate, setViewDate] = React.useState(\n (Array.isArray(value) ? value[0] : value) ?? new Date(),\n );\n // соответствует дню, на котором сейчас есть фокус\n // меняется при переключении дней с помощью стрелок\n const [focusedDay, setFocusedDay] = React.useState<Date>();\n // соотвествует дню, на котором можно сфокусироваться с помощью Tab\n const [focusableDay, setFocusableDay] = React.useState<Date>();\n\n const setPrevMonth = React.useCallback(() => {\n onPrevMonth?.();\n setViewDate(subMonths(viewDate, 1));\n }, [viewDate, onPrevMonth]);\n const setNextMonth = React.useCallback(() => {\n onNextMonth?.();\n setViewDate(addMonths(viewDate, 1));\n }, [viewDate, onNextMonth]);\n\n const handleSetViewDate = React.useCallback(\n (value: Date) => {\n onHeaderChange?.(value);\n setViewDate(value);\n },\n [onHeaderChange],\n );\n\n const isDayFocused = React.useCallback(\n (day: Date) => Boolean(focusedDay && isSameDay(day, focusedDay)),\n [focusedDay],\n );\n\n const isDayDisabled = React.useCallback(\n (day: Date, withTime?: boolean) => {\n const now = new Date();\n if (shouldDisableDate) {\n return shouldDisableDate(day);\n }\n if (disableFuture) {\n return isAfter(startOfDay(day), now);\n }\n if (disablePast) {\n return isBefore(endOfDay(day), now);\n }\n if (minDateTime || maxDateTime) {\n return isDayMinMaxRestricted(day, { min: minDateTime, max: maxDateTime, withTime });\n }\n\n return false;\n },\n [disableFuture, disablePast, shouldDisableDate, minDateTime, maxDateTime],\n );\n\n const isMonthDisabled = React.useCallback(\n (month: number, year?: number): boolean => {\n const now = new Date();\n year = year || viewDate.getFullYear();\n const minMonth = minDateTime ? minDateTime.getMonth() : 0;\n const maxMonth = maxDateTime ? maxDateTime.getMonth() : 11;\n const minYear = minDateTime?.getFullYear() || DEFAULT_MIN_YEAR;\n const maxYear = maxDateTime?.getFullYear() || DEFAULT_MAX_YEAR;\n\n let isDisabled =\n year >= minYear && year <= maxYear\n ? (year === minYear && minMonth > month) || (year === maxYear && month > maxMonth)\n : true;\n\n if (disableFuture) {\n isDisabled =\n isDisabled ||\n (year === now.getFullYear() ? month > now.getMonth() : year > now.getFullYear());\n }\n if (disablePast) {\n isDisabled =\n isDisabled ||\n (year === now.getFullYear() ? month < now.getMonth() : year < now.getFullYear());\n }\n\n return isDisabled;\n },\n [disableFuture, disablePast, viewDate, minDateTime, maxDateTime],\n );\n\n const isYearDisabled = React.useCallback(\n (year: number): boolean => {\n const now = new Date();\n const minYear = minDateTime?.getFullYear() || DEFAULT_MIN_YEAR;\n const maxYear = maxDateTime?.getFullYear() || DEFAULT_MAX_YEAR;\n\n let isDisabled = minYear > year || year > maxYear;\n if (disableFuture) {\n isDisabled = isDisabled || year > now.getFullYear();\n }\n if (disablePast) {\n isDisabled = isDisabled || year < now.getFullYear();\n }\n\n return isDisabled;\n },\n [disableFuture, disablePast, minDateTime, maxDateTime],\n );\n\n const resetSelectedDay = React.useCallback(() => {\n setFocusedDay(undefined);\n }, [setFocusedDay]);\n\n return {\n viewDate,\n setViewDate: handleSetViewDate,\n setPrevMonth,\n setNextMonth,\n focusedDay,\n setFocusedDay,\n focusableDay,\n setFocusableDay,\n isDayFocused,\n isDayDisabled,\n resetSelectedDay,\n isMonthDisabled,\n isYearDisabled,\n };\n}\n"],"names":["React","addMonths","endOfDay","isAfter","isBefore","isSameDay","startOfDay","subMonths","DEFAULT_MAX_YEAR","DEFAULT_MIN_YEAR","isDayMinMaxRestricted","useCalendar","value","disablePast","disableFuture","shouldDisableDate","onHeaderChange","onNextMonth","onPrevMonth","minDateTime","maxDateTime","Array","viewDate","setViewDate","useState","isArray","Date","focusedDay","setFocusedDay","focusableDay","setFocusableDay","setPrevMonth","useCallback","setNextMonth","handleSetViewDate","isDayFocused","day","Boolean","isDayDisabled","withTime","now","min","max","isMonthDisabled","month","year","getFullYear","minMonth","getMonth","maxMonth","minYear","maxYear","isDisabled","isYearDisabled","resetSelectedDay","undefined"],"mappings":"AAAA,YAAYA,WAAW,QAAQ;AAC/B,SAASC,SAAS,EAAEC,QAAQ,EAAEC,OAAO,EAAEC,QAAQ,EAAEC,SAAS,EAAEC,UAAU,EAAEC,SAAS,QAAQ,WAAW;AAEpG,SAASC,gBAAgB,EAAEC,gBAAgB,EAAEC,qBAAqB,QAAQ,qBAAkB;AAiB5F,OAAO,SAASC,YAAY,EAC1BC,KAAK,EACLC,WAAW,EACXC,aAAa,EACbC,iBAAiB,EACjBC,cAAc,EACdC,WAAW,EACXC,WAAW,EACXC,WAAW,EACXC,WAAW,EACa;QAgBrBC;IADH,MAAM,CAACC,UAAUC,YAAY,GAAGvB,MAAMwB,QAAQ,CAC5C,CAACH,OAAAA,MAAMI,OAAO,CAACb,SAASA,KAAK,CAAC,EAAE,GAAGA,mBAAlCS,kBAAAA,OAA4C,IAAIK;IAEnD,kDAAkD;IAClD,mDAAmD;IACnD,MAAM,CAACC,YAAYC,cAAc,GAAG5B,MAAMwB,QAAQ;IAClD,mEAAmE;IACnE,MAAM,CAACK,cAAcC,gBAAgB,GAAG9B,MAAMwB,QAAQ;IAEtD,MAAMO,eAAe/B,MAAMgC,WAAW,CAAC;QACrCd,wBAAAA,kCAAAA;QACAK,YAAYhB,UAAUe,UAAU;IAClC,GAAG;QAACA;QAAUJ;KAAY;IAC1B,MAAMe,eAAejC,MAAMgC,WAAW,CAAC;QACrCf,wBAAAA,kCAAAA;QACAM,YAAYtB,UAAUqB,UAAU;IAClC,GAAG;QAACA;QAAUL;KAAY;IAE1B,MAAMiB,oBAAoBlC,MAAMgC,WAAW,CACzC,CAACpB;QACCI,2BAAAA,qCAAAA,eAAiBJ;QACjBW,YAAYX;IACd,GACA;QAACI;KAAe;IAGlB,MAAMmB,eAAenC,MAAMgC,WAAW,CACpC,CAACI,MAAcC,QAAQV,cAActB,UAAU+B,KAAKT,cACpD;QAACA;KAAW;IAGd,MAAMW,gBAAgBtC,MAAMgC,WAAW,CACrC,CAACI,KAAWG;QACV,MAAMC,MAAM,IAAId;QAChB,IAAIX,mBAAmB;YACrB,OAAOA,kBAAkBqB;QAC3B;QACA,IAAItB,eAAe;YACjB,OAAOX,QAAQG,WAAW8B,MAAMI;QAClC;QACA,IAAI3B,aAAa;YACf,OAAOT,SAASF,SAASkC,MAAMI;QACjC;QACA,IAAIrB,eAAeC,aAAa;YAC9B,OAAOV,sBAAsB0B,KAAK;gBAAEK,KAAKtB;gBAAauB,KAAKtB;gBAAamB;YAAS;QACnF;QAEA,OAAO;IACT,GACA;QAACzB;QAAeD;QAAaE;QAAmBI;QAAaC;KAAY;IAG3E,MAAMuB,kBAAkB3C,MAAMgC,WAAW,CACvC,CAACY,OAAeC;QACd,MAAML,MAAM,IAAId;QAChBmB,OAAOA,QAAQvB,SAASwB,WAAW;QACnC,MAAMC,WAAW5B,cAAcA,YAAY6B,QAAQ,KAAK;QACxD,MAAMC,WAAW7B,cAAcA,YAAY4B,QAAQ,KAAK;QACxD,MAAME,UAAU/B,CAAAA,wBAAAA,kCAAAA,YAAa2B,WAAW,OAAMrC;QAC9C,MAAM0C,UAAU/B,CAAAA,wBAAAA,kCAAAA,YAAa0B,WAAW,OAAMtC;QAE9C,IAAI4C,aACFP,QAAQK,WAAWL,QAAQM,UACvB,AAACN,SAASK,WAAWH,WAAWH,SAAWC,SAASM,WAAWP,QAAQK,WACvE;QAEN,IAAInC,eAAe;YACjBsC,aACEA,cACCP,CAAAA,SAASL,IAAIM,WAAW,KAAKF,QAAQJ,IAAIQ,QAAQ,KAAKH,OAAOL,IAAIM,WAAW,EAAC;QAClF;QACA,IAAIjC,aAAa;YACfuC,aACEA,cACCP,CAAAA,SAASL,IAAIM,WAAW,KAAKF,QAAQJ,IAAIQ,QAAQ,KAAKH,OAAOL,IAAIM,WAAW,EAAC;QAClF;QAEA,OAAOM;IACT,GACA;QAACtC;QAAeD;QAAaS;QAAUH;QAAaC;KAAY;IAGlE,MAAMiC,iBAAiBrD,MAAMgC,WAAW,CACtC,CAACa;QACC,MAAML,MAAM,IAAId;QAChB,MAAMwB,UAAU/B,CAAAA,wBAAAA,kCAAAA,YAAa2B,WAAW,OAAMrC;QAC9C,MAAM0C,UAAU/B,CAAAA,wBAAAA,kCAAAA,YAAa0B,WAAW,OAAMtC;QAE9C,IAAI4C,aAAaF,UAAUL,QAAQA,OAAOM;QAC1C,IAAIrC,eAAe;YACjBsC,aAAaA,cAAcP,OAAOL,IAAIM,WAAW;QACnD;QACA,IAAIjC,aAAa;YACfuC,aAAaA,cAAcP,OAAOL,IAAIM,WAAW;QACnD;QAEA,OAAOM;IACT,GACA;QAACtC;QAAeD;QAAaM;QAAaC;KAAY;IAGxD,MAAMkC,mBAAmBtD,MAAMgC,WAAW,CAAC;QACzCJ,cAAc2B;IAChB,GAAG;QAAC3B;KAAc;IAElB,OAAO;QACLN;QACAC,aAAaW;QACbH;QACAE;QACAN;QACAC;QACAC;QACAC;QACAK;QACAG;QACAgB;QACAX;QACAU;IACF;AACF"}
1
+ {"version":3,"sources":["../../src/hooks/useCalendar.ts"],"sourcesContent":["import * as React from 'react';\nimport { addMonths, endOfDay, isAfter, isBefore, isSameDay, startOfDay, subMonths } from 'date-fns';\nimport type { CalendarProps } from '../components/Calendar/Calendar';\nimport { DEFAULT_MAX_YEAR, DEFAULT_MIN_YEAR, isDayMinMaxRestricted } from '../lib/calendar';\n\nexport interface UseCalendarDependencies\n extends Pick<\n CalendarProps,\n | 'onHeaderChange'\n | 'onNextMonth'\n | 'onPrevMonth'\n | 'minDateTime'\n | 'maxDateTime'\n | 'shouldDisableDate'\n | 'disableFuture'\n | 'disablePast'\n > {\n value?: Array<Date | null> | Date | null;\n}\n\nexport function useCalendar({\n value,\n disablePast,\n disableFuture,\n shouldDisableDate,\n onHeaderChange,\n onNextMonth,\n onPrevMonth,\n minDateTime,\n maxDateTime,\n}: UseCalendarDependencies): {\n viewDate: Date;\n setViewDate: (value: Date) => void;\n setPrevMonth: () => void;\n setNextMonth: () => void;\n focusedDay: Date | undefined;\n setFocusedDay: React.Dispatch<React.SetStateAction<Date | undefined>>;\n isDayFocused: (day: Date) => boolean;\n isDayDisabled: (day: Date, withTime?: boolean) => boolean;\n isMonthDisabled: (month: number, year?: number) => boolean;\n isYearDisabled: (year: number) => boolean;\n} {\n const [viewDate, setViewDate] = React.useState(\n (Array.isArray(value) ? value[0] : value) ?? new Date(),\n );\n // соответствует дню, на котором сейчас есть фокус\n // меняется при переключении дней с помощью стрелок\n const [focusedDay, setFocusedDay] = React.useState<Date>();\n\n const setPrevMonth = React.useCallback(() => {\n onPrevMonth?.();\n setViewDate(subMonths(viewDate, 1));\n }, [viewDate, onPrevMonth]);\n const setNextMonth = React.useCallback(() => {\n onNextMonth?.();\n setViewDate(addMonths(viewDate, 1));\n }, [viewDate, onNextMonth]);\n\n const handleSetViewDate = React.useCallback(\n (value: Date) => {\n onHeaderChange?.(value);\n setViewDate(value);\n },\n [onHeaderChange],\n );\n\n const isDayFocused = React.useCallback(\n (day: Date) => Boolean(focusedDay && isSameDay(day, focusedDay)),\n [focusedDay],\n );\n\n const isDayDisabled = React.useCallback(\n (day: Date, withTime?: boolean) => {\n const now = new Date();\n if (shouldDisableDate) {\n return shouldDisableDate(day);\n }\n if (disableFuture) {\n return isAfter(startOfDay(day), now);\n }\n if (disablePast) {\n return isBefore(endOfDay(day), now);\n }\n if (minDateTime || maxDateTime) {\n return isDayMinMaxRestricted(day, { min: minDateTime, max: maxDateTime, withTime });\n }\n\n return false;\n },\n [disableFuture, disablePast, shouldDisableDate, minDateTime, maxDateTime],\n );\n\n const isMonthDisabled = React.useCallback(\n (month: number, year?: number): boolean => {\n const now = new Date();\n year = year || viewDate.getFullYear();\n const minMonth = minDateTime ? minDateTime.getMonth() : 0;\n const maxMonth = maxDateTime ? maxDateTime.getMonth() : 11;\n const minYear = minDateTime?.getFullYear() || DEFAULT_MIN_YEAR;\n const maxYear = maxDateTime?.getFullYear() || DEFAULT_MAX_YEAR;\n\n let isDisabled =\n year >= minYear && year <= maxYear\n ? (year === minYear && minMonth > month) || (year === maxYear && month > maxMonth)\n : true;\n\n if (disableFuture) {\n isDisabled =\n isDisabled ||\n (year === now.getFullYear() ? month > now.getMonth() : year > now.getFullYear());\n }\n if (disablePast) {\n isDisabled =\n isDisabled ||\n (year === now.getFullYear() ? month < now.getMonth() : year < now.getFullYear());\n }\n\n return isDisabled;\n },\n [disableFuture, disablePast, viewDate, minDateTime, maxDateTime],\n );\n\n const isYearDisabled = React.useCallback(\n (year: number): boolean => {\n const now = new Date();\n const minYear = minDateTime?.getFullYear() || DEFAULT_MIN_YEAR;\n const maxYear = maxDateTime?.getFullYear() || DEFAULT_MAX_YEAR;\n\n let isDisabled = minYear > year || year > maxYear;\n if (disableFuture) {\n isDisabled = isDisabled || year > now.getFullYear();\n }\n if (disablePast) {\n isDisabled = isDisabled || year < now.getFullYear();\n }\n\n return isDisabled;\n },\n [disableFuture, disablePast, minDateTime, maxDateTime],\n );\n\n return {\n viewDate,\n setViewDate: handleSetViewDate,\n setPrevMonth,\n setNextMonth,\n focusedDay,\n setFocusedDay,\n isDayFocused,\n isDayDisabled,\n isMonthDisabled,\n isYearDisabled,\n };\n}\n"],"names":["React","addMonths","endOfDay","isAfter","isBefore","isSameDay","startOfDay","subMonths","DEFAULT_MAX_YEAR","DEFAULT_MIN_YEAR","isDayMinMaxRestricted","useCalendar","value","disablePast","disableFuture","shouldDisableDate","onHeaderChange","onNextMonth","onPrevMonth","minDateTime","maxDateTime","Array","viewDate","setViewDate","useState","isArray","Date","focusedDay","setFocusedDay","setPrevMonth","useCallback","setNextMonth","handleSetViewDate","isDayFocused","day","Boolean","isDayDisabled","withTime","now","min","max","isMonthDisabled","month","year","getFullYear","minMonth","getMonth","maxMonth","minYear","maxYear","isDisabled","isYearDisabled"],"mappings":"AAAA,YAAYA,WAAW,QAAQ;AAC/B,SAASC,SAAS,EAAEC,QAAQ,EAAEC,OAAO,EAAEC,QAAQ,EAAEC,SAAS,EAAEC,UAAU,EAAEC,SAAS,QAAQ,WAAW;AAEpG,SAASC,gBAAgB,EAAEC,gBAAgB,EAAEC,qBAAqB,QAAQ,qBAAkB;AAiB5F,OAAO,SAASC,YAAY,EAC1BC,KAAK,EACLC,WAAW,EACXC,aAAa,EACbC,iBAAiB,EACjBC,cAAc,EACdC,WAAW,EACXC,WAAW,EACXC,WAAW,EACXC,WAAW,EACa;QAarBC;IADH,MAAM,CAACC,UAAUC,YAAY,GAAGvB,MAAMwB,QAAQ,CAC5C,CAACH,OAAAA,MAAMI,OAAO,CAACb,SAASA,KAAK,CAAC,EAAE,GAAGA,mBAAlCS,kBAAAA,OAA4C,IAAIK;IAEnD,kDAAkD;IAClD,mDAAmD;IACnD,MAAM,CAACC,YAAYC,cAAc,GAAG5B,MAAMwB,QAAQ;IAElD,MAAMK,eAAe7B,MAAM8B,WAAW,CAAC;QACrCZ,wBAAAA,kCAAAA;QACAK,YAAYhB,UAAUe,UAAU;IAClC,GAAG;QAACA;QAAUJ;KAAY;IAC1B,MAAMa,eAAe/B,MAAM8B,WAAW,CAAC;QACrCb,wBAAAA,kCAAAA;QACAM,YAAYtB,UAAUqB,UAAU;IAClC,GAAG;QAACA;QAAUL;KAAY;IAE1B,MAAMe,oBAAoBhC,MAAM8B,WAAW,CACzC,CAAClB;QACCI,2BAAAA,qCAAAA,eAAiBJ;QACjBW,YAAYX;IACd,GACA;QAACI;KAAe;IAGlB,MAAMiB,eAAejC,MAAM8B,WAAW,CACpC,CAACI,MAAcC,QAAQR,cAActB,UAAU6B,KAAKP,cACpD;QAACA;KAAW;IAGd,MAAMS,gBAAgBpC,MAAM8B,WAAW,CACrC,CAACI,KAAWG;QACV,MAAMC,MAAM,IAAIZ;QAChB,IAAIX,mBAAmB;YACrB,OAAOA,kBAAkBmB;QAC3B;QACA,IAAIpB,eAAe;YACjB,OAAOX,QAAQG,WAAW4B,MAAMI;QAClC;QACA,IAAIzB,aAAa;YACf,OAAOT,SAASF,SAASgC,MAAMI;QACjC;QACA,IAAInB,eAAeC,aAAa;YAC9B,OAAOV,sBAAsBwB,KAAK;gBAAEK,KAAKpB;gBAAaqB,KAAKpB;gBAAaiB;YAAS;QACnF;QAEA,OAAO;IACT,GACA;QAACvB;QAAeD;QAAaE;QAAmBI;QAAaC;KAAY;IAG3E,MAAMqB,kBAAkBzC,MAAM8B,WAAW,CACvC,CAACY,OAAeC;QACd,MAAML,MAAM,IAAIZ;QAChBiB,OAAOA,QAAQrB,SAASsB,WAAW;QACnC,MAAMC,WAAW1B,cAAcA,YAAY2B,QAAQ,KAAK;QACxD,MAAMC,WAAW3B,cAAcA,YAAY0B,QAAQ,KAAK;QACxD,MAAME,UAAU7B,CAAAA,wBAAAA,kCAAAA,YAAayB,WAAW,OAAMnC;QAC9C,MAAMwC,UAAU7B,CAAAA,wBAAAA,kCAAAA,YAAawB,WAAW,OAAMpC;QAE9C,IAAI0C,aACFP,QAAQK,WAAWL,QAAQM,UACvB,AAACN,SAASK,WAAWH,WAAWH,SAAWC,SAASM,WAAWP,QAAQK,WACvE;QAEN,IAAIjC,eAAe;YACjBoC,aACEA,cACCP,CAAAA,SAASL,IAAIM,WAAW,KAAKF,QAAQJ,IAAIQ,QAAQ,KAAKH,OAAOL,IAAIM,WAAW,EAAC;QAClF;QACA,IAAI/B,aAAa;YACfqC,aACEA,cACCP,CAAAA,SAASL,IAAIM,WAAW,KAAKF,QAAQJ,IAAIQ,QAAQ,KAAKH,OAAOL,IAAIM,WAAW,EAAC;QAClF;QAEA,OAAOM;IACT,GACA;QAACpC;QAAeD;QAAaS;QAAUH;QAAaC;KAAY;IAGlE,MAAM+B,iBAAiBnD,MAAM8B,WAAW,CACtC,CAACa;QACC,MAAML,MAAM,IAAIZ;QAChB,MAAMsB,UAAU7B,CAAAA,wBAAAA,kCAAAA,YAAayB,WAAW,OAAMnC;QAC9C,MAAMwC,UAAU7B,CAAAA,wBAAAA,kCAAAA,YAAawB,WAAW,OAAMpC;QAE9C,IAAI0C,aAAaF,UAAUL,QAAQA,OAAOM;QAC1C,IAAInC,eAAe;YACjBoC,aAAaA,cAAcP,OAAOL,IAAIM,WAAW;QACnD;QACA,IAAI/B,aAAa;YACfqC,aAAaA,cAAcP,OAAOL,IAAIM,WAAW;QACnD;QAEA,OAAOM;IACT,GACA;QAACpC;QAAeD;QAAaM;QAAaC;KAAY;IAGxD,OAAO;QACLE;QACAC,aAAaS;QACbH;QACAE;QACAJ;QACAC;QACAK;QACAG;QACAK;QACAU;IACF;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"useDateInput.d.ts","sourceRoot":"","sources":["../../src/hooks/useDateInput.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B,MAAM,WAAW,wBAAwB,CAAC,CAAC,EAAE,CAAC;IAC5C,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IACvC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;IACjB,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK;QACjC,MAAM,EAAE,MAAM,CAAC;QACf,GAAG,EAAE,MAAM,CAAC;QACZ,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;IACF,qBAAqB,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IACjD,gBAAgB,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,IAAI,GAAG,SAAS,KAAK,MAAM,EAAE,CAAC;IAC7D,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,qBAAqB,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IAClD,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,wBAAgB,YAAY,CAAC,CAAC,SAAS,WAAW,EAAE,CAAC,EAAE,EACrD,UAAU,EACV,IAAI,EACJ,SAAS,EACT,QAAQ,EACR,cAAc,EACd,OAAO,EACP,qBAAqB,EACrB,gBAAgB,EAChB,KAAK,EACL,qBAAqB,EACrB,UAAU,GACX,EAAE,wBAAwB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG;IAClC,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAChD,WAAW,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IACpD,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,iBAAiB,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;IACvE,aAAa,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,eAAe,CAAC,KAAK,IAAI,CAAC;IACjE,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,gBAAgB,EAAE,MAAM,IAAI,CAAC;IAC7B,oBAAoB,EAAE,MAAM,IAAI,CAAC;IACjC,kBAAkB,EAAE,MAAM,OAAO,CAAC;CACnC,CAuNA"}
1
+ {"version":3,"file":"useDateInput.d.ts","sourceRoot":"","sources":["../../src/hooks/useDateInput.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B,MAAM,WAAW,wBAAwB,CAAC,CAAC,EAAE,CAAC;IAC5C,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IACvC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;IACjB,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK;QACjC,MAAM,EAAE,MAAM,CAAC;QACf,GAAG,EAAE,MAAM,CAAC;QACZ,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;IACF,qBAAqB,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IACjD,gBAAgB,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,IAAI,GAAG,SAAS,KAAK,MAAM,EAAE,CAAC;IAC7D,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,qBAAqB,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IAClD,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,wBAAgB,YAAY,CAAC,CAAC,SAAS,WAAW,EAAE,CAAC,EAAE,EACrD,UAAU,EACV,IAAI,EACJ,SAAS,EACT,QAAQ,EACR,cAAc,EACd,OAAO,EACP,qBAAqB,EACrB,gBAAgB,EAChB,KAAK,EACL,qBAAqB,EACrB,UAAU,GACX,EAAE,wBAAwB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG;IAClC,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAChD,WAAW,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IACpD,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,iBAAiB,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;IACvE,aAAa,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,eAAe,CAAC,KAAK,IAAI,CAAC;IACjE,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,gBAAgB,EAAE,MAAM,IAAI,CAAC;IAC7B,oBAAoB,EAAE,MAAM,IAAI,CAAC;IACjC,kBAAkB,EAAE,MAAM,OAAO,CAAC;CACnC,CAgOA"}
@@ -42,31 +42,38 @@ export function useDateInput({ maxElement, refs, autoFocus, disabled, elementsCo
42
42
  openCalendar,
43
43
  accessible
44
44
  ]);
45
- const toggleCalendar = useCallback(()=>{
46
- if (open) {
47
- _onCalendarClose();
48
- } else {
49
- _onCalendarOpen();
50
- }
51
- }, [
52
- open,
53
- _onCalendarOpen,
54
- _onCalendarClose
55
- ]);
56
- const removeFocusFromField = React.useCallback(()=>{
45
+ const resetFocusedElement = React.useCallback(()=>{
57
46
  if (focusedElement !== null) {
58
47
  var _window_getSelection;
59
48
  setFocusedElement(null);
60
49
  (_window_getSelection = window.getSelection()) === null || _window_getSelection === void 0 ? void 0 : _window_getSelection.removeAllRanges();
61
50
  setInternalValue(getInternalValue(value));
62
51
  }
63
- _onCalendarClose();
64
52
  }, [
65
- _onCalendarClose,
66
- window,
53
+ focusedElement,
67
54
  getInternalValue,
68
55
  value,
69
- focusedElement
56
+ window
57
+ ]);
58
+ const removeFocusFromField = React.useCallback(()=>{
59
+ resetFocusedElement();
60
+ _onCalendarClose();
61
+ }, [
62
+ resetFocusedElement,
63
+ _onCalendarClose
64
+ ]);
65
+ const toggleCalendar = useCallback(()=>{
66
+ resetFocusedElement();
67
+ if (open) {
68
+ _onCalendarClose();
69
+ } else {
70
+ _onCalendarOpen();
71
+ }
72
+ }, [
73
+ resetFocusedElement,
74
+ open,
75
+ _onCalendarClose,
76
+ _onCalendarOpen
70
77
  ]);
71
78
  const handleClickOutside = React.useCallback((e)=>{
72
79
  var _rootRef_current, _calendarRef_current;
@@ -178,13 +185,17 @@ export function useDateInput({ maxElement, refs, autoFocus, disabled, elementsCo
178
185
  _value[focusedElement] = String(currentValue >= config.max ? config.min : currentValue + 1).padStart(config.length, '0');
179
186
  } else if (e.key === 'ArrowLeft' || e.key === 'Left' || e.key === 'Tab' && e.shiftKey) {
180
187
  if (focusedElement <= 0) {
181
- removeFocusFromField();
188
+ if (e.key === 'Tab') {
189
+ removeFocusFromField();
190
+ }
182
191
  return;
183
192
  }
184
193
  setFocusedElement(focusedElement - 1);
185
194
  } else if (e.key === 'ArrowRight' || e.key === 'Right' || e.key === 'Tab') {
186
195
  if (focusedElement >= maxElement) {
187
- removeFocusFromField();
196
+ if (e.key === 'Tab') {
197
+ removeFocusFromField();
198
+ }
188
199
  return;
189
200
  }
190
201
  setFocusedElement(focusedElement + 1);