@vkontakte/vkui 5.7.1 → 5.7.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 (155) hide show
  1. package/dist/cjs/components/Banner/Banner.js +1 -1
  2. package/dist/cjs/components/Banner/Banner.js.map +1 -1
  3. package/dist/cjs/components/Checkbox/Checkbox.js +3 -1
  4. package/dist/cjs/components/Checkbox/Checkbox.js.map +1 -1
  5. package/dist/cjs/components/ChipsSelect/ChipsSelect.js +4 -2
  6. package/dist/cjs/components/ChipsSelect/ChipsSelect.js.map +1 -1
  7. package/dist/cjs/components/Group/Group.js +2 -3
  8. package/dist/cjs/components/Group/Group.js.map +1 -1
  9. package/dist/cjs/components/HorizontalScroll/HorizontalScroll.js +13 -11
  10. package/dist/cjs/components/HorizontalScroll/HorizontalScroll.js.map +1 -1
  11. package/dist/cjs/components/Image/Image.js +52 -37
  12. package/dist/cjs/components/Image/Image.js.map +1 -1
  13. package/dist/cjs/components/ImageBase/ImageBase.js +20 -1
  14. package/dist/cjs/components/ImageBase/ImageBase.js.map +1 -1
  15. package/dist/cjs/components/MiniInfoCell/MiniInfoCell.js +1 -1
  16. package/dist/cjs/components/MiniInfoCell/MiniInfoCell.js.map +1 -1
  17. package/dist/cjs/components/PopoutRoot/PopoutRoot.js +1 -3
  18. package/dist/cjs/components/PopoutRoot/PopoutRoot.js.map +1 -1
  19. package/dist/cjs/components/PopoutWrapper/PopoutWrapper.js +1 -1
  20. package/dist/cjs/components/PopoutWrapper/PopoutWrapper.js.map +1 -1
  21. package/dist/cjs/components/SelectMimicry/SelectMimicry.d.ts +1 -1
  22. package/dist/cjs/components/SelectMimicry/SelectMimicry.js +8 -3
  23. package/dist/cjs/components/SelectMimicry/SelectMimicry.js.map +1 -1
  24. package/dist/cjs/components/SimpleCell/SimpleCell.js +0 -1
  25. package/dist/cjs/components/SimpleCell/SimpleCell.js.map +1 -1
  26. package/dist/cjs/components/View/View.js +4 -4
  27. package/dist/cjs/components/View/View.js.map +1 -1
  28. package/dist/cjs/components/View/ViewInfinite.js +4 -4
  29. package/dist/cjs/components/View/ViewInfinite.js.map +1 -1
  30. package/dist/cjs/hooks/useAdaptivityHasHover.js +4 -3
  31. package/dist/cjs/hooks/useAdaptivityHasHover.js.map +1 -1
  32. package/dist/cjs/hooks/useAdaptivityHasPointer.js +5 -5
  33. package/dist/cjs/hooks/useAdaptivityHasPointer.js.map +1 -1
  34. package/dist/cjs/hooks/useAutoFocus.d.ts +2 -0
  35. package/dist/cjs/hooks/useAutoFocus.js +23 -0
  36. package/dist/cjs/hooks/useAutoFocus.js.map +1 -0
  37. package/dist/cjs/hooks/useChipsSelect.js +5 -4
  38. package/dist/cjs/hooks/useChipsSelect.js.map +1 -1
  39. package/dist/cjs/hooks/useFocusWithin.js +3 -0
  40. package/dist/cjs/hooks/useFocusWithin.js.map +1 -1
  41. package/dist/cjs/hooks/useIsClient.js +2 -1
  42. package/dist/cjs/hooks/useIsClient.js.map +1 -1
  43. package/dist/components/Banner/Banner.js +2 -2
  44. package/dist/components/Banner/Banner.js.map +1 -1
  45. package/dist/components/Checkbox/Checkbox.js +3 -1
  46. package/dist/components/Checkbox/Checkbox.js.map +1 -1
  47. package/dist/components/ChipsSelect/ChipsSelect.js +4 -2
  48. package/dist/components/ChipsSelect/ChipsSelect.js.map +1 -1
  49. package/dist/components/Group/Group.js +2 -3
  50. package/dist/components/Group/Group.js.map +1 -1
  51. package/dist/components/HorizontalScroll/HorizontalScroll.js +13 -11
  52. package/dist/components/HorizontalScroll/HorizontalScroll.js.map +1 -1
  53. package/dist/components/Image/Image.js +54 -39
  54. package/dist/components/Image/Image.js.map +1 -1
  55. package/dist/components/ImageBase/ImageBase.js +20 -1
  56. package/dist/components/ImageBase/ImageBase.js.map +1 -1
  57. package/dist/components/MiniInfoCell/MiniInfoCell.js +1 -1
  58. package/dist/components/MiniInfoCell/MiniInfoCell.js.map +1 -1
  59. package/dist/components/PopoutRoot/PopoutRoot.js +1 -3
  60. package/dist/components/PopoutRoot/PopoutRoot.js.map +1 -1
  61. package/dist/components/PopoutWrapper/PopoutWrapper.js +1 -1
  62. package/dist/components/PopoutWrapper/PopoutWrapper.js.map +1 -1
  63. package/dist/components/SelectMimicry/SelectMimicry.d.ts +1 -1
  64. package/dist/components/SelectMimicry/SelectMimicry.js +8 -3
  65. package/dist/components/SelectMimicry/SelectMimicry.js.map +1 -1
  66. package/dist/components/SimpleCell/SimpleCell.js +0 -1
  67. package/dist/components/SimpleCell/SimpleCell.js.map +1 -1
  68. package/dist/components/View/View.js +4 -4
  69. package/dist/components/View/View.js.map +1 -1
  70. package/dist/components/View/ViewInfinite.js +4 -4
  71. package/dist/components/View/ViewInfinite.js.map +1 -1
  72. package/dist/components.css +22 -22
  73. package/dist/components.css.map +1 -1
  74. package/dist/components.js.tmp +757 -698
  75. package/dist/cssm/components/ActionSheet/ActionSheet.module.css +3 -3
  76. package/dist/cssm/components/Alert/Alert.module.css +4 -4
  77. package/dist/cssm/components/Banner/Banner.js +2 -2
  78. package/dist/cssm/components/Banner/Banner.js.map +1 -1
  79. package/dist/cssm/components/Banner/Banner.module.css +2 -2
  80. package/dist/cssm/components/Checkbox/Checkbox.js +3 -1
  81. package/dist/cssm/components/Checkbox/Checkbox.js.map +1 -1
  82. package/dist/cssm/components/Checkbox/Checkbox.module.css +6 -0
  83. package/dist/cssm/components/ChipsSelect/ChipsSelect.js +3 -1
  84. package/dist/cssm/components/ChipsSelect/ChipsSelect.js.map +1 -1
  85. package/dist/cssm/components/FocusVisible/FocusVisible.module.css +4 -4
  86. package/dist/cssm/components/Group/Group.js +2 -3
  87. package/dist/cssm/components/Group/Group.js.map +1 -1
  88. package/dist/cssm/components/HorizontalScroll/HorizontalScroll.js +13 -11
  89. package/dist/cssm/components/HorizontalScroll/HorizontalScroll.js.map +1 -1
  90. package/dist/cssm/components/Image/Image.js +46 -33
  91. package/dist/cssm/components/Image/Image.js.map +1 -1
  92. package/dist/cssm/components/ImageBase/ImageBase.js +20 -1
  93. package/dist/cssm/components/ImageBase/ImageBase.js.map +1 -1
  94. package/dist/cssm/components/MiniInfoCell/MiniInfoCell.js +1 -1
  95. package/dist/cssm/components/MiniInfoCell/MiniInfoCell.js.map +1 -1
  96. package/dist/cssm/components/ModalPage/ModalPage.module.css +0 -4
  97. package/dist/cssm/components/ModalRoot/ModalRoot.module.css +2 -2
  98. package/dist/cssm/components/PanelHeader/PanelHeader.module.css +4 -2
  99. package/dist/cssm/components/PanelHeaderContext/PanelHeaderContext.module.css +8 -8
  100. package/dist/cssm/components/Placeholder/Placeholder.module.css +1 -0
  101. package/dist/cssm/components/PopoutRoot/PopoutRoot.js +1 -3
  102. package/dist/cssm/components/PopoutRoot/PopoutRoot.js.map +1 -1
  103. package/dist/cssm/components/PopoutRoot/PopoutRoot.module.css +0 -4
  104. package/dist/cssm/components/PopoutWrapper/PopoutWrapper.js +1 -1
  105. package/dist/cssm/components/PopoutWrapper/PopoutWrapper.js.map +1 -1
  106. package/dist/cssm/components/PopoutWrapper/PopoutWrapper.module.css +2 -2
  107. package/dist/cssm/components/Popover/Popover.module.css +2 -2
  108. package/dist/cssm/components/PullToRefresh/PullToRefresh.module.css +4 -4
  109. package/dist/cssm/components/RichTooltip/RichTooltip.module.css +2 -2
  110. package/dist/cssm/components/Root/Root.module.css +12 -13
  111. package/dist/cssm/components/ScreenSpinner/ScreenSpinner.module.css +5 -5
  112. package/dist/cssm/components/SelectMimicry/SelectMimicry.d.ts +1 -1
  113. package/dist/cssm/components/SelectMimicry/SelectMimicry.js +6 -2
  114. package/dist/cssm/components/SelectMimicry/SelectMimicry.js.map +1 -1
  115. package/dist/cssm/components/SimpleCell/SimpleCell.js +0 -1
  116. package/dist/cssm/components/SimpleCell/SimpleCell.js.map +1 -1
  117. package/dist/cssm/components/Snackbar/Snackbar.module.css +4 -4
  118. package/dist/cssm/components/Tappable/Tappable.module.css +2 -2
  119. package/dist/cssm/components/TextTooltip/TextTooltip.module.css +2 -2
  120. package/dist/cssm/components/View/View.js +4 -4
  121. package/dist/cssm/components/View/View.js.map +1 -1
  122. package/dist/cssm/components/View/View.module.css +16 -16
  123. package/dist/cssm/components/View/ViewInfinite.js +4 -4
  124. package/dist/cssm/components/View/ViewInfinite.js.map +1 -1
  125. package/dist/cssm/hooks/useAdaptivityHasHover.js +4 -3
  126. package/dist/cssm/hooks/useAdaptivityHasHover.js.map +1 -1
  127. package/dist/cssm/hooks/useAdaptivityHasPointer.js +5 -5
  128. package/dist/cssm/hooks/useAdaptivityHasPointer.js.map +1 -1
  129. package/dist/cssm/hooks/useAutoFocus.d.ts +2 -0
  130. package/dist/cssm/hooks/useAutoFocus.js +12 -0
  131. package/dist/cssm/hooks/useAutoFocus.js.map +1 -0
  132. package/dist/cssm/hooks/useChipsSelect.js +5 -4
  133. package/dist/cssm/hooks/useChipsSelect.js.map +1 -1
  134. package/dist/cssm/hooks/useFocusWithin.js +3 -0
  135. package/dist/cssm/hooks/useFocusWithin.js.map +1 -1
  136. package/dist/cssm/hooks/useIsClient.js +2 -1
  137. package/dist/cssm/hooks/useIsClient.js.map +1 -1
  138. package/dist/cssm/styles/constants.css +1 -1
  139. package/dist/hooks/useAdaptivityHasHover.js +4 -3
  140. package/dist/hooks/useAdaptivityHasHover.js.map +1 -1
  141. package/dist/hooks/useAdaptivityHasPointer.js +5 -5
  142. package/dist/hooks/useAdaptivityHasPointer.js.map +1 -1
  143. package/dist/hooks/useAutoFocus.d.ts +2 -0
  144. package/dist/hooks/useAutoFocus.js +12 -0
  145. package/dist/hooks/useAutoFocus.js.map +1 -0
  146. package/dist/hooks/useChipsSelect.js +5 -4
  147. package/dist/hooks/useChipsSelect.js.map +1 -1
  148. package/dist/hooks/useFocusWithin.js +3 -0
  149. package/dist/hooks/useFocusWithin.js.map +1 -1
  150. package/dist/hooks/useIsClient.js +2 -1
  151. package/dist/hooks/useIsClient.js.map +1 -1
  152. package/dist/vkui.css +22 -22
  153. package/dist/vkui.css.map +1 -1
  154. package/dist/vkui.js.tmp +757 -698
  155. package/package.json +1 -1
@@ -7,7 +7,7 @@
7
7
  display: flex;
8
8
  flex-direction: column;
9
9
  box-sizing: border-box;
10
- animation: vkui-animation-actionsheet-intro 0.2s var(--vkui--animation_easing_platform);
10
+ animation: animation-actionsheet-intro 0.2s var(--vkui--animation_easing_platform);
11
11
  padding: 8px 0;
12
12
  margin: 10px;
13
13
  border-radius: 12px;
@@ -34,7 +34,7 @@
34
34
 
35
35
  .ActionSheet--ios {
36
36
  width: 100%;
37
- animation: vkui-animation-actionsheet-intro 0.3s var(--vkui--animation_easing_platform);
37
+ animation: animation-actionsheet-intro 0.3s var(--vkui--animation_easing_platform);
38
38
  padding: 8px;
39
39
  margin: unset;
40
40
  background: transparent;
@@ -99,7 +99,7 @@
99
99
  * Animations
100
100
  */
101
101
 
102
- @keyframes vkui-animation-actionsheet-intro {
102
+ @keyframes animation-actionsheet-intro {
103
103
  from {
104
104
  transform: translateY(100%);
105
105
  }
@@ -10,7 +10,7 @@
10
10
  margin: auto 24px;
11
11
  box-shadow: var(--vkui--elevation4);
12
12
  border-radius: var(--vkui--size_border_radius_paper--regular);
13
- animation: vkui-animation-android-alert-intro 0.2s var(--vkui--animation_easing_platform);
13
+ animation: animation-android-alert-intro 0.2s var(--vkui--animation_easing_platform);
14
14
  }
15
15
 
16
16
  .Alert--desktop {
@@ -100,7 +100,7 @@
100
100
  width: 270px;
101
101
  min-width: 270px;
102
102
  overflow: hidden;
103
- animation: vkui-animation-ios-alert-intro 0.3s var(--vkui--animation_easing_platform);
103
+ animation: animation-ios-alert-intro 0.3s var(--vkui--animation_easing_platform);
104
104
  box-shadow: none;
105
105
  }
106
106
 
@@ -268,7 +268,7 @@
268
268
  * Animations
269
269
  */
270
270
 
271
- @keyframes vkui-animation-ios-alert-intro {
271
+ @keyframes animation-ios-alert-intro {
272
272
  from {
273
273
  opacity: 0;
274
274
  transform: scale(1.05);
@@ -280,7 +280,7 @@
280
280
  }
281
281
  }
282
282
 
283
- @keyframes vkui-animation-android-alert-intro {
283
+ @keyframes animation-android-alert-intro {
284
284
  from {
285
285
  opacity: 0;
286
286
  transform: scale(0.95);
@@ -1,5 +1,5 @@
1
1
  import * as React from 'react';
2
- import { Icon24Cancel, Icon24Chevron, Icon24DismissDark, Icon24DismissSubstract } from '@vkontakte/icons';
2
+ import { Icon24Cancel, Icon24Chevron, Icon24Dismiss, Icon24DismissDark } from '@vkontakte/icons';
3
3
  import { classNames, hasReactNode } from '@vkontakte/vkjs';
4
4
  import { usePlatform } from '../../hooks/usePlatform';
5
5
  import { Platform } from '../../lib/platform';
@@ -16,7 +16,7 @@ import styles from './Banner.module.css';
16
16
  const platform = usePlatform();
17
17
  const HeaderTypography = size === 'm' ? Title : Headline;
18
18
  const SubheaderTypography = size === 'm' ? Text : Subhead;
19
- const IconDismissIOS = mode === 'image' ? Icon24DismissDark : Icon24DismissSubstract;
19
+ const IconDismissIOS = mode === 'image' ? Icon24DismissDark : Icon24Dismiss;
20
20
  const content = /*#__PURE__*/ React.createElement(React.Fragment, null, mode === 'image' && background && /*#__PURE__*/ React.createElement("div", {
21
21
  "aria-hidden": true,
22
22
  className: styles['Banner__bg']
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/Banner/Banner.tsx"],"sourcesContent":["import * as React from 'react';\nimport {\n Icon24Cancel,\n Icon24Chevron,\n Icon24DismissDark,\n Icon24DismissSubstract,\n} from '@vkontakte/icons';\nimport { classNames, hasReactNode } from '@vkontakte/vkjs';\nimport { usePlatform } from '../../hooks/usePlatform';\nimport { Platform } from '../../lib/platform';\nimport { HasRootRef } from '../../types';\nimport { IconButton } from '../IconButton/IconButton';\nimport { Tappable } from '../Tappable/Tappable';\nimport { Headline } from '../Typography/Headline/Headline';\nimport { Subhead } from '../Typography/Subhead/Subhead';\nimport { Text } from '../Typography/Text/Text';\nimport { Title } from '../Typography/Title/Title';\nimport styles from './Banner.module.css';\n\nexport interface BannerProps extends React.HTMLAttributes<HTMLDivElement>, HasRootRef<HTMLElement> {\n /**\n * Тип баннера.\n */\n mode?: 'tint' | 'image';\n size?: 's' | 'm';\n /**\n * Тип действия в правой части баннера.\n *\n * - `dismiss` – отображается иконка крестика, при клике на неё сработает свойство `onDismiss`.\n * - `expand` – отображается иконка шеврона, которая подразумевает, что при клике на баннер можно куда-то перейти.\n */\n asideMode?: 'dismiss' | 'expand';\n /**\n * Срабатывает при клике на иконку крестика при `asideMode=\"dismiss\"`.\n */\n onDismiss?: React.MouseEventHandler<HTMLButtonElement>;\n /**\n * `aria-label` для кнопки при `asideMode=\"dismiss\". Необходим, чтобы кнопка была доступной.\n */\n dismissLabel?: string;\n /**\n * Содержимое, отображаемое в левой части баннера.\n */\n before?: React.ReactNode;\n /**\n * Заголовок.\n */\n header?: React.ReactNode;\n /**\n * Подзаголовок.\n */\n subheader?: React.ReactNode;\n /**\n * Текст баннера.\n */\n text?: React.ReactNode;\n /**\n * При использовании `mode=\"image\"`.\n *\n * - `light` – в качестве фона используется светлое изображение, цвет текста в баннере будет тёмным.\n * - `dark` – в качестве фона используется тёмное изображение, цвет текста будет светлым.\n */\n imageTheme?: 'light' | 'dark';\n /**\n * При использовании `mode=\"image\"`.\n *\n * Элемент, который нужно стилизовать цветом и/или фоном. Этот элемент будет растянут на 100% ширины и высоты баннера.\n */\n background?: React.ReactNode;\n /**\n * Кнопки-действия. Принимает [`Button`](https://vkcom.github.io/VKUI/#/Button).\n *\n * - В режиме `tint` или `image` со светлым фоном используйте только с параметрами:\n * - `mode=\"primary\"`\n * - `mode=\"secondary\"`\n * - В режиме `image` с тёмным фоном используйте с параметрами:\n * - `appearance=\"overlay\"`.\n *\n * Для набора кнопок используйте [`ButtonGroup`](https://vkcom.github.io/VKUI/#/ButtonGroup) с параметрами:\n *\n * - `gap=\"m\" mode=\"horizontal\" stretched`\n * - `gap=\"m\" mode=\"vertical\" stretched`\n */\n actions?: React.ReactNode;\n /**\n * Удаляет отступы у компонента\n */\n noPadding?: boolean;\n}\n\n/**\n * @see https://vkcom.github.io/VKUI/#/Banner\n */\nexport const Banner = ({\n mode = 'tint',\n imageTheme = 'dark',\n size = 's',\n before,\n asideMode,\n header,\n subheader,\n text,\n children,\n background,\n actions,\n onDismiss,\n dismissLabel = 'Скрыть',\n className,\n getRootRef,\n noPadding,\n ...restProps\n}: BannerProps) => {\n const platform = usePlatform();\n\n const HeaderTypography = size === 'm' ? Title : Headline;\n const SubheaderTypography = size === 'm' ? Text : Subhead;\n\n const IconDismissIOS = mode === 'image' ? Icon24DismissDark : Icon24DismissSubstract;\n\n const content = (\n <>\n {mode === 'image' && background && (\n <div aria-hidden className={styles['Banner__bg']}>\n {background}\n </div>\n )}\n\n {before && <div className={styles['Banner__before']}>{before}</div>}\n\n <div className={styles['Banner__content']}>\n {hasReactNode(header) && (\n <HeaderTypography Component=\"p\" weight=\"2\" level={size === 'm' ? '2' : '1'}>\n {header}\n </HeaderTypography>\n )}\n {hasReactNode(subheader) && (\n <SubheaderTypography Component=\"p\" className={styles['Banner__subheader']}>\n {subheader}\n </SubheaderTypography>\n )}\n {hasReactNode(text) && (\n <Text Component=\"p\" className={styles['Banner__text']}>\n {text}\n </Text>\n )}\n {hasReactNode(actions) && React.Children.count(actions) > 0 && (\n <div className={styles['Banner__actions']}>{actions}</div>\n )}\n </div>\n </>\n );\n\n return (\n <section\n {...restProps}\n className={classNames(\n styles['Banner'],\n !noPadding && styles['Banner--withPadding'],\n platform === Platform.IOS && styles['Banner--ios'],\n mode === 'image' && styles['Banner--mode-image'],\n {\n s: styles['Banner--size-s'],\n m: styles['Banner--size-m'],\n }[size],\n mode === 'image' && imageTheme === 'dark' && styles['Banner--inverted'],\n className,\n )}\n ref={getRootRef}\n >\n {asideMode === 'expand' ? (\n <Tappable\n className={styles['Banner__in']}\n activeMode={platform === Platform.IOS ? 'opacity' : 'background'}\n role=\"button\"\n >\n {content}\n\n <div className={styles['Banner__aside']}>\n <Icon24Chevron className={styles['Banner__expand']} />\n </div>\n </Tappable>\n ) : (\n <div className={styles['Banner__in']}>\n {content}\n\n {asideMode === 'dismiss' && (\n <div className={styles['Banner__aside']}>\n <IconButton\n aria-label={dismissLabel}\n className={styles['Banner__dismiss']}\n onClick={onDismiss}\n hoverMode=\"opacity\"\n hasActive={false}\n >\n {platform === Platform.IOS ? <IconDismissIOS /> : <Icon24Cancel />}\n </IconButton>\n </div>\n )}\n </div>\n )}\n </section>\n );\n};\n"],"names":["React","Icon24Cancel","Icon24Chevron","Icon24DismissDark","Icon24DismissSubstract","classNames","hasReactNode","usePlatform","Platform","IconButton","Tappable","Headline","Subhead","Text","Title","styles","Banner","mode","imageTheme","size","before","asideMode","header","subheader","text","children","background","actions","onDismiss","dismissLabel","className","getRootRef","noPadding","restProps","platform","HeaderTypography","SubheaderTypography","IconDismissIOS","content","div","aria-hidden","Component","weight","level","Children","count","section","IOS","s","m","ref","activeMode","role","aria-label","onClick","hoverMode","hasActive"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/components/Banner/Banner.tsx"],"sourcesContent":["import * as React from 'react';\nimport { Icon24Cancel, Icon24Chevron, Icon24Dismiss, Icon24DismissDark } from '@vkontakte/icons';\nimport { classNames, hasReactNode } from '@vkontakte/vkjs';\nimport { usePlatform } from '../../hooks/usePlatform';\nimport { Platform } from '../../lib/platform';\nimport { HasRootRef } from '../../types';\nimport { IconButton } from '../IconButton/IconButton';\nimport { Tappable } from '../Tappable/Tappable';\nimport { Headline } from '../Typography/Headline/Headline';\nimport { Subhead } from '../Typography/Subhead/Subhead';\nimport { Text } from '../Typography/Text/Text';\nimport { Title } from '../Typography/Title/Title';\nimport styles from './Banner.module.css';\n\nexport interface BannerProps extends React.HTMLAttributes<HTMLDivElement>, HasRootRef<HTMLElement> {\n /**\n * Тип баннера.\n */\n mode?: 'tint' | 'image';\n size?: 's' | 'm';\n /**\n * Тип действия в правой части баннера.\n *\n * - `dismiss` – отображается иконка крестика, при клике на неё сработает свойство `onDismiss`.\n * - `expand` – отображается иконка шеврона, которая подразумевает, что при клике на баннер можно куда-то перейти.\n */\n asideMode?: 'dismiss' | 'expand';\n /**\n * Срабатывает при клике на иконку крестика при `asideMode=\"dismiss\"`.\n */\n onDismiss?: React.MouseEventHandler<HTMLButtonElement>;\n /**\n * `aria-label` для кнопки при `asideMode=\"dismiss\". Необходим, чтобы кнопка была доступной.\n */\n dismissLabel?: string;\n /**\n * Содержимое, отображаемое в левой части баннера.\n */\n before?: React.ReactNode;\n /**\n * Заголовок.\n */\n header?: React.ReactNode;\n /**\n * Подзаголовок.\n */\n subheader?: React.ReactNode;\n /**\n * Текст баннера.\n */\n text?: React.ReactNode;\n /**\n * При использовании `mode=\"image\"`.\n *\n * - `light` – в качестве фона используется светлое изображение, цвет текста в баннере будет тёмным.\n * - `dark` – в качестве фона используется тёмное изображение, цвет текста будет светлым.\n */\n imageTheme?: 'light' | 'dark';\n /**\n * При использовании `mode=\"image\"`.\n *\n * Элемент, который нужно стилизовать цветом и/или фоном. Этот элемент будет растянут на 100% ширины и высоты баннера.\n */\n background?: React.ReactNode;\n /**\n * Кнопки-действия. Принимает [`Button`](https://vkcom.github.io/VKUI/#/Button).\n *\n * - В режиме `tint` или `image` со светлым фоном используйте только с параметрами:\n * - `mode=\"primary\"`\n * - `mode=\"secondary\"`\n * - В режиме `image` с тёмным фоном используйте с параметрами:\n * - `appearance=\"overlay\"`.\n *\n * Для набора кнопок используйте [`ButtonGroup`](https://vkcom.github.io/VKUI/#/ButtonGroup) с параметрами:\n *\n * - `gap=\"m\" mode=\"horizontal\" stretched`\n * - `gap=\"m\" mode=\"vertical\" stretched`\n */\n actions?: React.ReactNode;\n /**\n * Удаляет отступы у компонента\n */\n noPadding?: boolean;\n}\n\n/**\n * @see https://vkcom.github.io/VKUI/#/Banner\n */\nexport const Banner = ({\n mode = 'tint',\n imageTheme = 'dark',\n size = 's',\n before,\n asideMode,\n header,\n subheader,\n text,\n children,\n background,\n actions,\n onDismiss,\n dismissLabel = 'Скрыть',\n className,\n getRootRef,\n noPadding,\n ...restProps\n}: BannerProps) => {\n const platform = usePlatform();\n\n const HeaderTypography = size === 'm' ? Title : Headline;\n const SubheaderTypography = size === 'm' ? Text : Subhead;\n\n const IconDismissIOS = mode === 'image' ? Icon24DismissDark : Icon24Dismiss;\n\n const content = (\n <>\n {mode === 'image' && background && (\n <div aria-hidden className={styles['Banner__bg']}>\n {background}\n </div>\n )}\n\n {before && <div className={styles['Banner__before']}>{before}</div>}\n\n <div className={styles['Banner__content']}>\n {hasReactNode(header) && (\n <HeaderTypography Component=\"p\" weight=\"2\" level={size === 'm' ? '2' : '1'}>\n {header}\n </HeaderTypography>\n )}\n {hasReactNode(subheader) && (\n <SubheaderTypography Component=\"p\" className={styles['Banner__subheader']}>\n {subheader}\n </SubheaderTypography>\n )}\n {hasReactNode(text) && (\n <Text Component=\"p\" className={styles['Banner__text']}>\n {text}\n </Text>\n )}\n {hasReactNode(actions) && React.Children.count(actions) > 0 && (\n <div className={styles['Banner__actions']}>{actions}</div>\n )}\n </div>\n </>\n );\n\n return (\n <section\n {...restProps}\n className={classNames(\n styles['Banner'],\n !noPadding && styles['Banner--withPadding'],\n platform === Platform.IOS && styles['Banner--ios'],\n mode === 'image' && styles['Banner--mode-image'],\n {\n s: styles['Banner--size-s'],\n m: styles['Banner--size-m'],\n }[size],\n mode === 'image' && imageTheme === 'dark' && styles['Banner--inverted'],\n className,\n )}\n ref={getRootRef}\n >\n {asideMode === 'expand' ? (\n <Tappable\n className={styles['Banner__in']}\n activeMode={platform === Platform.IOS ? 'opacity' : 'background'}\n role=\"button\"\n >\n {content}\n\n <div className={styles['Banner__aside']}>\n <Icon24Chevron className={styles['Banner__expand']} />\n </div>\n </Tappable>\n ) : (\n <div className={styles['Banner__in']}>\n {content}\n\n {asideMode === 'dismiss' && (\n <div className={styles['Banner__aside']}>\n <IconButton\n aria-label={dismissLabel}\n className={styles['Banner__dismiss']}\n onClick={onDismiss}\n hoverMode=\"opacity\"\n hasActive={false}\n >\n {platform === Platform.IOS ? <IconDismissIOS /> : <Icon24Cancel />}\n </IconButton>\n </div>\n )}\n </div>\n )}\n </section>\n );\n};\n"],"names":["React","Icon24Cancel","Icon24Chevron","Icon24Dismiss","Icon24DismissDark","classNames","hasReactNode","usePlatform","Platform","IconButton","Tappable","Headline","Subhead","Text","Title","styles","Banner","mode","imageTheme","size","before","asideMode","header","subheader","text","children","background","actions","onDismiss","dismissLabel","className","getRootRef","noPadding","restProps","platform","HeaderTypography","SubheaderTypography","IconDismissIOS","content","div","aria-hidden","Component","weight","level","Children","count","section","IOS","s","m","ref","activeMode","role","aria-label","onClick","hoverMode","hasActive"],"mappings":"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"}
@@ -77,7 +77,7 @@
77
77
  align-items: center;
78
78
  justify-content: flex-end;
79
79
  width: 28px;
80
- color: var(--vkui--color_icon_tertiary);
80
+ color: var(--vkui--color_icon_secondary);
81
81
  }
82
82
 
83
83
  .Banner__dismiss {
@@ -144,7 +144,7 @@
144
144
 
145
145
  .Banner--ios .Banner__dismiss,
146
146
  .Banner--ios.Banner--mode-image .Banner__dismiss {
147
- color: var(--vkui--color_icon_tertiary);
147
+ color: var(--vkui--color_icon_secondary);
148
148
  }
149
149
 
150
150
  /**
@@ -110,7 +110,9 @@ const warn = warnOnce('Checkbox');
110
110
  className: styles['Checkbox__content']
111
111
  }, /*#__PURE__*/ React.createElement("div", {
112
112
  className: styles['Checkbox__title']
113
- }, /*#__PURE__*/ React.createElement(Text, null, children), /*#__PURE__*/ React.createElement("div", {
113
+ }, /*#__PURE__*/ React.createElement(Text, {
114
+ className: styles['Checkbox__titleBefore']
115
+ }, children), /*#__PURE__*/ React.createElement("div", {
114
116
  className: styles['Checkbox__titleAfter']
115
117
  }, titleAfter)), hasReactNode(description) && /*#__PURE__*/ React.createElement(Footnote, {
116
118
  className: styles['Checkbox__description']
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/Checkbox/Checkbox.tsx"],"sourcesContent":["import * as React from 'react';\nimport {\n Icon20CheckBoxIndetermanate,\n Icon20CheckBoxOff,\n Icon20CheckBoxOn,\n Icon24CheckBoxOff,\n Icon24CheckBoxOn,\n} from '@vkontakte/icons';\nimport { classNames, hasReactNode } from '@vkontakte/vkjs';\nimport { useAdaptivity } from '../../hooks/useAdaptivity';\nimport { useAdaptivityConditionalRender } from '../../hooks/useAdaptivityConditionalRender';\nimport { useExternRef } from '../../hooks/useExternRef';\nimport { usePlatform } from '../../hooks/usePlatform';\nimport { SizeType } from '../../lib/adaptivity';\nimport { Platform } from '../../lib/platform';\nimport { warnOnce } from '../../lib/warnOnce';\nimport { HasRef, HasRootRef } from '../../types';\nimport { ACTIVE_EFFECT_DELAY, Tappable, type TappableProps } from '../Tappable/Tappable';\nimport { Footnote } from '../Typography/Footnote/Footnote';\nimport { Text } from '../Typography/Text/Text';\nimport { VisuallyHidden } from '../VisuallyHidden/VisuallyHidden';\nimport styles from './Checkbox.module.css';\n\nconst sizeYClassNames = {\n none: styles['Checkbox--sizeY-none'],\n [SizeType.COMPACT]: styles['Checkbox--sizeY-compact'],\n [SizeType.REGULAR]: styles['Checkbox--sizeY-regular'],\n};\n\nexport interface CheckboxProps\n extends React.InputHTMLAttributes<HTMLInputElement>,\n HasRootRef<HTMLLabelElement>,\n HasRef<HTMLInputElement>,\n Pick<\n TappableProps,\n 'hoverMode' | 'activeMode' | 'hasHover' | 'hasActive' | 'focusVisibleMode'\n > {\n description?: React.ReactNode;\n indeterminate?: boolean;\n defaultIndeterminate?: boolean;\n titleAfter?: React.ReactNode;\n}\n\nconst warn = warnOnce('Checkbox');\n\n/**\n * @see https://vkcom.github.io/VKUI/#/Checkbox\n */\nexport const Checkbox = ({\n children,\n className,\n style,\n getRootRef,\n getRef,\n description,\n indeterminate,\n defaultIndeterminate,\n hoverMode,\n activeMode,\n hasHover,\n hasActive,\n focusVisibleMode,\n onChange,\n titleAfter,\n ...restProps\n}: CheckboxProps) => {\n const inputRef = useExternRef(getRef);\n const platform = usePlatform();\n const { sizeY = 'none' } = useAdaptivity();\n const { sizeY: adaptiveSizeY } = useAdaptivityConditionalRender();\n\n React.useEffect(() => {\n const indeterminateValue = indeterminate === undefined ? defaultIndeterminate : indeterminate;\n\n if (inputRef.current) {\n inputRef.current.indeterminate = Boolean(indeterminateValue);\n }\n }, [defaultIndeterminate, indeterminate, inputRef]);\n\n const handleChange: CheckboxProps['onChange'] = React.useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n if (\n defaultIndeterminate !== undefined &&\n indeterminate === undefined &&\n restProps.checked === undefined &&\n inputRef.current\n ) {\n inputRef.current.indeterminate = false;\n }\n if (indeterminate !== undefined && inputRef.current) {\n inputRef.current.indeterminate = indeterminate;\n }\n onChange && onChange(event);\n },\n [defaultIndeterminate, indeterminate, restProps.checked, onChange, inputRef],\n );\n\n if (process.env.NODE_ENV === 'development') {\n if (defaultIndeterminate && restProps.defaultChecked) {\n warn('defaultIndeterminate и defaultChecked не могут быть true одновременно', 'error');\n }\n\n if (indeterminate && restProps.checked) {\n warn('indeterminate и checked не могут быть true одновременно', 'error');\n }\n\n if (restProps.defaultChecked && restProps.checked) {\n warn('defaultChecked и checked не могут быть true одновременно', 'error');\n }\n }\n\n return (\n <Tappable\n Component=\"label\"\n className={classNames(\n styles['Checkbox'],\n platform === Platform.VKCOM && styles['Checkbox--vkcom'],\n sizeYClassNames[sizeY],\n !(hasReactNode(children) || hasReactNode(description)) && styles['Checkbox--simple'],\n className,\n )}\n style={style}\n disabled={restProps.disabled}\n activeEffectDelay={platform === Platform.IOS ? 100 : ACTIVE_EFFECT_DELAY}\n getRootRef={getRootRef}\n hoverMode={hoverMode}\n activeMode={activeMode}\n hasHover={hasHover}\n hasActive={hasActive}\n focusVisibleMode={focusVisibleMode}\n >\n <VisuallyHidden\n {...restProps}\n Component=\"input\"\n type=\"checkbox\"\n onChange={handleChange}\n className={styles['Checkbox__input']}\n getRootRef={inputRef}\n />\n <div className={classNames(styles['Checkbox__icon'], styles['Checkbox__icon--on'])}>\n {platform === Platform.VKCOM ? (\n <Icon20CheckBoxOn />\n ) : (\n <React.Fragment>\n {adaptiveSizeY.compact && (\n <Icon20CheckBoxOn className={adaptiveSizeY.compact.className} />\n )}\n {adaptiveSizeY.regular && (\n <Icon24CheckBoxOn className={adaptiveSizeY.regular.className} />\n )}\n </React.Fragment>\n )}\n </div>\n <div className={classNames(styles['Checkbox__icon'], styles['Checkbox__icon--off'])}>\n {platform === Platform.VKCOM ? (\n <Icon20CheckBoxOff />\n ) : (\n <React.Fragment>\n {adaptiveSizeY.compact && (\n <Icon20CheckBoxOff className={adaptiveSizeY.compact.className} />\n )}\n {adaptiveSizeY.regular && (\n <Icon24CheckBoxOff className={adaptiveSizeY.regular.className} />\n )}\n </React.Fragment>\n )}\n </div>\n <div\n className={classNames(styles['Checkbox__icon'], styles['Checkbox__icon--indeterminate'])}\n >\n {platform === Platform.VKCOM ? (\n <Icon20CheckBoxIndetermanate width={20} height={20} />\n ) : (\n <React.Fragment>\n {adaptiveSizeY.compact && (\n <Icon20CheckBoxIndetermanate\n className={adaptiveSizeY.compact.className}\n width={20}\n height={20}\n />\n )}\n {adaptiveSizeY.regular && (\n <Icon20CheckBoxIndetermanate\n className={adaptiveSizeY.regular.className}\n width={24}\n height={24}\n />\n )}\n </React.Fragment>\n )}\n </div>\n <div className={styles['Checkbox__content']}>\n <div className={styles['Checkbox__title']}>\n <Text>{children}</Text>\n <div className={styles['Checkbox__titleAfter']}>{titleAfter}</div>\n </div>\n {hasReactNode(description) && (\n <Footnote className={styles['Checkbox__description']}>{description}</Footnote>\n )}\n </div>\n </Tappable>\n );\n};\n"],"names":["React","Icon20CheckBoxIndetermanate","Icon20CheckBoxOff","Icon20CheckBoxOn","Icon24CheckBoxOff","Icon24CheckBoxOn","classNames","hasReactNode","useAdaptivity","useAdaptivityConditionalRender","useExternRef","usePlatform","SizeType","Platform","warnOnce","ACTIVE_EFFECT_DELAY","Tappable","Footnote","Text","VisuallyHidden","styles","sizeYClassNames","none","COMPACT","REGULAR","warn","Checkbox","children","className","style","getRootRef","getRef","description","indeterminate","defaultIndeterminate","hoverMode","activeMode","hasHover","hasActive","focusVisibleMode","onChange","titleAfter","restProps","inputRef","platform","sizeY","adaptiveSizeY","useEffect","indeterminateValue","undefined","current","Boolean","handleChange","useCallback","event","checked","process","env","NODE_ENV","defaultChecked","Component","VKCOM","disabled","activeEffectDelay","IOS","type","div","Fragment","compact","regular","width","height"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/components/Checkbox/Checkbox.tsx"],"sourcesContent":["import * as React from 'react';\nimport {\n Icon20CheckBoxIndetermanate,\n Icon20CheckBoxOff,\n Icon20CheckBoxOn,\n Icon24CheckBoxOff,\n Icon24CheckBoxOn,\n} from '@vkontakte/icons';\nimport { classNames, hasReactNode } from '@vkontakte/vkjs';\nimport { useAdaptivity } from '../../hooks/useAdaptivity';\nimport { useAdaptivityConditionalRender } from '../../hooks/useAdaptivityConditionalRender';\nimport { useExternRef } from '../../hooks/useExternRef';\nimport { usePlatform } from '../../hooks/usePlatform';\nimport { SizeType } from '../../lib/adaptivity';\nimport { Platform } from '../../lib/platform';\nimport { warnOnce } from '../../lib/warnOnce';\nimport { HasRef, HasRootRef } from '../../types';\nimport { ACTIVE_EFFECT_DELAY, Tappable, type TappableProps } from '../Tappable/Tappable';\nimport { Footnote } from '../Typography/Footnote/Footnote';\nimport { Text } from '../Typography/Text/Text';\nimport { VisuallyHidden } from '../VisuallyHidden/VisuallyHidden';\nimport styles from './Checkbox.module.css';\n\nconst sizeYClassNames = {\n none: styles['Checkbox--sizeY-none'],\n [SizeType.COMPACT]: styles['Checkbox--sizeY-compact'],\n [SizeType.REGULAR]: styles['Checkbox--sizeY-regular'],\n};\n\nexport interface CheckboxProps\n extends React.InputHTMLAttributes<HTMLInputElement>,\n HasRootRef<HTMLLabelElement>,\n HasRef<HTMLInputElement>,\n Pick<\n TappableProps,\n 'hoverMode' | 'activeMode' | 'hasHover' | 'hasActive' | 'focusVisibleMode'\n > {\n description?: React.ReactNode;\n indeterminate?: boolean;\n defaultIndeterminate?: boolean;\n titleAfter?: React.ReactNode;\n}\n\nconst warn = warnOnce('Checkbox');\n\n/**\n * @see https://vkcom.github.io/VKUI/#/Checkbox\n */\nexport const Checkbox = ({\n children,\n className,\n style,\n getRootRef,\n getRef,\n description,\n indeterminate,\n defaultIndeterminate,\n hoverMode,\n activeMode,\n hasHover,\n hasActive,\n focusVisibleMode,\n onChange,\n titleAfter,\n ...restProps\n}: CheckboxProps) => {\n const inputRef = useExternRef(getRef);\n const platform = usePlatform();\n const { sizeY = 'none' } = useAdaptivity();\n const { sizeY: adaptiveSizeY } = useAdaptivityConditionalRender();\n\n React.useEffect(() => {\n const indeterminateValue = indeterminate === undefined ? defaultIndeterminate : indeterminate;\n\n if (inputRef.current) {\n inputRef.current.indeterminate = Boolean(indeterminateValue);\n }\n }, [defaultIndeterminate, indeterminate, inputRef]);\n\n const handleChange: CheckboxProps['onChange'] = React.useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n if (\n defaultIndeterminate !== undefined &&\n indeterminate === undefined &&\n restProps.checked === undefined &&\n inputRef.current\n ) {\n inputRef.current.indeterminate = false;\n }\n if (indeterminate !== undefined && inputRef.current) {\n inputRef.current.indeterminate = indeterminate;\n }\n onChange && onChange(event);\n },\n [defaultIndeterminate, indeterminate, restProps.checked, onChange, inputRef],\n );\n\n if (process.env.NODE_ENV === 'development') {\n if (defaultIndeterminate && restProps.defaultChecked) {\n warn('defaultIndeterminate и defaultChecked не могут быть true одновременно', 'error');\n }\n\n if (indeterminate && restProps.checked) {\n warn('indeterminate и checked не могут быть true одновременно', 'error');\n }\n\n if (restProps.defaultChecked && restProps.checked) {\n warn('defaultChecked и checked не могут быть true одновременно', 'error');\n }\n }\n\n return (\n <Tappable\n Component=\"label\"\n className={classNames(\n styles['Checkbox'],\n platform === Platform.VKCOM && styles['Checkbox--vkcom'],\n sizeYClassNames[sizeY],\n !(hasReactNode(children) || hasReactNode(description)) && styles['Checkbox--simple'],\n className,\n )}\n style={style}\n disabled={restProps.disabled}\n activeEffectDelay={platform === Platform.IOS ? 100 : ACTIVE_EFFECT_DELAY}\n getRootRef={getRootRef}\n hoverMode={hoverMode}\n activeMode={activeMode}\n hasHover={hasHover}\n hasActive={hasActive}\n focusVisibleMode={focusVisibleMode}\n >\n <VisuallyHidden\n {...restProps}\n Component=\"input\"\n type=\"checkbox\"\n onChange={handleChange}\n className={styles['Checkbox__input']}\n getRootRef={inputRef}\n />\n <div className={classNames(styles['Checkbox__icon'], styles['Checkbox__icon--on'])}>\n {platform === Platform.VKCOM ? (\n <Icon20CheckBoxOn />\n ) : (\n <React.Fragment>\n {adaptiveSizeY.compact && (\n <Icon20CheckBoxOn className={adaptiveSizeY.compact.className} />\n )}\n {adaptiveSizeY.regular && (\n <Icon24CheckBoxOn className={adaptiveSizeY.regular.className} />\n )}\n </React.Fragment>\n )}\n </div>\n <div className={classNames(styles['Checkbox__icon'], styles['Checkbox__icon--off'])}>\n {platform === Platform.VKCOM ? (\n <Icon20CheckBoxOff />\n ) : (\n <React.Fragment>\n {adaptiveSizeY.compact && (\n <Icon20CheckBoxOff className={adaptiveSizeY.compact.className} />\n )}\n {adaptiveSizeY.regular && (\n <Icon24CheckBoxOff className={adaptiveSizeY.regular.className} />\n )}\n </React.Fragment>\n )}\n </div>\n <div\n className={classNames(styles['Checkbox__icon'], styles['Checkbox__icon--indeterminate'])}\n >\n {platform === Platform.VKCOM ? (\n <Icon20CheckBoxIndetermanate width={20} height={20} />\n ) : (\n <React.Fragment>\n {adaptiveSizeY.compact && (\n <Icon20CheckBoxIndetermanate\n className={adaptiveSizeY.compact.className}\n width={20}\n height={20}\n />\n )}\n {adaptiveSizeY.regular && (\n <Icon20CheckBoxIndetermanate\n className={adaptiveSizeY.regular.className}\n width={24}\n height={24}\n />\n )}\n </React.Fragment>\n )}\n </div>\n <div className={styles['Checkbox__content']}>\n <div className={styles['Checkbox__title']}>\n <Text className={styles['Checkbox__titleBefore']}>{children}</Text>\n <div className={styles['Checkbox__titleAfter']}>{titleAfter}</div>\n </div>\n {hasReactNode(description) && (\n <Footnote className={styles['Checkbox__description']}>{description}</Footnote>\n )}\n </div>\n </Tappable>\n );\n};\n"],"names":["React","Icon20CheckBoxIndetermanate","Icon20CheckBoxOff","Icon20CheckBoxOn","Icon24CheckBoxOff","Icon24CheckBoxOn","classNames","hasReactNode","useAdaptivity","useAdaptivityConditionalRender","useExternRef","usePlatform","SizeType","Platform","warnOnce","ACTIVE_EFFECT_DELAY","Tappable","Footnote","Text","VisuallyHidden","styles","sizeYClassNames","none","COMPACT","REGULAR","warn","Checkbox","children","className","style","getRootRef","getRef","description","indeterminate","defaultIndeterminate","hoverMode","activeMode","hasHover","hasActive","focusVisibleMode","onChange","titleAfter","restProps","inputRef","platform","sizeY","adaptiveSizeY","useEffect","indeterminateValue","undefined","current","Boolean","handleChange","useCallback","event","checked","process","env","NODE_ENV","defaultChecked","Component","VKCOM","disabled","activeEffectDelay","IOS","type","div","Fragment","compact","regular","width","height"],"mappings":"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"}
@@ -41,6 +41,7 @@
41
41
  .Checkbox__content {
42
42
  flex-grow: 1;
43
43
  color: var(--vkui--color_text_primary);
44
+ min-width: 0; /* см. https://github.com/VKCOM/VKUI/issues/5687 */
44
45
  word-break: break-word;
45
46
  }
46
47
 
@@ -62,8 +63,13 @@
62
63
  margin-bottom: 12px;
63
64
  }
64
65
 
66
+ .Checkbox__titleBefore {
67
+ min-width: 0; /* см. https://github.com/VKCOM/VKUI/issues/5687 */
68
+ }
69
+
65
70
  .Checkbox__titleAfter {
66
71
  margin-left: 4px;
72
+ flex-shrink: 0;
67
73
  color: var(--vkui--color_icon_tertiary);
68
74
  }
69
75
 
@@ -57,7 +57,9 @@ const chipsSelectDefaultProps = {
57
57
  }
58
58
  };
59
59
  const handleClickOutside = (e)=>{
60
- if (e.target !== rootRef.current && !rootRef.current?.contains(e.target)) {
60
+ const isClickOutsideFormField = !rootRef.current?.contains(e.target);
61
+ const isClickOutsideDropdown = !scrollBoxRef.current?.contains(e.target);
62
+ if (isClickOutsideFormField && isClickOutsideDropdown) {
61
63
  setOpened(false);
62
64
  }
63
65
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/ChipsSelect/ChipsSelect.tsx"],"sourcesContent":["import * as React from 'react';\nimport { classNames, noop } from '@vkontakte/vkjs';\nimport { useChipsSelect } from '../../hooks/useChipsSelect';\nimport { useExternRef } from '../../hooks/useExternRef';\nimport { useGlobalEventListener } from '../../hooks/useGlobalEventListener';\nimport { useDOM } from '../../lib/dom';\nimport type { Placement } from '../../lib/floating';\nimport { defaultFilterFn } from '../../lib/select';\nimport { ChipOption, ChipValue, RenderChip } from '../Chip/Chip';\nimport { ChipsInputProps } from '../ChipsInput/ChipsInput';\nimport { ChipsInputBase, chipsInputDefaultProps } from '../ChipsInputBase/ChipsInputBase';\nimport { CustomSelectDropdown } from '../CustomSelectDropdown/CustomSelectDropdown';\nimport {\n CustomSelectOption,\n CustomSelectOptionProps,\n} from '../CustomSelectOption/CustomSelectOption';\nimport { DropdownIcon } from '../DropdownIcon/DropdownIcon';\nimport { FormField } from '../FormField/FormField';\nimport { IconButton } from '../IconButton/IconButton';\nimport { Footnote } from '../Typography/Footnote/Footnote';\nimport styles from './ChipsSelect.module.css';\n\nexport interface ChipsSelectProps<Option extends ChipOption>\n extends Omit<ChipsInputProps<Option>, 'after'> {\n popupDirection?: 'top' | 'bottom';\n options?: Option[];\n filterFn?:\n | false\n | ((\n value?: string,\n option?: Option,\n getOptionLabel?: Pick<ChipsInputProps<Option>, 'getOptionLabel'>['getOptionLabel'],\n ) => boolean);\n /**\n * Возможность создавать чипы которых нет в списке (по enter или с помощью пункта в меню, см creatableText)\n */\n creatable?: boolean;\n /**\n * Отрисовка лоадера вместо списка опций в выпадающем списке\n */\n fetching?: boolean;\n renderOption?: (props: CustomSelectOptionProps) => React.ReactNode;\n /**\n * Показывать или скрывать уже выбранные опции\n */\n showSelected?: boolean;\n /**\n * Текст для пункта создающего чипы при клике, так же отвечает за то будет ли показан этот пункт (показывается после того как в списке не отсанется опций)\n */\n creatableText?: string;\n /**\n * Текст который показывается если список опций пуст\n */\n emptyText?: string;\n /**\n * Событие срабатывающее перед onChange\n */\n onChangeStart?: (e: React.MouseEvent | React.KeyboardEvent, option: Option) => void;\n /**\n * Закрытие выпадающего списка после выбора элемента\n */\n closeAfterSelect?: boolean;\n fixDropdownWidth?: boolean;\n forceDropdownPortal?: boolean;\n /**\n * Иконка раскрывающегося списка\n */\n icon?: React.ReactNode;\n /**\n * Добавляет значение в список на событие `onBlur` (использовать вместе с `creatable`)\n */\n addOnBlur?: boolean;\n}\n\ntype FocusActionType = 'next' | 'prev';\n\nconst FOCUS_ACTION_NEXT: FocusActionType = 'next';\nconst FOCUS_ACTION_PREV: FocusActionType = 'prev';\n\nconst chipsSelectDefaultProps: ChipsSelectProps<any> = {\n ...chipsInputDefaultProps,\n emptyText: 'Ничего не найдено',\n creatableText: 'Создать значение',\n onChangeStart: noop,\n creatable: false,\n fetching: false,\n showSelected: true,\n closeAfterSelect: true,\n options: [],\n filterFn: defaultFilterFn,\n renderOption(props) {\n return <CustomSelectOption {...props} />;\n },\n};\n\n/**\n * @see https://vkcom.github.io/VKUI/#/ChipsSelect\n */\nexport const ChipsSelect = <Option extends ChipOption>(props: ChipsSelectProps<Option>) => {\n const propsWithDefault = { ...chipsSelectDefaultProps, ...props };\n const {\n style,\n onFocus,\n onBlur,\n onKeyDown,\n className,\n fetching,\n renderOption,\n emptyText,\n getRef,\n getRootRef,\n disabled,\n placeholder,\n tabIndex,\n getOptionValue,\n getOptionLabel,\n showSelected,\n getNewOptionData,\n renderChip,\n popupDirection,\n creatable,\n filterFn,\n inputValue,\n creatableText,\n closeAfterSelect,\n onChangeStart,\n before,\n icon,\n options,\n fixDropdownWidth,\n forceDropdownPortal,\n ...restProps\n } = propsWithDefault;\n\n const { document } = useDOM();\n\n const [popperPlacement, setPopperPlacement] = React.useState<Placement | undefined>(undefined);\n\n const scrollBoxRef = React.useRef<HTMLDivElement>(null);\n const rootRef = useExternRef(getRef);\n const {\n fieldValue,\n selectedOptions = [],\n opened,\n setOpened,\n addOptionFromInput,\n filteredOptions,\n addOption,\n handleInputChange,\n clearInput,\n focusedOption,\n setFocusedOption,\n focusedOptionIndex,\n setFocusedOptionIndex,\n } = useChipsSelect(propsWithDefault);\n\n const showCreatable = Boolean(\n creatable && creatableText && !filteredOptions.length && fieldValue,\n );\n\n const handleFocus = (e: React.FocusEvent<HTMLInputElement>) => {\n setOpened(true);\n setFocusedOptionIndex(null);\n onFocus!(e);\n };\n\n const handleBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n onBlur!(e);\n\n // Не добавляем значение, если его нужно выбрать строго из списка\n if (!e.defaultPrevented && !creatable) {\n e.preventDefault();\n }\n };\n\n const handleClickOutside = (e: MouseEvent) => {\n if (e.target !== rootRef.current && !rootRef.current?.contains(e.target as Node)) {\n setOpened(false);\n }\n };\n\n const chipsSelectOptions = React.useRef<HTMLElement[]>([]).current;\n\n const scrollToElement = (index: number, center = false) => {\n const dropdown = scrollBoxRef.current;\n const item = chipsSelectOptions[index];\n\n if (!item || !dropdown) {\n return;\n }\n\n const dropdownHeight = dropdown.offsetHeight;\n const scrollTop = dropdown.scrollTop;\n const itemTop = item.offsetTop;\n const itemHeight = item.offsetHeight;\n\n if (center) {\n dropdown.scrollTop = itemTop - dropdownHeight / 2 + itemHeight / 2;\n } else if (itemTop + itemHeight > dropdownHeight + scrollTop) {\n dropdown.scrollTop = itemTop - dropdownHeight + itemHeight;\n } else if (itemTop < scrollTop) {\n dropdown.scrollTop = itemTop;\n }\n };\n\n const focusOptionByIndex = (index: number, oldIndex: number | null) => {\n const { length } = filteredOptions;\n\n if (index < 0) {\n index = length - 1;\n } else if (index >= length) {\n index = 0;\n }\n\n if (index === oldIndex) {\n return;\n }\n\n scrollToElement(index);\n setFocusedOptionIndex(index);\n };\n\n const focusOption = (nextIndex: number | null, type: FocusActionType) => {\n let index = nextIndex === null ? -1 : nextIndex;\n\n if (type === FOCUS_ACTION_NEXT) {\n index = index + 1;\n } else if (type === FOCUS_ACTION_PREV) {\n index = index - 1;\n }\n\n focusOptionByIndex(index, focusedOptionIndex);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n onKeyDown!(e);\n\n if (e.key === 'ArrowUp' && !e.defaultPrevented) {\n e.preventDefault();\n\n if (!opened) {\n setOpened(true);\n setFocusedOptionIndex(0);\n } else {\n focusOption(focusedOptionIndex, FOCUS_ACTION_PREV);\n }\n }\n\n if (e.key === 'ArrowDown' && !e.defaultPrevented) {\n e.preventDefault();\n\n if (!opened) {\n setOpened(true);\n setFocusedOptionIndex(0);\n } else {\n focusOption(focusedOptionIndex, FOCUS_ACTION_NEXT);\n }\n }\n\n if (e.key === 'Enter' && !e.defaultPrevented && opened) {\n if (focusedOptionIndex != null) {\n const option = filteredOptions[focusedOptionIndex];\n\n if (option) {\n onChangeStart!(e, option);\n\n if (!e.defaultPrevented) {\n addOption(option);\n setFocusedOptionIndex(null);\n clearInput();\n closeAfterSelect && setOpened(false);\n e.preventDefault();\n }\n } else if (!creatable) {\n e.preventDefault();\n }\n } else if (!creatable) {\n e.preventDefault();\n }\n }\n\n if (['Escape', 'Tab'].includes(e.key) && !e.defaultPrevented && opened) {\n setOpened(false);\n }\n };\n\n React.useEffect(() => {\n if (focusedOptionIndex != null && filteredOptions[focusedOptionIndex]) {\n setFocusedOption(filteredOptions[focusedOptionIndex]);\n } else if (focusedOptionIndex === null || focusedOptionIndex === 0) {\n setFocusedOption(null);\n }\n }, [focusedOptionIndex, filteredOptions, setFocusedOption]);\n\n useGlobalEventListener(document, 'click', handleClickOutside);\n\n const renderChipWrapper = (renderChipProps: RenderChip<Option> | undefined) => {\n if (renderChipProps === undefined) {\n return null;\n }\n const onRemoveWrapper = (e: React.MouseEvent | undefined, value: ChipValue | undefined) => {\n e?.preventDefault();\n e?.stopPropagation();\n\n renderChipProps.onRemove?.(e, value);\n };\n\n return renderChip!({\n ...renderChipProps,\n onRemove: onRemoveWrapper,\n });\n };\n\n const isPopperDirectionTop = popperPlacement?.includes('top');\n\n const onPlacementChange = React.useCallback(\n (placement?: Placement) => {\n setPopperPlacement(placement);\n },\n [setPopperPlacement],\n );\n\n const onDropdownMouseLeave = React.useCallback(() => {\n setFocusedOptionIndex(null);\n }, [setFocusedOptionIndex]);\n\n const toggleOpened = () => {\n setOpened((prevOpened) => !prevOpened);\n };\n\n return (\n <>\n <FormField\n getRootRef={rootRef}\n style={style}\n className={classNames(\n styles['ChipsSelect'],\n opened &&\n (isPopperDirectionTop\n ? styles['ChipsSelect--pop-up']\n : styles['ChipsSelect--pop-down']),\n className,\n )}\n disabled={disabled}\n role=\"application\"\n aria-disabled={disabled}\n aria-readonly={restProps.readOnly}\n after={\n <IconButton\n className={styles['ChipsSelect__dropdown']}\n activeMode=\"\"\n hoverMode=\"\"\n // TODO [>=6]: add label customization\n aria-label={opened ? 'Скрыть' : 'Развернуть'}\n onClick={toggleOpened}\n >\n {icon ?? <DropdownIcon className={styles['ChipsSelect__icon']} opened={opened} />}\n </IconButton>\n }\n before={before}\n >\n <ChipsInputBase\n {...restProps}\n tabIndex={tabIndex}\n value={selectedOptions}\n inputValue={fieldValue}\n getNewOptionData={getNewOptionData}\n getOptionLabel={getOptionLabel}\n getOptionValue={getOptionValue}\n renderChip={renderChipWrapper}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n getRef={getRef}\n disabled={disabled}\n onInputChange={handleInputChange}\n />\n </FormField>\n {opened && (\n <CustomSelectDropdown\n targetRef={rootRef}\n placement={popupDirection}\n scrollBoxRef={scrollBoxRef}\n onPlacementChange={onPlacementChange}\n onMouseLeave={onDropdownMouseLeave}\n fetching={fetching}\n sameWidth={fixDropdownWidth}\n forcePortal={forceDropdownPortal}\n >\n {showCreatable && (\n <CustomSelectOption\n hovered={focusedOptionIndex === 0}\n onMouseDown={addOptionFromInput}\n onMouseEnter={() => setFocusedOptionIndex(0)}\n >\n {creatableText}\n </CustomSelectOption>\n )}\n {!filteredOptions?.length && !showCreatable && emptyText ? (\n <Footnote className={styles['ChipsSelect__empty']}>{emptyText}</Footnote>\n ) : (\n filteredOptions.map((option: Option, index: number) => {\n const label = getOptionLabel!(option);\n const hovered =\n focusedOption && getOptionValue!(option) === getOptionValue!(focusedOption);\n const selected = selectedOptions.find((selectedOption: Option) => {\n return getOptionValue!(selectedOption) === getOptionValue!(option);\n });\n const value = getOptionValue!(option);\n\n return (\n <React.Fragment key={`${typeof value}-${value}`}>\n {renderOption!({\n option,\n hovered: Boolean(hovered),\n children: label,\n selected: !!selected,\n getRootRef: (e) => {\n if (e) {\n return (chipsSelectOptions[index] = e);\n }\n return undefined;\n },\n onMouseDown: (e: React.MouseEvent<HTMLDivElement>) => {\n onChangeStart?.(e, option);\n\n if (!e.defaultPrevented) {\n closeAfterSelect && setOpened(false);\n addOption(option);\n clearInput();\n }\n },\n onMouseEnter: () => setFocusedOptionIndex(index),\n })}\n </React.Fragment>\n );\n })\n )}\n </CustomSelectDropdown>\n )}\n </>\n );\n};\n"],"names":["React","classNames","noop","useChipsSelect","useExternRef","useGlobalEventListener","useDOM","defaultFilterFn","ChipsInputBase","chipsInputDefaultProps","CustomSelectDropdown","CustomSelectOption","DropdownIcon","FormField","IconButton","Footnote","styles","FOCUS_ACTION_NEXT","FOCUS_ACTION_PREV","chipsSelectDefaultProps","emptyText","creatableText","onChangeStart","creatable","fetching","showSelected","closeAfterSelect","options","filterFn","renderOption","props","ChipsSelect","propsWithDefault","style","onFocus","onBlur","onKeyDown","className","getRef","getRootRef","disabled","placeholder","tabIndex","getOptionValue","getOptionLabel","getNewOptionData","renderChip","popupDirection","inputValue","before","icon","fixDropdownWidth","forceDropdownPortal","restProps","document","popperPlacement","setPopperPlacement","useState","undefined","scrollBoxRef","useRef","rootRef","fieldValue","selectedOptions","opened","setOpened","addOptionFromInput","filteredOptions","addOption","handleInputChange","clearInput","focusedOption","setFocusedOption","focusedOptionIndex","setFocusedOptionIndex","showCreatable","Boolean","length","handleFocus","e","handleBlur","defaultPrevented","preventDefault","handleClickOutside","target","current","contains","chipsSelectOptions","scrollToElement","index","center","dropdown","item","dropdownHeight","offsetHeight","scrollTop","itemTop","offsetTop","itemHeight","focusOptionByIndex","oldIndex","focusOption","nextIndex","type","handleKeyDown","key","option","includes","useEffect","renderChipWrapper","renderChipProps","onRemoveWrapper","value","stopPropagation","onRemove","isPopperDirectionTop","onPlacementChange","useCallback","placement","onDropdownMouseLeave","toggleOpened","prevOpened","role","aria-disabled","aria-readonly","readOnly","after","activeMode","hoverMode","aria-label","onClick","onInputChange","targetRef","onMouseLeave","sameWidth","forcePortal","hovered","onMouseDown","onMouseEnter","map","label","selected","find","selectedOption","Fragment","children"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/components/ChipsSelect/ChipsSelect.tsx"],"sourcesContent":["import * as React from 'react';\nimport { classNames, noop } from '@vkontakte/vkjs';\nimport { useChipsSelect } from '../../hooks/useChipsSelect';\nimport { useExternRef } from '../../hooks/useExternRef';\nimport { useGlobalEventListener } from '../../hooks/useGlobalEventListener';\nimport { useDOM } from '../../lib/dom';\nimport type { Placement } from '../../lib/floating';\nimport { defaultFilterFn } from '../../lib/select';\nimport { ChipOption, ChipValue, RenderChip } from '../Chip/Chip';\nimport { ChipsInputProps } from '../ChipsInput/ChipsInput';\nimport { ChipsInputBase, chipsInputDefaultProps } from '../ChipsInputBase/ChipsInputBase';\nimport { CustomSelectDropdown } from '../CustomSelectDropdown/CustomSelectDropdown';\nimport {\n CustomSelectOption,\n CustomSelectOptionProps,\n} from '../CustomSelectOption/CustomSelectOption';\nimport { DropdownIcon } from '../DropdownIcon/DropdownIcon';\nimport { FormField } from '../FormField/FormField';\nimport { IconButton } from '../IconButton/IconButton';\nimport { Footnote } from '../Typography/Footnote/Footnote';\nimport styles from './ChipsSelect.module.css';\n\nexport interface ChipsSelectProps<Option extends ChipOption>\n extends Omit<ChipsInputProps<Option>, 'after'> {\n popupDirection?: 'top' | 'bottom';\n options?: Option[];\n filterFn?:\n | false\n | ((\n value?: string,\n option?: Option,\n getOptionLabel?: Pick<ChipsInputProps<Option>, 'getOptionLabel'>['getOptionLabel'],\n ) => boolean);\n /**\n * Возможность создавать чипы которых нет в списке (по enter или с помощью пункта в меню, см creatableText)\n */\n creatable?: boolean;\n /**\n * Отрисовка лоадера вместо списка опций в выпадающем списке\n */\n fetching?: boolean;\n renderOption?: (props: CustomSelectOptionProps) => React.ReactNode;\n /**\n * Показывать или скрывать уже выбранные опции\n */\n showSelected?: boolean;\n /**\n * Текст для пункта создающего чипы при клике, так же отвечает за то будет ли показан этот пункт (показывается после того как в списке не отсанется опций)\n */\n creatableText?: string;\n /**\n * Текст который показывается если список опций пуст\n */\n emptyText?: string;\n /**\n * Событие срабатывающее перед onChange\n */\n onChangeStart?: (e: React.MouseEvent | React.KeyboardEvent, option: Option) => void;\n /**\n * Закрытие выпадающего списка после выбора элемента\n */\n closeAfterSelect?: boolean;\n fixDropdownWidth?: boolean;\n forceDropdownPortal?: boolean;\n /**\n * Иконка раскрывающегося списка\n */\n icon?: React.ReactNode;\n /**\n * Добавляет значение в список на событие `onBlur` (использовать вместе с `creatable`)\n */\n addOnBlur?: boolean;\n}\n\ntype FocusActionType = 'next' | 'prev';\n\nconst FOCUS_ACTION_NEXT: FocusActionType = 'next';\nconst FOCUS_ACTION_PREV: FocusActionType = 'prev';\n\nconst chipsSelectDefaultProps: ChipsSelectProps<any> = {\n ...chipsInputDefaultProps,\n emptyText: 'Ничего не найдено',\n creatableText: 'Создать значение',\n onChangeStart: noop,\n creatable: false,\n fetching: false,\n showSelected: true,\n closeAfterSelect: true,\n options: [],\n filterFn: defaultFilterFn,\n renderOption(props) {\n return <CustomSelectOption {...props} />;\n },\n};\n\n/**\n * @see https://vkcom.github.io/VKUI/#/ChipsSelect\n */\nexport const ChipsSelect = <Option extends ChipOption>(props: ChipsSelectProps<Option>) => {\n const propsWithDefault = { ...chipsSelectDefaultProps, ...props };\n const {\n style,\n onFocus,\n onBlur,\n onKeyDown,\n className,\n fetching,\n renderOption,\n emptyText,\n getRef,\n getRootRef,\n disabled,\n placeholder,\n tabIndex,\n getOptionValue,\n getOptionLabel,\n showSelected,\n getNewOptionData,\n renderChip,\n popupDirection,\n creatable,\n filterFn,\n inputValue,\n creatableText,\n closeAfterSelect,\n onChangeStart,\n before,\n icon,\n options,\n fixDropdownWidth,\n forceDropdownPortal,\n ...restProps\n } = propsWithDefault;\n\n const { document } = useDOM();\n\n const [popperPlacement, setPopperPlacement] = React.useState<Placement | undefined>(undefined);\n\n const scrollBoxRef = React.useRef<HTMLDivElement>(null);\n const rootRef = useExternRef(getRef);\n const {\n fieldValue,\n selectedOptions = [],\n opened,\n setOpened,\n addOptionFromInput,\n filteredOptions,\n addOption,\n handleInputChange,\n clearInput,\n focusedOption,\n setFocusedOption,\n focusedOptionIndex,\n setFocusedOptionIndex,\n } = useChipsSelect(propsWithDefault);\n\n const showCreatable = Boolean(\n creatable && creatableText && !filteredOptions.length && fieldValue,\n );\n\n const handleFocus = (e: React.FocusEvent<HTMLInputElement>) => {\n setOpened(true);\n setFocusedOptionIndex(null);\n onFocus!(e);\n };\n\n const handleBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n onBlur!(e);\n\n // Не добавляем значение, если его нужно выбрать строго из списка\n if (!e.defaultPrevented && !creatable) {\n e.preventDefault();\n }\n };\n\n const handleClickOutside = (e: MouseEvent) => {\n const isClickOutsideFormField = !rootRef.current?.contains(e.target as Node);\n const isClickOutsideDropdown = !scrollBoxRef.current?.contains(e.target as Node);\n\n if (isClickOutsideFormField && isClickOutsideDropdown) {\n setOpened(false);\n }\n };\n\n const chipsSelectOptions = React.useRef<HTMLElement[]>([]).current;\n\n const scrollToElement = (index: number, center = false) => {\n const dropdown = scrollBoxRef.current;\n const item = chipsSelectOptions[index];\n\n if (!item || !dropdown) {\n return;\n }\n\n const dropdownHeight = dropdown.offsetHeight;\n const scrollTop = dropdown.scrollTop;\n const itemTop = item.offsetTop;\n const itemHeight = item.offsetHeight;\n\n if (center) {\n dropdown.scrollTop = itemTop - dropdownHeight / 2 + itemHeight / 2;\n } else if (itemTop + itemHeight > dropdownHeight + scrollTop) {\n dropdown.scrollTop = itemTop - dropdownHeight + itemHeight;\n } else if (itemTop < scrollTop) {\n dropdown.scrollTop = itemTop;\n }\n };\n\n const focusOptionByIndex = (index: number, oldIndex: number | null) => {\n const { length } = filteredOptions;\n\n if (index < 0) {\n index = length - 1;\n } else if (index >= length) {\n index = 0;\n }\n\n if (index === oldIndex) {\n return;\n }\n\n scrollToElement(index);\n setFocusedOptionIndex(index);\n };\n\n const focusOption = (nextIndex: number | null, type: FocusActionType) => {\n let index = nextIndex === null ? -1 : nextIndex;\n\n if (type === FOCUS_ACTION_NEXT) {\n index = index + 1;\n } else if (type === FOCUS_ACTION_PREV) {\n index = index - 1;\n }\n\n focusOptionByIndex(index, focusedOptionIndex);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n onKeyDown!(e);\n\n if (e.key === 'ArrowUp' && !e.defaultPrevented) {\n e.preventDefault();\n\n if (!opened) {\n setOpened(true);\n setFocusedOptionIndex(0);\n } else {\n focusOption(focusedOptionIndex, FOCUS_ACTION_PREV);\n }\n }\n\n if (e.key === 'ArrowDown' && !e.defaultPrevented) {\n e.preventDefault();\n\n if (!opened) {\n setOpened(true);\n setFocusedOptionIndex(0);\n } else {\n focusOption(focusedOptionIndex, FOCUS_ACTION_NEXT);\n }\n }\n\n if (e.key === 'Enter' && !e.defaultPrevented && opened) {\n if (focusedOptionIndex != null) {\n const option = filteredOptions[focusedOptionIndex];\n\n if (option) {\n onChangeStart!(e, option);\n\n if (!e.defaultPrevented) {\n addOption(option);\n setFocusedOptionIndex(null);\n clearInput();\n closeAfterSelect && setOpened(false);\n e.preventDefault();\n }\n } else if (!creatable) {\n e.preventDefault();\n }\n } else if (!creatable) {\n e.preventDefault();\n }\n }\n\n if (['Escape', 'Tab'].includes(e.key) && !e.defaultPrevented && opened) {\n setOpened(false);\n }\n };\n\n React.useEffect(() => {\n if (focusedOptionIndex != null && filteredOptions[focusedOptionIndex]) {\n setFocusedOption(filteredOptions[focusedOptionIndex]);\n } else if (focusedOptionIndex === null || focusedOptionIndex === 0) {\n setFocusedOption(null);\n }\n }, [focusedOptionIndex, filteredOptions, setFocusedOption]);\n\n useGlobalEventListener(document, 'click', handleClickOutside);\n\n const renderChipWrapper = (renderChipProps: RenderChip<Option> | undefined) => {\n if (renderChipProps === undefined) {\n return null;\n }\n const onRemoveWrapper = (e: React.MouseEvent | undefined, value: ChipValue | undefined) => {\n e?.preventDefault();\n e?.stopPropagation();\n\n renderChipProps.onRemove?.(e, value);\n };\n\n return renderChip!({\n ...renderChipProps,\n onRemove: onRemoveWrapper,\n });\n };\n\n const isPopperDirectionTop = popperPlacement?.includes('top');\n\n const onPlacementChange = React.useCallback(\n (placement?: Placement) => {\n setPopperPlacement(placement);\n },\n [setPopperPlacement],\n );\n\n const onDropdownMouseLeave = React.useCallback(() => {\n setFocusedOptionIndex(null);\n }, [setFocusedOptionIndex]);\n\n const toggleOpened = () => {\n setOpened((prevOpened) => !prevOpened);\n };\n\n return (\n <>\n <FormField\n getRootRef={rootRef}\n style={style}\n className={classNames(\n styles['ChipsSelect'],\n opened &&\n (isPopperDirectionTop\n ? styles['ChipsSelect--pop-up']\n : styles['ChipsSelect--pop-down']),\n className,\n )}\n disabled={disabled}\n role=\"application\"\n aria-disabled={disabled}\n aria-readonly={restProps.readOnly}\n after={\n <IconButton\n className={styles['ChipsSelect__dropdown']}\n activeMode=\"\"\n hoverMode=\"\"\n // TODO [>=6]: add label customization\n aria-label={opened ? 'Скрыть' : 'Развернуть'}\n onClick={toggleOpened}\n >\n {icon ?? <DropdownIcon className={styles['ChipsSelect__icon']} opened={opened} />}\n </IconButton>\n }\n before={before}\n >\n <ChipsInputBase\n {...restProps}\n tabIndex={tabIndex}\n value={selectedOptions}\n inputValue={fieldValue}\n getNewOptionData={getNewOptionData}\n getOptionLabel={getOptionLabel}\n getOptionValue={getOptionValue}\n renderChip={renderChipWrapper}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n getRef={getRef}\n disabled={disabled}\n onInputChange={handleInputChange}\n />\n </FormField>\n {opened && (\n <CustomSelectDropdown\n targetRef={rootRef}\n placement={popupDirection}\n scrollBoxRef={scrollBoxRef}\n onPlacementChange={onPlacementChange}\n onMouseLeave={onDropdownMouseLeave}\n fetching={fetching}\n sameWidth={fixDropdownWidth}\n forcePortal={forceDropdownPortal}\n >\n {showCreatable && (\n <CustomSelectOption\n hovered={focusedOptionIndex === 0}\n onMouseDown={addOptionFromInput}\n onMouseEnter={() => setFocusedOptionIndex(0)}\n >\n {creatableText}\n </CustomSelectOption>\n )}\n {!filteredOptions?.length && !showCreatable && emptyText ? (\n <Footnote className={styles['ChipsSelect__empty']}>{emptyText}</Footnote>\n ) : (\n filteredOptions.map((option: Option, index: number) => {\n const label = getOptionLabel!(option);\n const hovered =\n focusedOption && getOptionValue!(option) === getOptionValue!(focusedOption);\n const selected = selectedOptions.find((selectedOption: Option) => {\n return getOptionValue!(selectedOption) === getOptionValue!(option);\n });\n const value = getOptionValue!(option);\n\n return (\n <React.Fragment key={`${typeof value}-${value}`}>\n {renderOption!({\n option,\n hovered: Boolean(hovered),\n children: label,\n selected: !!selected,\n getRootRef: (e) => {\n if (e) {\n return (chipsSelectOptions[index] = e);\n }\n return undefined;\n },\n onMouseDown: (e: React.MouseEvent<HTMLDivElement>) => {\n onChangeStart?.(e, option);\n\n if (!e.defaultPrevented) {\n closeAfterSelect && setOpened(false);\n addOption(option);\n clearInput();\n }\n },\n onMouseEnter: () => setFocusedOptionIndex(index),\n })}\n </React.Fragment>\n );\n })\n )}\n </CustomSelectDropdown>\n )}\n </>\n );\n};\n"],"names":["React","classNames","noop","useChipsSelect","useExternRef","useGlobalEventListener","useDOM","defaultFilterFn","ChipsInputBase","chipsInputDefaultProps","CustomSelectDropdown","CustomSelectOption","DropdownIcon","FormField","IconButton","Footnote","styles","FOCUS_ACTION_NEXT","FOCUS_ACTION_PREV","chipsSelectDefaultProps","emptyText","creatableText","onChangeStart","creatable","fetching","showSelected","closeAfterSelect","options","filterFn","renderOption","props","ChipsSelect","propsWithDefault","style","onFocus","onBlur","onKeyDown","className","getRef","getRootRef","disabled","placeholder","tabIndex","getOptionValue","getOptionLabel","getNewOptionData","renderChip","popupDirection","inputValue","before","icon","fixDropdownWidth","forceDropdownPortal","restProps","document","popperPlacement","setPopperPlacement","useState","undefined","scrollBoxRef","useRef","rootRef","fieldValue","selectedOptions","opened","setOpened","addOptionFromInput","filteredOptions","addOption","handleInputChange","clearInput","focusedOption","setFocusedOption","focusedOptionIndex","setFocusedOptionIndex","showCreatable","Boolean","length","handleFocus","e","handleBlur","defaultPrevented","preventDefault","handleClickOutside","isClickOutsideFormField","current","contains","target","isClickOutsideDropdown","chipsSelectOptions","scrollToElement","index","center","dropdown","item","dropdownHeight","offsetHeight","scrollTop","itemTop","offsetTop","itemHeight","focusOptionByIndex","oldIndex","focusOption","nextIndex","type","handleKeyDown","key","option","includes","useEffect","renderChipWrapper","renderChipProps","onRemoveWrapper","value","stopPropagation","onRemove","isPopperDirectionTop","onPlacementChange","useCallback","placement","onDropdownMouseLeave","toggleOpened","prevOpened","role","aria-disabled","aria-readonly","readOnly","after","activeMode","hoverMode","aria-label","onClick","onInputChange","targetRef","onMouseLeave","sameWidth","forcePortal","hovered","onMouseDown","onMouseEnter","map","label","selected","find","selectedOption","Fragment","children"],"mappings":"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"}
@@ -63,7 +63,7 @@
63
63
 
64
64
  @media (prefers-reduced-motion: no-preference) {
65
65
  .FocusVisible--visible.FocusVisible--mode-inside {
66
- animation: vkui-animation-focus-visible 0.15s ease-in-out forwards;
66
+ animation: animation-focus-visible 0.15s ease-in-out forwards;
67
67
  animation-delay: 0.01ms;
68
68
  will-change: top, left, bottom, right;
69
69
 
@@ -71,13 +71,13 @@
71
71
  }
72
72
 
73
73
  .FocusVisible--visible.FocusVisible--mode-outside {
74
- animation-name: vkui-animation-focus-visible-outside;
74
+ animation-name: animation-focus-visible-outside;
75
75
 
76
76
  --vkui_internal--focus_visible_distance: 0;
77
77
  }
78
78
  }
79
79
 
80
- @keyframes vkui-animation-focus-visible {
80
+ @keyframes animation-focus-visible {
81
81
  0% {
82
82
  }
83
83
 
@@ -90,7 +90,7 @@
90
90
  }
91
91
  }
92
92
 
93
- @keyframes vkui-animation-focus-visible-outside {
93
+ @keyframes animation-focus-visible-outside {
94
94
  0% {
95
95
  }
96
96
 
@@ -34,7 +34,6 @@ const warn = warnOnce('Group');
34
34
  warn('При использовании роли "tabpanel" необходимо задать значение свойств "aria-controls" и "id"');
35
35
  }
36
36
  const tabIndex = isTabPanel && tabIndexProp === undefined ? 0 : tabIndexProp;
37
- const separatorClassName = classNames(styles['Group__separator'], separator === 'show' && styles['Group__separator--force']);
38
37
  return /*#__PURE__*/ React.createElement(React.Fragment, null, /*#__PURE__*/ React.createElement("section", {
39
38
  ...restProps,
40
39
  tabIndex: tabIndex,
@@ -50,10 +49,10 @@ const warn = warnOnce('Group');
50
49
  }, header, children, hasReactNode(description) && /*#__PURE__*/ React.createElement(Footnote, {
51
50
  className: styles['Group__description']
52
51
  }, description)), separator !== 'hide' && /*#__PURE__*/ React.createElement(React.Fragment, null, /*#__PURE__*/ React.createElement(Spacing, {
53
- className: classNames(separatorClassName, styles['Group__separator--spacing']),
52
+ className: classNames(styles['Group__separator'], styles['Group__separator--spacing']),
54
53
  size: 16
55
54
  }), /*#__PURE__*/ React.createElement(Separator, {
56
- className: classNames(separatorClassName, styles['Group__separator--separator'])
55
+ className: classNames(styles['Group__separator'], styles['Group__separator--separator'], separator === 'show' && styles['Group__separator--force'])
57
56
  })));
58
57
  };
59
58
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/Group/Group.tsx"],"sourcesContent":["import * as React from 'react';\nimport { classNames, hasReactNode } from '@vkontakte/vkjs';\nimport { useAdaptivity } from '../../hooks/useAdaptivity';\nimport { usePlatform } from '../../hooks/usePlatform';\nimport { SizeType } from '../../lib/adaptivity';\nimport { Platform } from '../../lib/platform';\nimport { warnOnce } from '../../lib/warnOnce';\nimport { HasChildren, HasRootRef } from '../../types';\nimport { ModalRootContext } from '../ModalRoot/ModalRootContext';\nimport { Separator } from '../Separator/Separator';\nimport { Spacing } from '../Spacing/Spacing';\nimport { Footnote } from '../Typography/Footnote/Footnote';\nimport styles from './Group.module.css';\n\nconst sizeXClassNames = {\n none: classNames(styles['Group--sizeX-none'], 'vkuiInternalGroup--sizeX-none'),\n [SizeType.COMPACT]: styles['Group--sizeX-compact'],\n};\n\nexport interface GroupProps\n extends HasRootRef<HTMLElement>,\n React.HTMLAttributes<HTMLElement>,\n HasChildren {\n header?: React.ReactNode;\n description?: React.ReactNode;\n /**\n `show` - разделитель всегда показывается,\n `hide` - разделитель всегда спрятан,\n `auto` - разделитель рисуется автоматически между соседними группами.\n */\n separator?: 'show' | 'hide' | 'auto';\n /**\n * Режим отображения. Если установлен `card`, выглядит как карточка c\n * обводкой и внешними отступами. Если `plain` — без отступов и обводки.\n * По умолчанию режим отображения зависит от `sizeX` (`mode=card` при `sizeX=REGULAR` и `mode=plain` при `sizeX=COMPACT`)\n * В модальных окнах по умолчанию `plain`.\n */\n mode?: 'plain' | 'card';\n /**\n * Отвечает за отступы вокруг контента в режиме `card`.\n */\n padding?: 's' | 'm';\n}\n\nconst warn = warnOnce('Group');\n/**\n * @see https://vkcom.github.io/VKUI/#/Group\n */\nexport const Group = ({\n header,\n description,\n children,\n separator = 'auto',\n getRootRef,\n mode: modeProps,\n padding = 'm',\n className,\n tabIndex: tabIndexProp,\n ...restProps\n}: GroupProps) => {\n const { isInsideModal } = React.useContext(ModalRootContext);\n const platform = usePlatform();\n const { sizeX = 'none' } = useAdaptivity();\n\n let mode: GroupProps['mode'] | 'none' = modeProps;\n\n if (!modeProps) {\n // Подробнее в \"none\" можно прочитать в ADAPTIVITY_GUIDE.md\n mode = isInsideModal ? 'plain' : 'none';\n }\n\n if (mode === 'none' && sizeX !== 'none') {\n mode = sizeX === SizeType.REGULAR ? 'card' : 'plain';\n }\n\n const isTabPanel = restProps.role === 'tabpanel';\n\n if (\n process.env.NODE_ENV === 'development' &&\n isTabPanel &&\n (!restProps['aria-controls'] || !restProps['id'])\n ) {\n warn(\n 'При использовании роли \"tabpanel\" необходимо задать значение свойств \"aria-controls\" и \"id\"',\n );\n }\n\n const tabIndex = isTabPanel && tabIndexProp === undefined ? 0 : tabIndexProp;\n\n const separatorClassName = classNames(\n styles['Group__separator'],\n separator === 'show' && styles['Group__separator--force'],\n );\n\n return (\n <>\n <section\n {...restProps}\n tabIndex={tabIndex}\n ref={getRootRef}\n className={classNames(\n 'vkuiInternalGroup',\n styles['Group'],\n isInsideModal && styles['Group--inside-modal'],\n platform === Platform.IOS && styles['Group--ios'],\n sizeX !== SizeType.REGULAR && sizeXClassNames[sizeX],\n mode &&\n {\n none: classNames(styles['Group--mode-none'], 'vkuiInternalGroup--mode-none'),\n plain: classNames(styles['Group--mode-plain'], 'vkuiInternalGroup--mode-plain'),\n card: classNames(styles['Group--mode-card'], 'vkuiInternalGroup--mode-card'),\n }[mode],\n {\n s: styles['Group--padding-s'],\n m: styles['Group--padding-m'],\n }[padding],\n className,\n )}\n >\n {header}\n {children}\n {hasReactNode(description) && (\n <Footnote className={styles['Group__description']}>{description}</Footnote>\n )}\n </section>\n\n {separator !== 'hide' && (\n <React.Fragment>\n <Spacing\n className={classNames(separatorClassName, styles['Group__separator--spacing'])}\n size={16}\n />\n <Separator\n className={classNames(separatorClassName, styles['Group__separator--separator'])}\n />\n </React.Fragment>\n )}\n </>\n );\n};\n"],"names":["React","classNames","hasReactNode","useAdaptivity","usePlatform","SizeType","Platform","warnOnce","ModalRootContext","Separator","Spacing","Footnote","styles","sizeXClassNames","none","COMPACT","warn","Group","header","description","children","separator","getRootRef","mode","modeProps","padding","className","tabIndex","tabIndexProp","restProps","isInsideModal","useContext","platform","sizeX","REGULAR","isTabPanel","role","process","env","NODE_ENV","undefined","separatorClassName","section","ref","IOS","plain","card","s","m","Fragment","size"],"mappings":"AAAA,YAAYA,WAAW,QAAQ;AAC/B,SAASC,UAAU,EAAEC,YAAY,QAAQ,kBAAkB;AAC3D,SAASC,aAAa,QAAQ,4BAA4B;AAC1D,SAASC,WAAW,QAAQ,0BAA0B;AACtD,SAASC,QAAQ,QAAQ,uBAAuB;AAChD,SAASC,QAAQ,QAAQ,qBAAqB;AAC9C,SAASC,QAAQ,QAAQ,qBAAqB;AAE9C,SAASC,gBAAgB,QAAQ,gCAAgC;AACjE,SAASC,SAAS,QAAQ,yBAAyB;AACnD,SAASC,OAAO,QAAQ,qBAAqB;AAC7C,SAASC,QAAQ,QAAQ,kCAAkC;AAC3D,OAAOC,YAAY,qBAAqB;AAExC,MAAMC,kBAAkB;IACtBC,MAAMb,WAAWW,MAAM,CAAC,oBAAoB,EAAE;IAC9C,CAACP,SAASU,OAAO,CAAC,EAAEH,MAAM,CAAC,uBAAuB;AACpD;AA2BA,MAAMI,OAAOT,SAAS;AACtB;;CAEC,GACD,OAAO,MAAMU,QAAQ,CAAC,EACpBC,MAAM,EACNC,WAAW,EACXC,QAAQ,EACRC,YAAY,MAAM,EAClBC,UAAU,EACVC,MAAMC,SAAS,EACfC,UAAU,GAAG,EACbC,SAAS,EACTC,UAAUC,YAAY,EACtB,GAAGC,WACQ;IACX,MAAM,EAAEC,aAAa,EAAE,GAAG9B,MAAM+B,UAAU,CAACvB;IAC3C,MAAMwB,WAAW5B;IACjB,MAAM,EAAE6B,QAAQ,MAAM,EAAE,GAAG9B;IAE3B,IAAIoB,OAAoCC;IAExC,IAAI,CAACA,WAAW;QACd,2DAA2D;QAC3DD,OAAOO,gBAAgB,UAAU;IACnC;IAEA,IAAIP,SAAS,UAAUU,UAAU,QAAQ;QACvCV,OAAOU,UAAU5B,SAAS6B,OAAO,GAAG,SAAS;IAC/C;IAEA,MAAMC,aAAaN,UAAUO,IAAI,KAAK;IAEtC,IACEC,QAAQC,GAAG,CAACC,QAAQ,KAAK,iBACzBJ,cACC,CAAA,CAACN,SAAS,CAAC,gBAAgB,IAAI,CAACA,SAAS,CAAC,KAAK,AAAD,GAC/C;QACAb,KACE;IAEJ;IAEA,MAAMW,WAAWQ,cAAcP,iBAAiBY,YAAY,IAAIZ;IAEhE,MAAMa,qBAAqBxC,WACzBW,MAAM,CAAC,mBAAmB,EAC1BS,cAAc,UAAUT,MAAM,CAAC,0BAA0B;IAG3D,qBACE,wDACE,oBAAC8B;QACE,GAAGb,SAAS;QACbF,UAAUA;QACVgB,KAAKrB;QACLI,WAAWzB,WACT,qBACAW,MAAM,CAAC,QAAQ,EACfkB,iBAAiBlB,MAAM,CAAC,sBAAsB,EAC9CoB,aAAa1B,SAASsC,GAAG,IAAIhC,MAAM,CAAC,aAAa,EACjDqB,UAAU5B,SAAS6B,OAAO,IAAIrB,eAAe,CAACoB,MAAM,EACpDV,QACE,CAAA;YACET,MAAMb,WAAWW,MAAM,CAAC,mBAAmB,EAAE;YAC7CiC,OAAO5C,WAAWW,MAAM,CAAC,oBAAoB,EAAE;YAC/CkC,MAAM7C,WAAWW,MAAM,CAAC,mBAAmB,EAAE;QAC/C,CAAA,CAAC,CAACW,KAAK,EACT;YACEwB,GAAGnC,MAAM,CAAC,mBAAmB;YAC7BoC,GAAGpC,MAAM,CAAC,mBAAmB;QAC/B,CAAC,CAACa,QAAQ,EACVC;OAGDR,QACAE,UACAlB,aAAaiB,8BACZ,oBAACR;QAASe,WAAWd,MAAM,CAAC,qBAAqB;OAAGO,eAIvDE,cAAc,wBACb,oBAACrB,MAAMiD,QAAQ,sBACb,oBAACvC;QACCgB,WAAWzB,WAAWwC,oBAAoB7B,MAAM,CAAC,4BAA4B;QAC7EsC,MAAM;sBAER,oBAACzC;QACCiB,WAAWzB,WAAWwC,oBAAoB7B,MAAM,CAAC,8BAA8B;;AAM3F,EAAE"}
1
+ {"version":3,"sources":["../../../../src/components/Group/Group.tsx"],"sourcesContent":["import * as React from 'react';\nimport { classNames, hasReactNode } from '@vkontakte/vkjs';\nimport { useAdaptivity } from '../../hooks/useAdaptivity';\nimport { usePlatform } from '../../hooks/usePlatform';\nimport { SizeType } from '../../lib/adaptivity';\nimport { Platform } from '../../lib/platform';\nimport { warnOnce } from '../../lib/warnOnce';\nimport { HasChildren, HasRootRef } from '../../types';\nimport { ModalRootContext } from '../ModalRoot/ModalRootContext';\nimport { Separator } from '../Separator/Separator';\nimport { Spacing } from '../Spacing/Spacing';\nimport { Footnote } from '../Typography/Footnote/Footnote';\nimport styles from './Group.module.css';\n\nconst sizeXClassNames = {\n none: classNames(styles['Group--sizeX-none'], 'vkuiInternalGroup--sizeX-none'),\n [SizeType.COMPACT]: styles['Group--sizeX-compact'],\n};\n\nexport interface GroupProps\n extends HasRootRef<HTMLElement>,\n React.HTMLAttributes<HTMLElement>,\n HasChildren {\n header?: React.ReactNode;\n description?: React.ReactNode;\n /**\n `show` - разделитель всегда показывается,\n `hide` - разделитель всегда спрятан,\n `auto` - разделитель рисуется автоматически между соседними группами.\n */\n separator?: 'show' | 'hide' | 'auto';\n /**\n * Режим отображения. Если установлен `card`, выглядит как карточка c\n * обводкой и внешними отступами. Если `plain` — без отступов и обводки.\n * По умолчанию режим отображения зависит от `sizeX` (`mode=card` при `sizeX=REGULAR` и `mode=plain` при `sizeX=COMPACT`)\n * В модальных окнах по умолчанию `plain`.\n */\n mode?: 'plain' | 'card';\n /**\n * Отвечает за отступы вокруг контента в режиме `card`.\n */\n padding?: 's' | 'm';\n}\n\nconst warn = warnOnce('Group');\n/**\n * @see https://vkcom.github.io/VKUI/#/Group\n */\nexport const Group = ({\n header,\n description,\n children,\n separator = 'auto',\n getRootRef,\n mode: modeProps,\n padding = 'm',\n className,\n tabIndex: tabIndexProp,\n ...restProps\n}: GroupProps) => {\n const { isInsideModal } = React.useContext(ModalRootContext);\n const platform = usePlatform();\n const { sizeX = 'none' } = useAdaptivity();\n\n let mode: GroupProps['mode'] | 'none' = modeProps;\n\n if (!modeProps) {\n // Подробнее в \"none\" можно прочитать в ADAPTIVITY_GUIDE.md\n mode = isInsideModal ? 'plain' : 'none';\n }\n\n if (mode === 'none' && sizeX !== 'none') {\n mode = sizeX === SizeType.REGULAR ? 'card' : 'plain';\n }\n\n const isTabPanel = restProps.role === 'tabpanel';\n\n if (\n process.env.NODE_ENV === 'development' &&\n isTabPanel &&\n (!restProps['aria-controls'] || !restProps['id'])\n ) {\n warn(\n 'При использовании роли \"tabpanel\" необходимо задать значение свойств \"aria-controls\" и \"id\"',\n );\n }\n\n const tabIndex = isTabPanel && tabIndexProp === undefined ? 0 : tabIndexProp;\n\n return (\n <>\n <section\n {...restProps}\n tabIndex={tabIndex}\n ref={getRootRef}\n className={classNames(\n 'vkuiInternalGroup',\n styles['Group'],\n isInsideModal && styles['Group--inside-modal'],\n platform === Platform.IOS && styles['Group--ios'],\n sizeX !== SizeType.REGULAR && sizeXClassNames[sizeX],\n mode &&\n {\n none: classNames(styles['Group--mode-none'], 'vkuiInternalGroup--mode-none'),\n plain: classNames(styles['Group--mode-plain'], 'vkuiInternalGroup--mode-plain'),\n card: classNames(styles['Group--mode-card'], 'vkuiInternalGroup--mode-card'),\n }[mode],\n {\n s: styles['Group--padding-s'],\n m: styles['Group--padding-m'],\n }[padding],\n className,\n )}\n >\n {header}\n {children}\n {hasReactNode(description) && (\n <Footnote className={styles['Group__description']}>{description}</Footnote>\n )}\n </section>\n\n {separator !== 'hide' && (\n <React.Fragment>\n <Spacing\n className={classNames(styles['Group__separator'], styles['Group__separator--spacing'])}\n size={16}\n />\n <Separator\n className={classNames(\n styles['Group__separator'],\n styles['Group__separator--separator'],\n separator === 'show' && styles['Group__separator--force'],\n )}\n />\n </React.Fragment>\n )}\n </>\n );\n};\n"],"names":["React","classNames","hasReactNode","useAdaptivity","usePlatform","SizeType","Platform","warnOnce","ModalRootContext","Separator","Spacing","Footnote","styles","sizeXClassNames","none","COMPACT","warn","Group","header","description","children","separator","getRootRef","mode","modeProps","padding","className","tabIndex","tabIndexProp","restProps","isInsideModal","useContext","platform","sizeX","REGULAR","isTabPanel","role","process","env","NODE_ENV","undefined","section","ref","IOS","plain","card","s","m","Fragment","size"],"mappings":"AAAA,YAAYA,WAAW,QAAQ;AAC/B,SAASC,UAAU,EAAEC,YAAY,QAAQ,kBAAkB;AAC3D,SAASC,aAAa,QAAQ,4BAA4B;AAC1D,SAASC,WAAW,QAAQ,0BAA0B;AACtD,SAASC,QAAQ,QAAQ,uBAAuB;AAChD,SAASC,QAAQ,QAAQ,qBAAqB;AAC9C,SAASC,QAAQ,QAAQ,qBAAqB;AAE9C,SAASC,gBAAgB,QAAQ,gCAAgC;AACjE,SAASC,SAAS,QAAQ,yBAAyB;AACnD,SAASC,OAAO,QAAQ,qBAAqB;AAC7C,SAASC,QAAQ,QAAQ,kCAAkC;AAC3D,OAAOC,YAAY,qBAAqB;AAExC,MAAMC,kBAAkB;IACtBC,MAAMb,WAAWW,MAAM,CAAC,oBAAoB,EAAE;IAC9C,CAACP,SAASU,OAAO,CAAC,EAAEH,MAAM,CAAC,uBAAuB;AACpD;AA2BA,MAAMI,OAAOT,SAAS;AACtB;;CAEC,GACD,OAAO,MAAMU,QAAQ,CAAC,EACpBC,MAAM,EACNC,WAAW,EACXC,QAAQ,EACRC,YAAY,MAAM,EAClBC,UAAU,EACVC,MAAMC,SAAS,EACfC,UAAU,GAAG,EACbC,SAAS,EACTC,UAAUC,YAAY,EACtB,GAAGC,WACQ;IACX,MAAM,EAAEC,aAAa,EAAE,GAAG9B,MAAM+B,UAAU,CAACvB;IAC3C,MAAMwB,WAAW5B;IACjB,MAAM,EAAE6B,QAAQ,MAAM,EAAE,GAAG9B;IAE3B,IAAIoB,OAAoCC;IAExC,IAAI,CAACA,WAAW;QACd,2DAA2D;QAC3DD,OAAOO,gBAAgB,UAAU;IACnC;IAEA,IAAIP,SAAS,UAAUU,UAAU,QAAQ;QACvCV,OAAOU,UAAU5B,SAAS6B,OAAO,GAAG,SAAS;IAC/C;IAEA,MAAMC,aAAaN,UAAUO,IAAI,KAAK;IAEtC,IACEC,QAAQC,GAAG,CAACC,QAAQ,KAAK,iBACzBJ,cACC,CAAA,CAACN,SAAS,CAAC,gBAAgB,IAAI,CAACA,SAAS,CAAC,KAAK,AAAD,GAC/C;QACAb,KACE;IAEJ;IAEA,MAAMW,WAAWQ,cAAcP,iBAAiBY,YAAY,IAAIZ;IAEhE,qBACE,wDACE,oBAACa;QACE,GAAGZ,SAAS;QACbF,UAAUA;QACVe,KAAKpB;QACLI,WAAWzB,WACT,qBACAW,MAAM,CAAC,QAAQ,EACfkB,iBAAiBlB,MAAM,CAAC,sBAAsB,EAC9CoB,aAAa1B,SAASqC,GAAG,IAAI/B,MAAM,CAAC,aAAa,EACjDqB,UAAU5B,SAAS6B,OAAO,IAAIrB,eAAe,CAACoB,MAAM,EACpDV,QACE,CAAA;YACET,MAAMb,WAAWW,MAAM,CAAC,mBAAmB,EAAE;YAC7CgC,OAAO3C,WAAWW,MAAM,CAAC,oBAAoB,EAAE;YAC/CiC,MAAM5C,WAAWW,MAAM,CAAC,mBAAmB,EAAE;QAC/C,CAAA,CAAC,CAACW,KAAK,EACT;YACEuB,GAAGlC,MAAM,CAAC,mBAAmB;YAC7BmC,GAAGnC,MAAM,CAAC,mBAAmB;QAC/B,CAAC,CAACa,QAAQ,EACVC;OAGDR,QACAE,UACAlB,aAAaiB,8BACZ,oBAACR;QAASe,WAAWd,MAAM,CAAC,qBAAqB;OAAGO,eAIvDE,cAAc,wBACb,oBAACrB,MAAMgD,QAAQ,sBACb,oBAACtC;QACCgB,WAAWzB,WAAWW,MAAM,CAAC,mBAAmB,EAAEA,MAAM,CAAC,4BAA4B;QACrFqC,MAAM;sBAER,oBAACxC;QACCiB,WAAWzB,WACTW,MAAM,CAAC,mBAAmB,EAC1BA,MAAM,CAAC,8BAA8B,EACrCS,cAAc,UAAUT,MAAM,CAAC,0BAA0B;;AAOvE,EAAE"}
@@ -100,7 +100,7 @@ function doScroll({ scrollElement, getScrollPosition, animationQueue, onScrollTo
100
100
  scrollTo,
101
101
  scrollerRef
102
102
  ]);
103
- const onscroll = React.useCallback(()=>{
103
+ const calculateArrowsVisibility = React.useCallback(()=>{
104
104
  if (showArrows && hasPointer && scrollerRef.current && !isCustomScrollingRef.current) {
105
105
  const scrollElement = scrollerRef.current;
106
106
  setCanScrollLeft(scrollElement.scrollLeft > 0);
@@ -111,19 +111,20 @@ function doScroll({ scrollElement, getScrollPosition, animationQueue, onScrollTo
111
111
  scrollerRef,
112
112
  showArrows
113
113
  ]);
114
- const scrollEvent = useEventListener('scroll', onscroll);
115
- React.useEffect(()=>{
116
- if (scrollerRef.current) {
117
- scrollEvent.add(scrollerRef.current);
114
+ const scrollEvent = useEventListener('scroll', calculateArrowsVisibility);
115
+ React.useEffect(function addScrollerRefToScrollEvent() {
116
+ if (!scrollerRef.current) {
117
+ return noop;
118
118
  }
119
+ scrollEvent.add(scrollerRef.current);
120
+ return scrollEvent.remove;
119
121
  }, [
120
122
  scrollEvent,
121
123
  scrollerRef
122
124
  ]);
123
- React.useEffect(onscroll, [
124
- scrollerRef,
125
- children,
126
- onscroll
125
+ React.useEffect(calculateArrowsVisibility, [
126
+ calculateArrowsVisibility,
127
+ children
127
128
  ]);
128
129
  /**
129
130
  * Прокрутка с помощью любого колеса мыши
@@ -137,7 +138,7 @@ function doScroll({ scrollElement, getScrollPosition, animationQueue, onScrollTo
137
138
  scrollerRef
138
139
  ]);
139
140
  const wheelEvent = useEventListener('wheel', onwheel);
140
- React.useEffect(()=>{
141
+ React.useEffect(function addScrollerRefToWheelEvent() {
141
142
  if (!scrollerRef.current || !scrollOnAnyWheel) {
142
143
  return noop;
143
144
  }
@@ -150,7 +151,8 @@ function doScroll({ scrollElement, getScrollPosition, animationQueue, onScrollTo
150
151
  ]);
151
152
  return /*#__PURE__*/ React.createElement("div", {
152
153
  ...restProps,
153
- className: classNames(styles['HorizontalScroll'], 'vkuiInternalHorizontalScroll', showArrows === 'always' && styles['HorizontalScroll--withConstArrows'], className)
154
+ className: classNames(styles['HorizontalScroll'], 'vkuiInternalHorizontalScroll', showArrows === 'always' && styles['HorizontalScroll--withConstArrows'], className),
155
+ onMouseEnter: calculateArrowsVisibility
154
156
  }, showArrows && (hasPointer || hasPointer === undefined) && canScrollLeft && /*#__PURE__*/ React.createElement(ScrollArrow, {
155
157
  size: arrowSize,
156
158
  offsetY: arrowOffsetY,