@vkontakte/vkui 4.21.0 → 4.22.2

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 (248) hide show
  1. package/.cache/.eslintcache +1 -1
  2. package/.cache/.stylelintcache +1 -1
  3. package/.cache/.tsbuildinfo +271 -37
  4. package/.cache/ts/src/components/Avatar/Avatar.d.ts +2 -0
  5. package/.cache/ts/src/components/Cell/Cell.d.ts +11 -0
  6. package/.cache/ts/src/components/Cell/CellCheckbox/CellCheckbox.d.ts +5 -0
  7. package/.cache/ts/src/components/Cell/CellDragger/CellDragger.d.ts +6 -0
  8. package/.cache/ts/src/components/Cell/useDraggable.d.ts +13 -0
  9. package/.cache/ts/src/components/CustomSelect/CustomSelect.d.ts +0 -1
  10. package/.cache/ts/src/components/DropdownIcon/DropdownIcon.d.ts +3 -0
  11. package/.cache/ts/src/components/GridAvatar/GridAvatar.d.ts +9 -0
  12. package/.cache/ts/src/components/InitialsAvatar/InitialsAvatar.d.ts +33 -0
  13. package/.cache/ts/src/components/Removable/Removable.d.ts +2 -1
  14. package/.cache/ts/src/components/TabbarItem/TabbarItem.d.ts +3 -1
  15. package/.cache/ts/src/index.d.ts +4 -0
  16. package/dist/cjs/components/ActionSheet/ActionSheet.js +1 -12
  17. package/dist/cjs/components/ActionSheet/ActionSheet.js.map +1 -1
  18. package/dist/cjs/components/Avatar/Avatar.d.ts +2 -0
  19. package/dist/cjs/components/Avatar/Avatar.js +7 -3
  20. package/dist/cjs/components/Avatar/Avatar.js.map +1 -1
  21. package/dist/cjs/components/CardScroll/CardScroll.js +1 -1
  22. package/dist/cjs/components/CardScroll/CardScroll.js.map +1 -1
  23. package/dist/cjs/components/Cell/Cell.d.ts +11 -0
  24. package/dist/cjs/components/Cell/Cell.js +109 -182
  25. package/dist/cjs/components/Cell/Cell.js.map +1 -1
  26. package/dist/cjs/components/Cell/CellCheckbox/CellCheckbox.d.ts +5 -0
  27. package/dist/cjs/components/Cell/CellCheckbox/CellCheckbox.js +50 -0
  28. package/dist/cjs/components/Cell/CellCheckbox/CellCheckbox.js.map +1 -0
  29. package/dist/cjs/components/Cell/CellDragger/CellDragger.d.ts +6 -0
  30. package/dist/cjs/components/Cell/CellDragger/CellDragger.js +53 -0
  31. package/dist/cjs/components/Cell/CellDragger/CellDragger.js.map +1 -0
  32. package/dist/cjs/components/Cell/useDraggable.d.ts +13 -0
  33. package/dist/cjs/components/Cell/useDraggable.js +142 -0
  34. package/dist/cjs/components/Cell/useDraggable.js.map +1 -0
  35. package/dist/cjs/components/ChipsSelect/ChipsSelect.js +2 -2
  36. package/dist/cjs/components/ChipsSelect/ChipsSelect.js.map +1 -1
  37. package/dist/cjs/components/CustomSelect/CustomSelect.d.ts +0 -1
  38. package/dist/cjs/components/CustomSelect/CustomSelect.js +2 -3
  39. package/dist/cjs/components/CustomSelect/CustomSelect.js.map +1 -1
  40. package/dist/cjs/components/DropdownIcon/DropdownIcon.d.ts +3 -0
  41. package/dist/cjs/components/DropdownIcon/DropdownIcon.js +37 -0
  42. package/dist/cjs/components/DropdownIcon/DropdownIcon.js.map +1 -0
  43. package/dist/cjs/components/FocusTrap/FocusTrap.js +3 -5
  44. package/dist/cjs/components/FocusTrap/FocusTrap.js.map +1 -1
  45. package/dist/cjs/components/FormLayoutGroup/FormLayoutGroup.js +1 -0
  46. package/dist/cjs/components/FormLayoutGroup/FormLayoutGroup.js.map +1 -1
  47. package/dist/cjs/components/GridAvatar/GridAvatar.d.ts +9 -0
  48. package/dist/cjs/components/GridAvatar/GridAvatar.js +61 -0
  49. package/dist/cjs/components/GridAvatar/GridAvatar.js.map +1 -0
  50. package/dist/cjs/components/InitialsAvatar/InitialsAvatar.d.ts +33 -0
  51. package/dist/cjs/components/InitialsAvatar/InitialsAvatar.js +64 -0
  52. package/dist/cjs/components/InitialsAvatar/InitialsAvatar.js.map +1 -0
  53. package/dist/cjs/components/NativeSelect/NativeSelect.js +2 -2
  54. package/dist/cjs/components/NativeSelect/NativeSelect.js.map +1 -1
  55. package/dist/cjs/components/Progress/Progress.js +6 -3
  56. package/dist/cjs/components/Progress/Progress.js.map +1 -1
  57. package/dist/cjs/components/Removable/Removable.d.ts +2 -1
  58. package/dist/cjs/components/Removable/Removable.js +20 -10
  59. package/dist/cjs/components/Removable/Removable.js.map +1 -1
  60. package/dist/cjs/components/SelectMimicry/SelectMimicry.js +2 -2
  61. package/dist/cjs/components/SelectMimicry/SelectMimicry.js.map +1 -1
  62. package/dist/cjs/components/Tabbar/Tabbar.js +3 -1
  63. package/dist/cjs/components/Tabbar/Tabbar.js.map +1 -1
  64. package/dist/cjs/components/TabbarItem/TabbarItem.d.ts +3 -1
  65. package/dist/cjs/components/TabbarItem/TabbarItem.js +29 -11
  66. package/dist/cjs/components/TabbarItem/TabbarItem.js.map +1 -1
  67. package/dist/cjs/components/View/View.js +53 -42
  68. package/dist/cjs/components/View/View.js.map +1 -1
  69. package/dist/cjs/components/View/ViewInfinite.js +63 -52
  70. package/dist/cjs/components/View/ViewInfinite.js.map +1 -1
  71. package/dist/cjs/index.d.ts +4 -0
  72. package/dist/cjs/index.js +16 -0
  73. package/dist/cjs/index.js.map +1 -1
  74. package/dist/cjs/lib/prefixClass.js +7 -6
  75. package/dist/cjs/lib/prefixClass.js.map +1 -1
  76. package/dist/components/ActionSheet/ActionSheet.js +1 -11
  77. package/dist/components/ActionSheet/ActionSheet.js.map +1 -1
  78. package/dist/components/Avatar/Avatar.d.ts +2 -0
  79. package/dist/components/Avatar/Avatar.js +4 -2
  80. package/dist/components/Avatar/Avatar.js.map +1 -1
  81. package/dist/components/CardScroll/CardScroll.js +1 -1
  82. package/dist/components/CardScroll/CardScroll.js.map +1 -1
  83. package/dist/components/Cell/Cell.d.ts +11 -0
  84. package/dist/components/Cell/Cell.js +103 -177
  85. package/dist/components/Cell/Cell.js.map +1 -1
  86. package/dist/components/Cell/CellCheckbox/CellCheckbox.d.ts +5 -0
  87. package/dist/components/Cell/CellCheckbox/CellCheckbox.js +31 -0
  88. package/dist/components/Cell/CellCheckbox/CellCheckbox.js.map +1 -0
  89. package/dist/components/Cell/CellDragger/CellDragger.d.ts +6 -0
  90. package/dist/components/Cell/CellDragger/CellDragger.js +30 -0
  91. package/dist/components/Cell/CellDragger/CellDragger.js.map +1 -0
  92. package/dist/components/Cell/useDraggable.d.ts +13 -0
  93. package/dist/components/Cell/useDraggable.js +126 -0
  94. package/dist/components/Cell/useDraggable.js.map +1 -0
  95. package/dist/components/ChipsSelect/ChipsSelect.js +2 -2
  96. package/dist/components/ChipsSelect/ChipsSelect.js.map +1 -1
  97. package/dist/components/CustomSelect/CustomSelect.d.ts +0 -1
  98. package/dist/components/CustomSelect/CustomSelect.js +3 -5
  99. package/dist/components/CustomSelect/CustomSelect.js.map +1 -1
  100. package/dist/components/DropdownIcon/DropdownIcon.d.ts +3 -0
  101. package/dist/components/DropdownIcon/DropdownIcon.js +19 -0
  102. package/dist/components/DropdownIcon/DropdownIcon.js.map +1 -0
  103. package/dist/components/FocusTrap/FocusTrap.js +3 -5
  104. package/dist/components/FocusTrap/FocusTrap.js.map +1 -1
  105. package/dist/components/FormLayoutGroup/FormLayoutGroup.js +1 -0
  106. package/dist/components/FormLayoutGroup/FormLayoutGroup.js.map +1 -1
  107. package/dist/components/GridAvatar/GridAvatar.d.ts +9 -0
  108. package/dist/components/GridAvatar/GridAvatar.js +41 -0
  109. package/dist/components/GridAvatar/GridAvatar.js.map +1 -0
  110. package/dist/components/InitialsAvatar/InitialsAvatar.d.ts +33 -0
  111. package/dist/components/InitialsAvatar/InitialsAvatar.js +46 -0
  112. package/dist/components/InitialsAvatar/InitialsAvatar.js.map +1 -0
  113. package/dist/components/NativeSelect/NativeSelect.js +2 -2
  114. package/dist/components/NativeSelect/NativeSelect.js.map +1 -1
  115. package/dist/components/Progress/Progress.js +6 -3
  116. package/dist/components/Progress/Progress.js.map +1 -1
  117. package/dist/components/Removable/Removable.d.ts +2 -1
  118. package/dist/components/Removable/Removable.js +20 -11
  119. package/dist/components/Removable/Removable.js.map +1 -1
  120. package/dist/components/SelectMimicry/SelectMimicry.js +2 -2
  121. package/dist/components/SelectMimicry/SelectMimicry.js.map +1 -1
  122. package/dist/components/Tabbar/Tabbar.js +3 -1
  123. package/dist/components/Tabbar/Tabbar.js.map +1 -1
  124. package/dist/components/TabbarItem/TabbarItem.d.ts +3 -1
  125. package/dist/components/TabbarItem/TabbarItem.js +26 -10
  126. package/dist/components/TabbarItem/TabbarItem.js.map +1 -1
  127. package/dist/components/View/View.js +53 -42
  128. package/dist/components/View/View.js.map +1 -1
  129. package/dist/components/View/ViewInfinite.js +65 -54
  130. package/dist/components/View/ViewInfinite.js.map +1 -1
  131. package/dist/components.css +1 -1
  132. package/dist/components.css.map +1 -1
  133. package/dist/cssm/components/ActionSheet/ActionSheet.js +1 -11
  134. package/dist/cssm/components/ActionSheet/ActionSheet.js.map +1 -1
  135. package/dist/cssm/components/Avatar/Avatar.js +4 -2
  136. package/dist/cssm/components/Avatar/Avatar.js.map +1 -1
  137. package/dist/cssm/components/CardScroll/CardScroll.js +1 -1
  138. package/dist/cssm/components/CardScroll/CardScroll.js.map +1 -1
  139. package/dist/cssm/components/Cell/Cell.css +1 -1
  140. package/dist/cssm/components/Cell/Cell.js +103 -177
  141. package/dist/cssm/components/Cell/Cell.js.map +1 -1
  142. package/dist/cssm/components/Cell/CellCheckbox/CellCheckbox.css +1 -0
  143. package/dist/cssm/components/Cell/CellCheckbox/CellCheckbox.js +32 -0
  144. package/dist/cssm/components/Cell/CellCheckbox/CellCheckbox.js.map +1 -0
  145. package/dist/cssm/components/Cell/CellDragger/CellDragger.css +1 -0
  146. package/dist/cssm/components/Cell/CellDragger/CellDragger.js +31 -0
  147. package/dist/cssm/components/Cell/CellDragger/CellDragger.js.map +1 -0
  148. package/dist/cssm/components/Cell/useDraggable.js +126 -0
  149. package/dist/cssm/components/Cell/useDraggable.js.map +1 -0
  150. package/dist/cssm/components/ChipsSelect/ChipsSelect.js +2 -2
  151. package/dist/cssm/components/ChipsSelect/ChipsSelect.js.map +1 -1
  152. package/dist/cssm/components/CustomSelect/CustomSelect.js +3 -5
  153. package/dist/cssm/components/CustomSelect/CustomSelect.js.map +1 -1
  154. package/dist/cssm/components/DropdownIcon/DropdownIcon.css +1 -0
  155. package/dist/cssm/components/DropdownIcon/DropdownIcon.js +20 -0
  156. package/dist/cssm/components/DropdownIcon/DropdownIcon.js.map +1 -0
  157. package/dist/cssm/components/FocusTrap/FocusTrap.js +3 -5
  158. package/dist/cssm/components/FocusTrap/FocusTrap.js.map +1 -1
  159. package/dist/cssm/components/FormItem/FormItem.css +1 -1
  160. package/dist/cssm/components/FormLayoutGroup/FormLayoutGroup.css +1 -1
  161. package/dist/cssm/components/FormLayoutGroup/FormLayoutGroup.js +1 -0
  162. package/dist/cssm/components/FormLayoutGroup/FormLayoutGroup.js.map +1 -1
  163. package/dist/cssm/components/GridAvatar/GridAvatar.css +1 -0
  164. package/dist/cssm/components/GridAvatar/GridAvatar.js +42 -0
  165. package/dist/cssm/components/GridAvatar/GridAvatar.js.map +1 -0
  166. package/dist/cssm/components/InitialsAvatar/InitialsAvatar.css +1 -0
  167. package/dist/cssm/components/InitialsAvatar/InitialsAvatar.js +52 -0
  168. package/dist/cssm/components/InitialsAvatar/InitialsAvatar.js.map +1 -0
  169. package/dist/cssm/components/NativeSelect/NativeSelect.js +2 -2
  170. package/dist/cssm/components/NativeSelect/NativeSelect.js.map +1 -1
  171. package/dist/cssm/components/Progress/Progress.js +6 -3
  172. package/dist/cssm/components/Progress/Progress.js.map +1 -1
  173. package/dist/cssm/components/Removable/Removable.css +1 -1
  174. package/dist/cssm/components/Removable/Removable.js +20 -11
  175. package/dist/cssm/components/Removable/Removable.js.map +1 -1
  176. package/dist/cssm/components/Select/Select.css +1 -1
  177. package/dist/cssm/components/SelectMimicry/SelectMimicry.js +2 -2
  178. package/dist/cssm/components/SelectMimicry/SelectMimicry.js.map +1 -1
  179. package/dist/cssm/components/SimpleCell/SimpleCell.css +1 -1
  180. package/dist/cssm/components/Tabbar/Tabbar.css +1 -1
  181. package/dist/cssm/components/Tabbar/Tabbar.js +3 -1
  182. package/dist/cssm/components/Tabbar/Tabbar.js.map +1 -1
  183. package/dist/cssm/components/TabbarItem/TabbarItem.css +1 -1
  184. package/dist/cssm/components/TabbarItem/TabbarItem.js +26 -10
  185. package/dist/cssm/components/TabbarItem/TabbarItem.js.map +1 -1
  186. package/dist/cssm/components/TabsItem/TabsItem.css +1 -1
  187. package/dist/cssm/components/View/View.js +53 -42
  188. package/dist/cssm/components/View/View.js.map +1 -1
  189. package/dist/cssm/components/View/ViewInfinite.js +65 -54
  190. package/dist/cssm/components/View/ViewInfinite.js.map +1 -1
  191. package/dist/cssm/index.js +2 -0
  192. package/dist/cssm/index.js.map +1 -1
  193. package/dist/cssm/lib/prefixClass.js +7 -6
  194. package/dist/cssm/lib/prefixClass.js.map +1 -1
  195. package/dist/cssm/styles/components.css +1 -1
  196. package/dist/index.d.ts +4 -0
  197. package/dist/index.js +2 -0
  198. package/dist/index.js.map +1 -1
  199. package/dist/lib/prefixClass.js +7 -6
  200. package/dist/lib/prefixClass.js.map +1 -1
  201. package/dist/vkui.css +1 -1
  202. package/dist/vkui.css.map +1 -1
  203. package/package.json +1 -1
  204. package/src/components/ActionSheet/ActionSheet.tsx +1 -8
  205. package/src/components/Avatar/Avatar.tsx +5 -2
  206. package/src/components/CardScroll/CardScroll.tsx +4 -1
  207. package/src/components/Cell/Cell.css +22 -45
  208. package/src/components/Cell/Cell.tsx +101 -162
  209. package/src/components/Cell/CellCheckbox/CellCheckbox.css +17 -0
  210. package/src/components/Cell/CellCheckbox/CellCheckbox.tsx +42 -0
  211. package/src/components/Cell/CellDragger/CellDragger.css +4 -0
  212. package/src/components/Cell/CellDragger/CellDragger.tsx +40 -0
  213. package/src/components/Cell/Readme.md +89 -51
  214. package/src/components/Cell/useDraggable.tsx +112 -0
  215. package/src/components/ChipsSelect/ChipsSelect.tsx +2 -2
  216. package/src/components/CustomSelect/CustomSelect.tsx +3 -4
  217. package/src/components/DropdownIcon/DropdownIcon.css +3 -0
  218. package/src/components/DropdownIcon/DropdownIcon.tsx +20 -0
  219. package/src/components/Epic/Readme.md +1 -0
  220. package/src/components/FocusTrap/FocusTrap.tsx +11 -8
  221. package/src/components/FormItem/FormItem.css +8 -8
  222. package/src/components/FormLayoutGroup/FormLayoutGroup.css +9 -3
  223. package/src/components/FormLayoutGroup/FormLayoutGroup.tsx +10 -1
  224. package/src/components/GridAvatar/GridAvatar.css +37 -0
  225. package/src/components/GridAvatar/GridAvatar.tsx +55 -0
  226. package/src/components/GridAvatar/Readme.md +12 -0
  227. package/src/components/InitialsAvatar/InitialsAvatar.css +53 -0
  228. package/src/components/InitialsAvatar/InitialsAvatar.tsx +90 -0
  229. package/src/components/InitialsAvatar/Readme.md +14 -0
  230. package/src/components/ModalRoot/Readme.md +2 -2
  231. package/src/components/NativeSelect/NativeSelect.tsx +2 -2
  232. package/src/components/Progress/Progress.tsx +8 -3
  233. package/src/components/Removable/Removable.css +9 -20
  234. package/src/components/Removable/Removable.tsx +19 -11
  235. package/src/components/Select/Select.css +1 -1
  236. package/src/components/SelectMimicry/SelectMimicry.tsx +2 -2
  237. package/src/components/SimpleCell/SimpleCell.css +10 -27
  238. package/src/components/Tabbar/Tabbar.css +15 -4
  239. package/src/components/Tabbar/Tabbar.tsx +3 -1
  240. package/src/components/TabbarItem/Readme.md +72 -0
  241. package/src/components/TabbarItem/TabbarItem.css +65 -14
  242. package/src/components/TabbarItem/TabbarItem.tsx +46 -22
  243. package/src/components/TabsItem/TabsItem.css +5 -2
  244. package/src/components/View/View.tsx +37 -31
  245. package/src/components/View/ViewInfinite.tsx +44 -38
  246. package/src/index.ts +4 -0
  247. package/src/lib/prefixClass.ts +9 -6
  248. package/src/styles/components.css +4 -0
@@ -1,58 +1,96 @@
1
1
  Надстройка над SimpleCell, позволяющая удалять, перетаскивать и выделять ячейки.
2
2
 
3
3
  ```jsx
4
- class Example extends React.Component {
5
-
6
- constructor() {
7
- this.state = {
8
- activePanel: 'list',
9
- removeList: ['Михаил Андриевский', 'Вадим Дорохов', 'Саша Колобов'],
10
- draggingList: ['Say', 'Hello', 'To', 'My', 'Little', 'Friend']
11
- };
12
- }
4
+ const [removeList, updateRemoveList] = React.useState(['Михаил Андриевский', 'Вадим Дорохов', 'Саша Колобов']);
5
+ const [draggingList, updateDraggingList] = React.useState(['Say', 'Hello', 'To', 'My', 'Little', 'Friend']);
6
+ const [dragAndSelectList, updateDragAndSelectList] = React.useState([{ label: 'Фотографии', defaultChecked: true }, { label: 'Музыка' }, { label: 'Видео' }]);
7
+ const [dragAndRemoveList, updateDragAndRemoveList] = React.useState(['Евгения Полозова', 'Артур Стамбульцян', 'Владимир Клепов']);
8
+
9
+ const removeFromList = (idx, list, updateListFn) => {
10
+ const _list = [...list];
11
+ _list.splice(idx, 1);
12
+ updateListFn(_list);
13
+ }
14
+
15
+ const reorderList = ({ from, to }, list, updateListFn) => {
16
+ const _list = [...list];
17
+ _list.splice(from, 1);
18
+ _list.splice(to, 0, list[from]);
19
+ updateListFn(_list);
20
+ }
21
+
22
+ <View activePanel="list">
23
+ <Panel id="list">
24
+ <PanelHeader>Cell</PanelHeader>
25
+
26
+
27
+ <Group header={<Header subtitle={<code>mode="selectable"</code>}>Выделение</Header>}>
28
+ <Cell mode="selectable" before={<Avatar />}>Артур Стамбульцян</Cell>
29
+ <Cell mode="selectable" before={<Avatar />}>Игорь Федоров</Cell>
30
+ <Cell mode="selectable" disabled before={<Avatar />}>Михаил Лихачев</Cell>
31
+ </Group>
13
32
 
14
- render() {
15
- return (
16
- <View activePanel={this.state.activePanel}>
17
- <Panel id="list">
18
- <PanelHeader>
19
- Cell
20
- </PanelHeader>
21
- <Group header={<Header mode="secondary">Выделение</Header>}>
22
- <Cell selectable before={<Avatar />}>Артур Стамбульцян</Cell>
23
- <Cell selectable before={<Avatar />}>Игорь Федоров</Cell>
24
- <Cell selectable disabled before={<Avatar />}>Михаил Лихачев</Cell>
25
- </Group>
26
- {this.state.removeList.length > 0 &&
27
- <Group header={<Header mode="secondary">Удаление</Header>}>
28
- <List>
29
- {this.state.removeList.map((item, index) => (
30
- <Cell key={item} removable onRemove={() => {
31
- this.setState({
32
- removeList: [...this.state.removeList.slice(0, index), ...this.state.removeList.slice(index + 1)]
33
- })
34
- }}>{item}</Cell>
35
- ))}
36
- </List>
37
- </Group>
38
- }
39
- <Group header={<Header mode="secondary">Перетаскивание</Header>}>
40
- <List>
41
- {this.state.draggingList.map((item) => (
42
- <Cell before={<Avatar />} key={item} draggable onDragFinish={({ from, to }) => {
43
- const draggingList = [...this.state.draggingList];
44
- draggingList.splice(from, 1);
45
- draggingList.splice(to, 0, this.state.draggingList[from]);
46
- this.setState({ draggingList });
47
- }}>{item}</Cell>
48
- ))}
49
- </List>
50
- </Group>
51
- </Panel>
52
- </View>
53
- )
33
+
34
+ {removeList.length > 0 &&
35
+ <Group header={<Header subtitle={<code>mode="removable"</code>}>Удаление</Header>}>
36
+ <List>
37
+ {removeList.map((item, idx) => (
38
+ <Cell
39
+ key={item}
40
+ mode="removable"
41
+ onRemove={() => removeFromList(idx, removeList, updateRemoveList)}
42
+ >{item}</Cell>
43
+ ))}
44
+ </List>
45
+ </Group>
54
46
  }
55
- }
56
47
 
57
- <Example />
48
+
49
+ <Group header={<Header subtitle={<code>draggable</code>}>Перетаскивание</Header>}>
50
+ <List>
51
+ {draggingList.map((item) => (
52
+ <Cell
53
+ key={item}
54
+ before={<Avatar />}
55
+ draggable
56
+ onDragFinish={({ from, to }) => reorderList({from, to}, draggingList, updateDraggingList)}
57
+ >{item}</Cell>
58
+ ))}
59
+ </List>
60
+ </Group>
61
+
62
+
63
+ <Group header={<Header subtitle={<code>draggable mode="selectable"</code>}>Перетаскивание c выделением</Header>}>
64
+ <List>
65
+ {dragAndSelectList.map(({ label, ...restItem }) => (
66
+ <Cell
67
+ key={label}
68
+ mode="selectable"
69
+ draggable
70
+ before={<Avatar mode="app" size={32} />}
71
+ onDragFinish={({ from, to }) => reorderList({from, to}, dragAndSelectList, updateDragAndSelectList)}
72
+ {...restItem}
73
+ >{label}</Cell>
74
+ ))}
75
+ </List>
76
+ </Group>
77
+
78
+ {dragAndRemoveList.length > 0 &&
79
+ <Group header={<Header subtitle={<code>draggable mode="removable"</code>} >Перетаскивание c удалением</Header>}>
80
+ <List>
81
+ {dragAndRemoveList.map((item, idx) => (
82
+ <Cell
83
+ key={item}
84
+ mode="removable"
85
+ draggable
86
+ before={<Avatar />}
87
+ onRemove={() => removeFromList(idx, dragAndRemoveList, updateDragAndRemoveList)}
88
+ onDragFinish={({ from, to }) => reorderList({from, to}, dragAndRemoveList, updateDragAndRemoveList)}
89
+ >{item}</Cell>
90
+ ))}
91
+ </List>
92
+ </Group>
93
+ }
94
+ </Panel>
95
+ </View>
58
96
  ```
@@ -0,0 +1,112 @@
1
+ import * as React from 'react';
2
+ import { TouchEvent } from '../Touch/Touch';
3
+ import { CellProps } from './Cell';
4
+
5
+ export interface DraggableProps {
6
+ onDragStart: () => void;
7
+ onDragEnd: () => void;
8
+ onDragMove: (e: TouchEvent) => void;
9
+ }
10
+
11
+ interface UseDraggableProps extends DraggableProps {
12
+ dragging: boolean;
13
+ rootElRef: any;
14
+ }
15
+
16
+ export const useDraggable = ({ onDragFinish }: Pick<CellProps, 'onDragFinish'>) => {
17
+ const [dragging, setDragging] = React.useState<boolean>(false);
18
+ const rootElRef = React.useRef(null);
19
+
20
+ const [siblings, setSiblings] = React.useState<HTMLElement[]>(undefined);
21
+ const [dragStartIndex, setDragStartIndex] = React.useState<number>(undefined);
22
+ const [dragEndIndex, setDragEndIndex] = React.useState<number>(undefined);
23
+ const [dragShift, setDragShift] = React.useState<number>(0);
24
+ const [dragDirection, setDragDirection] = React.useState<'down' | 'up'>(undefined);
25
+
26
+ const onDragStart = () => {
27
+ const rootEl = rootElRef.current;
28
+
29
+ setDragging(true);
30
+
31
+ const _siblings: HTMLElement[] = [...rootEl.parentElement.childNodes];
32
+ const idx = _siblings.indexOf(rootEl);
33
+
34
+ setDragStartIndex(idx);
35
+ setDragEndIndex(idx);
36
+ setSiblings(_siblings);
37
+ setDragShift(0);
38
+ };
39
+
40
+ const onDragMove = (e: TouchEvent) => {
41
+ e.originalEvent.preventDefault();
42
+
43
+ const rootEl = rootElRef.current;
44
+
45
+ rootEl.style.transform = `translateY(${e.shiftY}px)`;
46
+ const rootGesture = rootEl.getBoundingClientRect();
47
+
48
+ setDragDirection(dragShift - e.shiftY < 0 ? 'down' : 'up');
49
+ setDragShift(e.shiftY);
50
+ setDragEndIndex(dragStartIndex);
51
+
52
+ siblings.forEach((sibling: HTMLElement, siblingIndex: number) => {
53
+ const siblingGesture = sibling.getBoundingClientRect();
54
+ const siblingHalfHeight = siblingGesture.height / 2;
55
+
56
+ const rootOverSibling = rootGesture.bottom > siblingGesture.top + siblingHalfHeight;
57
+ const rootUnderSibling = rootGesture.top < siblingGesture.bottom - siblingHalfHeight;
58
+
59
+ if (dragStartIndex < siblingIndex) {
60
+ if (rootOverSibling) {
61
+ if (dragDirection === 'down') {
62
+ sibling.style.transform = 'translateY(-100%)';
63
+ }
64
+
65
+ setDragEndIndex((dragEndIndex) => dragEndIndex + 1);
66
+ }
67
+ if (rootUnderSibling && dragDirection === 'up') {
68
+ sibling.style.transform = 'translateY(0)';
69
+ }
70
+ } else if (dragStartIndex > siblingIndex) {
71
+ if (rootUnderSibling) {
72
+ if (dragDirection === 'up') {
73
+ sibling.style.transform = 'translateY(100%)';
74
+ }
75
+
76
+ setDragEndIndex((dragEndIndex) => dragEndIndex - 1);
77
+ }
78
+ if (rootOverSibling && dragDirection === 'down') {
79
+ sibling.style.transform = 'translateY(0)';
80
+ }
81
+ }
82
+ });
83
+ };
84
+
85
+ const onDragEnd = () => {
86
+ const [from, to] = [dragStartIndex, dragEndIndex];
87
+
88
+ siblings.forEach((sibling: HTMLElement) => {
89
+ sibling.style.transform = null;
90
+ });
91
+
92
+ setSiblings(undefined);
93
+ setDragEndIndex(undefined);
94
+ setDragStartIndex(undefined);
95
+ setDragDirection(undefined);
96
+ setDragShift(undefined);
97
+
98
+ setDragging(false);
99
+
100
+ onDragFinish && onDragFinish({ from, to });
101
+ };
102
+
103
+ const useDraggableProps: UseDraggableProps = {
104
+ onDragStart,
105
+ onDragMove,
106
+ onDragEnd,
107
+ dragging,
108
+ rootElRef,
109
+ };
110
+
111
+ return useDraggableProps;
112
+ };
@@ -1,5 +1,5 @@
1
1
  import * as React from 'react';
2
- import { Icon20Dropdown } from '@vkontakte/icons';
2
+ import { DropdownIcon } from '../DropdownIcon/DropdownIcon';
3
3
  import { classNames } from '../../lib/classNames';
4
4
  import Spinner from '../Spinner/Spinner';
5
5
  import CustomScrollView from '../CustomScrollView/CustomScrollView';
@@ -247,7 +247,7 @@ const ChipsSelect = <Option extends ChipsInputOption>(props: ChipsSelectProps<Op
247
247
  getRef={getRef}
248
248
  disabled={disabled}
249
249
  onInputChange={handleInputChange}
250
- after={<Icon20Dropdown />}
250
+ after={<DropdownIcon />}
251
251
  />
252
252
  {opened &&
253
253
  <div
@@ -4,14 +4,14 @@ import { debounce, setRef } from '../../lib/utils';
4
4
  import { classNames } from '../../lib/classNames';
5
5
  import { NativeSelectProps } from '../NativeSelect/NativeSelect';
6
6
  import CustomScrollView from '../CustomScrollView/CustomScrollView';
7
- import { SizeType, withAdaptivity } from '../../hoc/withAdaptivity';
7
+ import { withAdaptivity } from '../../hoc/withAdaptivity';
8
8
  import { withPlatform } from '../../hoc/withPlatform';
9
9
  import CustomSelectOption, { CustomSelectOptionProps } from '../CustomSelectOption/CustomSelectOption';
10
10
  import { getClassName } from '../../helpers/getClassName';
11
11
  import { FormFieldProps } from '../FormField/FormField';
12
12
  import { HasPlatform } from '../../types';
13
13
  import Input from '../Input/Input';
14
- import { Icon20Dropdown, Icon24Dropdown } from '@vkontakte/icons';
14
+ import { DropdownIcon } from '../DropdownIcon/DropdownIcon';
15
15
  import Caption from '../Typography/Caption/Caption';
16
16
  import { warnOnce } from '../../lib/warnOnce';
17
17
  import Spinner from '../Spinner/Spinner';
@@ -150,7 +150,6 @@ class CustomSelect extends React.Component<CustomSelectProps, CustomSelectState>
150
150
  }
151
151
  }
152
152
 
153
- public state: CustomSelectState;
154
153
  private keyboardInput: string;
155
154
  private isControlledOutside: boolean;
156
155
  private selectEl: HTMLSelectElement;
@@ -576,7 +575,7 @@ class CustomSelect extends React.Component<CustomSelectProps, CustomSelectState>
576
575
  // TODO Нужно перестать пытаться превратить CustomSelect в select. Тогда эта проблема уйдёт.
577
576
  // @ts-ignore
578
577
  onClick={onClick}
579
- after={sizeY === SizeType.COMPACT ? <Icon20Dropdown /> : <Icon24Dropdown />}
578
+ after={<DropdownIcon />}
580
579
  placeholder={restProps.placeholder}
581
580
  /> :
582
581
  <SelectMimicry
@@ -0,0 +1,3 @@
1
+ .DropdownIcon {
2
+ cursor: pointer;
3
+ }
@@ -0,0 +1,20 @@
1
+ import * as React from 'react';
2
+ import { Icon20Dropdown, Icon24ChevronDown } from '@vkontakte/icons';
3
+ import { SizeType } from '../AdaptivityProvider/AdaptivityContext';
4
+ import { getClassName } from '../../helpers/getClassName';
5
+ import { useAdaptivity } from '../../hooks/useAdaptivity';
6
+ import { usePlatform } from '../../hooks/usePlatform';
7
+ import './DropdownIcon.css';
8
+
9
+ export const DropdownIcon: React.FC<React.HTMLAttributes<HTMLElement>> = (props) => {
10
+ const platform = usePlatform();
11
+ const { sizeY } = useAdaptivity();
12
+
13
+ const Icon = sizeY === SizeType.COMPACT
14
+ ? Icon20Dropdown
15
+ : Icon24ChevronDown;
16
+
17
+ return (
18
+ <Icon vkuiClass={getClassName('DropdownIcon', platform)} {...props} />
19
+ );
20
+ };
@@ -135,6 +135,7 @@ const Example = withAdaptivity(({ viewWidth }) => {
135
135
  onClick={onStoryChange}
136
136
  selected={activeStory === 'profile'}
137
137
  data-story="profile"
138
+ indicator={<Badge mode="prominent" />}
138
139
  text="Профиль"
139
140
  ><Icon28UserCircleOutline /></TabbarItem>
140
141
  </Tabbar>
@@ -54,14 +54,17 @@ export const FocusTrap: React.FC<FocusTrapProps> = ({
54
54
  }
55
55
 
56
56
  const nodes: HTMLElement[] = [];
57
- // eslint-disable-next-line no-restricted-properties
58
- ref.current?.querySelectorAll(FOCUSABLE_ELEMENTS).forEach((focusableEl) => {
59
- const { display, visibility } = window.getComputedStyle(focusableEl);
60
-
61
- if (display !== 'none' && visibility !== 'hidden') {
62
- nodes.push(focusableEl as HTMLElement);
63
- }
64
- });
57
+ Array.prototype.forEach.call(
58
+ // eslint-disable-next-line no-restricted-properties
59
+ ref.current.querySelectorAll(FOCUSABLE_ELEMENTS),
60
+ (focusableEl: Element) => {
61
+ const { display, visibility } = window.getComputedStyle(focusableEl);
62
+
63
+ if (display !== 'none' && visibility !== 'hidden') {
64
+ nodes.push(focusableEl as HTMLElement);
65
+ }
66
+ },
67
+ );
65
68
 
66
69
  if (nodes?.length) {
67
70
  setFocusableNodes(nodes);
@@ -56,14 +56,6 @@
56
56
  --formitem_padding: 12px;
57
57
  }
58
58
 
59
- .FormLayoutGroup .Removable .FormItem--ios.FormItem--withTop {
60
- margin-top: -28px;
61
- }
62
-
63
- .FormLayoutGroup .Removable .FormItem--ios.FormItem--sizeY-compact.FormItem--withTop {
64
- margin-top: -26px;
65
- }
66
-
67
59
  /**
68
60
  * CMP:
69
61
  * FormLayoutGroup
@@ -80,3 +72,11 @@
80
72
  .FormLayoutGroup--horizontal .FormItem + .FormItem {
81
73
  margin-left: 24px;
82
74
  }
75
+
76
+ .FormLayoutGroup--removable .FormItem--ios.FormItem--withTop {
77
+ margin-top: -28px;
78
+ }
79
+
80
+ .FormLayoutGroup--removable .FormItem--ios.FormItem--withTop.FormItem--sizeY-compact {
81
+ margin-top: -26px;
82
+ }
@@ -3,9 +3,10 @@
3
3
  padding: 12px var(--formitem_padding);
4
4
  }
5
5
 
6
- .FormLayoutGroup--horizontal.FormLayoutGroup--removable {
7
- padding-left: 0;
8
- padding-right: 0;
6
+ .FormLayoutGroup__removable {
7
+ flex-grow: 1;
8
+ min-width: 0;
9
+ max-width: 100%;
9
10
  }
10
11
 
11
12
  /**
@@ -14,3 +15,8 @@
14
15
  .FormLayoutGroup--ios {
15
16
  --formitem_padding: 12px;
16
17
  }
18
+
19
+ .FormLayoutGroup--removable {
20
+ padding-left: 0;
21
+ padding-right: 0;
22
+ }
@@ -42,7 +42,16 @@ const FormLayoutGroup: React.FC<FormLayoutGroupProps> = ({
42
42
  )}
43
43
  {...restProps}>
44
44
  {isRemovable
45
- ? <Removable align="start" removePlaceholder={removePlaceholder} onRemove={(e) => onRemove(e, rootEl?.current)}>{children}</Removable>
45
+ ? (
46
+ <Removable
47
+ vkuiClass="FormLayoutGroup__removable"
48
+ align="start"
49
+ removePlaceholder={removePlaceholder}
50
+ onRemove={(e) => onRemove(e, rootEl?.current)}
51
+ >
52
+ {children}
53
+ </Removable>
54
+ )
46
55
  : children
47
56
  }
48
57
  </div>
@@ -0,0 +1,37 @@
1
+ .GridAvatar__in {
2
+ display: flex;
3
+ flex-flow: column wrap;
4
+ height: 100%;
5
+ width: 100%;
6
+ overflow: hidden;
7
+ border-radius: inherit;
8
+
9
+ --grid-avatar-image-offset: 2px;
10
+ }
11
+
12
+ .GridAvatar__item {
13
+ width: calc(50% - var(--grid-avatar-image-offset) / 2);
14
+ height: 100%;
15
+ background-size: cover;
16
+ background-position: center;
17
+ }
18
+
19
+ .GridAvatar--images-1 .GridAvatar__item {
20
+ width: 100%;
21
+ }
22
+
23
+ .GridAvatar--images-3 .GridAvatar__item:nth-child(1n + 2),
24
+ .GridAvatar--images-4 .GridAvatar__item {
25
+ height: calc(50% - var(--grid-avatar-image-offset) / 2);
26
+ }
27
+
28
+ .GridAvatar--images-2 .GridAvatar__item:nth-child(1n + 2),
29
+ .GridAvatar--images-3 .GridAvatar__item:nth-child(1n + 2),
30
+ .GridAvatar--images-4 .GridAvatar__item:nth-child(1n + 3) {
31
+ margin-left: var(--grid-avatar-image-offset);
32
+ }
33
+
34
+ .GridAvatar--images-3 .GridAvatar__item:nth-child(2),
35
+ .GridAvatar--images-4 .GridAvatar__item:nth-child(odd) {
36
+ margin-bottom: var(--grid-avatar-image-offset);
37
+ }
@@ -0,0 +1,55 @@
1
+ import * as React from 'react';
2
+ import Avatar, { AVATAR_DEFAULT_SHADOW, AVATAR_DEFAULT_SIZE } from '../Avatar/Avatar';
3
+ import { classNames } from '../../lib/classNames';
4
+ import { warnOnce } from '../../lib/warnOnce';
5
+ import { HasRootRef } from '../../types';
6
+ import './GridAvatar.css';
7
+
8
+ export interface GridAvatarProps extends React.HTMLAttributes<HTMLDivElement>, HasRootRef<HTMLDivElement> {
9
+ src?: string[];
10
+ size?: number;
11
+ shadow?: boolean;
12
+ }
13
+
14
+ const MIN_GRID_LENGTH = 1;
15
+ const MAX_GRID_LENGTH = 4;
16
+
17
+ const warn = warnOnce('GridAvatar');
18
+
19
+ export const GridAvatar: React.FC<GridAvatarProps> = ({
20
+ src = [],
21
+ size = AVATAR_DEFAULT_SIZE,
22
+ shadow = AVATAR_DEFAULT_SHADOW,
23
+ ...restProps
24
+ }: GridAvatarProps) => {
25
+ if (process.env.NODE_ENV === 'development' && src.length > MAX_GRID_LENGTH) {
26
+ warn(`Размер пропа src (${src.length}) больше максимального (${MAX_GRID_LENGTH})`);
27
+ }
28
+
29
+ const count = Math.max(MIN_GRID_LENGTH, Math.min(MAX_GRID_LENGTH, src.length));
30
+
31
+ return (
32
+ <Avatar
33
+ {...restProps}
34
+ vkuiClass={classNames(
35
+ 'GridAvatar',
36
+ `GridAvatar--images-${count}`,
37
+ )}
38
+ shadow={shadow}
39
+ size={size}
40
+ >
41
+ <div vkuiClass="GridAvatar__in">
42
+ {src.slice(0, MAX_GRID_LENGTH).map((src, i) => {
43
+ return (
44
+ <div
45
+ key={i}
46
+ vkuiClass="GridAvatar__item"
47
+ style={{ backgroundImage: `url(${src})` }}
48
+ >
49
+ </div>
50
+ );
51
+ })}
52
+ </div>
53
+ </Avatar>
54
+ );
55
+ };
@@ -0,0 +1,12 @@
1
+ Отображение нескольких аватаров в сетке от 1 до 4 элементов.
2
+
3
+
4
+ ```jsx { "props": { "layout": false, "iframe": false } }
5
+ <div style={{ display: 'flex', padding: 12, gap: 8, flexFlow: 'row wrap' }}>
6
+ <GridAvatar />
7
+ <GridAvatar src={[getAvatarUrl('user_ji')]} />
8
+ <GridAvatar src={[getAvatarUrl('user_wayshev'), getAvatarUrl('user_mm')]} />
9
+ <GridAvatar src={[getAvatarUrl('user_arthurstam'), getAvatarUrl('user_xyz'), getAvatarUrl('user_ox')]} />
10
+ <GridAvatar src={[getAvatarUrl('user_ilyagrshn'), getAvatarUrl('user_tc'), getAvatarUrl('user_lihachyov'), getAvatarUrl('user_va')]} />
11
+ </div>
12
+ ```
@@ -0,0 +1,53 @@
1
+ .InitialsAvatar {
2
+ overflow: hidden;
3
+ background: #99a2ad;
4
+ background: linear-gradient(135deg, #b1b6bd, #99a2ad);
5
+ }
6
+
7
+ .InitialsAvatar__text {
8
+ font-family: var(--font-tt);
9
+ font-weight: 600;
10
+ color: var(--white); /* stylelint-disable-line plugin/only-tokens-are-allowed */
11
+ text-transform: uppercase;
12
+ text-align: center;
13
+ }
14
+
15
+ .InitialsAvatar--color-red {
16
+ background: #e52e40;
17
+ background: linear-gradient(135deg, #ff7583, #e52e40);
18
+ }
19
+
20
+ .InitialsAvatar--color-pink {
21
+ background: #e62e6b;
22
+ background: linear-gradient(135deg, #ff8880, #e62e6b);
23
+ }
24
+
25
+ .InitialsAvatar--color-orange {
26
+ background: #e66b2e;
27
+ background: linear-gradient(135deg, #ffbf80, #e66b2e);
28
+ }
29
+
30
+ .InitialsAvatar--color-yellow {
31
+ background: #e7a902;
32
+ background: linear-gradient(135deg, #ffd54f, #e7a902);
33
+ }
34
+
35
+ .InitialsAvatar--color-green {
36
+ background: #6cd97e;
37
+ background: linear-gradient(135deg, #6cd97e, #12b212);
38
+ }
39
+
40
+ .InitialsAvatar--color-l-blue {
41
+ background: #2bb4d6;
42
+ background: linear-gradient(135deg, #7df1fa, #2bb4d6);
43
+ }
44
+
45
+ .InitialsAvatar--color-blue {
46
+ background: #3f8ae0;
47
+ background: linear-gradient(135deg, #6cf, #3f8ae0);
48
+ }
49
+
50
+ .InitialsAvatar--color-violet {
51
+ background: #8f3fe0;
52
+ background: linear-gradient(135deg, #d3a6ff, #8f3fe0);
53
+ }