@megafon/ui-core 6.4.4 → 6.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. package/CHANGELOG.md +20 -4
  2. package/dist/es/components/Banner/Banner.css +3 -0
  3. package/dist/es/components/Banner/Banner.d.ts +2 -0
  4. package/dist/es/components/Banner/Banner.js +5 -1
  5. package/dist/es/components/Calendar/Calendar.css +2 -3
  6. package/dist/es/components/Calendar/Calendar.js +2 -2
  7. package/dist/es/components/Calendar/components/Day/Day.css +10 -7
  8. package/dist/es/components/Calendar/components/Month/Month.css +5 -5
  9. package/dist/es/components/Search/Search.css +76 -4
  10. package/dist/es/components/Search/Search.d.ts +15 -2
  11. package/dist/es/components/Search/Search.js +204 -25
  12. package/dist/es/components/Search/i/textarea-resizer.svg +4 -0
  13. package/dist/es/components/Tooltip/Tooltip.css +56 -0
  14. package/dist/es/components/Tooltip/Tooltip.d.ts +8 -0
  15. package/dist/es/components/Tooltip/Tooltip.js +11 -2
  16. package/dist/lib/components/Banner/Banner.css +3 -0
  17. package/dist/lib/components/Banner/Banner.d.ts +2 -0
  18. package/dist/lib/components/Banner/Banner.js +5 -1
  19. package/dist/lib/components/Calendar/Calendar.css +2 -3
  20. package/dist/lib/components/Calendar/Calendar.js +2 -2
  21. package/dist/lib/components/Calendar/components/Day/Day.css +10 -7
  22. package/dist/lib/components/Calendar/components/Month/Month.css +5 -5
  23. package/dist/lib/components/Search/Search.css +76 -4
  24. package/dist/lib/components/Search/Search.d.ts +15 -2
  25. package/dist/lib/components/Search/Search.js +217 -26
  26. package/dist/lib/components/Search/i/textarea-resizer.svg +4 -0
  27. package/dist/lib/components/Tooltip/Tooltip.css +56 -0
  28. package/dist/lib/components/Tooltip/Tooltip.d.ts +8 -0
  29. package/dist/lib/components/Tooltip/Tooltip.js +13 -3
  30. package/package.json +2 -2
@@ -1,6 +1,7 @@
1
1
  import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
2
2
  import _extends from "@babel/runtime/helpers/extends";
3
3
  import "core-js/modules/es.array.slice.js";
4
+ import "core-js/modules/es.parse-float.js";
4
5
  import "core-js/modules/es.regexp.exec.js";
5
6
  import "core-js/modules/es.string.replace.js";
6
7
  import "core-js/modules/es.string.split.js";
@@ -11,10 +12,12 @@ import "core-js/modules/es.object.values.js";
11
12
  import React from 'react';
12
13
  import { cnCreate, filterDataAttrs } from '@megafon/ui-helpers';
13
14
  import debounce from 'lodash.debounce';
15
+ import throttle from 'lodash.throttle';
14
16
  import * as PropTypes from 'prop-types';
15
17
  import Caption from "../Caption/Caption";
16
18
  import Header from "../Header/Header";
17
19
  import Preloader from "../Preloader/Preloader";
20
+ import throttleTime from "../../constants/throttleTime";
18
21
  import "./Search.css";
19
22
 
20
23
  var SearchIcon16 = function SearchIcon16(props) {
@@ -42,8 +45,26 @@ var ClearIcon = function ClearIcon(props) {
42
45
  }));
43
46
  };
44
47
 
48
+ var ResizeIcon = function ResizeIcon(props) {
49
+ return /*#__PURE__*/React.createElement("svg", _extends({
50
+ width: 12,
51
+ height: 12
52
+ }, props), /*#__PURE__*/React.createElement("path", {
53
+ d: "M1 11L11 1M7 11l4-4"
54
+ }));
55
+ };
56
+
57
+ var DEFAULT_ROW_COUNT = 3;
58
+ var MAX_ROW_COUNT = 6;
59
+ var TEXTAREA_ROW_HEIGHT = 24;
60
+ var TEXTAREA_MAX_HEIGHT = TEXTAREA_ROW_HEIGHT * MAX_ROW_COUNT;
61
+ var DEFAULT_LABEL_TOP_POSITION = 16;
45
62
  var SEARCH_QUERY_REGEX = /[^A-Z-a-zА-ЯЁа-яё0-9]/g;
46
63
  var MAX_POPULAR_ITEMS_LENGTH = 5;
64
+ export var MinTextareaHeight = {
65
+ ONE_ROW: TEXTAREA_ROW_HEIGHT,
66
+ THREE_ROWS: TEXTAREA_ROW_HEIGHT * DEFAULT_ROW_COUNT
67
+ };
47
68
  export var Verification = {
48
69
  VALID: 'valid',
49
70
  ERROR: 'error'
@@ -75,6 +96,7 @@ var Search = function Search(_ref) {
75
96
  classes = _ref.classes,
76
97
  _ref$type = _ref.type,
77
98
  type = _ref$type === void 0 ? 'textfield' : _ref$type,
99
+ textarea = _ref.textarea,
78
100
  showLoader = _ref.showLoader,
79
101
  showNotFound = _ref.showNotFound,
80
102
  textNotFound = _ref.textNotFound,
@@ -82,6 +104,9 @@ var Search = function Search(_ref) {
82
104
  popularItems = _ref$popularItems === void 0 ? [] : _ref$popularItems,
83
105
  popularTitle = _ref.popularTitle,
84
106
  listRef = _ref.listRef,
107
+ _ref$minTextareaHeigh = _ref.minTextareaHeight,
108
+ minTextareaHeight = _ref$minTextareaHeigh === void 0 ? MinTextareaHeight.ONE_ROW : _ref$minTextareaHeigh,
109
+ showResizer = _ref.showResizer,
85
110
  onChange = _ref.onChange,
86
111
  onSubmit = _ref.onSubmit,
87
112
  onBlur = _ref.onBlur,
@@ -108,19 +133,68 @@ var Search = function Search(_ref) {
108
133
  popularActiveIndex = _React$useState8[0],
109
134
  setPopularActiveIndex = _React$useState8[1];
110
135
 
136
+ var _React$useState9 = React.useState(TEXTAREA_ROW_HEIGHT),
137
+ _React$useState10 = _slicedToArray(_React$useState9, 2),
138
+ textareaHeight = _React$useState10[0],
139
+ setTextareaHeight = _React$useState10[1];
140
+
141
+ var _React$useState11 = React.useState(false),
142
+ _React$useState12 = _slicedToArray(_React$useState11, 2),
143
+ isTextareaResizing = _React$useState12[0],
144
+ setIsTextareaResizing = _React$useState12[1];
145
+
146
+ var _React$useState13 = React.useState(false),
147
+ _React$useState14 = _slicedToArray(_React$useState13, 2),
148
+ isTextareaResized = _React$useState14[0],
149
+ setIsTextareaResized = _React$useState14[1];
150
+
111
151
  var debouncedOnChange = React.useRef(debounce(function (inputValue) {
112
152
  return onChange && onChange(inputValue);
113
153
  }, changeDelay));
114
154
  var highlightedItem = React.useRef(null);
115
- var fieldNode = React.useRef(null);
155
+ var containerRef = React.useRef(null);
156
+ var fieldRef = React.useRef(null);
157
+ var labelRef = React.useRef(null);
158
+ var resizerRef = React.useRef(null);
116
159
  var correctPopularItems = React.useMemo(function () {
117
160
  return popularItems.slice(0, MAX_POPULAR_ITEMS_LENGTH);
118
161
  }, [popularItems]);
119
162
  var isCompact = type === 'compact';
163
+ var isTextarea = textarea && !isCompact;
120
164
  var showClearIcon = isCompact && !!searchQuery;
121
165
  var showTextFieldSubmit = !hideIcon && !isCompact && !showLoader;
122
166
  var showAdditionalElement = !hideIcon || showLoader || showClearIcon;
123
167
  var showPopularItems = !!correctPopularItems.length;
168
+
169
+ var getFieldRef = function getFieldRef(node) {
170
+ if (!node) {
171
+ return;
172
+ }
173
+
174
+ fieldRef.current = node;
175
+ };
176
+
177
+ var textareaResize = React.useCallback(function () {
178
+ if (!isTextarea || !fieldRef.current || !containerRef.current || isTextareaResized) {
179
+ return;
180
+ }
181
+
182
+ fieldRef.current.style.height = "".concat(minTextareaHeight, "px");
183
+ var scrollHeight = fieldRef.current.scrollHeight;
184
+
185
+ var _window$getComputedSt = window.getComputedStyle(fieldRef.current),
186
+ paddingTop = _window$getComputedSt.paddingTop,
187
+ paddingBottom = _window$getComputedSt.paddingBottom;
188
+
189
+ var innerHeight = scrollHeight - parseFloat(paddingTop) - parseFloat(paddingBottom);
190
+
191
+ if (innerHeight >= TEXTAREA_MAX_HEIGHT) {
192
+ fieldRef.current.style.height = "".concat(TEXTAREA_MAX_HEIGHT, "px");
193
+ return;
194
+ }
195
+
196
+ fieldRef.current.style.height = "".concat(innerHeight, "px");
197
+ }, [isTextareaResized, minTextareaHeight, isTextarea]);
124
198
  var handleChange = React.useCallback(function (e) {
125
199
  var _e$target$value = e.target.value,
126
200
  inputValue = _e$target$value === void 0 ? '' : _e$target$value;
@@ -134,7 +208,9 @@ var Search = function Search(_ref) {
134
208
  // @ts-ignore
135
209
  debouncedOnChange.current(inputValue);
136
210
  }
137
- }, [changeDelay, onChange]);
211
+
212
+ textareaResize();
213
+ }, [changeDelay, onChange, textareaResize]);
138
214
  var handleHoverItem = React.useCallback(function (index) {
139
215
  return function () {
140
216
  setActiveIndex(index);
@@ -185,7 +261,7 @@ var Search = function Search(_ref) {
185
261
  var _a;
186
262
 
187
263
  var chosenValue = popularItems[popularActiveIndex].title;
188
- (_a = fieldNode === null || fieldNode === void 0 ? void 0 : fieldNode.current) === null || _a === void 0 ? void 0 : _a.blur();
264
+ (_a = fieldRef === null || fieldRef === void 0 ? void 0 : fieldRef.current) === null || _a === void 0 ? void 0 : _a.blur();
189
265
  onPopularItemClick === null || onPopularItemClick === void 0 ? void 0 : onPopularItemClick(chosenValue);
190
266
  }, [onPopularItemClick, popularActiveIndex, popularItems]);
191
267
  var handleKeyDownPopularItems = React.useCallback(function (e) {
@@ -210,6 +286,7 @@ var Search = function Search(_ref) {
210
286
  {
211
287
  var currentHref = (_a = popularItems[popularActiveIndex]) === null || _a === void 0 ? void 0 : _a.href;
212
288
  handlePopularItemMouseUp();
289
+ e.preventDefault();
213
290
 
214
291
  if (currentHref) {
215
292
  window.location.href = currentHref;
@@ -246,7 +323,12 @@ var Search = function Search(_ref) {
246
323
  break;
247
324
 
248
325
  case e.key === 'Enter' && activeIndex === -1:
326
+ if (isTextarea && e.shiftKey) {
327
+ return false;
328
+ }
329
+
249
330
  handleSearchSubmit();
331
+ e.preventDefault();
250
332
  break;
251
333
 
252
334
  default:
@@ -254,7 +336,7 @@ var Search = function Search(_ref) {
254
336
  }
255
337
 
256
338
  return false;
257
- }, [activeIndex, handleItemSubmit, handleSearchSubmit, items.length]);
339
+ }, [activeIndex, handleItemSubmit, handleSearchSubmit, items.length, isTextarea]);
258
340
  var handleKeyDown = React.useCallback(function (e) {
259
341
  if (showNotFound && showPopularItems) {
260
342
  return handleKeyDownPopularItems(e);
@@ -272,9 +354,68 @@ var Search = function Search(_ref) {
272
354
  !!debouncedOnChange.current && debouncedOnChange.current.cancel();
273
355
  onChange === null || onChange === void 0 ? void 0 : onChange('');
274
356
  setSearchQuery('');
275
- (_a = fieldNode === null || fieldNode === void 0 ? void 0 : fieldNode.current) === null || _a === void 0 ? void 0 : _a.focus();
357
+ (_a = fieldRef === null || fieldRef === void 0 ? void 0 : fieldRef.current) === null || _a === void 0 ? void 0 : _a.focus();
276
358
  };
277
359
 
360
+ var handleTextareaScroll = function handleTextareaScroll() {
361
+ if (!(fieldRef === null || fieldRef === void 0 ? void 0 : fieldRef.current) || !(labelRef === null || labelRef === void 0 ? void 0 : labelRef.current)) {
362
+ return;
363
+ }
364
+
365
+ var scrollTop = fieldRef.current.scrollTop;
366
+
367
+ if (!scrollTop) {
368
+ labelRef.current.style.top = '';
369
+ return;
370
+ }
371
+
372
+ labelRef.current.style.top = "".concat(DEFAULT_LABEL_TOP_POSITION - scrollTop, "px");
373
+ };
374
+
375
+ React.useEffect(function () {
376
+ textareaResize();
377
+ }, [textareaResize]);
378
+ React.useEffect(function () {
379
+ if (!resizerRef.current || !isTextarea || !showResizer) {
380
+ return;
381
+ }
382
+
383
+ var originalHeight;
384
+ var originalCoordinateY;
385
+ var handleResize = throttle(function (moveEvent) {
386
+ var currentCoordinateY = moveEvent.clientY || moveEvent.touches[0].clientY;
387
+ var resizeHeight = originalHeight + (currentCoordinateY - originalCoordinateY);
388
+ var updatedHeight = resizeHeight < minTextareaHeight ? minTextareaHeight : resizeHeight;
389
+ setTextareaHeight(updatedHeight);
390
+ setIsTextareaResized(true);
391
+ }, throttleTime.resizeTextarea);
392
+
393
+ var handleResizeCancel = function handleResizeCancel() {
394
+ setIsTextareaResizing(false);
395
+ window.removeEventListener('mousemove', handleResize);
396
+ window.removeEventListener('touchmove', handleResize);
397
+ window.removeEventListener('mouseup', handleResizeCancel);
398
+ window.removeEventListener('touchend', handleResizeCancel);
399
+ };
400
+
401
+ var handleStartResize = function handleStartResize(event) {
402
+ if (!fieldRef.current) {
403
+ return;
404
+ }
405
+
406
+ setIsTextareaResizing(true);
407
+ event.preventDefault();
408
+ originalHeight = parseFloat(getComputedStyle(fieldRef.current).getPropertyValue('height').replace('px', ''));
409
+ originalCoordinateY = event.clientY || event.touches[0].clientY;
410
+ window.addEventListener('mousemove', handleResize);
411
+ window.addEventListener('touchmove', handleResize);
412
+ window.addEventListener('mouseup', handleResizeCancel);
413
+ window.addEventListener('touchend', handleResizeCancel);
414
+ };
415
+
416
+ resizerRef.current.addEventListener('mousedown', handleStartResize);
417
+ resizerRef.current.addEventListener('touchstart', handleStartResize);
418
+ }, [isTextarea, minTextareaHeight, showResizer]);
278
419
  React.useEffect(function () {
279
420
  return setSearchQuery(value);
280
421
  }, [value]);
@@ -407,17 +548,14 @@ var Search = function Search(_ref) {
407
548
  }, popularTitle || 'Популярные действия'), renderPopularItems())));
408
549
  };
409
550
 
410
- return /*#__PURE__*/React.createElement("div", _extends({}, filterDataAttrs(dataAttrs === null || dataAttrs === void 0 ? void 0 : dataAttrs.root), {
411
- className: cn({
412
- open: isFocused,
413
- disabled: disabled,
414
- type: type,
415
- error: verification === Verification.ERROR,
416
- success: verification === Verification.VALID
417
- }, [className])
418
- }), /*#__PURE__*/React.createElement("div", _extends({}, filterDataAttrs(dataAttrs === null || dataAttrs === void 0 ? void 0 : dataAttrs.control), {
419
- className: cn('control', [classes === null || classes === void 0 ? void 0 : classes.control])
420
- }), isCompact && renderSubmitButton(), /*#__PURE__*/React.createElement("input", _extends({}, filterDataAttrs(dataAttrs === null || dataAttrs === void 0 ? void 0 : dataAttrs.searchField), {
551
+ var renderLabel = /*#__PURE__*/React.createElement("label", {
552
+ className: cn('label', [classes === null || classes === void 0 ? void 0 : classes.label]),
553
+ htmlFor: searchId,
554
+ ref: labelRef
555
+ }, label, required && /*#__PURE__*/React.createElement("span", {
556
+ className: cn('require-mark')
557
+ }, "*"));
558
+ var renderInput = /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("input", _extends({}, filterDataAttrs(dataAttrs === null || dataAttrs === void 0 ? void 0 : dataAttrs.searchField), {
421
559
  id: searchId,
422
560
  className: cn('field', {
423
561
  filled: !!searchQuery,
@@ -433,13 +571,48 @@ var Search = function Search(_ref) {
433
571
  disabled: disabled,
434
572
  type: "text",
435
573
  autoComplete: "off",
436
- ref: fieldNode
437
- })), label && /*#__PURE__*/React.createElement("label", {
438
- className: cn('label', [classes === null || classes === void 0 ? void 0 : classes.label]),
439
- htmlFor: searchId
440
- }, label, required && /*#__PURE__*/React.createElement("span", {
441
- className: cn('require-mark')
442
- }, "*")), showAdditionalElement && /*#__PURE__*/React.createElement("div", {
574
+ ref: getFieldRef
575
+ })), label && renderLabel);
576
+ var renderTextarea = /*#__PURE__*/React.createElement(React.Fragment, null, showResizer && /*#__PURE__*/React.createElement("div", _extends({
577
+ className: cn('resizer', [classes === null || classes === void 0 ? void 0 : classes.resizer]),
578
+ ref: resizerRef
579
+ }, filterDataAttrs(dataAttrs === null || dataAttrs === void 0 ? void 0 : dataAttrs.resizer)), /*#__PURE__*/React.createElement(ResizeIcon, null)), /*#__PURE__*/React.createElement("div", {
580
+ className: cn('textarea-wrapper')
581
+ }, /*#__PURE__*/React.createElement("textarea", _extends({}, filterDataAttrs(dataAttrs === null || dataAttrs === void 0 ? void 0 : dataAttrs.searchField), {
582
+ id: searchId,
583
+ className: cn('field', {
584
+ filled: !!searchQuery,
585
+ labeled: !!label
586
+ }, [classes === null || classes === void 0 ? void 0 : classes.input]),
587
+ style: {
588
+ height: "".concat(textareaHeight, "px")
589
+ },
590
+ placeholder: placeholder,
591
+ value: searchQuery,
592
+ onChange: handleChange,
593
+ onFocus: handleFocus,
594
+ onBlur: handleBlur,
595
+ onKeyDown: handleKeyDown,
596
+ onClick: handleClick,
597
+ onScroll: handleTextareaScroll,
598
+ autoComplete: "off",
599
+ ref: getFieldRef
600
+ })), label && renderLabel));
601
+ return /*#__PURE__*/React.createElement("div", _extends({}, filterDataAttrs(dataAttrs === null || dataAttrs === void 0 ? void 0 : dataAttrs.root), {
602
+ className: cn({
603
+ open: isFocused,
604
+ disabled: disabled,
605
+ type: type,
606
+ textarea: isTextarea,
607
+ error: verification === Verification.ERROR,
608
+ success: verification === Verification.VALID
609
+ }, [className])
610
+ }), /*#__PURE__*/React.createElement("div", _extends({}, filterDataAttrs(dataAttrs === null || dataAttrs === void 0 ? void 0 : dataAttrs.control), {
611
+ className: cn('control', {
612
+ focused: isTextareaResizing
613
+ }, [classes === null || classes === void 0 ? void 0 : classes.control]),
614
+ ref: containerRef
615
+ }), isCompact && renderSubmitButton(), isTextarea ? renderTextarea : renderInput, showAdditionalElement && /*#__PURE__*/React.createElement("div", {
443
616
  className: cn('icons')
444
617
  }, showTextFieldSubmit && renderSubmitButton(), showLoader && /*#__PURE__*/React.createElement(Preloader, {
445
618
  delay: false,
@@ -462,9 +635,12 @@ Search.propTypes = {
462
635
  item: PropTypes.objectOf(PropTypes.string.isRequired),
463
636
  itemTitle: PropTypes.objectOf(PropTypes.string.isRequired),
464
637
  notice: PropTypes.objectOf(PropTypes.string.isRequired),
465
- popularItem: PropTypes.objectOf(PropTypes.string.isRequired)
638
+ popularItem: PropTypes.objectOf(PropTypes.string.isRequired),
639
+ resizer: PropTypes.objectOf(PropTypes.string.isRequired)
466
640
  }),
467
641
  value: PropTypes.string,
642
+ type: PropTypes.oneOf(['textfield', 'compact']),
643
+ textarea: PropTypes.bool,
468
644
  label: PropTypes.string,
469
645
  searchId: PropTypes.string,
470
646
  placeholder: PropTypes.string,
@@ -489,7 +665,8 @@ Search.propTypes = {
489
665
  icon: PropTypes.string,
490
666
  textNotFound: PropTypes.string,
491
667
  popularTitle: PropTypes.string,
492
- popularItem: PropTypes.string
668
+ popularItem: PropTypes.string,
669
+ resizer: PropTypes.string
493
670
  }),
494
671
  showNotFound: PropTypes.bool,
495
672
  textNotFound: PropTypes.string,
@@ -502,6 +679,8 @@ Search.propTypes = {
502
679
  listRef: PropTypes.oneOfType([PropTypes.func, PropTypes.oneOfType([PropTypes.shape({
503
680
  current: PropTypes.elementType
504
681
  }), PropTypes.any])]),
682
+ minTextareaHeight: PropTypes.oneOf([MinTextareaHeight.ONE_ROW, MinTextareaHeight.THREE_ROWS]),
683
+ showResizer: PropTypes.bool,
505
684
  onChange: PropTypes.func,
506
685
  onSubmit: PropTypes.func,
507
686
  onBlur: PropTypes.func,
@@ -0,0 +1,4 @@
1
+ <svg width="12" height="12" viewBox="0 0 12 12" xmlns="http://www.w3.org/2000/svg">
2
+ <path d="M1 11L11 1" stroke-opacity="0.2" stroke-width="2" stroke-linecap="round"/>
3
+ <path d="M7 11L11 7" stroke-opacity="0.2" stroke-width="2" stroke-linecap="round"/>
4
+ </svg>
@@ -269,6 +269,20 @@
269
269
  -webkit-transform: rotate(-90deg);
270
270
  transform: rotate(-90deg);
271
271
  }
272
+ .mfui-v6-tooltip_offset_small[data-popper-placement='right'] .mfui-v6-tooltip__content,
273
+ .mfui-v6-tooltip_offset_small[data-popper-placement='right-start'] .mfui-v6-tooltip__content,
274
+ .mfui-v6-tooltip_offset_small[data-popper-placement='right-end'] .mfui-v6-tooltip__content,
275
+ .mfui-v6-tooltip_offset_small[data-popper-placement='right'] .mfui-v6-tooltip__content-shadow,
276
+ .mfui-v6-tooltip_offset_small[data-popper-placement='right-start'] .mfui-v6-tooltip__content-shadow,
277
+ .mfui-v6-tooltip_offset_small[data-popper-placement='right-end'] .mfui-v6-tooltip__content-shadow {
278
+ -webkit-transform: translateX(15px);
279
+ transform: translateX(15px);
280
+ }
281
+ .mfui-v6-tooltip_offset_small[data-popper-placement='right'] .mfui-v6-tooltip__arrow-wrap,
282
+ .mfui-v6-tooltip_offset_small[data-popper-placement='right-start'] .mfui-v6-tooltip__arrow-wrap,
283
+ .mfui-v6-tooltip_offset_small[data-popper-placement='right-end'] .mfui-v6-tooltip__arrow-wrap {
284
+ left: -6px;
285
+ }
272
286
  .mfui-v6-tooltip[data-popper-placement='left'] .mfui-v6-tooltip__content,
273
287
  .mfui-v6-tooltip[data-popper-placement='left-start'] .mfui-v6-tooltip__content,
274
288
  .mfui-v6-tooltip[data-popper-placement='left-end'] .mfui-v6-tooltip__content,
@@ -292,6 +306,20 @@
292
306
  -webkit-transform: rotate(90deg);
293
307
  transform: rotate(90deg);
294
308
  }
309
+ .mfui-v6-tooltip_offset_small[data-popper-placement='left'] .mfui-v6-tooltip__content,
310
+ .mfui-v6-tooltip_offset_small[data-popper-placement='left-start'] .mfui-v6-tooltip__content,
311
+ .mfui-v6-tooltip_offset_small[data-popper-placement='left-end'] .mfui-v6-tooltip__content,
312
+ .mfui-v6-tooltip_offset_small[data-popper-placement='left'] .mfui-v6-tooltip__content-shadow,
313
+ .mfui-v6-tooltip_offset_small[data-popper-placement='left-start'] .mfui-v6-tooltip__content-shadow,
314
+ .mfui-v6-tooltip_offset_small[data-popper-placement='left-end'] .mfui-v6-tooltip__content-shadow {
315
+ -webkit-transform: translateX(-15px);
316
+ transform: translateX(-15px);
317
+ }
318
+ .mfui-v6-tooltip_offset_small[data-popper-placement='left'] .mfui-v6-tooltip__arrow-wrap,
319
+ .mfui-v6-tooltip_offset_small[data-popper-placement='left-start'] .mfui-v6-tooltip__arrow-wrap,
320
+ .mfui-v6-tooltip_offset_small[data-popper-placement='left-end'] .mfui-v6-tooltip__arrow-wrap {
321
+ right: -6px;
322
+ }
295
323
  .mfui-v6-tooltip[data-popper-placement='top'] .mfui-v6-tooltip__content,
296
324
  .mfui-v6-tooltip[data-popper-placement='top-start'] .mfui-v6-tooltip__content,
297
325
  .mfui-v6-tooltip[data-popper-placement='top-end'] .mfui-v6-tooltip__content,
@@ -315,6 +343,20 @@
315
343
  -webkit-transform: rotate(180deg);
316
344
  transform: rotate(180deg);
317
345
  }
346
+ .mfui-v6-tooltip_offset_small[data-popper-placement='top'] .mfui-v6-tooltip__content,
347
+ .mfui-v6-tooltip_offset_small[data-popper-placement='top-start'] .mfui-v6-tooltip__content,
348
+ .mfui-v6-tooltip_offset_small[data-popper-placement='top-end'] .mfui-v6-tooltip__content,
349
+ .mfui-v6-tooltip_offset_small[data-popper-placement='top'] .mfui-v6-tooltip__content-shadow,
350
+ .mfui-v6-tooltip_offset_small[data-popper-placement='top-start'] .mfui-v6-tooltip__content-shadow,
351
+ .mfui-v6-tooltip_offset_small[data-popper-placement='top-end'] .mfui-v6-tooltip__content-shadow {
352
+ -webkit-transform: translateY(-15px);
353
+ transform: translateY(-15px);
354
+ }
355
+ .mfui-v6-tooltip_offset_small[data-popper-placement='top'] .mfui-v6-tooltip__arrow-wrap,
356
+ .mfui-v6-tooltip_offset_small[data-popper-placement='top-start'] .mfui-v6-tooltip__arrow-wrap,
357
+ .mfui-v6-tooltip_offset_small[data-popper-placement='top-end'] .mfui-v6-tooltip__arrow-wrap {
358
+ bottom: 4px;
359
+ }
318
360
  .mfui-v6-tooltip[data-popper-placement='bottom'] .mfui-v6-tooltip__content,
319
361
  .mfui-v6-tooltip[data-popper-placement='bottom-start'] .mfui-v6-tooltip__content,
320
362
  .mfui-v6-tooltip[data-popper-placement='bottom-end'] .mfui-v6-tooltip__content,
@@ -329,6 +371,20 @@
329
371
  .mfui-v6-tooltip[data-popper-placement='bottom-end'] .mfui-v6-tooltip__arrow-wrap {
330
372
  top: 13px;
331
373
  }
374
+ .mfui-v6-tooltip_offset_small[data-popper-placement='bottom'] .mfui-v6-tooltip__content,
375
+ .mfui-v6-tooltip_offset_small[data-popper-placement='bottom-start'] .mfui-v6-tooltip__content,
376
+ .mfui-v6-tooltip_offset_small[data-popper-placement='bottom-end'] .mfui-v6-tooltip__content,
377
+ .mfui-v6-tooltip_offset_small[data-popper-placement='bottom'] .mfui-v6-tooltip__content-shadow,
378
+ .mfui-v6-tooltip_offset_small[data-popper-placement='bottom-start'] .mfui-v6-tooltip__content-shadow,
379
+ .mfui-v6-tooltip_offset_small[data-popper-placement='bottom-end'] .mfui-v6-tooltip__content-shadow {
380
+ -webkit-transform: translateY(15px);
381
+ transform: translateY(15px);
382
+ }
383
+ .mfui-v6-tooltip_offset_small[data-popper-placement='bottom'] .mfui-v6-tooltip__arrow-wrap,
384
+ .mfui-v6-tooltip_offset_small[data-popper-placement='bottom-start'] .mfui-v6-tooltip__arrow-wrap,
385
+ .mfui-v6-tooltip_offset_small[data-popper-placement='bottom-end'] .mfui-v6-tooltip__arrow-wrap {
386
+ top: 4px;
387
+ }
332
388
  .mfui-v6-tooltip[data-popper-escaped='true'].mfui-v6-tooltip_has-escape {
333
389
  visibility: hidden;
334
390
  pointer-events: none;
@@ -23,6 +23,10 @@ export declare const Paddings: {
23
23
  readonly MEDIUM: "medium";
24
24
  };
25
25
  declare type PaddingsType = typeof Paddings[keyof typeof Paddings];
26
+ export declare const Offset: {
27
+ readonly SMALL: "small";
28
+ };
29
+ declare type OffsetType = typeof Offset[keyof typeof Offset];
26
30
  export declare const TriggerEvent: {
27
31
  readonly HOVER: "hover";
28
32
  readonly CLICK: "click";
@@ -55,6 +59,8 @@ export interface ITooltipProps {
55
59
  hasCloseButton?: boolean;
56
60
  /** Позиционирование относительно триггер-элемента */
57
61
  placement?: PlacementType;
62
+ /** Смещение тултипа относительно триггер-элемента */
63
+ offset?: OffsetType;
58
64
  /** Направления перестроения тултипа при переполнении */
59
65
  fallbackPlacements?: PlacementType[];
60
66
  /** Размер отступов от контента */
@@ -69,6 +75,8 @@ export interface ITooltipProps {
69
75
  targetElement?: React.RefObject<HTMLElement>;
70
76
  /** Управление состоянием. Компонент поддерживает контроллируемое и неконтроллируемое состояние. */
71
77
  isOpened?: boolean;
78
+ /** Пересчет позиции тултипа в скрытом состоянии при изменении размера окна */
79
+ isHiddenResize?: boolean;
72
80
  /** Отрендерить компонент в корневой элементе страницы body */
73
81
  isPortal?: boolean;
74
82
  /** Рендеринг компонента в указанном селекторе */
@@ -62,6 +62,9 @@ export var Paddings = {
62
62
  SMALL: 'small',
63
63
  MEDIUM: 'medium'
64
64
  };
65
+ export var Offset = {
66
+ SMALL: 'small'
67
+ };
65
68
  export var TriggerEvent = {
66
69
  HOVER: 'hover',
67
70
  CLICK: 'click',
@@ -95,6 +98,7 @@ var Tooltip = function Tooltip(_ref) {
95
98
  fallbackPlacements = _ref$fallbackPlacemen === void 0 ? ['left', 'right', 'top', 'bottom'] : _ref$fallbackPlacemen,
96
99
  _ref$paddings = _ref.paddings,
97
100
  paddings = _ref$paddings === void 0 ? 'small' : _ref$paddings,
101
+ offset = _ref.offset,
98
102
  _ref$triggerEvent = _ref.triggerEvent,
99
103
  triggerEvent = _ref$triggerEvent === void 0 ? 'hover' : _ref$triggerEvent,
100
104
  boundaryElement = _ref.boundaryElement,
@@ -104,6 +108,8 @@ var Tooltip = function Tooltip(_ref) {
104
108
  isOpened = _ref$isOpened === void 0 ? false : _ref$isOpened,
105
109
  _ref$isPortal = _ref.isPortal,
106
110
  isPortal = _ref$isPortal === void 0 ? false : _ref$isPortal,
111
+ _ref$isHiddenResize = _ref.isHiddenResize,
112
+ isHiddenResize = _ref$isHiddenResize === void 0 ? false : _ref$isHiddenResize,
107
113
  portalSelector = _ref.portalSelector,
108
114
  children = _ref.children,
109
115
  _ref$classes = _ref.classes;
@@ -180,7 +186,7 @@ var Tooltip = function Tooltip(_ref) {
180
186
  name: 'eventListeners',
181
187
  options: {
182
188
  scroll: isOpen,
183
- resize: isOpen
189
+ resize: isHiddenResize || isOpen
184
190
  }
185
191
  }, {
186
192
  name: 'preventOverflow',
@@ -189,7 +195,7 @@ var Tooltip = function Tooltip(_ref) {
189
195
  }
190
196
  }]
191
197
  };
192
- }, [placement, arrowElement, currentBoundary, isOpen, fallbackPlacements]);
198
+ }, [placement, arrowElement, fallbackPlacements, isOpen, isHiddenResize, currentBoundary]);
193
199
 
194
200
  var _usePopper = usePopper(currentTarget, popperElement, options),
195
201
  styles = _usePopper.styles,
@@ -335,6 +341,7 @@ var Tooltip = function Tooltip(_ref) {
335
341
  className: cn({
336
342
  theme: theme,
337
343
  paddings: paddings,
344
+ offset: offset,
338
345
  open: isOpen,
339
346
  small: !isBigSize,
340
347
  'has-escape': !targetElement
@@ -399,6 +406,7 @@ Tooltip.propTypes = {
399
406
  placement: PropTypes.oneOf(Object.values(Placement)),
400
407
  fallbackPlacements: PropTypes.arrayOf(PropTypes.oneOf(Object.values(Placement)).isRequired),
401
408
  paddings: PropTypes.oneOf(Object.values(Paddings)),
409
+ offset: PropTypes.oneOf(Object.values(Offset)),
402
410
  triggerEvent: PropTypes.oneOf(Object.values(TriggerEvent)),
403
411
  boundaryElement: PropTypes.oneOfType([PropTypes.func, PropTypes.oneOfType([PropTypes.shape({
404
412
  current: PropTypes.elementType
@@ -424,6 +432,7 @@ Tooltip.propTypes = {
424
432
  }), PropTypes.any])]),
425
433
  isOpened: PropTypes.bool,
426
434
  isPortal: PropTypes.bool,
435
+ isHiddenResize: PropTypes.bool,
427
436
  portalSelector: PropTypes.string,
428
437
  className: PropTypes.string,
429
438
  classes: PropTypes.shape({
@@ -154,6 +154,9 @@
154
154
  bottom: 72px;
155
155
  }
156
156
  }
157
+ .mfui-v6-banner_margin-top {
158
+ margin-top: 24px;
159
+ }
157
160
  .mfui-v6-banner_radius_rounded .mfui-v6-banner__swiper {
158
161
  border-radius: 24px;
159
162
  }
@@ -69,6 +69,8 @@ export interface IBannerProps {
69
69
  noIncreaseAutoplayDelay?: boolean;
70
70
  /** Показать часть следующего слайда */
71
71
  showNextSlide?: boolean;
72
+ /** Отступ сверху */
73
+ hasMarginTop?: boolean;
72
74
  /** Ref на swiper */
73
75
  getSwiper?: (instance: SwiperCore) => void;
74
76
  /** Обработчик клика по стрелке "вперед" (должен быть обернут в useCallback) */
@@ -97,6 +97,8 @@ var Banner = function Banner(_ref) {
97
97
  autoHeight = _ref$autoHeight === void 0 ? false : _ref$autoHeight,
98
98
  noIncreaseAutoplayDelay = _ref.noIncreaseAutoplayDelay,
99
99
  showNextSlide = _ref.showNextSlide,
100
+ _ref$hasMarginTop = _ref.hasMarginTop,
101
+ hasMarginTop = _ref$hasMarginTop === void 0 ? false : _ref$hasMarginTop,
100
102
  _ref$children = _ref.children,
101
103
  children = _ref$children === void 0 ? [] : _ref$children,
102
104
  getSwiper = _ref.getSwiper,
@@ -299,7 +301,8 @@ var Banner = function Banner(_ref) {
299
301
  'background-color': backgroundColor,
300
302
  'no-touch': !isTouch,
301
303
  radius: radius,
302
- 'show-next-slide': showNextSlide
304
+ 'show-next-slide': showNextSlide,
305
+ 'margin-top': hasMarginTop
303
306
  }, className),
304
307
  ref: rootRef
305
308
  }), /*#__PURE__*/React.createElement("div", {
@@ -361,6 +364,7 @@ Banner.propTypes = {
361
364
  noIncreaseAutoplayDelay: PropTypes.bool,
362
365
  showNextSlide: PropTypes.bool,
363
366
  getSwiper: PropTypes.func,
367
+ hasMarginTop: PropTypes.bool,
364
368
  onNextClick: PropTypes.func,
365
369
  onPrevClick: PropTypes.func,
366
370
  onDotClick: PropTypes.func,
@@ -5,16 +5,15 @@
5
5
  }
6
6
  .mfui-v6-calendar_modern {
7
7
  display: block;
8
- width: 364px;
8
+ width: 100%;
9
9
  height: 304px;
10
10
  overflow-x: hidden;
11
11
  overflow-y: scroll;
12
12
  }
13
13
  .mfui-v6-calendar_modern::-webkit-scrollbar {
14
- width: 16px;
14
+ width: 4px;
15
15
  }
16
16
  .mfui-v6-calendar_modern::-webkit-scrollbar-thumb {
17
- border: 6px solid transparent;
18
17
  border-radius: 16px;
19
18
  background-color: #D8D8D8;
20
19
  background-clip: padding-box;
@@ -406,14 +406,14 @@ var Calendar = function Calendar(_ref) {
406
406
  var isNextMonthDisabled = !!maxBookingDate && (0, _isSameMonth["default"])(new Date(year, month, 1), maxBookingDate);
407
407
  var isCurrentMonth = new Date().getFullYear() === year && new Date().getMonth() === month;
408
408
  return /*#__PURE__*/_react["default"].createElement("div", {
409
- ref: isCurrentMonth ? currentMonthRef : null
409
+ ref: isCurrentMonth ? currentMonthRef : null,
410
+ key: "".concat(year, "-").concat(month)
410
411
  }, /*#__PURE__*/_react["default"].createElement(_Month["default"], {
411
412
  dataAttrs: {
412
413
  root: dataAttrs === null || dataAttrs === void 0 ? void 0 : dataAttrs.month,
413
414
  arrowLeft: dataAttrs === null || dataAttrs === void 0 ? void 0 : dataAttrs.arrowLeft,
414
415
  arrowRight: dataAttrs === null || dataAttrs === void 0 ? void 0 : dataAttrs.arrowRight
415
416
  },
416
- key: "".concat(year, "-").concat(month),
417
417
  year: year,
418
418
  weekdayLabels: weekdayLabels,
419
419
  monthLabel: monthLabel,