@megafon/ui-core 3.7.0 → 3.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -3,6 +3,45 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ # [3.10.0](https://github.com/MegafonWebLab/megafon-ui/compare/@megafon/ui-core@3.9.0...@megafon/ui-core@3.10.0) (2022-05-30)
7
+
8
+
9
+ ### Features
10
+
11
+ * **banner:** add new prop 'pauseOnHover' ([ac654c3](https://github.com/MegafonWebLab/megafon-ui/commit/ac654c3c23821a5d29ffd5cd91ff7337b3d087c1))
12
+
13
+
14
+
15
+
16
+
17
+ # [3.9.0](https://github.com/MegafonWebLab/megafon-ui/compare/@megafon/ui-core@3.8.0...@megafon/ui-core@3.9.0) (2022-05-27)
18
+
19
+
20
+ ### Bug Fixes
21
+
22
+ * **select:** fix selected item color when value is zero ([9847095](https://github.com/MegafonWebLab/megafon-ui/commit/98470955ef813504d4bfa4cd4d3aba77b5458446))
23
+
24
+
25
+ ### Features
26
+
27
+ * **switcher:** add data-attribute for inner element ([793a022](https://github.com/MegafonWebLab/megafon-ui/commit/793a0224ab957b938e67dd1b4d16c2389a9fb6f8))
28
+ * **tooltip:** add portal selector props ([6188832](https://github.com/MegafonWebLab/megafon-ui/commit/6188832e9ba212e7a8182333aba06d77c3e979d6))
29
+
30
+
31
+
32
+
33
+
34
+ # [3.8.0](https://github.com/MegafonWebLab/megafon-ui/compare/@megafon/ui-core@3.7.0...@megafon/ui-core@3.8.0) (2022-05-17)
35
+
36
+
37
+ ### Features
38
+
39
+ * **notification:** add props classes to notification component ([608a424](https://github.com/MegafonWebLab/megafon-ui/commit/608a4246eb99af354fb7cf8ab98c2ed513d87b66))
40
+
41
+
42
+
43
+
44
+
6
45
  # [3.7.0](https://github.com/MegafonWebLab/megafon-ui/compare/@megafon/ui-core@3.6.0...@megafon/ui-core@3.7.0) (2022-05-05)
7
46
 
8
47
 
@@ -32,6 +32,8 @@ export interface IBannerProps {
32
32
  autoPlay?: boolean;
33
33
  /** Задержка автоматической прокрутки */
34
34
  autoPlayDelay?: number;
35
+ /** Пауза автоматической прокрутки при наведении курсора на компонент */
36
+ pauseOnHover?: boolean;
35
37
  /** Цветовая тема навигации */
36
38
  navTheme?: NavThemeType;
37
39
  /** Обработчик клика по стрелке "вперед" (должен быть обернут в useCallback) */
@@ -49,7 +49,9 @@ var Banner = function Banner(_ref) {
49
49
  onPrevClick = _ref.onPrevClick,
50
50
  onDotClick = _ref.onDotClick,
51
51
  onChange = _ref.onChange,
52
- dataAttrs = _ref.dataAttrs;
52
+ dataAttrs = _ref.dataAttrs,
53
+ _ref$pauseOnHover = _ref.pauseOnHover,
54
+ pauseOnHover = _ref$pauseOnHover === void 0 ? false : _ref$pauseOnHover;
53
55
 
54
56
  var _React$useState = React.useState(),
55
57
  _React$useState2 = _slicedToArray(_React$useState, 2),
@@ -69,29 +71,42 @@ var Banner = function Banner(_ref) {
69
71
  var _React$useState7 = React.useState(autoPlay),
70
72
  _React$useState8 = _slicedToArray(_React$useState7, 2),
71
73
  isAutoPlaying = _React$useState8[0],
72
- setAutoPlayning = _React$useState8[1];
74
+ setAutoPlaying = _React$useState8[1];
73
75
 
74
76
  var _React$useState9 = React.useState(0),
75
77
  _React$useState10 = _slicedToArray(_React$useState9, 2),
76
78
  activeIndex = _React$useState10[0],
77
79
  setActiveIndex = _React$useState10[1];
78
80
 
81
+ var _React$useState11 = React.useState(autoPlayDelay),
82
+ _React$useState12 = _slicedToArray(_React$useState11, 2),
83
+ delay = _React$useState12[0],
84
+ setDelay = _React$useState12[1];
85
+
86
+ var _React$useState13 = React.useState(false),
87
+ _React$useState14 = _slicedToArray(_React$useState13, 2),
88
+ isIncreasedDelay = _React$useState14[0],
89
+ setIsIncreasedDelay = _React$useState14[1];
90
+
79
91
  var showDotTimer = loop ? isAutoPlaying : isAutoPlaying && !isEnd;
80
- var dotTimerDelay = autoPlayDelay / 1000;
92
+ var dotTimerDelay = delay / 1000;
81
93
  var navArrowTheme = navTheme === NavTheme.DARK ? ArrowTheme.DARK : ArrowTheme.PURPLE;
94
+ var rootRef = React.useRef(null);
82
95
  var increaseAutoplayDelay = React.useCallback(function (_ref2) {
83
96
  var params = _ref2.params,
84
97
  autoplay = _ref2.autoplay;
85
98
 
86
- if (_typeof(params.autoplay) !== 'object' || !autoplay.running) {
99
+ if (_typeof(params.autoplay) !== 'object' || !autoPlay) {
87
100
  return;
88
101
  }
89
102
 
90
103
  autoplay.stop(); // eslint-disable-next-line no-param-reassign
91
104
 
92
105
  params.autoplay.delay = autoPlayDelay * 3;
106
+ setDelay(autoPlayDelay * 3);
107
+ setIsIncreasedDelay(true);
93
108
  autoplay.start();
94
- }, [autoPlayDelay]);
109
+ }, [autoPlay, autoPlayDelay]);
95
110
  var handlePrevClick = React.useCallback(function () {
96
111
  if (!swiperInstance) {
97
112
  return;
@@ -99,8 +114,8 @@ var Banner = function Banner(_ref) {
99
114
 
100
115
  swiperInstance.slidePrev();
101
116
  onPrevClick === null || onPrevClick === void 0 ? void 0 : onPrevClick(swiperInstance.realIndex);
102
- increaseAutoplayDelay(swiperInstance);
103
- }, [swiperInstance, onPrevClick, increaseAutoplayDelay]);
117
+ !isIncreasedDelay && increaseAutoplayDelay(swiperInstance);
118
+ }, [swiperInstance, onPrevClick, isIncreasedDelay, increaseAutoplayDelay]);
104
119
  var handleNextClick = React.useCallback(function () {
105
120
  if (!swiperInstance) {
106
121
  return;
@@ -108,8 +123,8 @@ var Banner = function Banner(_ref) {
108
123
 
109
124
  swiperInstance.slideNext();
110
125
  onNextClick === null || onNextClick === void 0 ? void 0 : onNextClick(swiperInstance.realIndex);
111
- increaseAutoplayDelay(swiperInstance);
112
- }, [swiperInstance, onNextClick, increaseAutoplayDelay]);
126
+ !isIncreasedDelay && increaseAutoplayDelay(swiperInstance);
127
+ }, [swiperInstance, onNextClick, isIncreasedDelay, increaseAutoplayDelay]);
113
128
  var handleDotClick = React.useCallback(function (index) {
114
129
  if (!swiperInstance) {
115
130
  return;
@@ -122,11 +137,8 @@ var Banner = function Banner(_ref) {
122
137
  }
123
138
 
124
139
  onDotClick === null || onDotClick === void 0 ? void 0 : onDotClick(swiperInstance.realIndex);
125
- increaseAutoplayDelay(swiperInstance);
126
- }, [swiperInstance, loop, onDotClick, increaseAutoplayDelay]);
127
- var handleSwiper = React.useCallback(function (swiper) {
128
- setSwiperInstance(swiper);
129
- }, []);
140
+ !isIncreasedDelay && increaseAutoplayDelay(swiperInstance);
141
+ }, [swiperInstance, loop, onDotClick, isIncreasedDelay, increaseAutoplayDelay]);
130
142
  var handleReachBeginning = React.useCallback(function () {
131
143
  setBeginning(true);
132
144
  }, []);
@@ -149,23 +161,42 @@ var Banner = function Banner(_ref) {
149
161
  onChange === null || onChange === void 0 ? void 0 : onChange(realIndex);
150
162
  }, [onChange]);
151
163
  var handleAutoplayStop = React.useCallback(function () {
152
- setAutoPlayning(false);
164
+ setAutoPlaying(false);
153
165
  }, []);
166
+ var handleAutoPlayStart = React.useCallback(function () {
167
+ setAutoPlaying(true);
168
+ }, []);
169
+ React.useEffect(function () {
170
+ var rootElement = rootRef.current;
171
+
172
+ if (!pauseOnHover || !autoPlay) {
173
+ return;
174
+ }
175
+
176
+ rootElement === null || rootElement === void 0 ? void 0 : rootElement.addEventListener('mouseenter', function () {
177
+ swiperInstance === null || swiperInstance === void 0 ? void 0 : swiperInstance.autoplay.stop();
178
+ });
179
+ rootElement === null || rootElement === void 0 ? void 0 : rootElement.addEventListener('mouseleave', function () {
180
+ swiperInstance === null || swiperInstance === void 0 ? void 0 : swiperInstance.autoplay.start();
181
+ });
182
+ }, [autoPlay, pauseOnHover, swiperInstance === null || swiperInstance === void 0 ? void 0 : swiperInstance.autoplay]);
154
183
  return /*#__PURE__*/React.createElement("div", _extends({}, filterDataAttrs(dataAttrs === null || dataAttrs === void 0 ? void 0 : dataAttrs.root), {
155
184
  className: cn({
156
185
  'nav-theme': navTheme
157
- }, className)
186
+ }, className),
187
+ ref: rootRef
158
188
  }), /*#__PURE__*/React.createElement(Swiper, _extends({}, filterDataAttrs(dataAttrs === null || dataAttrs === void 0 ? void 0 : dataAttrs.swiper), {
159
189
  className: cn('swiper'),
160
190
  loop: loop,
161
191
  autoplay: autoPlay ? getAutoPlayConfig(autoPlayDelay) : false,
162
192
  watchSlidesVisibility: true,
163
- onSwiper: handleSwiper,
193
+ onSwiper: setSwiperInstance,
164
194
  onReachBeginning: handleReachBeginning,
165
195
  onReachEnd: handleReachEnd,
166
196
  onFromEdge: handleFromEdge,
167
197
  onSlideChange: handleSlideChange,
168
198
  onAutoplayStop: handleAutoplayStop,
199
+ onAutoplayStart: handleAutoPlayStart,
169
200
  onTouchEnd: increaseAutoplayDelay
170
201
  }), React.Children.map(children, function (child, i) {
171
202
  return /*#__PURE__*/React.createElement(SwiperSlide, _extends({}, filterDataAttrs(dataAttrs === null || dataAttrs === void 0 ? void 0 : dataAttrs.slide, i + 1), {
@@ -232,6 +263,7 @@ Banner.propTypes = {
232
263
  }),
233
264
  autoPlay: PropTypes.bool,
234
265
  autoPlayDelay: PropTypes.number,
266
+ pauseOnHover: PropTypes.bool,
235
267
  navTheme: PropTypes.oneOf(Object.values(NavTheme)),
236
268
  onNextClick: PropTypes.func,
237
269
  onPrevClick: PropTypes.func,
@@ -10,9 +10,9 @@ var ArrowLeft = function ArrowLeft(props) {
10
10
  return /*#__PURE__*/React.createElement("svg", _extends({
11
11
  viewBox: "0 0 20 20"
12
12
  }, props), /*#__PURE__*/React.createElement("path", {
13
+ d: "M12 6v8l-5-4z",
13
14
  fillRule: "evenodd",
14
- clipRule: "evenodd",
15
- d: "M12 6v8l-5-4z"
15
+ clipRule: "evenodd"
16
16
  }));
17
17
  };
18
18
 
@@ -20,9 +20,9 @@ var ArrowRight = function ArrowRight(props) {
20
20
  return /*#__PURE__*/React.createElement("svg", _extends({
21
21
  viewBox: "0 0 20 20"
22
22
  }, props), /*#__PURE__*/React.createElement("path", {
23
+ d: "M8 14V6l5 4z",
23
24
  fillRule: "evenodd",
24
- clipRule: "evenodd",
25
- d: "M8 14V6l5 4z"
25
+ clipRule: "evenodd"
26
26
  }));
27
27
  };
28
28
 
@@ -17,6 +17,12 @@ declare type ShadowType = typeof ShadowTypes[keyof typeof ShadowTypes];
17
17
  export interface INotificationProps {
18
18
  /** Дополнительный класс корневого элемента */
19
19
  className?: string;
20
+ /** Дополнительные классы для корневого и внутренних элементов */
21
+ classes?: {
22
+ root?: string;
23
+ container?: string;
24
+ content?: string;
25
+ };
20
26
  /** Тип отображения */
21
27
  type?: NotificationType;
22
28
  /** Уровень тени */
@@ -77,6 +77,11 @@ var cn = cnCreate('mfui-notification');
77
77
 
78
78
  var Notification = function Notification(_ref) {
79
79
  var className = _ref.className,
80
+ _ref$classes = _ref.classes;
81
+ _ref$classes = _ref$classes === void 0 ? {} : _ref$classes;
82
+ var rootClass = _ref$classes.root,
83
+ containerClass = _ref$classes.container,
84
+ contentClass = _ref$classes.content,
80
85
  children = _ref.children,
81
86
  _ref$type = _ref.type,
82
87
  type = _ref$type === void 0 ? 'info' : _ref$type,
@@ -143,13 +148,13 @@ var Notification = function Notification(_ref) {
143
148
  className: cn({
144
149
  type: type,
145
150
  colored: isColored
146
- }, className)
151
+ }, [className, rootClass])
147
152
  }, /*#__PURE__*/React.createElement("div", {
148
- className: cn('container')
153
+ className: cn('container', [containerClass])
149
154
  }, /*#__PURE__*/React.createElement("div", {
150
155
  className: cn('icon-container')
151
156
  }, renderIcon()), /*#__PURE__*/React.createElement("div", {
152
- className: cn('content')
157
+ className: cn('content', [contentClass])
153
158
  }, title && /*#__PURE__*/React.createElement(Header, {
154
159
  dataAttrs: {
155
160
  root: dataAttrs === null || dataAttrs === void 0 ? void 0 : dataAttrs.title
@@ -174,6 +179,11 @@ var Notification = function Notification(_ref) {
174
179
  Notification.propTypes = {
175
180
  type: PropTypes.oneOf(Object.values(NotificationTypes)),
176
181
  className: PropTypes.string,
182
+ classes: PropTypes.shape({
183
+ root: PropTypes.string,
184
+ container: PropTypes.string,
185
+ content: PropTypes.string
186
+ }),
177
187
  shadowLevel: PropTypes.oneOf(Object.values(ShadowTypes)),
178
188
  isColored: PropTypes.bool,
179
189
  hasCloseButton: PropTypes.bool,
@@ -337,7 +337,7 @@ var Select = function Select(_ref) {
337
337
 
338
338
  return /*#__PURE__*/React.createElement("div", _extends({}, filterDataAttrs(dataAttrs === null || dataAttrs === void 0 ? void 0 : dataAttrs.title), {
339
339
  className: cn('title', {
340
- placeholder: !!placeholder && !currentValue
340
+ placeholder: !!placeholder && currentValue === undefined
341
341
  }, [classes === null || classes === void 0 ? void 0 : classes.title]),
342
342
  role: "button",
343
343
  tabIndex: 0,
@@ -5,6 +5,7 @@ export interface ISwitcherProps {
5
5
  /** Дополнительные data атрибуты к внутренним элементам */
6
6
  dataAttrs?: {
7
7
  root?: Record<string, string>;
8
+ input?: Record<string, string>;
8
9
  };
9
10
  /** Дополнительный класс корневого элемента */
10
11
  className?: string;
@@ -40,7 +40,7 @@ var Switcher = function Switcher(_ref) {
40
40
  size: textSize,
41
41
  left: true
42
42
  })
43
- }, children), /*#__PURE__*/React.createElement("div", {
43
+ }, children), /*#__PURE__*/React.createElement("div", _extends({}, filterDataAttrs(dataAttrs === null || dataAttrs === void 0 ? void 0 : dataAttrs.input), {
44
44
  className: cn('input', {
45
45
  checked: checked,
46
46
  disabled: disabled,
@@ -50,7 +50,7 @@ var Switcher = function Switcher(_ref) {
50
50
  onClick: handleChange,
51
51
  onKeyDown: handleChange,
52
52
  tabIndex: isInteractiveDisabled ? undefined : 0
53
- }, showLoader && !disabled && /*#__PURE__*/React.createElement("div", {
53
+ }), showLoader && !disabled && /*#__PURE__*/React.createElement("div", {
54
54
  className: cn('loader')
55
55
  }), /*#__PURE__*/React.createElement("div", {
56
56
  className: cn('pointer')
@@ -63,7 +63,8 @@ var Switcher = function Switcher(_ref) {
63
63
 
64
64
  Switcher.propTypes = {
65
65
  dataAttrs: PropTypes.shape({
66
- root: PropTypes.objectOf(PropTypes.string.isRequired)
66
+ root: PropTypes.objectOf(PropTypes.string.isRequired),
67
+ input: PropTypes.objectOf(PropTypes.string.isRequired)
67
68
  }),
68
69
  className: PropTypes.string,
69
70
  textSize: PropTypes.oneOf(['small', 'medium']),
@@ -39,6 +39,8 @@ export interface ITooltipProps {
39
39
  isOpened?: boolean;
40
40
  /** Отрендерить компонент в корневой элементе страницы body */
41
41
  isPortal?: boolean;
42
+ /** Рендеринг компонента в указанном селекторе */
43
+ portalSelector?: string;
42
44
  /** Дополнительный класс корневого элемента */
43
45
  className?: string;
44
46
  /** Дополнительные классы для внутренних элементов */
@@ -48,6 +48,7 @@ var Tooltip = function Tooltip(_ref) {
48
48
  isOpened = _ref$isOpened === void 0 ? false : _ref$isOpened,
49
49
  _ref$isPortal = _ref.isPortal,
50
50
  isPortal = _ref$isPortal === void 0 ? false : _ref$isPortal,
51
+ portalSelector = _ref.portalSelector,
51
52
  children = _ref.children,
52
53
  _ref$classes = _ref.classes;
53
54
  _ref$classes = _ref$classes === void 0 ? {} : _ref$classes;
@@ -222,12 +223,14 @@ var Tooltip = function Tooltip(_ref) {
222
223
  useEffect(function () {
223
224
  return function () {
224
225
  if (portalElem.current) {
225
- document.body.removeChild(portalElem.current);
226
+ var parent = portalSelector ? document.querySelector(portalSelector) : document.body;
227
+ parent === null || parent === void 0 ? void 0 : parent.removeChild(portalElem.current);
226
228
  }
227
229
 
228
230
  portalElem.current = null;
229
231
  };
230
- }, []);
232
+ }, // eslint-disable-next-line react-hooks/exhaustive-deps
233
+ []);
231
234
  var template = /*#__PURE__*/React.createElement("div", _extends({}, filterDataAttrs(dataAttrs === null || dataAttrs === void 0 ? void 0 : dataAttrs.root), {
232
235
  className: cn({
233
236
  paddings: paddings,
@@ -255,7 +258,8 @@ var Tooltip = function Tooltip(_ref) {
255
258
 
256
259
  if (isPortal && !portalElem.current && typeof window !== 'undefined') {
257
260
  portalElem.current = document.createElement('div');
258
- document.body.appendChild(portalElem.current);
261
+ var parent = portalSelector ? document.querySelector(portalSelector) : document.body;
262
+ parent === null || parent === void 0 ? void 0 : parent.appendChild(portalElem.current);
259
263
  }
260
264
 
261
265
  if (isPortal && portalElem.current) {
@@ -294,6 +298,7 @@ Tooltip.propTypes = {
294
298
  }), PropTypes.any])]),
295
299
  isOpened: PropTypes.bool,
296
300
  isPortal: PropTypes.bool,
301
+ portalSelector: PropTypes.string,
297
302
  className: PropTypes.string,
298
303
  classes: PropTypes.shape({
299
304
  root: PropTypes.string,
@@ -32,6 +32,8 @@ export interface IBannerProps {
32
32
  autoPlay?: boolean;
33
33
  /** Задержка автоматической прокрутки */
34
34
  autoPlayDelay?: number;
35
+ /** Пауза автоматической прокрутки при наведении курсора на компонент */
36
+ pauseOnHover?: boolean;
35
37
  /** Цветовая тема навигации */
36
38
  navTheme?: NavThemeType;
37
39
  /** Обработчик клика по стрелке "вперед" (должен быть обернут в useCallback) */
@@ -77,7 +77,9 @@ var Banner = function Banner(_ref) {
77
77
  onPrevClick = _ref.onPrevClick,
78
78
  onDotClick = _ref.onDotClick,
79
79
  onChange = _ref.onChange,
80
- dataAttrs = _ref.dataAttrs;
80
+ dataAttrs = _ref.dataAttrs,
81
+ _ref$pauseOnHover = _ref.pauseOnHover,
82
+ pauseOnHover = _ref$pauseOnHover === void 0 ? false : _ref$pauseOnHover;
81
83
 
82
84
  var _React$useState = React.useState(),
83
85
  _React$useState2 = (0, _slicedToArray2["default"])(_React$useState, 2),
@@ -97,29 +99,42 @@ var Banner = function Banner(_ref) {
97
99
  var _React$useState7 = React.useState(autoPlay),
98
100
  _React$useState8 = (0, _slicedToArray2["default"])(_React$useState7, 2),
99
101
  isAutoPlaying = _React$useState8[0],
100
- setAutoPlayning = _React$useState8[1];
102
+ setAutoPlaying = _React$useState8[1];
101
103
 
102
104
  var _React$useState9 = React.useState(0),
103
105
  _React$useState10 = (0, _slicedToArray2["default"])(_React$useState9, 2),
104
106
  activeIndex = _React$useState10[0],
105
107
  setActiveIndex = _React$useState10[1];
106
108
 
109
+ var _React$useState11 = React.useState(autoPlayDelay),
110
+ _React$useState12 = (0, _slicedToArray2["default"])(_React$useState11, 2),
111
+ delay = _React$useState12[0],
112
+ setDelay = _React$useState12[1];
113
+
114
+ var _React$useState13 = React.useState(false),
115
+ _React$useState14 = (0, _slicedToArray2["default"])(_React$useState13, 2),
116
+ isIncreasedDelay = _React$useState14[0],
117
+ setIsIncreasedDelay = _React$useState14[1];
118
+
107
119
  var showDotTimer = loop ? isAutoPlaying : isAutoPlaying && !isEnd;
108
- var dotTimerDelay = autoPlayDelay / 1000;
120
+ var dotTimerDelay = delay / 1000;
109
121
  var navArrowTheme = navTheme === NavTheme.DARK ? _NavArrow.Theme.DARK : _NavArrow.Theme.PURPLE;
122
+ var rootRef = React.useRef(null);
110
123
  var increaseAutoplayDelay = React.useCallback(function (_ref2) {
111
124
  var params = _ref2.params,
112
125
  autoplay = _ref2.autoplay;
113
126
 
114
- if ((0, _typeof2["default"])(params.autoplay) !== 'object' || !autoplay.running) {
127
+ if ((0, _typeof2["default"])(params.autoplay) !== 'object' || !autoPlay) {
115
128
  return;
116
129
  }
117
130
 
118
131
  autoplay.stop(); // eslint-disable-next-line no-param-reassign
119
132
 
120
133
  params.autoplay.delay = autoPlayDelay * 3;
134
+ setDelay(autoPlayDelay * 3);
135
+ setIsIncreasedDelay(true);
121
136
  autoplay.start();
122
- }, [autoPlayDelay]);
137
+ }, [autoPlay, autoPlayDelay]);
123
138
  var handlePrevClick = React.useCallback(function () {
124
139
  if (!swiperInstance) {
125
140
  return;
@@ -127,8 +142,8 @@ var Banner = function Banner(_ref) {
127
142
 
128
143
  swiperInstance.slidePrev();
129
144
  onPrevClick === null || onPrevClick === void 0 ? void 0 : onPrevClick(swiperInstance.realIndex);
130
- increaseAutoplayDelay(swiperInstance);
131
- }, [swiperInstance, onPrevClick, increaseAutoplayDelay]);
145
+ !isIncreasedDelay && increaseAutoplayDelay(swiperInstance);
146
+ }, [swiperInstance, onPrevClick, isIncreasedDelay, increaseAutoplayDelay]);
132
147
  var handleNextClick = React.useCallback(function () {
133
148
  if (!swiperInstance) {
134
149
  return;
@@ -136,8 +151,8 @@ var Banner = function Banner(_ref) {
136
151
 
137
152
  swiperInstance.slideNext();
138
153
  onNextClick === null || onNextClick === void 0 ? void 0 : onNextClick(swiperInstance.realIndex);
139
- increaseAutoplayDelay(swiperInstance);
140
- }, [swiperInstance, onNextClick, increaseAutoplayDelay]);
154
+ !isIncreasedDelay && increaseAutoplayDelay(swiperInstance);
155
+ }, [swiperInstance, onNextClick, isIncreasedDelay, increaseAutoplayDelay]);
141
156
  var handleDotClick = React.useCallback(function (index) {
142
157
  if (!swiperInstance) {
143
158
  return;
@@ -150,11 +165,8 @@ var Banner = function Banner(_ref) {
150
165
  }
151
166
 
152
167
  onDotClick === null || onDotClick === void 0 ? void 0 : onDotClick(swiperInstance.realIndex);
153
- increaseAutoplayDelay(swiperInstance);
154
- }, [swiperInstance, loop, onDotClick, increaseAutoplayDelay]);
155
- var handleSwiper = React.useCallback(function (swiper) {
156
- setSwiperInstance(swiper);
157
- }, []);
168
+ !isIncreasedDelay && increaseAutoplayDelay(swiperInstance);
169
+ }, [swiperInstance, loop, onDotClick, isIncreasedDelay, increaseAutoplayDelay]);
158
170
  var handleReachBeginning = React.useCallback(function () {
159
171
  setBeginning(true);
160
172
  }, []);
@@ -177,23 +189,42 @@ var Banner = function Banner(_ref) {
177
189
  onChange === null || onChange === void 0 ? void 0 : onChange(realIndex);
178
190
  }, [onChange]);
179
191
  var handleAutoplayStop = React.useCallback(function () {
180
- setAutoPlayning(false);
192
+ setAutoPlaying(false);
181
193
  }, []);
194
+ var handleAutoPlayStart = React.useCallback(function () {
195
+ setAutoPlaying(true);
196
+ }, []);
197
+ React.useEffect(function () {
198
+ var rootElement = rootRef.current;
199
+
200
+ if (!pauseOnHover || !autoPlay) {
201
+ return;
202
+ }
203
+
204
+ rootElement === null || rootElement === void 0 ? void 0 : rootElement.addEventListener('mouseenter', function () {
205
+ swiperInstance === null || swiperInstance === void 0 ? void 0 : swiperInstance.autoplay.stop();
206
+ });
207
+ rootElement === null || rootElement === void 0 ? void 0 : rootElement.addEventListener('mouseleave', function () {
208
+ swiperInstance === null || swiperInstance === void 0 ? void 0 : swiperInstance.autoplay.start();
209
+ });
210
+ }, [autoPlay, pauseOnHover, swiperInstance === null || swiperInstance === void 0 ? void 0 : swiperInstance.autoplay]);
182
211
  return /*#__PURE__*/React.createElement("div", (0, _extends2["default"])({}, (0, _uiHelpers.filterDataAttrs)(dataAttrs === null || dataAttrs === void 0 ? void 0 : dataAttrs.root), {
183
212
  className: cn({
184
213
  'nav-theme': navTheme
185
- }, className)
214
+ }, className),
215
+ ref: rootRef
186
216
  }), /*#__PURE__*/React.createElement(_react2.Swiper, (0, _extends2["default"])({}, (0, _uiHelpers.filterDataAttrs)(dataAttrs === null || dataAttrs === void 0 ? void 0 : dataAttrs.swiper), {
187
217
  className: cn('swiper'),
188
218
  loop: loop,
189
219
  autoplay: autoPlay ? getAutoPlayConfig(autoPlayDelay) : false,
190
220
  watchSlidesVisibility: true,
191
- onSwiper: handleSwiper,
221
+ onSwiper: setSwiperInstance,
192
222
  onReachBeginning: handleReachBeginning,
193
223
  onReachEnd: handleReachEnd,
194
224
  onFromEdge: handleFromEdge,
195
225
  onSlideChange: handleSlideChange,
196
226
  onAutoplayStop: handleAutoplayStop,
227
+ onAutoplayStart: handleAutoPlayStart,
197
228
  onTouchEnd: increaseAutoplayDelay
198
229
  }), React.Children.map(children, function (child, i) {
199
230
  return /*#__PURE__*/React.createElement(_react2.SwiperSlide, (0, _extends2["default"])({}, (0, _uiHelpers.filterDataAttrs)(dataAttrs === null || dataAttrs === void 0 ? void 0 : dataAttrs.slide, i + 1), {
@@ -260,6 +291,7 @@ Banner.propTypes = {
260
291
  }),
261
292
  autoPlay: PropTypes.bool,
262
293
  autoPlayDelay: PropTypes.number,
294
+ pauseOnHover: PropTypes.bool,
263
295
  navTheme: PropTypes.oneOf(Object.values(NavTheme)),
264
296
  onNextClick: PropTypes.func,
265
297
  onPrevClick: PropTypes.func,
@@ -23,9 +23,9 @@ var ArrowLeft = function ArrowLeft(props) {
23
23
  return /*#__PURE__*/_react["default"].createElement("svg", (0, _extends2["default"])({
24
24
  viewBox: "0 0 20 20"
25
25
  }, props), /*#__PURE__*/_react["default"].createElement("path", {
26
+ d: "M12 6v8l-5-4z",
26
27
  fillRule: "evenodd",
27
- clipRule: "evenodd",
28
- d: "M12 6v8l-5-4z"
28
+ clipRule: "evenodd"
29
29
  }));
30
30
  };
31
31
 
@@ -33,9 +33,9 @@ var ArrowRight = function ArrowRight(props) {
33
33
  return /*#__PURE__*/_react["default"].createElement("svg", (0, _extends2["default"])({
34
34
  viewBox: "0 0 20 20"
35
35
  }, props), /*#__PURE__*/_react["default"].createElement("path", {
36
+ d: "M8 14V6l5 4z",
36
37
  fillRule: "evenodd",
37
- clipRule: "evenodd",
38
- d: "M8 14V6l5 4z"
38
+ clipRule: "evenodd"
39
39
  }));
40
40
  };
41
41
 
@@ -17,6 +17,12 @@ declare type ShadowType = typeof ShadowTypes[keyof typeof ShadowTypes];
17
17
  export interface INotificationProps {
18
18
  /** Дополнительный класс корневого элемента */
19
19
  className?: string;
20
+ /** Дополнительные классы для корневого и внутренних элементов */
21
+ classes?: {
22
+ root?: string;
23
+ container?: string;
24
+ content?: string;
25
+ };
20
26
  /** Тип отображения */
21
27
  type?: NotificationType;
22
28
  /** Уровень тени */
@@ -101,6 +101,11 @@ var cn = (0, _uiHelpers.cnCreate)('mfui-notification');
101
101
 
102
102
  var Notification = function Notification(_ref) {
103
103
  var className = _ref.className,
104
+ _ref$classes = _ref.classes;
105
+ _ref$classes = _ref$classes === void 0 ? {} : _ref$classes;
106
+ var rootClass = _ref$classes.root,
107
+ containerClass = _ref$classes.container,
108
+ contentClass = _ref$classes.content,
104
109
  children = _ref.children,
105
110
  _ref$type = _ref.type,
106
111
  type = _ref$type === void 0 ? 'info' : _ref$type,
@@ -167,13 +172,13 @@ var Notification = function Notification(_ref) {
167
172
  className: cn({
168
173
  type: type,
169
174
  colored: isColored
170
- }, className)
175
+ }, [className, rootClass])
171
176
  }, /*#__PURE__*/_react["default"].createElement("div", {
172
- className: cn('container')
177
+ className: cn('container', [containerClass])
173
178
  }, /*#__PURE__*/_react["default"].createElement("div", {
174
179
  className: cn('icon-container')
175
180
  }, renderIcon()), /*#__PURE__*/_react["default"].createElement("div", {
176
- className: cn('content')
181
+ className: cn('content', [contentClass])
177
182
  }, title && /*#__PURE__*/_react["default"].createElement(_Header["default"], {
178
183
  dataAttrs: {
179
184
  root: dataAttrs === null || dataAttrs === void 0 ? void 0 : dataAttrs.title
@@ -198,6 +203,11 @@ var Notification = function Notification(_ref) {
198
203
  Notification.propTypes = {
199
204
  type: PropTypes.oneOf(Object.values(NotificationTypes)),
200
205
  className: PropTypes.string,
206
+ classes: PropTypes.shape({
207
+ root: PropTypes.string,
208
+ container: PropTypes.string,
209
+ content: PropTypes.string
210
+ }),
201
211
  shadowLevel: PropTypes.oneOf(Object.values(ShadowTypes)),
202
212
  isColored: PropTypes.bool,
203
213
  hasCloseButton: PropTypes.bool,
@@ -372,7 +372,7 @@ var Select = function Select(_ref) {
372
372
 
373
373
  return /*#__PURE__*/React.createElement("div", (0, _extends2["default"])({}, (0, _uiHelpers.filterDataAttrs)(dataAttrs === null || dataAttrs === void 0 ? void 0 : dataAttrs.title), {
374
374
  className: cn('title', {
375
- placeholder: !!placeholder && !currentValue
375
+ placeholder: !!placeholder && currentValue === undefined
376
376
  }, [classes === null || classes === void 0 ? void 0 : classes.title]),
377
377
  role: "button",
378
378
  tabIndex: 0,
@@ -5,6 +5,7 @@ export interface ISwitcherProps {
5
5
  /** Дополнительные data атрибуты к внутренним элементам */
6
6
  dataAttrs?: {
7
7
  root?: Record<string, string>;
8
+ input?: Record<string, string>;
8
9
  };
9
10
  /** Дополнительный класс корневого элемента */
10
11
  className?: string;
@@ -58,7 +58,7 @@ var Switcher = function Switcher(_ref) {
58
58
  size: textSize,
59
59
  left: true
60
60
  })
61
- }, children), /*#__PURE__*/React.createElement("div", {
61
+ }, children), /*#__PURE__*/React.createElement("div", (0, _extends2["default"])({}, (0, _uiHelpers.filterDataAttrs)(dataAttrs === null || dataAttrs === void 0 ? void 0 : dataAttrs.input), {
62
62
  className: cn('input', {
63
63
  checked: checked,
64
64
  disabled: disabled,
@@ -68,7 +68,7 @@ var Switcher = function Switcher(_ref) {
68
68
  onClick: handleChange,
69
69
  onKeyDown: handleChange,
70
70
  tabIndex: isInteractiveDisabled ? undefined : 0
71
- }, showLoader && !disabled && /*#__PURE__*/React.createElement("div", {
71
+ }), showLoader && !disabled && /*#__PURE__*/React.createElement("div", {
72
72
  className: cn('loader')
73
73
  }), /*#__PURE__*/React.createElement("div", {
74
74
  className: cn('pointer')
@@ -81,7 +81,8 @@ var Switcher = function Switcher(_ref) {
81
81
 
82
82
  Switcher.propTypes = {
83
83
  dataAttrs: PropTypes.shape({
84
- root: PropTypes.objectOf(PropTypes.string.isRequired)
84
+ root: PropTypes.objectOf(PropTypes.string.isRequired),
85
+ input: PropTypes.objectOf(PropTypes.string.isRequired)
85
86
  }),
86
87
  className: PropTypes.string,
87
88
  textSize: PropTypes.oneOf(['small', 'medium']),
@@ -39,6 +39,8 @@ export interface ITooltipProps {
39
39
  isOpened?: boolean;
40
40
  /** Отрендерить компонент в корневой элементе страницы body */
41
41
  isPortal?: boolean;
42
+ /** Рендеринг компонента в указанном селекторе */
43
+ portalSelector?: string;
42
44
  /** Дополнительный класс корневого элемента */
43
45
  className?: string;
44
46
  /** Дополнительные классы для внутренних элементов */
@@ -76,6 +76,7 @@ var Tooltip = function Tooltip(_ref) {
76
76
  isOpened = _ref$isOpened === void 0 ? false : _ref$isOpened,
77
77
  _ref$isPortal = _ref.isPortal,
78
78
  isPortal = _ref$isPortal === void 0 ? false : _ref$isPortal,
79
+ portalSelector = _ref.portalSelector,
79
80
  children = _ref.children,
80
81
  _ref$classes = _ref.classes;
81
82
  _ref$classes = _ref$classes === void 0 ? {} : _ref$classes;
@@ -251,12 +252,14 @@ var Tooltip = function Tooltip(_ref) {
251
252
  (0, _react.useEffect)(function () {
252
253
  return function () {
253
254
  if (portalElem.current) {
254
- document.body.removeChild(portalElem.current);
255
+ var parent = portalSelector ? document.querySelector(portalSelector) : document.body;
256
+ parent === null || parent === void 0 ? void 0 : parent.removeChild(portalElem.current);
255
257
  }
256
258
 
257
259
  portalElem.current = null;
258
260
  };
259
- }, []);
261
+ }, // eslint-disable-next-line react-hooks/exhaustive-deps
262
+ []);
260
263
 
261
264
  var template = /*#__PURE__*/_react["default"].createElement("div", (0, _extends2["default"])({}, (0, _uiHelpers.filterDataAttrs)(dataAttrs === null || dataAttrs === void 0 ? void 0 : dataAttrs.root), {
262
265
  className: cn({
@@ -286,7 +289,8 @@ var Tooltip = function Tooltip(_ref) {
286
289
 
287
290
  if (isPortal && !portalElem.current && typeof window !== 'undefined') {
288
291
  portalElem.current = document.createElement('div');
289
- document.body.appendChild(portalElem.current);
292
+ var parent = portalSelector ? document.querySelector(portalSelector) : document.body;
293
+ parent === null || parent === void 0 ? void 0 : parent.appendChild(portalElem.current);
290
294
  }
291
295
 
292
296
  if (isPortal && portalElem.current) {
@@ -325,6 +329,7 @@ Tooltip.propTypes = {
325
329
  }), _propTypes["default"].any])]),
326
330
  isOpened: _propTypes["default"].bool,
327
331
  isPortal: _propTypes["default"].bool,
332
+ portalSelector: _propTypes["default"].string,
328
333
  className: _propTypes["default"].string,
329
334
  classes: _propTypes["default"].shape({
330
335
  root: _propTypes["default"].string,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@megafon/ui-core",
3
- "version": "3.7.0",
3
+ "version": "3.10.0",
4
4
  "files": [
5
5
  "dist",
6
6
  "styles"
@@ -54,7 +54,7 @@
54
54
  "@babel/preset-env": "^7.8.6",
55
55
  "@babel/preset-react": "^7.8.3",
56
56
  "@babel/preset-typescript": "^7.8.3",
57
- "@megafon/ui-icons": "^1.2.1",
57
+ "@megafon/ui-icons": "^1.2.2",
58
58
  "@svgr/core": "^2.4.1",
59
59
  "@testing-library/react-hooks": "^7.0.1",
60
60
  "@types/enzyme": "^3.10.5",
@@ -97,5 +97,5 @@
97
97
  "react-popper": "^2.2.3",
98
98
  "swiper": "^6.5.6"
99
99
  },
100
- "gitHead": "be6065a442b0c2f8f1a82ea4fd45dd36679cbfaf"
100
+ "gitHead": "eca7dfc6c6f0f7317f404b989bb8d7bd5ec429ed"
101
101
  }