@cloud-ru/ds-calendar 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (528) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/LICENSE +201 -0
  3. package/MIGRATION.md +5 -0
  4. package/README.md +685 -0
  5. package/dist/cjs/components/Calendar/Calendar.d.ts +128 -0
  6. package/dist/cjs/components/Calendar/Calendar.js +25 -0
  7. package/dist/cjs/components/Calendar/index.d.ts +1 -0
  8. package/dist/cjs/components/Calendar/index.js +17 -0
  9. package/dist/cjs/components/Calendar/utils.d.ts +3 -0
  10. package/dist/cjs/components/Calendar/utils.js +19 -0
  11. package/dist/cjs/components/CalendarDropdown/CalendarDropdown.d.ts +22 -0
  12. package/dist/cjs/components/CalendarDropdown/CalendarDropdown.js +11 -0
  13. package/dist/cjs/components/CalendarDropdown/index.d.ts +1 -0
  14. package/dist/cjs/components/CalendarDropdown/index.js +17 -0
  15. package/dist/cjs/components/CalendarDropdown/styles.module.css +9 -0
  16. package/dist/cjs/components/TimePicker/TimePicker.d.ts +34 -0
  17. package/dist/cjs/components/TimePicker/TimePicker.js +138 -0
  18. package/dist/cjs/components/TimePicker/constants.d.ts +1 -0
  19. package/dist/cjs/components/TimePicker/constants.js +4 -0
  20. package/dist/cjs/components/TimePicker/index.d.ts +1 -0
  21. package/dist/cjs/components/TimePicker/index.js +17 -0
  22. package/dist/cjs/components/TimePicker/styles.module.css +12 -0
  23. package/dist/cjs/components/TimePickerDropdown/TimePickerDropdown.d.ts +22 -0
  24. package/dist/cjs/components/TimePickerDropdown/TimePickerDropdown.js +11 -0
  25. package/dist/cjs/components/TimePickerDropdown/index.d.ts +1 -0
  26. package/dist/cjs/components/TimePickerDropdown/index.js +17 -0
  27. package/dist/cjs/components/TimePickerDropdown/styles.module.css +19 -0
  28. package/dist/cjs/components/index.d.ts +4 -0
  29. package/dist/cjs/components/index.js +20 -0
  30. package/dist/cjs/constants.d.ts +68 -0
  31. package/dist/cjs/constants.js +64 -0
  32. package/dist/cjs/helperComponents/CalendarBase/CalendarBase.d.ts +27 -0
  33. package/dist/cjs/helperComponents/CalendarBase/CalendarBase.js +151 -0
  34. package/dist/cjs/helperComponents/CalendarBase/hooks.d.ts +11 -0
  35. package/dist/cjs/helperComponents/CalendarBase/hooks.js +40 -0
  36. package/dist/cjs/helperComponents/CalendarBase/index.d.ts +1 -0
  37. package/dist/cjs/helperComponents/CalendarBase/index.js +17 -0
  38. package/dist/cjs/helperComponents/CalendarBase/styles.module.css +100 -0
  39. package/dist/cjs/helperComponents/CalendarBody/CalendarBody.d.ts +1 -0
  40. package/dist/cjs/helperComponents/CalendarBody/CalendarBody.js +21 -0
  41. package/dist/cjs/helperComponents/CalendarBody/index.d.ts +1 -0
  42. package/dist/cjs/helperComponents/CalendarBody/index.js +17 -0
  43. package/dist/cjs/helperComponents/CalendarContext/CalendarContext.d.ts +51 -0
  44. package/dist/cjs/helperComponents/CalendarContext/CalendarContext.js +47 -0
  45. package/dist/cjs/helperComponents/CalendarContext/index.d.ts +1 -0
  46. package/dist/cjs/helperComponents/CalendarContext/index.js +17 -0
  47. package/dist/cjs/helperComponents/DecadeView/DecadeView.d.ts +1 -0
  48. package/dist/cjs/helperComponents/DecadeView/DecadeView.js +45 -0
  49. package/dist/cjs/helperComponents/DecadeView/index.d.ts +1 -0
  50. package/dist/cjs/helperComponents/DecadeView/index.js +17 -0
  51. package/dist/cjs/helperComponents/DecadeView/utils.d.ts +2 -0
  52. package/dist/cjs/helperComponents/DecadeView/utils.js +19 -0
  53. package/dist/cjs/helperComponents/DesktopCalendarDropdown/DesktopCalendarDropdown.d.ts +2 -0
  54. package/dist/cjs/helperComponents/DesktopCalendarDropdown/DesktopCalendarDropdown.js +30 -0
  55. package/dist/cjs/helperComponents/DesktopCalendarDropdown/index.d.ts +1 -0
  56. package/dist/cjs/helperComponents/DesktopCalendarDropdown/index.js +17 -0
  57. package/dist/cjs/helperComponents/DesktopTimePickerDropdown/DesktopTimePickerDropdown.d.ts +2 -0
  58. package/dist/cjs/helperComponents/DesktopTimePickerDropdown/DesktopTimePickerDropdown.js +117 -0
  59. package/dist/cjs/helperComponents/DesktopTimePickerDropdown/index.d.ts +1 -0
  60. package/dist/cjs/helperComponents/DesktopTimePickerDropdown/index.js +17 -0
  61. package/dist/cjs/helperComponents/Footer/Footer.d.ts +20 -0
  62. package/dist/cjs/helperComponents/Footer/Footer.js +100 -0
  63. package/dist/cjs/helperComponents/Footer/index.d.ts +1 -0
  64. package/dist/cjs/helperComponents/Footer/index.js +17 -0
  65. package/dist/cjs/helperComponents/Footer/styles.module.css +15 -0
  66. package/dist/cjs/helperComponents/Grid/Grid.d.ts +5 -0
  67. package/dist/cjs/helperComponents/Grid/Grid.js +23 -0
  68. package/dist/cjs/helperComponents/Grid/index.d.ts +1 -0
  69. package/dist/cjs/helperComponents/Grid/index.js +17 -0
  70. package/dist/cjs/helperComponents/Grid/styles.module.css +5 -0
  71. package/dist/cjs/helperComponents/Header/Header.d.ts +1 -0
  72. package/dist/cjs/helperComponents/Header/Header.js +68 -0
  73. package/dist/cjs/helperComponents/Header/constants.d.ts +3 -0
  74. package/dist/cjs/helperComponents/Header/constants.js +6 -0
  75. package/dist/cjs/helperComponents/Header/hooks.d.ts +1 -0
  76. package/dist/cjs/helperComponents/Header/hooks.js +23 -0
  77. package/dist/cjs/helperComponents/Header/index.d.ts +1 -0
  78. package/dist/cjs/helperComponents/Header/index.js +17 -0
  79. package/dist/cjs/helperComponents/Header/styles.module.css +28 -0
  80. package/dist/cjs/helperComponents/Header/utils.d.ts +2 -0
  81. package/dist/cjs/helperComponents/Header/utils.js +17 -0
  82. package/dist/cjs/helperComponents/Item/Item.d.ts +21 -0
  83. package/dist/cjs/helperComponents/Item/Item.js +75 -0
  84. package/dist/cjs/helperComponents/Item/hooks.d.ts +30 -0
  85. package/dist/cjs/helperComponents/Item/hooks.js +71 -0
  86. package/dist/cjs/helperComponents/Item/index.d.ts +1 -0
  87. package/dist/cjs/helperComponents/Item/index.js +17 -0
  88. package/dist/cjs/helperComponents/Item/styles.module.css +355 -0
  89. package/dist/cjs/helperComponents/MobileCalendar/MobileCalendar.d.ts +25 -0
  90. package/dist/cjs/helperComponents/MobileCalendar/MobileCalendar.js +308 -0
  91. package/dist/cjs/helperComponents/MobileCalendar/index.d.ts +1 -0
  92. package/dist/cjs/helperComponents/MobileCalendar/index.js +17 -0
  93. package/dist/cjs/helperComponents/MobileCalendar/levelConfig.d.ts +30 -0
  94. package/dist/cjs/helperComponents/MobileCalendar/levelConfig.js +69 -0
  95. package/dist/cjs/helperComponents/MobileCalendar/styles.module.css +35 -0
  96. package/dist/cjs/helperComponents/MobileCalendarDropdown/MobileCalendarDropdown.d.ts +5 -0
  97. package/dist/cjs/helperComponents/MobileCalendarDropdown/MobileCalendarDropdown.js +32 -0
  98. package/dist/cjs/helperComponents/MobileCalendarDropdown/index.d.ts +1 -0
  99. package/dist/cjs/helperComponents/MobileCalendarDropdown/index.js +17 -0
  100. package/dist/cjs/helperComponents/MobileFooter/MobileFooter.d.ts +12 -0
  101. package/dist/cjs/helperComponents/MobileFooter/MobileFooter.js +35 -0
  102. package/dist/cjs/helperComponents/MobileFooter/format.d.ts +10 -0
  103. package/dist/cjs/helperComponents/MobileFooter/format.js +60 -0
  104. package/dist/cjs/helperComponents/MobileFooter/index.d.ts +1 -0
  105. package/dist/cjs/helperComponents/MobileFooter/index.js +17 -0
  106. package/dist/cjs/helperComponents/MobileFooter/styles.module.css +38 -0
  107. package/dist/cjs/helperComponents/MobilePeriodBlock/MobilePeriodBlock.d.ts +18 -0
  108. package/dist/cjs/helperComponents/MobilePeriodBlock/MobilePeriodBlock.js +40 -0
  109. package/dist/cjs/helperComponents/MobilePeriodBlock/index.d.ts +1 -0
  110. package/dist/cjs/helperComponents/MobilePeriodBlock/index.js +17 -0
  111. package/dist/cjs/helperComponents/MobilePeriodBlock/styles.module.css +56 -0
  112. package/dist/cjs/helperComponents/MobilePeriodScroller/MobilePeriodScroller.d.ts +21 -0
  113. package/dist/cjs/helperComponents/MobilePeriodScroller/MobilePeriodScroller.js +92 -0
  114. package/dist/cjs/helperComponents/MobilePeriodScroller/index.d.ts +1 -0
  115. package/dist/cjs/helperComponents/MobilePeriodScroller/index.js +17 -0
  116. package/dist/cjs/helperComponents/MobilePeriodScroller/styles.module.css +17 -0
  117. package/dist/cjs/helperComponents/MobilePresetsScreen/MobilePresetsScreen.d.ts +6 -0
  118. package/dist/cjs/helperComponents/MobilePresetsScreen/MobilePresetsScreen.js +8 -0
  119. package/dist/cjs/helperComponents/MobilePresetsScreen/index.d.ts +1 -0
  120. package/dist/cjs/helperComponents/MobilePresetsScreen/index.js +17 -0
  121. package/dist/cjs/helperComponents/MobileTimePickerDropdown/MobileTimePickerDropdown.d.ts +6 -0
  122. package/dist/cjs/helperComponents/MobileTimePickerDropdown/MobileTimePickerDropdown.js +69 -0
  123. package/dist/cjs/helperComponents/MobileTimePickerDropdown/index.d.ts +1 -0
  124. package/dist/cjs/helperComponents/MobileTimePickerDropdown/index.js +17 -0
  125. package/dist/cjs/helperComponents/MobileTimeScreen/MobileTimeScreen.d.ts +9 -0
  126. package/dist/cjs/helperComponents/MobileTimeScreen/MobileTimeScreen.js +14 -0
  127. package/dist/cjs/helperComponents/MobileTimeScreen/index.d.ts +1 -0
  128. package/dist/cjs/helperComponents/MobileTimeScreen/index.js +17 -0
  129. package/dist/cjs/helperComponents/MonthView/MonthView.d.ts +1 -0
  130. package/dist/cjs/helperComponents/MonthView/MonthView.js +76 -0
  131. package/dist/cjs/helperComponents/MonthView/constants.d.ts +2 -0
  132. package/dist/cjs/helperComponents/MonthView/constants.js +5 -0
  133. package/dist/cjs/helperComponents/MonthView/index.d.ts +1 -0
  134. package/dist/cjs/helperComponents/MonthView/index.js +17 -0
  135. package/dist/cjs/helperComponents/MonthView/utils.d.ts +2 -0
  136. package/dist/cjs/helperComponents/MonthView/utils.js +23 -0
  137. package/dist/cjs/helperComponents/NavButton/NavButton.d.ts +15 -0
  138. package/dist/cjs/helperComponents/NavButton/NavButton.js +49 -0
  139. package/dist/cjs/helperComponents/NavButton/index.d.ts +1 -0
  140. package/dist/cjs/helperComponents/NavButton/index.js +17 -0
  141. package/dist/cjs/helperComponents/PeriodPresetsList/PeriodPresetsList.d.ts +10 -0
  142. package/dist/cjs/helperComponents/PeriodPresetsList/PeriodPresetsList.js +21 -0
  143. package/dist/cjs/helperComponents/PeriodPresetsList/index.d.ts +1 -0
  144. package/dist/cjs/helperComponents/PeriodPresetsList/index.js +17 -0
  145. package/dist/cjs/helperComponents/PeriodPresetsList/utils.d.ts +5 -0
  146. package/dist/cjs/helperComponents/PeriodPresetsList/utils.js +56 -0
  147. package/dist/cjs/helperComponents/TimeList/TimeList.d.ts +16 -0
  148. package/dist/cjs/helperComponents/TimeList/TimeList.js +29 -0
  149. package/dist/cjs/helperComponents/TimeList/index.d.ts +1 -0
  150. package/dist/cjs/helperComponents/TimeList/index.js +17 -0
  151. package/dist/cjs/helperComponents/TimeList/styles.module.css +29 -0
  152. package/dist/cjs/helperComponents/TimePickerBase/TimePickerBase.d.ts +7 -0
  153. package/dist/cjs/helperComponents/TimePickerBase/TimePickerBase.js +132 -0
  154. package/dist/cjs/helperComponents/TimePickerBase/index.d.ts +1 -0
  155. package/dist/cjs/helperComponents/TimePickerBase/index.js +17 -0
  156. package/dist/cjs/helperComponents/TimePickerBase/styles.module.css +108 -0
  157. package/dist/cjs/helperComponents/TimePickerDrum/TimePickerDrum.d.ts +24 -0
  158. package/dist/cjs/helperComponents/TimePickerDrum/TimePickerDrum.js +77 -0
  159. package/dist/cjs/helperComponents/TimePickerDrum/TimePickerDrumWheelColumn.d.ts +34 -0
  160. package/dist/cjs/helperComponents/TimePickerDrum/TimePickerDrumWheelColumn.js +225 -0
  161. package/dist/cjs/helperComponents/TimePickerDrum/constants.d.ts +11 -0
  162. package/dist/cjs/helperComponents/TimePickerDrum/constants.js +15 -0
  163. package/dist/cjs/helperComponents/TimePickerDrum/index.d.ts +3 -0
  164. package/dist/cjs/helperComponents/TimePickerDrum/index.js +21 -0
  165. package/dist/cjs/helperComponents/TimePickerDrum/styles.module.css +297 -0
  166. package/dist/cjs/helperComponents/TimePickerDrum/types.d.ts +59 -0
  167. package/dist/cjs/helperComponents/TimePickerDrum/types.js +2 -0
  168. package/dist/cjs/helperComponents/TimePickerDrum/utils.d.ts +36 -0
  169. package/dist/cjs/helperComponents/TimePickerDrum/utils.js +122 -0
  170. package/dist/cjs/helperComponents/WeekRow/WeekRow.d.ts +1 -0
  171. package/dist/cjs/helperComponents/WeekRow/WeekRow.js +21 -0
  172. package/dist/cjs/helperComponents/WeekRow/index.d.ts +1 -0
  173. package/dist/cjs/helperComponents/WeekRow/index.js +17 -0
  174. package/dist/cjs/helperComponents/WeekRow/styles.module.css +3 -0
  175. package/dist/cjs/helperComponents/WeekRow/utils.d.ts +3 -0
  176. package/dist/cjs/helperComponents/WeekRow/utils.js +16 -0
  177. package/dist/cjs/helperComponents/YearView/YearView.d.ts +1 -0
  178. package/dist/cjs/helperComponents/YearView/YearView.js +57 -0
  179. package/dist/cjs/helperComponents/YearView/index.d.ts +1 -0
  180. package/dist/cjs/helperComponents/YearView/index.js +17 -0
  181. package/dist/cjs/helperComponents/YearView/utils.d.ts +2 -0
  182. package/dist/cjs/helperComponents/YearView/utils.js +19 -0
  183. package/dist/cjs/helperComponents/index.d.ts +4 -0
  184. package/dist/cjs/helperComponents/index.js +20 -0
  185. package/dist/cjs/hooks/classifyCell.d.ts +34 -0
  186. package/dist/cjs/hooks/classifyCell.js +45 -0
  187. package/dist/cjs/hooks/index.d.ts +7 -0
  188. package/dist/cjs/hooks/index.js +23 -0
  189. package/dist/cjs/hooks/useCalendarContext.d.ts +1 -0
  190. package/dist/cjs/hooks/useCalendarContext.js +8 -0
  191. package/dist/cjs/hooks/useDateAndTime.d.ts +14 -0
  192. package/dist/cjs/hooks/useDateAndTime.js +111 -0
  193. package/dist/cjs/hooks/useGrid.d.ts +13 -0
  194. package/dist/cjs/hooks/useGrid.js +80 -0
  195. package/dist/cjs/hooks/useOpenTrigger.d.ts +3 -0
  196. package/dist/cjs/hooks/useOpenTrigger.js +25 -0
  197. package/dist/cjs/hooks/useTimeDrumHandlers.d.ts +8 -0
  198. package/dist/cjs/hooks/useTimeDrumHandlers.js +20 -0
  199. package/dist/cjs/hooks/useTimePickerValueBridge.d.ts +22 -0
  200. package/dist/cjs/hooks/useTimePickerValueBridge.js +74 -0
  201. package/dist/cjs/index.d.ts +4 -0
  202. package/dist/cjs/index.js +20 -0
  203. package/dist/cjs/locale/index.d.ts +95 -0
  204. package/dist/cjs/locale/index.js +52 -0
  205. package/dist/cjs/package.json +3 -0
  206. package/dist/cjs/style.css +1126 -0
  207. package/dist/cjs/types.d.ts +78 -0
  208. package/dist/cjs/types.js +2 -0
  209. package/dist/cjs/utils.d.ts +36 -0
  210. package/dist/cjs/utils.js +130 -0
  211. package/dist/esm/components/Calendar/Calendar.d.ts +128 -0
  212. package/dist/esm/components/Calendar/Calendar.js +22 -0
  213. package/dist/esm/components/Calendar/index.d.ts +1 -0
  214. package/dist/esm/components/Calendar/index.js +1 -0
  215. package/dist/esm/components/Calendar/utils.d.ts +3 -0
  216. package/dist/esm/components/Calendar/utils.js +15 -0
  217. package/dist/esm/components/CalendarDropdown/CalendarDropdown.d.ts +22 -0
  218. package/dist/esm/components/CalendarDropdown/CalendarDropdown.js +8 -0
  219. package/dist/esm/components/CalendarDropdown/index.d.ts +1 -0
  220. package/dist/esm/components/CalendarDropdown/index.js +1 -0
  221. package/dist/esm/components/CalendarDropdown/styles.module.css +9 -0
  222. package/dist/esm/components/TimePicker/TimePicker.d.ts +34 -0
  223. package/dist/esm/components/TimePicker/TimePicker.js +132 -0
  224. package/dist/esm/components/TimePicker/constants.d.ts +1 -0
  225. package/dist/esm/components/TimePicker/constants.js +1 -0
  226. package/dist/esm/components/TimePicker/index.d.ts +1 -0
  227. package/dist/esm/components/TimePicker/index.js +1 -0
  228. package/dist/esm/components/TimePicker/styles.module.css +12 -0
  229. package/dist/esm/components/TimePickerDropdown/TimePickerDropdown.d.ts +22 -0
  230. package/dist/esm/components/TimePickerDropdown/TimePickerDropdown.js +8 -0
  231. package/dist/esm/components/TimePickerDropdown/index.d.ts +1 -0
  232. package/dist/esm/components/TimePickerDropdown/index.js +1 -0
  233. package/dist/esm/components/TimePickerDropdown/styles.module.css +19 -0
  234. package/dist/esm/components/index.d.ts +4 -0
  235. package/dist/esm/components/index.js +4 -0
  236. package/dist/esm/constants.d.ts +68 -0
  237. package/dist/esm/constants.js +61 -0
  238. package/dist/esm/helperComponents/CalendarBase/CalendarBase.d.ts +27 -0
  239. package/dist/esm/helperComponents/CalendarBase/CalendarBase.js +145 -0
  240. package/dist/esm/helperComponents/CalendarBase/hooks.d.ts +11 -0
  241. package/dist/esm/helperComponents/CalendarBase/hooks.js +36 -0
  242. package/dist/esm/helperComponents/CalendarBase/index.d.ts +1 -0
  243. package/dist/esm/helperComponents/CalendarBase/index.js +1 -0
  244. package/dist/esm/helperComponents/CalendarBase/styles.module.css +100 -0
  245. package/dist/esm/helperComponents/CalendarBody/CalendarBody.d.ts +1 -0
  246. package/dist/esm/helperComponents/CalendarBody/CalendarBody.js +18 -0
  247. package/dist/esm/helperComponents/CalendarBody/index.d.ts +1 -0
  248. package/dist/esm/helperComponents/CalendarBody/index.js +1 -0
  249. package/dist/esm/helperComponents/CalendarContext/CalendarContext.d.ts +51 -0
  250. package/dist/esm/helperComponents/CalendarContext/CalendarContext.js +44 -0
  251. package/dist/esm/helperComponents/CalendarContext/index.d.ts +1 -0
  252. package/dist/esm/helperComponents/CalendarContext/index.js +1 -0
  253. package/dist/esm/helperComponents/DecadeView/DecadeView.d.ts +1 -0
  254. package/dist/esm/helperComponents/DecadeView/DecadeView.js +42 -0
  255. package/dist/esm/helperComponents/DecadeView/index.d.ts +1 -0
  256. package/dist/esm/helperComponents/DecadeView/index.js +1 -0
  257. package/dist/esm/helperComponents/DecadeView/utils.d.ts +2 -0
  258. package/dist/esm/helperComponents/DecadeView/utils.js +15 -0
  259. package/dist/esm/helperComponents/DesktopCalendarDropdown/DesktopCalendarDropdown.d.ts +2 -0
  260. package/dist/esm/helperComponents/DesktopCalendarDropdown/DesktopCalendarDropdown.js +24 -0
  261. package/dist/esm/helperComponents/DesktopCalendarDropdown/index.d.ts +1 -0
  262. package/dist/esm/helperComponents/DesktopCalendarDropdown/index.js +1 -0
  263. package/dist/esm/helperComponents/DesktopTimePickerDropdown/DesktopTimePickerDropdown.d.ts +2 -0
  264. package/dist/esm/helperComponents/DesktopTimePickerDropdown/DesktopTimePickerDropdown.js +111 -0
  265. package/dist/esm/helperComponents/DesktopTimePickerDropdown/index.d.ts +1 -0
  266. package/dist/esm/helperComponents/DesktopTimePickerDropdown/index.js +1 -0
  267. package/dist/esm/helperComponents/Footer/Footer.d.ts +20 -0
  268. package/dist/esm/helperComponents/Footer/Footer.js +94 -0
  269. package/dist/esm/helperComponents/Footer/index.d.ts +1 -0
  270. package/dist/esm/helperComponents/Footer/index.js +1 -0
  271. package/dist/esm/helperComponents/Footer/styles.module.css +15 -0
  272. package/dist/esm/helperComponents/Grid/Grid.d.ts +5 -0
  273. package/dist/esm/helperComponents/Grid/Grid.js +17 -0
  274. package/dist/esm/helperComponents/Grid/index.d.ts +1 -0
  275. package/dist/esm/helperComponents/Grid/index.js +1 -0
  276. package/dist/esm/helperComponents/Grid/styles.module.css +5 -0
  277. package/dist/esm/helperComponents/Header/Header.d.ts +1 -0
  278. package/dist/esm/helperComponents/Header/Header.js +62 -0
  279. package/dist/esm/helperComponents/Header/constants.d.ts +3 -0
  280. package/dist/esm/helperComponents/Header/constants.js +3 -0
  281. package/dist/esm/helperComponents/Header/hooks.d.ts +1 -0
  282. package/dist/esm/helperComponents/Header/hooks.js +20 -0
  283. package/dist/esm/helperComponents/Header/index.d.ts +1 -0
  284. package/dist/esm/helperComponents/Header/index.js +1 -0
  285. package/dist/esm/helperComponents/Header/styles.module.css +28 -0
  286. package/dist/esm/helperComponents/Header/utils.d.ts +2 -0
  287. package/dist/esm/helperComponents/Header/utils.js +13 -0
  288. package/dist/esm/helperComponents/Item/Item.d.ts +21 -0
  289. package/dist/esm/helperComponents/Item/Item.js +69 -0
  290. package/dist/esm/helperComponents/Item/hooks.d.ts +30 -0
  291. package/dist/esm/helperComponents/Item/hooks.js +68 -0
  292. package/dist/esm/helperComponents/Item/index.d.ts +1 -0
  293. package/dist/esm/helperComponents/Item/index.js +1 -0
  294. package/dist/esm/helperComponents/Item/styles.module.css +355 -0
  295. package/dist/esm/helperComponents/MobileCalendar/MobileCalendar.d.ts +25 -0
  296. package/dist/esm/helperComponents/MobileCalendar/MobileCalendar.js +302 -0
  297. package/dist/esm/helperComponents/MobileCalendar/index.d.ts +1 -0
  298. package/dist/esm/helperComponents/MobileCalendar/index.js +1 -0
  299. package/dist/esm/helperComponents/MobileCalendar/levelConfig.d.ts +30 -0
  300. package/dist/esm/helperComponents/MobileCalendar/levelConfig.js +66 -0
  301. package/dist/esm/helperComponents/MobileCalendar/styles.module.css +35 -0
  302. package/dist/esm/helperComponents/MobileCalendarDropdown/MobileCalendarDropdown.d.ts +5 -0
  303. package/dist/esm/helperComponents/MobileCalendarDropdown/MobileCalendarDropdown.js +29 -0
  304. package/dist/esm/helperComponents/MobileCalendarDropdown/index.d.ts +1 -0
  305. package/dist/esm/helperComponents/MobileCalendarDropdown/index.js +1 -0
  306. package/dist/esm/helperComponents/MobileFooter/MobileFooter.d.ts +12 -0
  307. package/dist/esm/helperComponents/MobileFooter/MobileFooter.js +29 -0
  308. package/dist/esm/helperComponents/MobileFooter/format.d.ts +10 -0
  309. package/dist/esm/helperComponents/MobileFooter/format.js +57 -0
  310. package/dist/esm/helperComponents/MobileFooter/index.d.ts +1 -0
  311. package/dist/esm/helperComponents/MobileFooter/index.js +1 -0
  312. package/dist/esm/helperComponents/MobileFooter/styles.module.css +38 -0
  313. package/dist/esm/helperComponents/MobilePeriodBlock/MobilePeriodBlock.d.ts +18 -0
  314. package/dist/esm/helperComponents/MobilePeriodBlock/MobilePeriodBlock.js +34 -0
  315. package/dist/esm/helperComponents/MobilePeriodBlock/index.d.ts +1 -0
  316. package/dist/esm/helperComponents/MobilePeriodBlock/index.js +1 -0
  317. package/dist/esm/helperComponents/MobilePeriodBlock/styles.module.css +56 -0
  318. package/dist/esm/helperComponents/MobilePeriodScroller/MobilePeriodScroller.d.ts +21 -0
  319. package/dist/esm/helperComponents/MobilePeriodScroller/MobilePeriodScroller.js +86 -0
  320. package/dist/esm/helperComponents/MobilePeriodScroller/index.d.ts +1 -0
  321. package/dist/esm/helperComponents/MobilePeriodScroller/index.js +1 -0
  322. package/dist/esm/helperComponents/MobilePeriodScroller/styles.module.css +17 -0
  323. package/dist/esm/helperComponents/MobilePresetsScreen/MobilePresetsScreen.d.ts +6 -0
  324. package/dist/esm/helperComponents/MobilePresetsScreen/MobilePresetsScreen.js +5 -0
  325. package/dist/esm/helperComponents/MobilePresetsScreen/index.d.ts +1 -0
  326. package/dist/esm/helperComponents/MobilePresetsScreen/index.js +1 -0
  327. package/dist/esm/helperComponents/MobileTimePickerDropdown/MobileTimePickerDropdown.d.ts +6 -0
  328. package/dist/esm/helperComponents/MobileTimePickerDropdown/MobileTimePickerDropdown.js +66 -0
  329. package/dist/esm/helperComponents/MobileTimePickerDropdown/index.d.ts +1 -0
  330. package/dist/esm/helperComponents/MobileTimePickerDropdown/index.js +1 -0
  331. package/dist/esm/helperComponents/MobileTimeScreen/MobileTimeScreen.d.ts +9 -0
  332. package/dist/esm/helperComponents/MobileTimeScreen/MobileTimeScreen.js +11 -0
  333. package/dist/esm/helperComponents/MobileTimeScreen/index.d.ts +1 -0
  334. package/dist/esm/helperComponents/MobileTimeScreen/index.js +1 -0
  335. package/dist/esm/helperComponents/MonthView/MonthView.d.ts +1 -0
  336. package/dist/esm/helperComponents/MonthView/MonthView.js +73 -0
  337. package/dist/esm/helperComponents/MonthView/constants.d.ts +2 -0
  338. package/dist/esm/helperComponents/MonthView/constants.js +2 -0
  339. package/dist/esm/helperComponents/MonthView/index.d.ts +1 -0
  340. package/dist/esm/helperComponents/MonthView/index.js +1 -0
  341. package/dist/esm/helperComponents/MonthView/utils.d.ts +2 -0
  342. package/dist/esm/helperComponents/MonthView/utils.js +19 -0
  343. package/dist/esm/helperComponents/NavButton/NavButton.d.ts +15 -0
  344. package/dist/esm/helperComponents/NavButton/NavButton.js +46 -0
  345. package/dist/esm/helperComponents/NavButton/index.d.ts +1 -0
  346. package/dist/esm/helperComponents/NavButton/index.js +1 -0
  347. package/dist/esm/helperComponents/PeriodPresetsList/PeriodPresetsList.d.ts +10 -0
  348. package/dist/esm/helperComponents/PeriodPresetsList/PeriodPresetsList.js +18 -0
  349. package/dist/esm/helperComponents/PeriodPresetsList/index.d.ts +1 -0
  350. package/dist/esm/helperComponents/PeriodPresetsList/index.js +1 -0
  351. package/dist/esm/helperComponents/PeriodPresetsList/utils.d.ts +5 -0
  352. package/dist/esm/helperComponents/PeriodPresetsList/utils.js +53 -0
  353. package/dist/esm/helperComponents/TimeList/TimeList.d.ts +16 -0
  354. package/dist/esm/helperComponents/TimeList/TimeList.js +23 -0
  355. package/dist/esm/helperComponents/TimeList/index.d.ts +1 -0
  356. package/dist/esm/helperComponents/TimeList/index.js +1 -0
  357. package/dist/esm/helperComponents/TimeList/styles.module.css +29 -0
  358. package/dist/esm/helperComponents/TimePickerBase/TimePickerBase.d.ts +7 -0
  359. package/dist/esm/helperComponents/TimePickerBase/TimePickerBase.js +126 -0
  360. package/dist/esm/helperComponents/TimePickerBase/index.d.ts +1 -0
  361. package/dist/esm/helperComponents/TimePickerBase/index.js +1 -0
  362. package/dist/esm/helperComponents/TimePickerBase/styles.module.css +108 -0
  363. package/dist/esm/helperComponents/TimePickerDrum/TimePickerDrum.d.ts +24 -0
  364. package/dist/esm/helperComponents/TimePickerDrum/TimePickerDrum.js +71 -0
  365. package/dist/esm/helperComponents/TimePickerDrum/TimePickerDrumWheelColumn.d.ts +34 -0
  366. package/dist/esm/helperComponents/TimePickerDrum/TimePickerDrumWheelColumn.js +219 -0
  367. package/dist/esm/helperComponents/TimePickerDrum/constants.d.ts +11 -0
  368. package/dist/esm/helperComponents/TimePickerDrum/constants.js +11 -0
  369. package/dist/esm/helperComponents/TimePickerDrum/index.d.ts +3 -0
  370. package/dist/esm/helperComponents/TimePickerDrum/index.js +3 -0
  371. package/dist/esm/helperComponents/TimePickerDrum/styles.module.css +297 -0
  372. package/dist/esm/helperComponents/TimePickerDrum/types.d.ts +59 -0
  373. package/dist/esm/helperComponents/TimePickerDrum/types.js +1 -0
  374. package/dist/esm/helperComponents/TimePickerDrum/utils.d.ts +36 -0
  375. package/dist/esm/helperComponents/TimePickerDrum/utils.js +114 -0
  376. package/dist/esm/helperComponents/WeekRow/WeekRow.d.ts +1 -0
  377. package/dist/esm/helperComponents/WeekRow/WeekRow.js +15 -0
  378. package/dist/esm/helperComponents/WeekRow/index.d.ts +1 -0
  379. package/dist/esm/helperComponents/WeekRow/index.js +1 -0
  380. package/dist/esm/helperComponents/WeekRow/styles.module.css +3 -0
  381. package/dist/esm/helperComponents/WeekRow/utils.d.ts +3 -0
  382. package/dist/esm/helperComponents/WeekRow/utils.js +12 -0
  383. package/dist/esm/helperComponents/YearView/YearView.d.ts +1 -0
  384. package/dist/esm/helperComponents/YearView/YearView.js +54 -0
  385. package/dist/esm/helperComponents/YearView/index.d.ts +1 -0
  386. package/dist/esm/helperComponents/YearView/index.js +1 -0
  387. package/dist/esm/helperComponents/YearView/utils.d.ts +2 -0
  388. package/dist/esm/helperComponents/YearView/utils.js +15 -0
  389. package/dist/esm/helperComponents/index.d.ts +4 -0
  390. package/dist/esm/helperComponents/index.js +4 -0
  391. package/dist/esm/hooks/classifyCell.d.ts +34 -0
  392. package/dist/esm/hooks/classifyCell.js +42 -0
  393. package/dist/esm/hooks/index.d.ts +7 -0
  394. package/dist/esm/hooks/index.js +7 -0
  395. package/dist/esm/hooks/useCalendarContext.d.ts +1 -0
  396. package/dist/esm/hooks/useCalendarContext.js +5 -0
  397. package/dist/esm/hooks/useDateAndTime.d.ts +14 -0
  398. package/dist/esm/hooks/useDateAndTime.js +108 -0
  399. package/dist/esm/hooks/useGrid.d.ts +13 -0
  400. package/dist/esm/hooks/useGrid.js +77 -0
  401. package/dist/esm/hooks/useOpenTrigger.d.ts +3 -0
  402. package/dist/esm/hooks/useOpenTrigger.js +22 -0
  403. package/dist/esm/hooks/useTimeDrumHandlers.d.ts +8 -0
  404. package/dist/esm/hooks/useTimeDrumHandlers.js +17 -0
  405. package/dist/esm/hooks/useTimePickerValueBridge.d.ts +22 -0
  406. package/dist/esm/hooks/useTimePickerValueBridge.js +71 -0
  407. package/dist/esm/index.d.ts +4 -0
  408. package/dist/esm/index.js +4 -0
  409. package/dist/esm/locale/index.d.ts +95 -0
  410. package/dist/esm/locale/index.js +49 -0
  411. package/dist/esm/style.css +1126 -0
  412. package/dist/esm/types.d.ts +78 -0
  413. package/dist/esm/types.js +1 -0
  414. package/dist/esm/utils.d.ts +36 -0
  415. package/dist/esm/utils.js +100 -0
  416. package/dist/tsconfig.cjs.tsbuildinfo +1 -0
  417. package/dist/tsconfig.esm.tsbuildinfo +1 -0
  418. package/package.json +63 -0
  419. package/src/components/Calendar/Calendar.tsx +172 -0
  420. package/src/components/Calendar/index.ts +1 -0
  421. package/src/components/Calendar/utils.ts +22 -0
  422. package/src/components/CalendarDropdown/CalendarDropdown.tsx +51 -0
  423. package/src/components/CalendarDropdown/index.ts +1 -0
  424. package/src/components/CalendarDropdown/styles.module.scss +8 -0
  425. package/src/components/TimePicker/TimePicker.tsx +218 -0
  426. package/src/components/TimePicker/constants.ts +1 -0
  427. package/src/components/TimePicker/index.ts +1 -0
  428. package/src/components/TimePicker/styles.module.scss +13 -0
  429. package/src/components/TimePickerDropdown/TimePickerDropdown.tsx +55 -0
  430. package/src/components/TimePickerDropdown/index.ts +1 -0
  431. package/src/components/TimePickerDropdown/styles.module.scss +25 -0
  432. package/src/components/index.ts +4 -0
  433. package/src/constants.ts +68 -0
  434. package/src/helperComponents/CalendarBase/CalendarBase.tsx +299 -0
  435. package/src/helperComponents/CalendarBase/hooks.ts +48 -0
  436. package/src/helperComponents/CalendarBase/index.ts +1 -0
  437. package/src/helperComponents/CalendarBase/styles.module.scss +84 -0
  438. package/src/helperComponents/CalendarBody/CalendarBody.tsx +19 -0
  439. package/src/helperComponents/CalendarBody/index.ts +1 -0
  440. package/src/helperComponents/CalendarContext/CalendarContext.tsx +107 -0
  441. package/src/helperComponents/CalendarContext/index.ts +1 -0
  442. package/src/helperComponents/DecadeView/DecadeView.tsx +68 -0
  443. package/src/helperComponents/DecadeView/index.ts +1 -0
  444. package/src/helperComponents/DecadeView/utils.ts +19 -0
  445. package/src/helperComponents/DesktopCalendarDropdown/DesktopCalendarDropdown.tsx +80 -0
  446. package/src/helperComponents/DesktopCalendarDropdown/index.ts +1 -0
  447. package/src/helperComponents/DesktopTimePickerDropdown/DesktopTimePickerDropdown.tsx +209 -0
  448. package/src/helperComponents/DesktopTimePickerDropdown/index.ts +1 -0
  449. package/src/helperComponents/Footer/Footer.tsx +163 -0
  450. package/src/helperComponents/Footer/index.ts +1 -0
  451. package/src/helperComponents/Footer/styles.module.scss +19 -0
  452. package/src/helperComponents/Grid/Grid.tsx +52 -0
  453. package/src/helperComponents/Grid/index.ts +1 -0
  454. package/src/helperComponents/Grid/styles.module.scss +5 -0
  455. package/src/helperComponents/Header/Header.tsx +123 -0
  456. package/src/helperComponents/Header/constants.ts +5 -0
  457. package/src/helperComponents/Header/hooks.ts +22 -0
  458. package/src/helperComponents/Header/index.ts +1 -0
  459. package/src/helperComponents/Header/styles.module.scss +25 -0
  460. package/src/helperComponents/Header/utils.ts +15 -0
  461. package/src/helperComponents/Item/Item.tsx +175 -0
  462. package/src/helperComponents/Item/hooks.ts +91 -0
  463. package/src/helperComponents/Item/index.ts +1 -0
  464. package/src/helperComponents/Item/styles.module.scss +284 -0
  465. package/src/helperComponents/MobileCalendar/MobileCalendar.tsx +513 -0
  466. package/src/helperComponents/MobileCalendar/index.ts +1 -0
  467. package/src/helperComponents/MobileCalendar/levelConfig.ts +109 -0
  468. package/src/helperComponents/MobileCalendar/styles.module.scss +39 -0
  469. package/src/helperComponents/MobileCalendarDropdown/MobileCalendarDropdown.tsx +85 -0
  470. package/src/helperComponents/MobileCalendarDropdown/index.ts +1 -0
  471. package/src/helperComponents/MobileFooter/MobileFooter.tsx +58 -0
  472. package/src/helperComponents/MobileFooter/format.ts +82 -0
  473. package/src/helperComponents/MobileFooter/index.ts +1 -0
  474. package/src/helperComponents/MobileFooter/styles.module.scss +39 -0
  475. package/src/helperComponents/MobilePeriodBlock/MobilePeriodBlock.tsx +82 -0
  476. package/src/helperComponents/MobilePeriodBlock/index.ts +1 -0
  477. package/src/helperComponents/MobilePeriodBlock/styles.module.scss +37 -0
  478. package/src/helperComponents/MobilePeriodScroller/MobilePeriodScroller.tsx +129 -0
  479. package/src/helperComponents/MobilePeriodScroller/index.ts +1 -0
  480. package/src/helperComponents/MobilePeriodScroller/styles.module.scss +23 -0
  481. package/src/helperComponents/MobilePresetsScreen/MobilePresetsScreen.tsx +11 -0
  482. package/src/helperComponents/MobilePresetsScreen/index.ts +1 -0
  483. package/src/helperComponents/MobileTimePickerDropdown/MobileTimePickerDropdown.tsx +126 -0
  484. package/src/helperComponents/MobileTimePickerDropdown/index.ts +1 -0
  485. package/src/helperComponents/MobileTimeScreen/MobileTimeScreen.tsx +38 -0
  486. package/src/helperComponents/MobileTimeScreen/index.ts +1 -0
  487. package/src/helperComponents/MonthView/MonthView.tsx +114 -0
  488. package/src/helperComponents/MonthView/constants.ts +3 -0
  489. package/src/helperComponents/MonthView/index.ts +1 -0
  490. package/src/helperComponents/MonthView/utils.ts +25 -0
  491. package/src/helperComponents/NavButton/NavButton.tsx +109 -0
  492. package/src/helperComponents/NavButton/index.ts +1 -0
  493. package/src/helperComponents/PeriodPresetsList/PeriodPresetsList.tsx +44 -0
  494. package/src/helperComponents/PeriodPresetsList/index.ts +1 -0
  495. package/src/helperComponents/PeriodPresetsList/utils.ts +63 -0
  496. package/src/helperComponents/TimeList/TimeList.tsx +77 -0
  497. package/src/helperComponents/TimeList/index.ts +1 -0
  498. package/src/helperComponents/TimeList/styles.module.scss +19 -0
  499. package/src/helperComponents/TimePickerBase/TimePickerBase.tsx +223 -0
  500. package/src/helperComponents/TimePickerBase/index.ts +1 -0
  501. package/src/helperComponents/TimePickerBase/styles.module.scss +105 -0
  502. package/src/helperComponents/TimePickerDrum/TimePickerDrum.tsx +187 -0
  503. package/src/helperComponents/TimePickerDrum/TimePickerDrumWheelColumn.tsx +344 -0
  504. package/src/helperComponents/TimePickerDrum/constants.ts +13 -0
  505. package/src/helperComponents/TimePickerDrum/index.ts +3 -0
  506. package/src/helperComponents/TimePickerDrum/styles.module.scss +277 -0
  507. package/src/helperComponents/TimePickerDrum/types.ts +62 -0
  508. package/src/helperComponents/TimePickerDrum/utils.ts +130 -0
  509. package/src/helperComponents/WeekRow/WeekRow.tsx +34 -0
  510. package/src/helperComponents/WeekRow/index.ts +1 -0
  511. package/src/helperComponents/WeekRow/styles.module.scss +3 -0
  512. package/src/helperComponents/WeekRow/utils.ts +18 -0
  513. package/src/helperComponents/YearView/YearView.tsx +83 -0
  514. package/src/helperComponents/YearView/index.ts +1 -0
  515. package/src/helperComponents/YearView/utils.ts +19 -0
  516. package/src/helperComponents/index.ts +4 -0
  517. package/src/hooks/classifyCell.ts +104 -0
  518. package/src/hooks/index.ts +7 -0
  519. package/src/hooks/useCalendarContext.ts +7 -0
  520. package/src/hooks/useDateAndTime.ts +130 -0
  521. package/src/hooks/useGrid.ts +123 -0
  522. package/src/hooks/useOpenTrigger.tsx +35 -0
  523. package/src/hooks/useTimeDrumHandlers.ts +35 -0
  524. package/src/hooks/useTimePickerValueBridge.ts +125 -0
  525. package/src/index.ts +4 -0
  526. package/src/locale/index.ts +53 -0
  527. package/src/types.ts +88 -0
  528. package/src/utils.ts +151 -0
package/README.md ADDED
@@ -0,0 +1,685 @@
1
+ # Calendar
2
+
3
+ `@cloud-ru/ds-calendar` — Пакет календаря и выбора времени — Calendar с режимами даты, диапазона и месяца/года, TimePicker и TimePickerDropdown для времени в составе полей ввода.
4
+
5
+ Пакет `@cloud-ru/ds-calendar` объединяет полноэкранный и встраиваемый календарь с клавиатурной навигацией и два варианта выбора времени: встроенный `TimePicker` и `TimePickerDropdown` на базе `Dropdown` для полей с триггером.
6
+
7
+ - ****Calendar**** — выбор даты, даты со временем, диапазонов и месяцев/лет в режимах `CALENDAR_MODE`.
8
+ - ****TimePicker**** — выбор часов, минут и опционально секунд в потоке формы.
9
+ - ****TimePickerDropdown**** — то же время в выпадающей панели с кнопками действий и настройками позиционирования триггера.
10
+
11
+ ## Когда использовать
12
+
13
+ - Нужен выбор периода или точечной даты с доступностью с клавиатуры и поддержкой локали.
14
+ - Время задаётся отдельно от даты или внутри поля — берите `TimePicker` или `TimePickerDropdown` по контексту (inline vs popover).
15
+
16
+ Когда **не** подходит: для простого текстового поля с маской без визуального календаря рассмотрите нативный `input type="date"` или поле с маской; для таймзон и сложного расписания — специализированные виджеты.
17
+
18
+ ## Установка
19
+
20
+ ```bash
21
+ pnpm add @cloud-ru/ds-calendar
22
+ ```
23
+
24
+ ```ts
25
+ import { Calendar, CALENDAR_MODE, TimePicker, TimePickerDropdown } from '@cloud-ru/ds-calendar'
26
+ ```
27
+
28
+ ## Figma
29
+
30
+ Макеты разбиты по узлам в библиотеке FF-8179 (сетка дней, месяцев, лет, барабан времени). Конкретные embed — на страницах компонентов ниже.
31
+
32
+ ## Смотри также
33
+
34
+ - [Паттерны календаря и времени](/patterns/calendar-patterns) — контролируемое значение, локаль и составление с полями формы.
35
+ ## Адаптивность
36
+
37
+ Триггерные `CalendarDropdown` и `TimePickerDropdown` переключают поверхность (surface-swap): на desktop — popover над триггером (`@cloud-ru/ds-dropdown`), на mobile — `BottomSheet` из `@cloud-ru/ds-bottom-sheet`. Раскладка берётся из `AdaptiveProvider` (контекст `@cloud-ru/ds-adaptive`), пропа `layoutType` нет. Встраиваемые `Calendar` и `TimePicker` desktop-only и не адаптируются.
38
+
39
+ Детали поведения на mobile — на страницах **Calendar** и **TimePickerDropdown**. Общая модель — **Adaptive**.
40
+
41
+ ## Calendar
42
+
43
+ Календарь с режимами одной даты, диапазона, даты со временем и выбора месяца или года — единый компонент с навигацией по месяцу, году и декаде.
44
+
45
+ Интерактивный календарь с переключением вида (месяц → год → декада) и режимами выбора от одной даты до диапазонов по дням, месяцам и годам. Поддерживает контролируемое и неконтролируемое значение, подсветку выходных и кастомизацию ячеек через `buildCellProps`.
46
+
47
+ ### Когда использовать
48
+
49
+ - Нужен явный визуальный выбор даты или периода в модалке, сайдпанели или под полем ввода.
50
+ - Требуется согласованная навигация по месяцу/году и доступность с клавиатуры.
51
+
52
+ Когда **не** нужен: если достаточно свободного ввода текста или маски без обзора месяца — используйте поле ввода или другой паттерн.
53
+
54
+ - ✅ Управлять значением через `value` + `onChangeValue` или через `defaultValue` для неконтролируемого режима.
55
+ - ❌ Подменять выбор даты только стилем без обновления состояния — календарь перестанет совпадать с формой и полем ввода.
56
+
57
+ - ✅ Задавать «сегодня» через `today`, если нужно зафиксировать опорный день (тесты, таймзона продукта).
58
+ - ❌ Игнорировать локаль при работе с неделей и подписями — передавайте `locale`, если браузерная по умолчанию не совпадает с приложением.
59
+
60
+ ### Анатомия
61
+
62
+ #### Size
63
+
64
+ | Значение | Назначение |
65
+ |----------|------------|
66
+ | `s` | Компактные попапы и плотные формы |
67
+ | `m` | Значение по умолчанию |
68
+ | `l` | Акцентные модальные сценарии |
69
+
70
+ #### Calendar mode (`mode`)
71
+
72
+ Режим определяет тип значения и разметку сетки: одна дата, пара дат (диапазон), дата со временем, месяц или год.
73
+
74
+ | Значение | Поведение |
75
+ |----------|-----------|
76
+ | `date` | Одна дата (`Date`) |
77
+ | `date-time` | Дата и время на одной сетке (`Date`) |
78
+ | `date-range` | Диапазон дней (`[Date, Date]`), доступны пресеты периода при `presets` |
79
+ | `month` / `month-range` | Выбор месяца или диапазона месяцев |
80
+ | `year` / `year-range` | Выбор года или диапазона лет |
81
+
82
+ #### View (навигация)
83
+
84
+ Внутренние уровни навигации соответствуют константам `VIEW_MODE`: месячная сетка дней, сетка месяцев года, сетка лет декады. Пользователь переключает уровень заголовком календаря.
85
+
86
+ #### Прочее
87
+
88
+ - `fitToContainer` — растягивание на контейнер (`width/height: 100%`); для демо ниже задана фиксированная ширина обёртки.
89
+ - `showHolidays` — подсветка субботы и воскресенья.
90
+ - `presets` — быстрые периоды только для `date-range` и без пользовательского `buildCellProps` (ограничение текущей версии).
91
+
92
+ ### Примеры использования
93
+
94
+ #### Одна дата
95
+
96
+ Контролируемое значение
97
+
98
+ ```tsx
99
+ import { Calendar, CALENDAR_MODE, SIZE } from '@cloud-ru/ds-calendar';
100
+ import { useState } from 'react';
101
+
102
+ export function CalendarDateSingle() {
103
+ const [value, setValue] = useState<Date | undefined>(() => new Date(2026, 3, 10));
104
+
105
+ return (
106
+ <div style={{ width: 320, maxWidth: '100%' }}>
107
+ <Calendar fitToContainer mode={CALENDAR_MODE.Date} size={SIZE.M} value={value} onChangeValue={d => setValue(d)} />
108
+ </div>
109
+ );
110
+ }
111
+ ```
112
+
113
+ #### Диапазон дат
114
+
115
+ ```tsx
116
+ import { Calendar, CALENDAR_MODE, Range, SIZE } from '@cloud-ru/ds-calendar';
117
+ import { useState } from 'react';
118
+
119
+ export function CalendarDateRange() {
120
+ const [value, setValue] = useState<Range | undefined>(() => [new Date(2026, 3, 1), new Date(2026, 3, 20)]);
121
+
122
+ return (
123
+ <div style={{ width: 320, maxWidth: '100%' }}>
124
+ <Calendar
125
+ fitToContainer
126
+ mode={CALENDAR_MODE.DateRange}
127
+ size={SIZE.M}
128
+ value={value}
129
+ onChangeValue={r => setValue(r)}
130
+ />
131
+ </div>
132
+ );
133
+ }
134
+ ```
135
+
136
+ #### Диапазон с пресетами
137
+
138
+ Быстрые периоды через presets={{ enabled: true }} (только date-range)
139
+
140
+ ```tsx
141
+ import { Calendar, CALENDAR_MODE, Range, SIZE } from '@cloud-ru/ds-calendar';
142
+ import { useState } from 'react';
143
+
144
+ export function CalendarWithPresets() {
145
+ const [value, setValue] = useState<Range | undefined>();
146
+
147
+ return (
148
+ <div style={{ width: 520, maxWidth: '100%' }}>
149
+ <Calendar
150
+ fitToContainer
151
+ mode={CALENDAR_MODE.DateRange}
152
+ size={SIZE.M}
153
+ presets={{ enabled: true }}
154
+ value={value}
155
+ onChangeValue={r => setValue(r)}
156
+ />
157
+ </div>
158
+ );
159
+ }
160
+ ```
161
+
162
+ #### Дата и время
163
+
164
+ Секунды включаются через showSeconds
165
+
166
+ ```tsx
167
+ import { Calendar, CALENDAR_MODE, SIZE } from '@cloud-ru/ds-calendar';
168
+ import { useState } from 'react';
169
+
170
+ export function CalendarDateTime() {
171
+ const [value, setValue] = useState<Date | undefined>(() => new Date(2026, 3, 10, 14, 30, 0));
172
+
173
+ return (
174
+ <div style={{ width: 320, maxWidth: '100%' }}>
175
+ <Calendar
176
+ fitToContainer
177
+ mode={CALENDAR_MODE.DateTime}
178
+ showSeconds
179
+ size={SIZE.M}
180
+ value={value}
181
+ onChangeValue={d => setValue(d)}
182
+ />
183
+ </div>
184
+ );
185
+ }
186
+ ```
187
+
188
+ #### Выбор месяца
189
+
190
+ ```tsx
191
+ import { Calendar, CALENDAR_MODE, SIZE } from '@cloud-ru/ds-calendar';
192
+ import { useState } from 'react';
193
+
194
+ export function CalendarMonthMode() {
195
+ const [value, setValue] = useState<Date | undefined>(() => new Date(2026, 3, 1));
196
+
197
+ return (
198
+ <div style={{ width: 320, maxWidth: '100%' }}>
199
+ <Calendar
200
+ fitToContainer
201
+ mode={CALENDAR_MODE.Month}
202
+ size={SIZE.M}
203
+ value={value}
204
+ onChangeValue={d => setValue(d)}
205
+ />
206
+ </div>
207
+ );
208
+ }
209
+ ```
210
+
211
+ #### Диапазон лет
212
+
213
+ ```tsx
214
+ import { Calendar, CALENDAR_MODE, Range, SIZE } from '@cloud-ru/ds-calendar';
215
+ import { useState } from 'react';
216
+
217
+ export function CalendarYearRange() {
218
+ const [value, setValue] = useState<Range | undefined>(() => [new Date(2024, 0, 1), new Date(2026, 0, 1)]);
219
+
220
+ return (
221
+ <div style={{ width: 320, maxWidth: '100%' }}>
222
+ <Calendar
223
+ fitToContainer
224
+ mode={CALENDAR_MODE.YearRange}
225
+ size={SIZE.M}
226
+ value={value}
227
+ onChangeValue={r => setValue(r)}
228
+ />
229
+ </div>
230
+ );
231
+ }
232
+ ```
233
+
234
+ ### Props
235
+
236
+ **CalendarProps**
237
+
238
+ | Prop | Type | Default | Description |
239
+ |------|------|---------|-------------|
240
+ | `autofocus` | `boolean` | — | Автофокус |
241
+ | `bottomSlot` | `ReactNode` | — | Рендерится после основной разметки календаря, внутри `CalendarContext` (например футер с Apply в дропдауне). |
242
+ | `buildCellProps` | `BuildCellPropsFunction` | — | Колбек установки свойств ячеек календаря. Вызывается на построение каждой ячейки. Принимает два параметра: <br/> <br> `Date` - дата ячейки <br/> <br> `ViewMode`: <br/> <br> - `month` отображение месяца, каждая ячейка - 1 день <br/> <br> - `year` отображение года, каждая ячейка - 1 месяц <br/> <br> - `decade` отображение декады, каждая ячейка - 1 год <br/> <br><br> Колбек должен возвращать объект с полями, отвечающими за отключение и подкраску ячейки. |
243
+ | `className` | `string` | — | CSS-класс контейнера |
244
+ | `data-test-id` | `string` | — | |
245
+ | `defaultValue` | `Range` | — | Значение по-умолчанию для uncontrolled.<br> - в режиме date тип `Date` <br/> <br> - в режиме date-range тип `Range` (`[Date, Date]`) <br/> <br> - в режиме month-range тип `Range` (`[Date, Date]`) <br/> <br> - в режиме year-range тип `Range` (`[Date, Date]`) <br/> <br> - в режиме month тип `Date` <br/> <br> - в режиме date-time тип `Date` <br/> <br> - в режиме year тип `Date` |
246
+ | `fitToContainer` | `boolean` | `true` | Отключает предустановленный размер, заставляя компонент подстраиваться к размеру контейнра: (width: 100%, height: 100%). |
247
+ | `locale` | `Intl.Locale` | `Проставляется в соответствие с языком в настройках браузера` | Локаль, в соответствие с которой выставляется язык названий и первый день недели |
248
+ | `mode` | `"date"` \| `"date-range"` \| `"date-time"` \| `"month"` \| `"month-range"` \| `"year"` \| `"year-range"` | — | Режим работы календаря: <br> - `date` - режим выбора даты <br/> <br> - `date-range` - режим выбора периода <br/> <br> - `month-range` - режим выбора периода из месяцев <br/> <br> - `year-range` - режим выбора периода из лет <br/> <br> - `month` - режим выбора месяца <br/> <br> - `date-time` - режим выбора даты и времени <br/> <br> - `year` - режим выбора года |
249
+ | `navigationStartRef` | `RefObject<{ focus(): void; }>` | — | Ссылка на управление первым элементом навигации |
250
+ | `onChangeValue` | `((value: Date) => void) \| ((value: Range) => void) \| ((value: Range) => void) \| ((value: Range) => void) \| ((value: Date) => void) \| ((value: Date) => void) \| ((value: Date) => void)` | — | Колбек выбора значения.<br> - в режиме date принимает тип `Date` <br/> <br> - в режиме date-range принимает тип `Range` <br/> <br> - в режиме month-range принимает тип `Range` <br/> <br> - в режиме year-range принимает тип `Range` <br/> <br> - в режиме month принимает тип `Date` <br/> <br> - в режиме date-time принимает тип `Date` <br/> <br> - в режиме year принимает тип `Date` |
251
+ | `onFocusLeave` | `((direction: FocusDirection) => void)` | — | Колбек потери фокуса. Вызывается со значением `next`, когда фокус покидает компонент, передвигаясь вперед, по клавише `tab`. Со значением `prev` - по клавише стрелки вверх или `shift + tab`. |
252
+ | `presets` | `PresetsOptions` | — | Настройки секции с пресетами быстрого выбора периода. Доступны только при mode === 'date-range' и отсутствии buildCellProps (временно PDS-3139) |
253
+ | `showHolidays` | `boolean` | — | Раскрашивает субботу и воскресенье |
254
+ | `showSeconds` | `boolean` | — | Показывать ли секунды (только в режиме date-time) |
255
+ | `size` | `"l"` \| `"m"` \| `"s"` | `m` | Размер |
256
+ | `style` | `CSSProperties` | — | Объект со стилями на контейнер. |
257
+ | `today` | `number \| Date` | — | Дата сегодняшнего дня |
258
+ | `value` | `Range` | — | Выбранное значение.<br> - в режиме date тип `Date` <br/> <br> - в режиме date-range тип `Range` (`[Date, Date]`) <br/> <br> - в режиме month-range тип `Range` (`[Date, Date]`) <br/> <br> - в режиме year-range тип `Range` (`[Date, Date]`) <br/> <br> - в режиме month тип `Date` <br/> <br> - в режиме date-time тип `Date` <br/> <br> - в режиме year тип `Date` |
259
+
260
+ ##### Related types
261
+
262
+ - `BuildCellPropsFunction` = `(date: Date, viewMode: ViewMode) => BuildCellProps`
263
+
264
+ **PresetItem**
265
+
266
+ | Prop | Type | Default | Description |
267
+ |------|------|---------|-------------|
268
+ | `id` | `string` | — | ID периода |
269
+ | `label` | `string` | — | Лейбл пресета |
270
+ | `range` | `Range` | — | Период |
271
+
272
+ **PresetsOptions**
273
+
274
+ | Prop | Type | Default | Description |
275
+ |------|------|---------|-------------|
276
+ | `enabled` | `boolean \| undefined` | — | Включение отображения секции с пресетами |
277
+ | `items` | `PresetItem` | — | Кастомные пресеты быстрого выбора периода относительно текущего момента |
278
+
279
+ **Range**
280
+
281
+ | Prop | Type | Default | Description |
282
+ |------|------|---------|-------------|
283
+ | `0` | `any` | — | |
284
+ | `1` | `any` | — | |
285
+ | `length` | `any` | — | |
286
+
287
+ - `Size` = `"l"` \| `"m"` \| `"s"`
288
+
289
+ ### Смотри также
290
+
291
+ - **TimePicker** и **TimePickerDropdown** — выбор времени.
292
+ - [Паттерны календаря и времени](/patterns/calendar-patterns).
293
+ ### Адаптивность
294
+
295
+ Адаптируется только триггерный `CalendarDropdown` — он переключает поверхность (surface-swap) в зависимости от раскладки из `AdaptiveProvider` (контекст `@cloud-ru/ds-adaptive`). Встраиваемый `Calendar` остаётся desktop-only: его разметка не меняется от раскладки. Публичный API единый для обеих платформ:
296
+
297
+ - **desktop** (по умолчанию) — календарь в popover над триггером (`@cloud-ru/ds-dropdown`).
298
+ - **mobile** — календарь в `BottomSheet` из `@cloud-ru/ds-bottom-sheet` (панель снизу со свайпом для закрытия).
299
+
300
+ Верстайте под desktop и поставьте один `<AdaptiveProvider>` в корне приложения — mobile-поверхность включается автоматически (desktop-first). Пропа `layoutType` у компонента нет: источник раскладки — только контекст.
301
+
302
+ #### Как форсировать платформу
303
+
304
+ Форс — только контекстом, не пропом:
305
+
306
+ - Поддерево — вложенный провайдер:
307
+ ```tsx
308
+ import { AdaptiveProvider } from '@cloud-ru/ds-adaptive'
309
+
310
+ <AdaptiveProvider layoutType='mobile'>
311
+ <CalendarDropdown>…</CalendarDropdown>
312
+ </AdaptiveProvider>
313
+ ```
314
+ - Отдельный компонент — `withLayoutType` (module-scope, сахар над провайдером):
315
+ ```tsx
316
+ import { withLayoutType } from '@cloud-ru/ds-adaptive'
317
+ import { CalendarDropdown } from '@cloud-ru/ds-calendar'
318
+
319
+ const MobileCalendarDropdown = withLayoutType(CalendarDropdown, 'mobile')
320
+ ```
321
+
322
+ #### Поведение на mobile
323
+
324
+ - Бесконечная вертикальная прокрутка месяцев, лет и декад вместо постраничной навигации.
325
+ - Заголовок — центрированный дропдаун уровня (`месяц → год → декада`, например `Январь 2026 ⌄`) с иконками-действиями: фильтр слева открывает пресеты периода отдельным подэкраном (только `date-range`), часы справа открывают барабан времени отдельным подэкраном (только `date-time`).
326
+ - Футер показывает строку «Выбрано:» с текущим значением и кнопки «Сейчас» / «Применить» во всех режимах.
327
+ - Выбранное значение отражается в заголовке, а не позицией прокрутки; при повторном открытии панель центрируется на выбранном значении.
328
+ - Время на mobile выбирается барабаном (`TimePickerDrum`), а не колонками `TimePicker`.
329
+
330
+ #### Платформенные пропы
331
+
332
+ Пропы позиционирования popover'а, унаследованные из `@cloud-ru/ds-dropdown` (`placement`, `fallbackPlacements`, `offset`, `widthStrategy` и др.), на mobile молча игнорируются — у `BottomSheet` своё позиционирование снизу.
333
+
334
+ | Пропы | desktop | mobile |
335
+ |-------|---------|--------|
336
+ | `placement`, `fallbackPlacements`, `offset`, `widthStrategy`, `trigger` | используется | игнорируется |
337
+ | `mode`, `value`, `defaultValue`, `onChangeValue`, `presets`, `showHolidays`, `open`, `onOpenChange` | используется | используется |
338
+
339
+ Подробнее о модели адаптивности — **Adaptive**.
340
+
341
+ ## TimePicker
342
+
343
+ Встроенный выбор времени (часы, минуты, опционально секунды) с размерами s/m/l и поддержкой контролируемого значения.
344
+
345
+ Компонент для выбора времени в потоке формы: колонки часов/минут/секунд с прокруткой и фокусной навигацией. Делит контекст с календарём через внутренний `CalendarContext`, если используется рядом с `Calendar` в кастомной композиции.
346
+
347
+ ### Когда использовать
348
+
349
+ - Нужен только выбор времени без даты на той же панели.
350
+ - Поле должно оставаться инлайн без выпадающего попапа.
351
+
352
+ Когда **не** нужен: если время выбирают редко и уместнее попап — используйте **TimePickerDropdown**.
353
+
354
+ - ✅ Синхронизировать значение с полем ввода через `value` / `onChangeValue`.
355
+ - ❌ Блокировать `onChangeValue` заглушкой — состояние не обновится и пример перестанет быть показательным.
356
+
357
+ ### Анатомия
358
+
359
+ #### Size
360
+
361
+ | Значение | Назначение |
362
+ |----------|------------|
363
+ | `s` | Узкие колонки и плотные таблицы |
364
+ | `m` | Значение по умолчанию |
365
+ | `l` | Крупные тач-цели |
366
+
367
+ #### Секунды
368
+
369
+ `showSeconds` (`true` по умолчанию) скрывает третью колонку, если достаточно часов и минут.
370
+
371
+ ### Примеры использования
372
+
373
+ #### Базовый выбор
374
+
375
+ ```tsx
376
+ import { SIZE, TimePicker, TimeValue } from '@cloud-ru/ds-calendar';
377
+ import { useState } from 'react';
378
+
379
+ export function TimePickerBasic() {
380
+ const [value, setValue] = useState<TimeValue | undefined>({ hours: 9, minutes: 15, seconds: 0 });
381
+
382
+ return (
383
+ <div style={{ width: 280, maxWidth: '100%' }}>
384
+ <TimePicker fitToContainer size={SIZE.M} value={value} onChangeValue={v => setValue(v)} />
385
+ </div>
386
+ );
387
+ }
388
+ ```
389
+
390
+ #### Без секунд
391
+
392
+ ```tsx
393
+ import { SIZE, TimePicker, TimeValue } from '@cloud-ru/ds-calendar';
394
+ import { useState } from 'react';
395
+
396
+ export function TimePickerNoSeconds() {
397
+ const [value, setValue] = useState<TimeValue | undefined>({ hours: 11, minutes: 45, seconds: 0 });
398
+
399
+ return (
400
+ <div style={{ width: 240, maxWidth: '100%' }}>
401
+ <TimePicker fitToContainer showSeconds={false} size={SIZE.M} value={value} onChangeValue={v => setValue(v)} />
402
+ </div>
403
+ );
404
+ }
405
+ ```
406
+
407
+ #### Размеры
408
+
409
+ ```tsx
410
+ import { SIZE, TimePicker } from '@cloud-ru/ds-calendar';
411
+
412
+ export function TimePickerSizes() {
413
+ return (
414
+ <div style={{ display: 'flex', gap: 12, flexWrap: 'wrap', alignItems: 'flex-start' }}>
415
+ <div style={{ width: 200 }}>
416
+ <TimePicker fitToContainer defaultValue={{ hours: 8, minutes: 0, seconds: 0 }} size={SIZE.S} />
417
+ </div>
418
+ <div style={{ width: 220 }}>
419
+ <TimePicker fitToContainer defaultValue={{ hours: 12, minutes: 30, seconds: 0 }} size={SIZE.M} />
420
+ </div>
421
+ <div style={{ width: 240 }}>
422
+ <TimePicker fitToContainer defaultValue={{ hours: 18, minutes: 45, seconds: 30 }} size={SIZE.L} />
423
+ </div>
424
+ </div>
425
+ );
426
+ }
427
+ ```
428
+
429
+ ### Props
430
+
431
+ **TimePickerProps**
432
+
433
+ | Prop | Type | Default | Description |
434
+ |------|------|---------|-------------|
435
+ | `className` | `string` | — | CSS-класс контейнера |
436
+ | `data-test-id` | `string` | — | |
437
+ | `defaultValue` | `TimeValue` | — | Значение по-умолчанию для uncontrolled. |
438
+ | `fitToContainer` | `boolean` | `true` | Отключает предустановленный размер, заставляя компонент подстраиваться к размеру контейнра: (width: 100%, height: 100%). |
439
+ | `navigationStartRef` | `RefObject<{ focus(): void; }>` | — | Ссылка на управление первым элементом навигации |
440
+ | `onChangeValue` | `((value?: TimeValue) => void)` | — | Колбек выбора значения |
441
+ | `onFocusLeave` | `((direction: FocusDirection) => void)` | — | Колбек потери фокуса. Вызывается со значением `next`, когда фокус покидает компонент, передвигаясь вперед, по клавише `tab`. Со значением `prev` - по клавише стрелки вверх или `shift + tab`. |
442
+ | `showSeconds` | `boolean` | `true` | Показывать ли секунды |
443
+ | `size` | `"l"` \| `"m"` \| `"s"` | `m` | Размер |
444
+ | `today` | `number \| Date` | — | Дата сегодняшнего дня |
445
+ | `value` | `TimeValue` | — | Выбранное значение. |
446
+
447
+ ##### Related types
448
+
449
+ - `Size` = `"l"` \| `"m"` \| `"s"`
450
+
451
+ **TimeValue**
452
+
453
+ | Prop | Type | Default | Description |
454
+ |------|------|---------|-------------|
455
+ | `hours` | `number \| undefined` | — | |
456
+ | `minutes` | `number \| undefined` | — | |
457
+ | `seconds` | `number \| undefined` | — | |
458
+
459
+ ### Смотри также
460
+
461
+ - **Calendar**
462
+ - **TimePickerDropdown**
463
+
464
+ ## TimePickerDropdown
465
+
466
+ Выбор времени в выпадающей панели поверх триггера — наследует TimePicker и пропсы Dropdown (позиция, открытие по hover/click, контролируемый open).
467
+
468
+ Обёртка над `TimePicker` с `Dropdown`: произвольный триггер (`children`), управление открытием, позиционирование и опциональное закрытие после Apply. Подходит для полей «время открытия», фильтров и компактных форм.
469
+
470
+ ### Когда использовать
471
+
472
+ - Нужна кнопка или кастомный триггер, а панель времени показывается по клику или ховеру.
473
+ - Требуется связать открытие с другим UI (например, контролируемый `open`).
474
+
475
+ Когда **не** нужен: для постоянно видимого времени в форме без попапа используйте **TimePicker**.
476
+
477
+ - ✅ Задавать `placement` и `trigger` в зависимости от layout и UX‑требований.
478
+ - ❌ Смешивать управляемый `open` с лишними внешними кнопками, которые дублируют открытие — проще контролировать только через `onOpenChange`.
479
+
480
+ ### Анатомия
481
+
482
+ #### Триггер и открытие
483
+
484
+ `trigger` — `click` | `hover` | `focus` и др. (см. пропсы Dropdown в таблице). `closeOnApply` закрывает панель после подтверждения, если сценарий это предполагает.
485
+
486
+ #### Позиционирование
487
+
488
+ `placement` и `fallbackPlacements` наследуются из `@cloud-ru/ds-dropdown` — подбирайте, чтобы панель не обрезалась у края экрана.
489
+
490
+ #### Визуал времени
491
+
492
+ Макет барабана времени совпадает с **TimePicker**; см. узел Figma ниже.
493
+
494
+ ### Примеры использования
495
+
496
+ #### Клик по кнопке
497
+
498
+ closeOnApply закрывает после выбора
499
+
500
+ ```tsx
501
+ import { Button } from '@cloud-ru/ds-button';
502
+ import { SIZE, TimePickerDropdown, TimeValue } from '@cloud-ru/ds-calendar';
503
+ import { useState } from 'react';
504
+
505
+ export function TimePickerDropdownBasic() {
506
+ const [value, setValue] = useState<TimeValue | undefined>({ hours: 10, minutes: 5, seconds: 0 });
507
+
508
+ return (
509
+ <TimePickerDropdown
510
+ closeOnApply
511
+ fitToContainer={false}
512
+ placement='bottom-start'
513
+ size={SIZE.M}
514
+ trigger='click'
515
+ value={value}
516
+ onChangeValue={v => setValue(v)}
517
+ >
518
+ <Button label='Выбрать время' />
519
+ </TimePickerDropdown>
520
+ );
521
+ }
522
+ ```
523
+
524
+ #### Контролируемое open
525
+
526
+ ```tsx
527
+ import { Button } from '@cloud-ru/ds-button';
528
+ import { SIZE, TimePickerDropdown, TimeValue } from '@cloud-ru/ds-calendar';
529
+ import { useState } from 'react';
530
+
531
+ export function TimePickerDropdownControlled() {
532
+ const [open, setOpen] = useState(false);
533
+ const [value, setValue] = useState<TimeValue | undefined>({ hours: 14, minutes: 0, seconds: 0 });
534
+
535
+ return (
536
+ <div style={{ display: 'flex', flexDirection: 'column', gap: 8 }}>
537
+ <TimePickerDropdown
538
+ fitToContainer={false}
539
+ open={open}
540
+ placement='bottom-start'
541
+ showSeconds={false}
542
+ size={SIZE.S}
543
+ trigger='click'
544
+ value={value}
545
+ onChangeValue={v => setValue(v)}
546
+ onOpenChange={setOpen}
547
+ >
548
+ <Button label='Время (controlled open)' />
549
+ </TimePickerDropdown>
550
+ <span style={{ fontSize: 14, opacity: 0.8 }}>Панель времени: {open ? 'открыта' : 'закрыта'}</span>
551
+ </div>
552
+ );
553
+ }
554
+ ```
555
+
556
+ #### Разные placement
557
+
558
+ ```tsx
559
+ import { Button } from '@cloud-ru/ds-button';
560
+ import { SIZE, TimePickerDropdown, TimeValue } from '@cloud-ru/ds-calendar';
561
+ import { useState } from 'react';
562
+
563
+ export function TimePickerDropdownPlacement() {
564
+ const [value, setValue] = useState<TimeValue | undefined>({ hours: 7, minutes: 30, seconds: 0 });
565
+
566
+ return (
567
+ <div style={{ display: 'flex', gap: 12, flexWrap: 'wrap', alignItems: 'flex-start' }}>
568
+ <TimePickerDropdown
569
+ closeOnApply
570
+ fitToContainer={false}
571
+ placement='bottom-start'
572
+ size={SIZE.M}
573
+ trigger='click'
574
+ value={value}
575
+ onChangeValue={v => setValue(v)}
576
+ >
577
+ <Button label='bottom-start' />
578
+ </TimePickerDropdown>
579
+ <TimePickerDropdown
580
+ closeOnApply
581
+ fitToContainer={false}
582
+ placement='top-end'
583
+ size={SIZE.M}
584
+ trigger='click'
585
+ value={value}
586
+ onChangeValue={v => setValue(v)}
587
+ >
588
+ <Button label='top-end' />
589
+ </TimePickerDropdown>
590
+ </div>
591
+ );
592
+ }
593
+ ```
594
+
595
+ ### Props
596
+
597
+ **TimePickerDropdownProps**
598
+
599
+ | Prop | Type | Default | Description |
600
+ |------|------|---------|-------------|
601
+ | `children` | `ReactNode` | — | Контент триггера открытия dropdown |
602
+ | `className` | `string` | — | CSS-класс контейнера |
603
+ | `closeOnApply` | `boolean` | — | Закрыть dropdown после нажатия кнопки Apply |
604
+ | `closeOnEscapeKey` | `boolean` | `true` | Закрывать ли по нажатию на кнопку `Esc` |
605
+ | `closeOnPopstate` | `boolean` | — | Закрывать ли поповер при переходе по истории браузера |
606
+ | `data-test-id` | `string` | — | |
607
+ | `defaultValue` | `TimeValue` | — | Значение по-умолчанию для uncontrolled. |
608
+ | `disableSpanWrapper` | `boolean` | — | Отключает для `isValidElement` внешнюю обертку триггера <br/> Пригодится для элементов с `position: absolute` <br/> Работает для триггеров, которые умеют отдать свою DOM-ноду: нативные элементы, `forwardRef`-компоненты <br/> и компоненты, помеченные `withInnerRefSupport` из `@cloud-ru/ds-utils`. Остальные всё равно получают `<span>` — <br/> без ноды поповеру не от чего считать позицию; в dev-режиме об этом печатается предупреждение. |
609
+ | `fallbackPlacements` | `Placement` | — | Цепочка расположений которая будет применяться к поповеру от первого к последнему если при текущем он не влезает. |
610
+ | `fitToContainer` | `boolean` | `true` | Отключает предустановленный размер, заставляя компонент подстраиваться к размеру контейнра: (width: 100%, height: 100%). |
611
+ | `hoverDelayClose` | `number` | — | Задержка закрытия по ховеру |
612
+ | `hoverDelayOpen` | `number` | — | Задержка открытия по ховеру |
613
+ | `navigationStartRef` | `RefObject<{ focus(): void; }>` | — | Ссылка на управление первым элементом навигации |
614
+ | `onApply` | `(() => void)` | — | Колбек по нажатию Apply |
615
+ | `onChangeValue` | `((value?: TimeValue) => void)` | — | Колбек выбора значения |
616
+ | `onCurrent` | `(() => void)` | — | Колбек по нажатию Current |
617
+ | `onFocusLeave` | `((direction: FocusDirection) => void)` | — | Колбек потери фокуса. Вызывается со значением `next`, когда фокус покидает компонент, передвигаясь вперед, по клавише `tab`. Со значением `prev` - по клавише стрелки вверх или `shift + tab`. |
618
+ | `onOpenChange` | `((isOpen: boolean) => void)` | — | Колбек отображения компонента. Срабатывает при изменении состояния open. |
619
+ | `open` | `boolean` | — | Управляет состоянием показан/не показан. |
620
+ | `outsideClick` | `OutsideClickHandler` | — | Закрывать ли при клике вне поповера |
621
+ | `placement` | `"bottom"` \| `"bottom-end"` \| `"bottom-start"` \| `"left"` \| `"left-end"` \| `"left-start"` \| `"right"` \| `"right-end"` \| `"right-start"` \| `"top"` \| `"top-end"` \| `"top-start"` | `top` | Положение поповера относительно своего триггера (children). |
622
+ | `showSeconds` | `boolean` | — | Показывать ли секунды |
623
+ | `size` | `"l"` \| `"m"` \| `"s"` | `m` | Размер |
624
+ | `today` | `number \| Date` | — | Дата сегодняшнего дня |
625
+ | `trigger` | `"click"` \| `"clickAndFocusVisible"` \| `"focus"` \| `"focusVisible"` \| `"hover"` \| `"hoverAndFocus"` \| `"hoverAndFocusVisible"` | — | Условие отображения поповера: <br/> - `click` - открывать по клику <br/> - `hover` - открывать по ховеру <br/> - `focusVisible` - открывать по focus-visible <br/> - `focus` - открывать по фокусу <br/> - `hoverAndFocusVisible` - открывать по ховеру и focus-visible <br/> - `hoverAndFocus` - открывать по ховеру и фокусу <br/> - `clickAndFocusVisible` - открывать по клику и focus-visible |
626
+ | `triggerClassName` | `string` | — | CSS-класс триггера |
627
+ | `triggerClickByKeys` | `boolean` | `true` | Вызывается ли попоповер по нажатию клавиш Enter/Space (при trigger = `click`) |
628
+ | `triggerRef` | `ForwardedRef<HTMLElement \| ReferenceType \| null>` | — | Ref ссылка на триггер |
629
+ | `value` | `TimeValue` | — | Выбранное значение. |
630
+
631
+ ##### Related types
632
+
633
+ - `Size` = `"l"` \| `"m"` \| `"s"`
634
+
635
+ **TimeValue**
636
+
637
+ | Prop | Type | Default | Description |
638
+ |------|------|---------|-------------|
639
+ | `hours` | `number \| undefined` | — | |
640
+ | `minutes` | `number \| undefined` | — | |
641
+ | `seconds` | `number \| undefined` | — | |
642
+
643
+ ### Смотри также
644
+
645
+ - **TimePicker**
646
+ - **Dropdown** — базовый выпадающий контейнер.
647
+ ### Адаптивность
648
+
649
+ `TimePickerDropdown` — адаптивный компонент с переключением поверхности (surface-swap). Раскладку он берёт из `AdaptiveProvider` (контекст `@cloud-ru/ds-adaptive`); встраиваемый `TimePicker` не адаптируется. Публичный API единый для обеих платформ:
650
+
651
+ - **desktop** (по умолчанию) — барабан времени в popover над триггером (`@cloud-ru/ds-dropdown`).
652
+ - **mobile** — барабан времени в `BottomSheet` из `@cloud-ru/ds-bottom-sheet` с кнопками «Сейчас» / «Применить».
653
+
654
+ Верстайте под desktop и поставьте один `<AdaptiveProvider>` в корне приложения — mobile-поверхность включается автоматически (desktop-first). Пропа `layoutType` у компонента нет: источник раскладки — только контекст.
655
+
656
+ #### Как форсировать платформу
657
+
658
+ Форс — только контекстом, не пропом:
659
+
660
+ - Поддерево — вложенный провайдер:
661
+ ```tsx
662
+ import { AdaptiveProvider } from '@cloud-ru/ds-adaptive'
663
+
664
+ <AdaptiveProvider layoutType='mobile'>
665
+ <TimePickerDropdown>…</TimePickerDropdown>
666
+ </AdaptiveProvider>
667
+ ```
668
+ - Отдельный компонент — `withLayoutType` (module-scope, сахар над провайдером):
669
+ ```tsx
670
+ import { withLayoutType } from '@cloud-ru/ds-adaptive'
671
+ import { TimePickerDropdown } from '@cloud-ru/ds-calendar'
672
+
673
+ const MobileTimePickerDropdown = withLayoutType(TimePickerDropdown, 'mobile')
674
+ ```
675
+
676
+ #### Платформенные пропы
677
+
678
+ Пропы позиционирования и открытия popover'а (`placement`, `fallbackPlacements`, `trigger`, `closeOnApply` и др.) применяются только на desktop; на mobile `BottomSheet` имеет своё позиционирование снизу и игнорирует их.
679
+
680
+ | Пропы | desktop | mobile |
681
+ |-------|---------|--------|
682
+ | `placement`, `fallbackPlacements`, `trigger`, `closeOnApply` | используется | игнорируется |
683
+ | `value`, `defaultValue`, `onChangeValue`, `showSeconds`, `open`, `onOpenChange` | используется | используется |
684
+
685
+ Подробнее о модели адаптивности — **Adaptive**.