@vkontakte/vkui 4.26.0 → 4.27.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 (299) hide show
  1. package/.cache/.eslintcache +1 -1
  2. package/.cache/.stylelintcache +1 -1
  3. package/.cache/.tsbuildinfo +210 -85
  4. package/.cache/ts/src/components/ActionSheetItem/ActionSheetItem.d.ts +1 -2
  5. package/.cache/ts/src/components/Alert/Alert.d.ts +1 -2
  6. package/.cache/ts/src/components/AppearanceProvider/AppearanceProvider.d.ts +1 -0
  7. package/.cache/ts/src/components/Card/Card.d.ts +1 -2
  8. package/.cache/ts/src/components/CardScroll/CardScroll.d.ts +4 -7
  9. package/.cache/ts/src/components/Chip/Chip.d.ts +2 -2
  10. package/.cache/ts/src/components/ConfigProvider/ConfigProvider.d.ts +1 -1
  11. package/.cache/ts/src/components/ConfigProvider/ConfigProviderContext.d.ts +5 -5
  12. package/.cache/ts/src/components/Gradient/Gradient.d.ts +1 -2
  13. package/.cache/ts/src/components/SegmentedControl/SegmentedControl.d.ts +17 -0
  14. package/.cache/ts/src/components/SegmentedControl/SegmentedControlOption/SegmentedControlOption.d.ts +4 -0
  15. package/.cache/ts/src/components/SliderSwitch/SliderSwitch.d.ts +6 -2
  16. package/.cache/ts/src/components/SliderSwitch/SliderSwitchButton.d.ts +4 -2
  17. package/.cache/ts/src/components/Switch/Switch.d.ts +3 -2
  18. package/.cache/ts/src/components/Typography/Title/Title.d.ts +4 -1
  19. package/.cache/ts/src/components/VisuallyHiddenInput/VisuallyHiddenInput.d.ts +12 -0
  20. package/.cache/ts/src/hooks/usePlatform.d.ts +1 -1
  21. package/.cache/ts/src/index.d.ts +7 -5
  22. package/.cache/ts/src/lib/utils.d.ts +1 -0
  23. package/.cache/ts/src/tokenized/index.d.ts +6 -0
  24. package/VKUI_TOKENS_MIGRATION_GUIDE.md +2 -1
  25. package/dist/cjs/components/ActionSheetItem/ActionSheetItem.d.ts +1 -2
  26. package/dist/cjs/components/ActionSheetItem/ActionSheetItem.js +16 -10
  27. package/dist/cjs/components/ActionSheetItem/ActionSheetItem.js.map +1 -1
  28. package/dist/cjs/components/Alert/Alert.d.ts +1 -2
  29. package/dist/cjs/components/Alert/Alert.js +12 -12
  30. package/dist/cjs/components/Alert/Alert.js.map +1 -1
  31. package/dist/cjs/components/AppearanceProvider/AppearanceProvider.d.ts +1 -0
  32. package/dist/cjs/components/AppearanceProvider/AppearanceProvider.js +29 -2
  33. package/dist/cjs/components/AppearanceProvider/AppearanceProvider.js.map +1 -1
  34. package/dist/cjs/components/Banner/Banner.js +1 -1
  35. package/dist/cjs/components/Banner/Banner.js.map +1 -1
  36. package/dist/cjs/components/Button/Button.js +9 -1
  37. package/dist/cjs/components/Button/Button.js.map +1 -1
  38. package/dist/cjs/components/Card/Card.d.ts +1 -2
  39. package/dist/cjs/components/Card/Card.js +4 -8
  40. package/dist/cjs/components/Card/Card.js.map +1 -1
  41. package/dist/cjs/components/CardScroll/CardScroll.d.ts +4 -7
  42. package/dist/cjs/components/CardScroll/CardScroll.js +11 -15
  43. package/dist/cjs/components/CardScroll/CardScroll.js.map +1 -1
  44. package/dist/cjs/components/Chip/Chip.d.ts +2 -2
  45. package/dist/cjs/components/Chip/Chip.js +3 -5
  46. package/dist/cjs/components/Chip/Chip.js.map +1 -1
  47. package/dist/cjs/components/ChipsInput/ChipsInput.js +2 -2
  48. package/dist/cjs/components/ChipsInput/ChipsInput.js.map +1 -1
  49. package/dist/cjs/components/ConfigProvider/ConfigProvider.d.ts +1 -1
  50. package/dist/cjs/components/ConfigProvider/ConfigProvider.js +1 -26
  51. package/dist/cjs/components/ConfigProvider/ConfigProvider.js.map +1 -1
  52. package/dist/cjs/components/ConfigProvider/ConfigProviderContext.d.ts +5 -5
  53. package/dist/cjs/components/ConfigProvider/ConfigProviderContext.js.map +1 -1
  54. package/dist/cjs/components/ContentCard/ContentCard.js +4 -4
  55. package/dist/cjs/components/ContentCard/ContentCard.js.map +1 -1
  56. package/dist/cjs/components/Gradient/Gradient.d.ts +1 -2
  57. package/dist/cjs/components/Gradient/Gradient.js +6 -10
  58. package/dist/cjs/components/Gradient/Gradient.js.map +1 -1
  59. package/dist/cjs/components/Header/Header.js +1 -1
  60. package/dist/cjs/components/Header/Header.js.map +1 -1
  61. package/dist/cjs/components/ModalCardBase/ModalCardBase.js +1 -1
  62. package/dist/cjs/components/ModalCardBase/ModalCardBase.js.map +1 -1
  63. package/dist/cjs/components/PanelHeaderButton/PanelHeaderButton.js +1 -1
  64. package/dist/cjs/components/PanelHeaderButton/PanelHeaderButton.js.map +1 -1
  65. package/dist/cjs/components/Placeholder/Placeholder.js +1 -1
  66. package/dist/cjs/components/Placeholder/Placeholder.js.map +1 -1
  67. package/dist/cjs/components/Search/Search.js +47 -23
  68. package/dist/cjs/components/Search/Search.js.map +1 -1
  69. package/dist/cjs/components/SegmentedControl/SegmentedControl.d.ts +17 -0
  70. package/dist/cjs/components/SegmentedControl/SegmentedControl.js +116 -0
  71. package/dist/cjs/components/SegmentedControl/SegmentedControl.js.map +1 -0
  72. package/dist/cjs/components/SegmentedControl/SegmentedControlOption/SegmentedControlOption.d.ts +4 -0
  73. package/dist/cjs/components/SegmentedControl/SegmentedControlOption/SegmentedControlOption.js +61 -0
  74. package/dist/cjs/components/SegmentedControl/SegmentedControlOption/SegmentedControlOption.js.map +1 -0
  75. package/dist/cjs/components/SimpleCell/SimpleCell.js +21 -8
  76. package/dist/cjs/components/SimpleCell/SimpleCell.js.map +1 -1
  77. package/dist/cjs/components/SliderSwitch/SliderSwitch.d.ts +6 -2
  78. package/dist/cjs/components/SliderSwitch/SliderSwitch.js +18 -6
  79. package/dist/cjs/components/SliderSwitch/SliderSwitch.js.map +1 -1
  80. package/dist/cjs/components/SliderSwitch/SliderSwitchButton.d.ts +4 -2
  81. package/dist/cjs/components/SliderSwitch/SliderSwitchButton.js +6 -5
  82. package/dist/cjs/components/SliderSwitch/SliderSwitchButton.js.map +1 -1
  83. package/dist/cjs/components/Switch/Switch.d.ts +3 -2
  84. package/dist/cjs/components/Switch/Switch.js +3 -6
  85. package/dist/cjs/components/Switch/Switch.js.map +1 -1
  86. package/dist/cjs/components/Typography/Title/Title.d.ts +4 -1
  87. package/dist/cjs/components/Typography/Title/Title.js +9 -19
  88. package/dist/cjs/components/Typography/Title/Title.js.map +1 -1
  89. package/dist/cjs/components/VisuallyHiddenInput/VisuallyHiddenInput.d.ts +12 -0
  90. package/dist/cjs/components/VisuallyHiddenInput/VisuallyHiddenInput.js +37 -0
  91. package/dist/cjs/components/VisuallyHiddenInput/VisuallyHiddenInput.js.map +1 -0
  92. package/dist/cjs/hooks/usePlatform.d.ts +1 -1
  93. package/dist/cjs/hooks/usePlatform.js.map +1 -1
  94. package/dist/cjs/index.d.ts +7 -5
  95. package/dist/cjs/index.js +18 -10
  96. package/dist/cjs/index.js.map +1 -1
  97. package/dist/cjs/lib/utils.d.ts +1 -0
  98. package/dist/cjs/lib/utils.js +7 -0
  99. package/dist/cjs/lib/utils.js.map +1 -1
  100. package/dist/cjs/tokenized/index.d.ts +6 -0
  101. package/dist/cjs/tokenized/index.js +24 -0
  102. package/dist/cjs/tokenized/index.js.map +1 -1
  103. package/dist/components/ActionSheetItem/ActionSheetItem.d.ts +1 -2
  104. package/dist/components/ActionSheetItem/ActionSheetItem.js +14 -10
  105. package/dist/components/ActionSheetItem/ActionSheetItem.js.map +1 -1
  106. package/dist/components/Alert/Alert.d.ts +1 -2
  107. package/dist/components/Alert/Alert.js +11 -12
  108. package/dist/components/Alert/Alert.js.map +1 -1
  109. package/dist/components/AppearanceProvider/AppearanceProvider.d.ts +1 -0
  110. package/dist/components/AppearanceProvider/AppearanceProvider.js +24 -1
  111. package/dist/components/AppearanceProvider/AppearanceProvider.js.map +1 -1
  112. package/dist/components/Banner/Banner.js +1 -1
  113. package/dist/components/Banner/Banner.js.map +1 -1
  114. package/dist/components/Button/Button.js +9 -2
  115. package/dist/components/Button/Button.js.map +1 -1
  116. package/dist/components/Card/Card.d.ts +1 -2
  117. package/dist/components/Card/Card.js +3 -9
  118. package/dist/components/Card/Card.js.map +1 -1
  119. package/dist/components/CardScroll/CardScroll.d.ts +4 -7
  120. package/dist/components/CardScroll/CardScroll.js +9 -14
  121. package/dist/components/CardScroll/CardScroll.js.map +1 -1
  122. package/dist/components/Chip/Chip.d.ts +2 -2
  123. package/dist/components/Chip/Chip.js +2 -6
  124. package/dist/components/Chip/Chip.js.map +1 -1
  125. package/dist/components/ChipsInput/ChipsInput.js +1 -1
  126. package/dist/components/ChipsInput/ChipsInput.js.map +1 -1
  127. package/dist/components/ConfigProvider/ConfigProvider.d.ts +1 -1
  128. package/dist/components/ConfigProvider/ConfigProvider.js +1 -25
  129. package/dist/components/ConfigProvider/ConfigProvider.js.map +1 -1
  130. package/dist/components/ConfigProvider/ConfigProviderContext.d.ts +5 -5
  131. package/dist/components/ConfigProvider/ConfigProviderContext.js.map +1 -1
  132. package/dist/components/ContentCard/ContentCard.js +3 -3
  133. package/dist/components/ContentCard/ContentCard.js.map +1 -1
  134. package/dist/components/Gradient/Gradient.d.ts +1 -2
  135. package/dist/components/Gradient/Gradient.js +5 -11
  136. package/dist/components/Gradient/Gradient.js.map +1 -1
  137. package/dist/components/Header/Header.js +1 -1
  138. package/dist/components/Header/Header.js.map +1 -1
  139. package/dist/components/ModalCardBase/ModalCardBase.js +2 -2
  140. package/dist/components/ModalCardBase/ModalCardBase.js.map +1 -1
  141. package/dist/components/PanelHeaderButton/PanelHeaderButton.js +1 -1
  142. package/dist/components/PanelHeaderButton/PanelHeaderButton.js.map +1 -1
  143. package/dist/components/Placeholder/Placeholder.js +1 -1
  144. package/dist/components/Placeholder/Placeholder.js.map +1 -1
  145. package/dist/components/Search/Search.js +45 -22
  146. package/dist/components/Search/Search.js.map +1 -1
  147. package/dist/components/SegmentedControl/SegmentedControl.d.ts +17 -0
  148. package/dist/components/SegmentedControl/SegmentedControl.js +94 -0
  149. package/dist/components/SegmentedControl/SegmentedControl.js.map +1 -0
  150. package/dist/components/SegmentedControl/SegmentedControlOption/SegmentedControlOption.d.ts +4 -0
  151. package/dist/components/SegmentedControl/SegmentedControlOption/SegmentedControlOption.js +40 -0
  152. package/dist/components/SegmentedControl/SegmentedControlOption/SegmentedControlOption.js.map +1 -0
  153. package/dist/components/SimpleCell/SimpleCell.js +21 -9
  154. package/dist/components/SimpleCell/SimpleCell.js.map +1 -1
  155. package/dist/components/SliderSwitch/SliderSwitch.d.ts +6 -2
  156. package/dist/components/SliderSwitch/SliderSwitch.js +14 -3
  157. package/dist/components/SliderSwitch/SliderSwitch.js.map +1 -1
  158. package/dist/components/SliderSwitch/SliderSwitchButton.d.ts +4 -2
  159. package/dist/components/SliderSwitch/SliderSwitchButton.js +5 -5
  160. package/dist/components/SliderSwitch/SliderSwitchButton.js.map +1 -1
  161. package/dist/components/Switch/Switch.d.ts +3 -2
  162. package/dist/components/Switch/Switch.js +3 -6
  163. package/dist/components/Switch/Switch.js.map +1 -1
  164. package/dist/components/Typography/Title/Title.d.ts +4 -1
  165. package/dist/components/Typography/Title/Title.js +7 -16
  166. package/dist/components/Typography/Title/Title.js.map +1 -1
  167. package/dist/components/VisuallyHiddenInput/VisuallyHiddenInput.d.ts +12 -0
  168. package/dist/components/VisuallyHiddenInput/VisuallyHiddenInput.js +23 -0
  169. package/dist/components/VisuallyHiddenInput/VisuallyHiddenInput.js.map +1 -0
  170. package/dist/components.css +5 -5
  171. package/dist/components.css.map +1 -1
  172. package/dist/cssm/components/ActionSheetItem/ActionSheetItem.js +14 -10
  173. package/dist/cssm/components/ActionSheetItem/ActionSheetItem.js.map +1 -1
  174. package/dist/cssm/components/Alert/Alert.js +11 -12
  175. package/dist/cssm/components/Alert/Alert.js.map +1 -1
  176. package/dist/cssm/components/AppearanceProvider/AppearanceProvider.js +24 -1
  177. package/dist/cssm/components/AppearanceProvider/AppearanceProvider.js.map +1 -1
  178. package/dist/cssm/components/Banner/Banner.js +1 -1
  179. package/dist/cssm/components/Banner/Banner.js.map +1 -1
  180. package/dist/cssm/components/Button/Button.js +9 -2
  181. package/dist/cssm/components/Button/Button.js.map +1 -1
  182. package/dist/cssm/components/Card/Card.css +2 -2
  183. package/dist/cssm/components/Card/Card.js +3 -9
  184. package/dist/cssm/components/Card/Card.js.map +1 -1
  185. package/dist/cssm/components/CardScroll/CardScroll.css +1 -1
  186. package/dist/cssm/components/CardScroll/CardScroll.js +9 -14
  187. package/dist/cssm/components/CardScroll/CardScroll.js.map +1 -1
  188. package/dist/cssm/components/Chip/Chip.js +2 -6
  189. package/dist/cssm/components/Chip/Chip.js.map +1 -1
  190. package/dist/cssm/components/ChipsInput/ChipsInput.js +1 -1
  191. package/dist/cssm/components/ChipsInput/ChipsInput.js.map +1 -1
  192. package/dist/cssm/components/ConfigProvider/ConfigProvider.js +1 -25
  193. package/dist/cssm/components/ConfigProvider/ConfigProvider.js.map +1 -1
  194. package/dist/cssm/components/ConfigProvider/ConfigProviderContext.js.map +1 -1
  195. package/dist/cssm/components/ContentCard/ContentCard.js +3 -3
  196. package/dist/cssm/components/ContentCard/ContentCard.js.map +1 -1
  197. package/dist/cssm/components/FocusVisible/FocusVisible.css +1 -1
  198. package/dist/cssm/components/Gradient/Gradient.js +5 -11
  199. package/dist/cssm/components/Gradient/Gradient.js.map +1 -1
  200. package/dist/cssm/components/Header/Header.js +1 -1
  201. package/dist/cssm/components/Header/Header.js.map +1 -1
  202. package/dist/cssm/components/ModalCardBase/ModalCardBase.js +2 -2
  203. package/dist/cssm/components/ModalCardBase/ModalCardBase.js.map +1 -1
  204. package/dist/cssm/components/PanelHeaderButton/PanelHeaderButton.js +1 -1
  205. package/dist/cssm/components/PanelHeaderButton/PanelHeaderButton.js.map +1 -1
  206. package/dist/cssm/components/Placeholder/Placeholder.js +1 -1
  207. package/dist/cssm/components/Placeholder/Placeholder.js.map +1 -1
  208. package/dist/cssm/components/Search/Search.js +45 -22
  209. package/dist/cssm/components/Search/Search.js.map +1 -1
  210. package/dist/cssm/components/SegmentedControl/SegmentedControl.css +1 -0
  211. package/dist/cssm/components/SegmentedControl/SegmentedControl.js +95 -0
  212. package/dist/cssm/components/SegmentedControl/SegmentedControl.js.map +1 -0
  213. package/dist/cssm/components/SegmentedControl/SegmentedControlOption/SegmentedControlOption.css +1 -0
  214. package/dist/cssm/components/SegmentedControl/SegmentedControlOption/SegmentedControlOption.js +41 -0
  215. package/dist/cssm/components/SegmentedControl/SegmentedControlOption/SegmentedControlOption.js.map +1 -0
  216. package/dist/cssm/components/SimpleCell/SimpleCell.js +21 -9
  217. package/dist/cssm/components/SimpleCell/SimpleCell.js.map +1 -1
  218. package/dist/cssm/components/SliderSwitch/SliderSwitch.js +14 -3
  219. package/dist/cssm/components/SliderSwitch/SliderSwitch.js.map +1 -1
  220. package/dist/cssm/components/SliderSwitch/SliderSwitchButton.js +5 -5
  221. package/dist/cssm/components/SliderSwitch/SliderSwitchButton.js.map +1 -1
  222. package/dist/cssm/components/Switch/Switch.css +1 -1
  223. package/dist/cssm/components/Switch/Switch.js +3 -6
  224. package/dist/cssm/components/Switch/Switch.js.map +1 -1
  225. package/dist/cssm/components/Typography/Title/Title.css +1 -1
  226. package/dist/cssm/components/Typography/Title/Title.js +7 -16
  227. package/dist/cssm/components/Typography/Title/Title.js.map +1 -1
  228. package/dist/cssm/components/VisuallyHiddenInput/VisuallyHiddenInput.css +1 -0
  229. package/dist/cssm/components/VisuallyHiddenInput/VisuallyHiddenInput.js +24 -0
  230. package/dist/cssm/components/VisuallyHiddenInput/VisuallyHiddenInput.js.map +1 -0
  231. package/dist/cssm/hooks/usePlatform.js.map +1 -1
  232. package/dist/cssm/index.js +6 -5
  233. package/dist/cssm/index.js.map +1 -1
  234. package/dist/cssm/lib/utils.js +3 -0
  235. package/dist/cssm/lib/utils.js.map +1 -1
  236. package/dist/cssm/styles/components.css +5 -5
  237. package/dist/cssm/styles/themes.css +1 -1
  238. package/dist/cssm/tokenized/index.js +3 -0
  239. package/dist/cssm/tokenized/index.js.map +1 -1
  240. package/dist/hooks/usePlatform.d.ts +1 -1
  241. package/dist/hooks/usePlatform.js.map +1 -1
  242. package/dist/index.d.ts +7 -5
  243. package/dist/index.js +6 -5
  244. package/dist/index.js.map +1 -1
  245. package/dist/lib/utils.d.ts +1 -0
  246. package/dist/lib/utils.js +3 -0
  247. package/dist/lib/utils.js.map +1 -1
  248. package/dist/tokenized/index.d.ts +6 -0
  249. package/dist/tokenized/index.js +3 -0
  250. package/dist/tokenized/index.js.map +1 -1
  251. package/dist/vkui.css +6 -6
  252. package/dist/vkui.css.map +1 -1
  253. package/package.json +2 -2
  254. package/src/components/ActionSheetItem/ActionSheetItem.tsx +26 -24
  255. package/src/components/Alert/Alert.tsx +5 -7
  256. package/src/components/AppearanceProvider/AppearanceProvider.tsx +25 -1
  257. package/src/components/Banner/Banner.tsx +1 -1
  258. package/src/components/Button/Button.tsx +6 -3
  259. package/src/components/Card/Card.css +41 -0
  260. package/src/components/Card/Card.tsx +2 -9
  261. package/src/components/CardScroll/CardScroll.css +2 -39
  262. package/src/components/CardScroll/CardScroll.tsx +7 -17
  263. package/src/components/CardScroll/Readme.md +3 -2
  264. package/src/components/Chip/Chip.tsx +1 -4
  265. package/src/components/ChipsInput/ChipsInput.tsx +1 -1
  266. package/src/components/ConfigProvider/ConfigProvider.tsx +6 -25
  267. package/src/components/ConfigProvider/ConfigProviderContext.tsx +5 -5
  268. package/src/components/ContentCard/ContentCard.tsx +2 -2
  269. package/src/components/FocusVisible/FocusVisible.css +4 -8
  270. package/src/components/FormItem/Readme.md +14 -2
  271. package/src/components/Gradient/Gradient.tsx +4 -12
  272. package/src/components/Gradient/Readme.md +1 -1
  273. package/src/components/Header/Header.tsx +1 -1
  274. package/src/components/ModalCardBase/ModalCardBase.tsx +2 -2
  275. package/src/components/ModalRoot/Readme.md +1 -1
  276. package/src/components/PanelHeaderButton/PanelHeaderButton.tsx +1 -5
  277. package/src/components/Placeholder/Placeholder.tsx +1 -1
  278. package/src/components/Search/Search.tsx +38 -14
  279. package/src/components/SegmentedControl/Readme.md +94 -0
  280. package/src/components/SegmentedControl/SegmentedControl.css +42 -0
  281. package/src/components/SegmentedControl/SegmentedControl.tsx +105 -0
  282. package/src/components/SegmentedControl/SegmentedControlOption/SegmentedControlOption.css +30 -0
  283. package/src/components/SegmentedControl/SegmentedControlOption/SegmentedControlOption.tsx +42 -0
  284. package/src/components/SimpleCell/SimpleCell.tsx +10 -6
  285. package/src/components/SliderSwitch/Readme.md +4 -0
  286. package/src/components/SliderSwitch/SliderSwitch.tsx +17 -3
  287. package/src/components/SliderSwitch/SliderSwitchButton.tsx +4 -4
  288. package/src/components/Switch/Switch.css +0 -12
  289. package/src/components/Switch/Switch.tsx +8 -10
  290. package/src/components/Typography/Title/Readme.md +28 -41
  291. package/src/components/Typography/Title/Title.css +22 -13
  292. package/src/components/Typography/Title/Title.tsx +27 -22
  293. package/src/components/VisuallyHiddenInput/VisuallyHiddenInput.css +9 -0
  294. package/src/components/VisuallyHiddenInput/VisuallyHiddenInput.tsx +25 -0
  295. package/src/hooks/usePlatform.ts +1 -1
  296. package/src/index.ts +11 -5
  297. package/src/lib/utils.ts +6 -0
  298. package/src/styles/components.css +3 -0
  299. package/src/tokenized/index.ts +13 -0
@@ -189,7 +189,7 @@ const App = withPlatform(
189
189
  <Title
190
190
  style={{ marginBottom: 8, marginTop: 20 }}
191
191
  level="2"
192
- weight="medium"
192
+ weight="2"
193
193
  >
194
194
  {this.randomUser.first_name + " " + this.randomUser.last_name}
195
195
  </Title>
@@ -27,11 +27,7 @@ const ButtonTypography: React.FC<ButtonTypographyProps> = ({
27
27
 
28
28
  if (platform === IOS) {
29
29
  return (
30
- <Title
31
- Component="span"
32
- level="3"
33
- weight={primary ? "semibold" : "regular"}
34
- >
30
+ <Title Component="span" level="3" weight={primary ? "1" : "3"}>
35
31
  {children}
36
32
  </Title>
37
33
  );
@@ -49,7 +49,7 @@ const Placeholder: React.FC<PlaceholderProps> = (props: PlaceholderProps) => {
49
49
  <div vkuiClass="Placeholder__in">
50
50
  {hasReactNode(icon) && <div vkuiClass="Placeholder__icon">{icon}</div>}
51
51
  {hasReactNode(header) && (
52
- <Title level="2" weight="medium" vkuiClass="Placeholder__header">
52
+ <Title level="2" weight="2" vkuiClass="Placeholder__header">
53
53
  {header}
54
54
  </Title>
55
55
  )}
@@ -7,13 +7,14 @@ import {
7
7
  Icon16Clear,
8
8
  Icon24Cancel,
9
9
  } from "@vkontakte/icons";
10
- import { IOS, VKCOM } from "../../lib/platform";
10
+ import { IOS, VKCOM, ANDROID } from "../../lib/platform";
11
11
  import { HasPlatform, HasRef } from "../../types";
12
12
  import { Touch, TouchEvent } from "../Touch/Touch";
13
13
  import { VKUITouchEvent } from "../../lib/touch";
14
14
  import { noop } from "../../lib/utils";
15
15
  import Text from "../Typography/Text/Text";
16
16
  import Title from "../Typography/Title/Title";
17
+ import Headline from "../Typography/Headline/Headline";
17
18
  import Separator from "../Separator/Separator";
18
19
  import { useExternRef } from "../../hooks/useExternRef";
19
20
  import { useEnsuredControl } from "../../hooks/useEnsuredControl";
@@ -21,6 +22,36 @@ import "./Search.css";
21
22
 
22
23
  export type InputRef = (element: HTMLInputElement) => void;
23
24
 
25
+ interface SearchPlaceholderTypographyProps
26
+ extends HasPlatform,
27
+ React.HTMLAttributes<HTMLElement> {}
28
+
29
+ const SearchPlaceholderTypography: React.FC<
30
+ SearchPlaceholderTypographyProps
31
+ > = ({ platform, children, ...restProps }) => {
32
+ switch (platform) {
33
+ case IOS:
34
+ return (
35
+ <Title {...restProps} level="3" weight="3">
36
+ {children}
37
+ </Title>
38
+ );
39
+ case VKCOM:
40
+ return (
41
+ <Text {...restProps} weight="regular">
42
+ {children}
43
+ </Text>
44
+ );
45
+ case ANDROID:
46
+ default:
47
+ return (
48
+ <Headline {...restProps} weight="regular">
49
+ {children}
50
+ </Headline>
51
+ );
52
+ }
53
+ };
54
+
24
55
  export interface SearchProps
25
56
  extends React.InputHTMLAttributes<HTMLInputElement>,
26
57
  HasRef<HTMLInputElement>,
@@ -118,19 +149,12 @@ const Search: React.FC<SearchProps> = ({
118
149
  <div vkuiClass="Search__placeholder">
119
150
  <div vkuiClass="Search__placeholder-in">
120
151
  {before}
121
- {platform === VKCOM ? (
122
- <Text vkuiClass="Search__placeholder-text" weight="regular">
123
- {placeholder}
124
- </Text>
125
- ) : (
126
- <Title
127
- vkuiClass="Search__placeholder-text"
128
- level="3"
129
- weight="regular"
130
- >
131
- {placeholder}
132
- </Title>
133
- )}
152
+ <SearchPlaceholderTypography
153
+ vkuiClass="Search__placeholder-text"
154
+ platform={platform}
155
+ >
156
+ {placeholder}
157
+ </SearchPlaceholderTypography>
134
158
  </div>
135
159
  {isFocused && platform === IOS && after && (
136
160
  <div vkuiClass="Search__after-width">{after}</div>
@@ -0,0 +1,94 @@
1
+ Горизонтальный контрол, который позволяет выбрать одну опцию-сегмент из представленного списка.
2
+
3
+ Для чего может быть нужен:
4
+
5
+ - для навигации — как аналог `<Tabs/>`;
6
+ - в формах — как аналог `<RadioGroup/>`.
7
+
8
+ Сегменты, как кнопки, могут содержать текст и/или иконки.
9
+
10
+ Сегментов не должно быть много: чем они больше — тем проще между ними переключаться. [Apple ограничивает количество сегментов на iPhone пятью](https://developer.apple.com/design/human-interface-guidelines/ios/controls/segmented-controls/).
11
+
12
+ ```jsx
13
+ const [reportType, changeReportType] = React.useState("idea");
14
+ const [selectedSex, changeSelectedSex] = React.useState();
15
+
16
+ <View activePanel="progress">
17
+ <Panel id="progress">
18
+ <PanelHeader>SegmentedControl</PanelHeader>
19
+ <Group header={<Header subtitle="Режим просмотра">Навигация</Header>}>
20
+ <Div>
21
+ <SegmentedControl
22
+ options={[
23
+ {
24
+ label: <Icon24List aria-hidden="true" />,
25
+ value: "list",
26
+ "aria-label": "Список",
27
+ },
28
+ {
29
+ label: <Icon16GridOfFour aria-hidden="true" />,
30
+ value: "grid",
31
+ "aria-label": "Плитки",
32
+ },
33
+ ]}
34
+ />
35
+ </Div>
36
+ </Group>
37
+ <Group header={<Header>Форма</Header>}>
38
+ <FormItem
39
+ top="Тип репорта"
40
+ bottom={`Controlled; name="report-type", size="m"`}
41
+ >
42
+ <SegmentedControl
43
+ size="m"
44
+ name="report-type"
45
+ value={reportType}
46
+ onChange={(value) => changeReportType(value)}
47
+ options={[
48
+ {
49
+ label: "Баг",
50
+ value: "bug",
51
+ },
52
+ {
53
+ label: "Идея",
54
+ value: "idea",
55
+ },
56
+ {
57
+ label: "Другое",
58
+ value: "other",
59
+ },
60
+ ]}
61
+ />
62
+ </FormItem>
63
+ <FormItem
64
+ top={
65
+ <React.Fragment>
66
+ Пол{selectedSex && <span>: {selectedSex}</span>}
67
+ </React.Fragment>
68
+ }
69
+ bottom={`Uncontrolled; name="sex", defaultValue="none", size="l"`}
70
+ >
71
+ <SegmentedControl
72
+ name="sex"
73
+ defaultValue="none"
74
+ onChange={(value) => changeSelectedSex(value)}
75
+ options={[
76
+ {
77
+ label: "Женский",
78
+ value: "female",
79
+ },
80
+ {
81
+ label: "Мужской",
82
+ value: "male",
83
+ },
84
+ {
85
+ label: "Любой",
86
+ value: "none",
87
+ },
88
+ ]}
89
+ />
90
+ </FormItem>
91
+ </Group>
92
+ </Panel>
93
+ </View>;
94
+ ```
@@ -0,0 +1,42 @@
1
+ .SegmentedControl {
2
+ height: 36px;
3
+ padding: 2px;
4
+ border-radius: var(--vkui--size_border_radius--regular);
5
+ background-color: var(--vkui--color_background_secondary);
6
+ box-sizing: border-box;
7
+ }
8
+
9
+ .SegmentedControl--l {
10
+ height: 44px;
11
+ }
12
+
13
+ .SegmentedControl__in {
14
+ position: relative;
15
+ display: flex;
16
+ height: 100%;
17
+ width: 100%;
18
+ transition: all 100ms ease-out;
19
+ border-radius: inherit;
20
+ }
21
+
22
+ .SegmentedControl__slider {
23
+ position: absolute;
24
+ top: 0;
25
+ left: 0;
26
+ bottom: 0;
27
+ background-color: var(--vkui--color_background_modal);
28
+ transition: transform 150ms;
29
+ transform-origin: 0 0;
30
+ border-radius: inherit;
31
+ box-shadow: inset 0 0 0 0.5px var(--vkui--color_image_border_alpha),
32
+ 0 3px 8px rgba(0, 0, 0, 0.12), 0 3px 1px rgba(0, 0, 0, 0.04);
33
+ }
34
+
35
+ .SegmentedControl__option {
36
+ position: relative;
37
+ flex: 1;
38
+ display: block;
39
+ margin: 0;
40
+ padding: 0;
41
+ z-index: 1;
42
+ }
@@ -0,0 +1,105 @@
1
+ import * as React from "react";
2
+ import { classNames } from "../../lib/classNames";
3
+ import { useIsomorphicLayoutEffect } from "../../lib/useIsomorphicLayoutEffect";
4
+ import { generateRandomId, noop } from "../../lib/utils";
5
+ import { warnOnce } from "../../lib/warnOnce";
6
+ import { SegmentedControlOption } from "./SegmentedControlOption/SegmentedControlOption";
7
+ import { HasRootRef } from "../../types";
8
+ import "./SegmentedControl.css";
9
+
10
+ export type SegmentedControlValue = string | number | undefined;
11
+
12
+ export interface SegmentedControlOptionInterface
13
+ extends Omit<React.HTMLAttributes<HTMLElement>, "label"> {
14
+ label: React.ReactChild;
15
+ value: SegmentedControlValue;
16
+ }
17
+
18
+ export interface SegmentedControlProps
19
+ extends Omit<React.HTMLAttributes<HTMLDivElement>, "onChange">,
20
+ HasRootRef<HTMLDivElement> {
21
+ options: SegmentedControlOptionInterface[];
22
+ size?: "m" | "l";
23
+ name?: string;
24
+ onChange?: (value: SegmentedControlValue) => void;
25
+ value?: SegmentedControlValue;
26
+ defaultValue?: SegmentedControlValue;
27
+ }
28
+
29
+ const warn = warnOnce("SegmentedControl");
30
+ export const SegmentedControl: React.FC<SegmentedControlProps> = ({
31
+ size = "l",
32
+ name,
33
+ options,
34
+ getRootRef,
35
+ onChange = noop,
36
+ value,
37
+ defaultValue,
38
+ children,
39
+ ...restProps
40
+ }) => {
41
+ let initialValue = defaultValue ?? value;
42
+
43
+ if (!initialValue) {
44
+ initialValue = options[0]?.value;
45
+ }
46
+
47
+ const [activeOptionIdx, updateActiveOptionIdx] = React.useState<number>(0);
48
+ const [activeValue, updateActiveValue] =
49
+ React.useState<SegmentedControlValue>(initialValue);
50
+
51
+ const nameRef = React.useRef<string>(name ?? generateRandomId());
52
+
53
+ useIsomorphicLayoutEffect(() => {
54
+ const _activeOptionIdx = options.findIndex(
55
+ (option) => option.value === activeValue
56
+ );
57
+
58
+ if (_activeOptionIdx === -1 && process.env.NODE_ENV === "development") {
59
+ warn("defaultValue: такого значения нет среди опций!");
60
+ }
61
+
62
+ updateActiveOptionIdx(_activeOptionIdx);
63
+ }, [activeValue, options]);
64
+
65
+ const translateX = `translateX(${100 * activeOptionIdx}%)`;
66
+
67
+ const handleOnChange = (value: SegmentedControlValue) => {
68
+ updateActiveValue(value);
69
+ onChange(value);
70
+ };
71
+
72
+ return (
73
+ <div
74
+ {...restProps}
75
+ vkuiClass={classNames("SegmentedControl", `SegmentedControl--${size}`)}
76
+ ref={getRootRef}
77
+ >
78
+ <div role="radiogroup" vkuiClass="SegmentedControl__in">
79
+ {activeOptionIdx > -1 && (
80
+ <div
81
+ aria-hidden="true"
82
+ vkuiClass="SegmentedControl__slider"
83
+ style={{
84
+ width: `${100 / options.length}%`,
85
+ transform: translateX,
86
+ WebkitTransform: translateX,
87
+ }}
88
+ />
89
+ )}
90
+ {options.map(({ label, ...optionProps }) => (
91
+ <SegmentedControlOption
92
+ key={`${optionProps.value}`}
93
+ {...optionProps}
94
+ vkuiClass="SegmentedControl__option"
95
+ name={nameRef.current}
96
+ checked={activeValue === optionProps.value}
97
+ onChange={() => handleOnChange(optionProps.value)}
98
+ >
99
+ {label}
100
+ </SegmentedControlOption>
101
+ ))}
102
+ </div>
103
+ </div>
104
+ );
105
+ };
@@ -0,0 +1,30 @@
1
+ .SegmentedControlOption {
2
+ height: 100%;
3
+ border: 0;
4
+ border-radius: inherit;
5
+ background: transparent;
6
+ color: var(--vkui--color_text_primary);
7
+ transition: color 100ms ease-out;
8
+ user-select: none;
9
+ box-sizing: border-box;
10
+ cursor: pointer;
11
+ appearance: none;
12
+ }
13
+
14
+ .SegmentedControlOption .Icon {
15
+ color: var(--vkui--color_icon_secondary);
16
+ }
17
+
18
+ .SegmentedControlOption:hover {
19
+ opacity: 0.5;
20
+ }
21
+
22
+ .SegmentedControlOption__content {
23
+ display: flex;
24
+ align-content: center;
25
+ align-items: center;
26
+ justify-content: center;
27
+ height: 100%;
28
+ width: 100%;
29
+ border-radius: inherit;
30
+ }
@@ -0,0 +1,42 @@
1
+ import * as React from "react";
2
+ import { useFocusVisible } from "../../../hooks/useFocusVisible";
3
+ import { callMultiple } from "../../../lib/callMultiple";
4
+ import { classNames } from "../../../lib/classNames";
5
+ import { FocusVisible } from "../../FocusVisible/FocusVisible";
6
+ import Text from "../../Typography/Text/Text";
7
+ import {
8
+ VisuallyHiddenInput,
9
+ VisuallyHiddenInputProps,
10
+ } from "../../VisuallyHiddenInput/VisuallyHiddenInput";
11
+ import "./SegmentedControlOption.css";
12
+
13
+ export const SegmentedControlOption: React.FC<VisuallyHiddenInputProps> = ({
14
+ className,
15
+ style,
16
+ children,
17
+ ...restProps
18
+ }) => {
19
+ const { focusVisible, onBlur, onFocus } = useFocusVisible();
20
+
21
+ return (
22
+ <label
23
+ className={className}
24
+ style={style}
25
+ vkuiClass={classNames("SegmentedControlOption", {
26
+ "SegmentedControlOption--checked": restProps.checked,
27
+ "SegmentedControlOption--focus-visible": focusVisible,
28
+ })}
29
+ >
30
+ <VisuallyHiddenInput
31
+ {...restProps}
32
+ type="radio"
33
+ onBlur={callMultiple(onBlur, restProps.onBlur)}
34
+ onFocus={callMultiple(onFocus, restProps.onFocus)}
35
+ />
36
+ <Text vkuiClass="SegmentedControlOption__content" weight="medium">
37
+ {children}
38
+ </Text>
39
+ <FocusVisible mode="inside" />
40
+ </label>
41
+ );
42
+ };
@@ -4,7 +4,7 @@ import { classNames } from "../../lib/classNames";
4
4
  import { getClassName } from "../../helpers/getClassName";
5
5
  import Tappable, { TappableProps } from "../Tappable/Tappable";
6
6
  import { Icon24Chevron } from "@vkontakte/icons";
7
- import { IOS } from "../../lib/platform";
7
+ import { ANDROID, IOS } from "../../lib/platform";
8
8
  import { usePlatform } from "../../hooks/usePlatform";
9
9
  import { hasReactNode } from "../../lib/utils";
10
10
  import { useAdaptivity } from "../../hooks/useAdaptivity";
@@ -12,6 +12,7 @@ import { withAdaptivity, SizeType } from "../../hoc/withAdaptivity";
12
12
  import Title from "../Typography/Title/Title";
13
13
  import Text from "../Typography/Text/Text";
14
14
  import Subhead from "../Typography/Subhead/Subhead";
15
+ import Headline from "../Typography/Headline/Headline";
15
16
  import "./SimpleCell.css";
16
17
 
17
18
  export interface SimpleCellOwnProps extends HasComponent {
@@ -55,12 +56,15 @@ const SimpleCellTypography: React.FC<SimpleCellTypographyProps> = (
55
56
  props: SimpleCellTypographyProps
56
57
  ) => {
57
58
  const { sizeY } = useAdaptivity();
59
+ const platform = usePlatform();
58
60
 
59
- return sizeY === SizeType.COMPACT ? (
60
- <Text Component="span" weight="regular" {...props} />
61
- ) : (
62
- <Title Component="span" level="3" weight="regular" {...props} />
63
- );
61
+ if (sizeY === SizeType.COMPACT) {
62
+ return <Text Component="span" weight="regular" {...props} />;
63
+ } else if (platform === ANDROID) {
64
+ return <Headline Component="span" weight="regular" {...props} />;
65
+ } else {
66
+ return <Title Component="span" level="3" weight="3" {...props} />;
67
+ }
64
68
  };
65
69
 
66
70
  const SimpleCell: React.FC<SimpleCellProps> = ({
@@ -1,3 +1,7 @@
1
+ > **Deprecated:** этот компонент устарел и будет удален в 5.0.0.
2
+ >
3
+ > Используйте [`SegmentedControl`](#/SegmentedControl).
4
+
1
5
  ```jsx
2
6
  <View activePanel="progress">
3
7
  <Panel id="progress">
@@ -1,6 +1,7 @@
1
1
  import * as React from "react";
2
- import SliderSwitchButton from "./SliderSwitchButton";
2
+ import { SliderSwitchButton } from "./SliderSwitchButton";
3
3
  import { classNames } from "../../lib/classNames";
4
+ import { warnOnce } from "../../lib/warnOnce";
4
5
  import { HasPlatform } from "../../types";
5
6
  import "./SliderSwitch.css";
6
7
 
@@ -26,8 +27,11 @@ interface SliderSwitchState {
26
27
  hoveredOptionId: number;
27
28
  }
28
29
 
29
- // eslint-disable-next-line import/no-default-export
30
- export default class SliderSwitch extends React.Component<
30
+ const warn = warnOnce("SliderSwitch");
31
+ /**
32
+ * @deprecated Этот компонент устарел и будет удален в 5.0.0. Используйте [`SegmentedControl`](#/SegmentedControl).
33
+ */
34
+ class SliderSwitch extends React.Component<
31
35
  SliderSwitchProps,
32
36
  SliderSwitchState
33
37
  > {
@@ -139,6 +143,14 @@ export default class SliderSwitch extends React.Component<
139
143
  return null;
140
144
  }
141
145
 
146
+ componentDidMount(): void {
147
+ if (process.env.NODE_ENV === "development") {
148
+ warn(
149
+ "Этот компонент устарел и будет удален в 5.0.0. Используйте SegmentedControl."
150
+ );
151
+ }
152
+ }
153
+
142
154
  public render() {
143
155
  const {
144
156
  name,
@@ -193,3 +205,5 @@ export default class SliderSwitch extends React.Component<
193
205
  );
194
206
  }
195
207
  }
208
+
209
+ export { SliderSwitch };
@@ -14,7 +14,10 @@ export interface ButtonProps
14
14
  hovered?: boolean;
15
15
  }
16
16
 
17
- const SliderSwitchButton: React.FunctionComponent<ButtonProps> = (
17
+ /**
18
+ * @deprecated Этот компонент устарел и будет удален в 5.0.0.
19
+ */
20
+ export const SliderSwitchButton: React.FunctionComponent<ButtonProps> = (
18
21
  props: ButtonProps
19
22
  ) => {
20
23
  const { active, hovered, children, getRootRef, ...restProps } = props;
@@ -48,6 +51,3 @@ const SliderSwitchButton: React.FunctionComponent<ButtonProps> = (
48
51
  </Tappable>
49
52
  );
50
53
  };
51
-
52
- // eslint-disable-next-line import/no-default-export
53
- export default SliderSwitchButton;
@@ -8,18 +8,6 @@
8
8
  cursor: default;
9
9
  }
10
10
 
11
- .Switch__self {
12
- position: absolute;
13
- width: 1px;
14
- height: 1px;
15
- margin: 0;
16
- padding: 0;
17
- border: 0;
18
- clip: rect(1px, 1px, 1px, 1px);
19
- overflow: hidden;
20
- opacity: 0;
21
- }
22
-
23
11
  .Switch__pseudo {
24
12
  position: relative;
25
13
  display: block;
@@ -3,22 +3,23 @@ import { getClassName } from "../../helpers/getClassName";
3
3
  import { classNames } from "../../lib/classNames";
4
4
  import { callMultiple } from "../../lib/callMultiple";
5
5
  import { usePlatform } from "../../hooks/usePlatform";
6
- import { HasRef, HasRootRef } from "../../types";
6
+ import { HasRootRef } from "../../types";
7
7
  import { useAdaptivity } from "../../hooks/useAdaptivity";
8
- import { useExternRef } from "../../hooks/useExternRef";
8
+ import {
9
+ VisuallyHiddenInput,
10
+ VisuallyHiddenInputProps,
11
+ } from "../VisuallyHiddenInput/VisuallyHiddenInput";
9
12
  import { useFocusVisible } from "../../hooks/useFocusVisible";
10
13
  import { FocusVisible } from "../FocusVisible/FocusVisible";
11
14
  import "./Switch.css";
12
15
 
13
16
  export interface SwitchProps
14
- extends React.InputHTMLAttributes<HTMLInputElement>,
15
- HasRootRef<HTMLLabelElement>,
16
- HasRef<HTMLInputElement> {}
17
+ extends VisuallyHiddenInputProps,
18
+ HasRootRef<HTMLLabelElement> {}
17
19
 
18
20
  export const Switch: React.FC<SwitchProps> = ({
19
21
  style,
20
22
  className,
21
- getRef,
22
23
  getRootRef,
23
24
  ...restProps
24
25
  }: SwitchProps) => {
@@ -26,8 +27,6 @@ export const Switch: React.FC<SwitchProps> = ({
26
27
  const { sizeY } = useAdaptivity();
27
28
  const { focusVisible, onBlur, onFocus } = useFocusVisible();
28
29
 
29
- const inputRef = useExternRef(getRef);
30
-
31
30
  return (
32
31
  <label
33
32
  vkuiClass={classNames(
@@ -43,11 +42,10 @@ export const Switch: React.FC<SwitchProps> = ({
43
42
  ref={getRootRef}
44
43
  role="presentation"
45
44
  >
46
- <input
45
+ <VisuallyHiddenInput
47
46
  {...restProps}
48
47
  type="checkbox"
49
48
  vkuiClass="Switch__self"
50
- ref={inputRef}
51
49
  onBlur={callMultiple(onBlur, restProps.onBlur)}
52
50
  onFocus={callMultiple(onFocus, restProps.onFocus)}
53
51
  />