@sima-land/moleculas 12.3.0 → 12.3.1

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 (32) hide show
  1. package/common/components/product-info/index.js +1 -1
  2. package/common/components/quick-view-button/index.js +1 -1
  3. package/common/components/wish-button/index.js +1 -1
  4. package/desktop/components/breadcrumbs/index.js +5 -5
  5. package/desktop/components/gallery-modal/components/all-round-view.js +11 -11
  6. package/desktop/components/gallery-modal/components/gallery-modal.js +7 -7
  7. package/desktop/components/gallery-modal/components/image-overlay.js +1 -1
  8. package/desktop/components/gallery-modal/components/review-info.js +1 -1
  9. package/desktop/components/gallery-modal/utils.js +5 -5
  10. package/desktop/components/item-image/index.js +3 -3
  11. package/desktop/components/modifiers/button/index.js +2 -2
  12. package/desktop/components/modifiers/group/index.js +12 -12
  13. package/desktop/components/modifiers/widget/index.js +2 -2
  14. package/desktop/components/person-modal/index.js +1 -1
  15. package/desktop/components/product-card/index.js +3 -3
  16. package/desktop/components/product-carousel/hover-card.js +4 -4
  17. package/desktop/components/product-carousel/index.js +10 -10
  18. package/desktop/components/product-carousel/utils.js +10 -10
  19. package/desktop/components/promotion-card/banner-title.js +5 -5
  20. package/desktop/components/promotion-card/estimate.js +2 -2
  21. package/desktop/components/promotion-card/index.d.ts +3 -1
  22. package/desktop/components/promotion-card/index.js +6 -6
  23. package/desktop/components/promotion-card/placeholder.js +4 -4
  24. package/mobile/components/item-image/index.js +2 -2
  25. package/mobile/components/modifiers-list/modifier-item/index.js +7 -7
  26. package/mobile/components/product-slider/index.js +6 -6
  27. package/mobile/components/product-slider/item.js +1 -1
  28. package/mobile/components/product-slider/utils.js +1 -1
  29. package/mobile/components/search-bar/index.js +25 -25
  30. package/mobile/components/select-screen/index.js +2 -2
  31. package/package.json +29 -29
  32. package/README.md +0 -86
@@ -26,7 +26,7 @@ exports.OnImage = OnImage;
26
26
  * @return Элемент.
27
27
  */
28
28
  const ProductInfo = ({ data, onLinkClick, children }) => {
29
- const { onImage } = define_slots_1.defineSlots(children, {
29
+ const { onImage } = (0, define_slots_1.defineSlots)(children, {
30
30
  onImage: exports.OnImage,
31
31
  });
32
32
  return (react_1.default.createElement(react_1.default.Fragment, null,
@@ -44,7 +44,7 @@ const cx = bind_1.default.bind(quick_view_button_module_scss_1.default);
44
44
  * @param props Свойства компонента.
45
45
  * @return Элемент.
46
46
  */
47
- exports.QuickViewButton = react_1.forwardRef((_a, ref) => {
47
+ exports.QuickViewButton = (0, react_1.forwardRef)((_a, ref) => {
48
48
  var { onClick, className } = _a, restProps = __rest(_a, ["onClick", "className"]);
49
49
  return (react_1.default.createElement(quick_view_svg_1.default, Object.assign({}, restProps, { ref: ref, role: 'button', "aria-label": '\u0411\u044B\u0441\u0442\u0440\u044B\u0439 \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440', className: cx('root', className), width: 24, height: 24, onClick: onClick, "data-testid": 'quick-view-button' })));
50
50
  });
@@ -49,7 +49,7 @@ const cx = bind_1.default.bind(wish_button_module_scss_1.default);
49
49
  * @param props.disabled Признак загрузки добавления товара в список избранного.
50
50
  * @return Элемент.
51
51
  */
52
- exports.WishButton = react_1.forwardRef((_a, ref) => {
52
+ exports.WishButton = (0, react_1.forwardRef)((_a, ref) => {
53
53
  var { checked, className, onClick, disabled } = _a, restProps = __rest(_a, ["checked", "className", "onClick", "disabled"]);
54
54
  const Icon = checked ? filled_heart_svg_1.default : heart_svg_1.default;
55
55
  return (react_1.default.createElement(Icon, Object.assign({}, restProps, { ref: ref, role: 'button', "aria-label": checked ? 'Убрать из избранного' : 'Добавить в избранное', className: cx('button', className, { checked, disabled }), onClick: disabled ? undefined : onClick, "data-testid": 'favorite-button', width: 24, height: 24 })));
@@ -47,12 +47,12 @@ exports.Breadcrumbs = Breadcrumbs;
47
47
  */
48
48
  const Breadcrumb = ({ data, onSiblingsPopupOpen, isSiblingActive, }) => {
49
49
  var _a;
50
- const popupRef = react_1.useRef(null);
51
- const [withPopup, togglePopup] = react_1.useState(false);
50
+ const popupRef = (0, react_1.useRef)(null);
51
+ const [withPopup, togglePopup] = (0, react_1.useState)(false);
52
52
  // с useOutsideClick не работает после обновления React до 17 версии, пока так
53
- react_1.useEffect(() => {
53
+ (0, react_1.useEffect)(() => {
54
54
  if (withPopup) {
55
- return on_1.default(window, 'mousedown', togglePopup.bind(null, false));
55
+ return (0, on_1.default)(window, 'mousedown', togglePopup.bind(null, false));
56
56
  }
57
57
  }, [withPopup]);
58
58
  const selfName = (react_1.default.createElement(link_1.Link, { color: 'gray87', href: data.url }, data.name));
@@ -74,6 +74,6 @@ const Breadcrumb = ({ data, onSiblingsPopupOpen, isSiblingActive, }) => {
74
74
  selfName,
75
75
  react_1.default.createElement(square_arrow_down_svg_1.default, { "data-testid": 'breadcrumb:siblings-closer', className: cx('toggle-icon', 'close'), onClick: () => togglePopup(false) })),
76
76
  react_1.default.createElement("ul", { className: cx('siblings') },
77
- data.siblings.state === 'fetching' && (react_1.default.createElement(react_1.default.Fragment, null, lodash_1.times(8).map(index => (react_1.default.createElement("div", { key: index, className: cx('sibling-placeholder') }))))),
77
+ data.siblings.state === 'fetching' && (react_1.default.createElement(react_1.default.Fragment, null, (0, lodash_1.times)(8).map(index => (react_1.default.createElement("div", { key: index, className: cx('sibling-placeholder') }))))),
78
78
  data.siblings.state === 'ready' && (react_1.default.createElement(react_1.default.Fragment, null, (_a = data.siblings.data) === null || _a === void 0 ? void 0 : _a.map((sibling, index) => (react_1.default.createElement("li", { key: index, className: cx('sibling'), "data-testid": 'breadcrumb-sibling' }, isSiblingActive(sibling) ? (react_1.default.createElement("span", { className: cx('active') }, sibling.name)) : (react_1.default.createElement(link_1.Link, { color: 'gray87', className: cx('link'), href: sibling.url, children: sibling.name }))))))))))))));
79
79
  };
@@ -36,16 +36,16 @@ const turn_left_svg_1 = __importDefault(require("../icons/turn-left.svg"));
36
36
  const turn_right_svg_1 = __importDefault(require("../icons/turn-right.svg"));
37
37
  const cx = bind_1.default.bind(all_round_view_module_scss_1.default);
38
38
  const AllRoundView = ({ photos }) => {
39
- const imageRef = react_1.useRef(null);
40
- const dragStartRef = react_1.useRef(null);
41
- const [state, setState] = react_1.useState('autoplay');
39
+ const imageRef = (0, react_1.useRef)(null);
40
+ const dragStartRef = (0, react_1.useRef)(null);
41
+ const [state, setState] = (0, react_1.useState)('autoplay');
42
42
  const autoplay = state === 'autoplay';
43
43
  const ChangeState = (bindState) => () => setState(bindState);
44
- const [index, setIndex] = react_1.useState(0);
45
- const indexRef = identity_1.useIdentityRef(index);
46
- const photosReady = utils_1.useImagesLoad(photos);
44
+ const [index, setIndex] = (0, react_1.useState)(0);
45
+ const indexRef = (0, identity_1.useIdentityRef)(index);
46
+ const photosReady = (0, utils_1.useImagesLoad)(photos);
47
47
  // запуск/остановка вращения
48
- react_1.useEffect(() => {
48
+ (0, react_1.useEffect)(() => {
49
49
  if (state !== 'default' && photosReady) {
50
50
  const timerId = window.setInterval(() => {
51
51
  const increment = state === 'turn-left' ? -1 : 1;
@@ -55,14 +55,14 @@ const AllRoundView = ({ photos }) => {
55
55
  }
56
56
  }, [state, photosReady]);
57
57
  // перетаскивание
58
- react_1.useEffect(() => {
58
+ (0, react_1.useEffect)(() => {
59
59
  // переданное число всегда замениться на такое, которое будет в промежутке от 0 до количества фото
60
60
  const wrap = (value) => (photos.length + value) % photos.length;
61
61
  const image = imageRef.current;
62
62
  const imageWidth = image.clientWidth;
63
63
  const imageLeft = image.getBoundingClientRect().left;
64
64
  const offList = [
65
- on_1.default(image, 'pointerdown', e => {
65
+ (0, on_1.default)(image, 'pointerdown', e => {
66
66
  e.preventDefault();
67
67
  setState('default');
68
68
  image.style.touchAction = 'none';
@@ -71,7 +71,7 @@ const AllRoundView = ({ photos }) => {
71
71
  index: indexRef.current,
72
72
  };
73
73
  }),
74
- on_1.default(window, 'pointermove', e => {
74
+ (0, on_1.default)(window, 'pointermove', e => {
75
75
  if (dragStartRef.current !== null) {
76
76
  const startX = dragStartRef.current.position;
77
77
  const currentX = e.clientX - imageLeft;
@@ -81,7 +81,7 @@ const AllRoundView = ({ photos }) => {
81
81
  setIndex(nextIndex);
82
82
  }
83
83
  }),
84
- on_1.default(window, 'pointerup', () => {
84
+ (0, on_1.default)(window, 'pointerup', () => {
85
85
  dragStartRef.current = null;
86
86
  image.style.touchAction = '';
87
87
  }),
@@ -49,23 +49,23 @@ const bind_1 = __importDefault(require("classnames/bind"));
49
49
  const gallery_modal_module_scss_1 = __importDefault(require("./gallery-modal.module.scss"));
50
50
  const cx = bind_1.default.bind(gallery_modal_module_scss_1.default);
51
51
  const GalleryModal = ({ media, defaultMediaIndex = 0, review, onClose, onGoToReview, onMediaChange, withScrollDisable, scrollDisableOptions, onVideoEvent, }) => {
52
- const [currentIndex, setCurrent] = react_1.useState(defaultMediaIndex);
53
- const thumbnailsRef = react_1.useRef(null);
54
- const areaRef = react_1.useRef(null);
52
+ const [currentIndex, setCurrent] = (0, react_1.useState)(defaultMediaIndex);
53
+ const thumbnailsRef = (0, react_1.useRef)(null);
54
+ const areaRef = (0, react_1.useRef)(null);
55
55
  const footerGutter = 40;
56
56
  const footerHeight = 20;
57
57
  const correction = review ? footerGutter + footerHeight : 0;
58
- const size = utils_1.useRectFit(areaRef, { correction });
58
+ const size = (0, utils_1.useRectFit)(areaRef, { correction });
59
59
  const innerStyles = Object.assign({}, (size !== null && {
60
60
  '--area-height': `${size + correction}px`,
61
61
  '--all-round-view-size': `${size}px`,
62
62
  }));
63
- const handlerRef = identity_1.useIdentityRef(onMediaChange);
64
- react_1.useEffect(() => {
63
+ const handlerRef = (0, identity_1.useIdentityRef)(onMediaChange);
64
+ (0, react_1.useEffect)(() => {
65
65
  var _a;
66
66
  (_a = handlerRef.current) === null || _a === void 0 ? void 0 : _a.call(handlerRef, media[currentIndex], currentIndex);
67
67
  thumbnailsRef.current &&
68
- scroll_to_child_1.scrollToChild(thumbnailsRef.current, thumbnailsRef.current.children[currentIndex]);
68
+ (0, scroll_to_child_1.scrollToChild)(thumbnailsRef.current, thumbnailsRef.current.children[currentIndex]);
69
69
  }, [currentIndex]);
70
70
  return (react_1.default.createElement(modal_1.Modal, Object.assign({ size: 'fullscreen', onClose: onClose }, { withScrollDisable, scrollDisableOptions }),
71
71
  react_1.default.createElement(modal_1.Modal.Header, { onClose: onClose }),
@@ -20,6 +20,6 @@ const classnames_1 = __importDefault(require("classnames"));
20
20
  const image_overlay_module_scss_1 = __importDefault(require("./image-overlay.module.scss"));
21
21
  const ImageOverlay = (_a) => {
22
22
  var { className, children } = _a, restProps = __rest(_a, ["className", "children"]);
23
- return (react_1.default.createElement("div", Object.assign({ className: classnames_1.default(image_overlay_module_scss_1.default.root, className) }, restProps), children));
23
+ return (react_1.default.createElement("div", Object.assign({ className: (0, classnames_1.default)(image_overlay_module_scss_1.default.root, className) }, restProps), children));
24
24
  };
25
25
  exports.ImageOverlay = ImageOverlay;
@@ -9,7 +9,7 @@ const link_1 = require("@sima-land/ui-nucleons/link");
9
9
  const rating_1 = require("@sima-land/ui-nucleons/rating");
10
10
  const classnames_1 = __importDefault(require("classnames"));
11
11
  const review_info_module_scss_1 = __importDefault(require("./review-info.module.scss"));
12
- const ReviewInfo = ({ rating, author, onGoToReview, className }) => (react_1.default.createElement("div", { className: classnames_1.default(review_info_module_scss_1.default.root, className) },
12
+ const ReviewInfo = ({ rating, author, onGoToReview, className }) => (react_1.default.createElement("div", { className: (0, classnames_1.default)(review_info_module_scss_1.default.root, className) },
13
13
  react_1.default.createElement(rating_1.Rating, { value: rating }),
14
14
  react_1.default.createElement("div", { className: review_info_module_scss_1.default.author }, author),
15
15
  onGoToReview && (react_1.default.createElement(link_1.Link, { className: review_info_module_scss_1.default.link, pseudo: true, onClick: onGoToReview, "data-testid": 'gallery-modal:go-to-review-link' }, "\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u043E\u0442\u0437\u044B\u0432\u0443"))));
@@ -12,8 +12,8 @@ const on_1 = __importDefault(require("@sima-land/ui-nucleons/helpers/on"));
12
12
  * @return Загружены ли все фото.
13
13
  */
14
14
  const useImagesLoad = (srcList) => {
15
- const [loadedCount, setLoadedCount] = react_1.useState(0);
16
- react_1.useEffect(() => {
15
+ const [loadedCount, setLoadedCount] = (0, react_1.useState)(0);
16
+ (0, react_1.useEffect)(() => {
17
17
  srcList.forEach(src => {
18
18
  const image = new Image();
19
19
  image.onload = () => setLoadedCount(c => c + 1);
@@ -31,8 +31,8 @@ exports.useImagesLoad = useImagesLoad;
31
31
  * @return Размер или null.
32
32
  */
33
33
  const useRectFit = (areaRef, { correction }) => {
34
- const [size, setSize] = react_1.useState(null);
35
- react_1.useEffect(() => {
34
+ const [size, setSize] = (0, react_1.useState)(null);
35
+ (0, react_1.useEffect)(() => {
36
36
  const calcSquareSize = () => {
37
37
  if (areaRef.current) {
38
38
  const availWidth = areaRef.current.clientWidth;
@@ -46,7 +46,7 @@ const useRectFit = (areaRef, { correction }) => {
46
46
  }
47
47
  };
48
48
  calcSquareSize();
49
- return on_1.default(window, 'resize', () => window.requestAnimationFrame(calcSquareSize));
49
+ return (0, on_1.default)(window, 'resize', () => window.requestAnimationFrame(calcSquareSize));
50
50
  }, [areaRef]);
51
51
  return size;
52
52
  };
@@ -88,8 +88,8 @@ class ItemImage extends react_1.Component {
88
88
  this.state = {
89
89
  currentPhotoIndex: null,
90
90
  };
91
- this.image = react_1.createRef();
92
- this.imageWrapper = react_1.createRef();
91
+ this.image = (0, react_1.createRef)();
92
+ this.imageWrapper = (0, react_1.createRef)();
93
93
  this.bootStartTime = Date.now();
94
94
  }
95
95
  /**
@@ -98,7 +98,7 @@ class ItemImage extends react_1.Component {
98
98
  componentDidMount() {
99
99
  const img = this.image.current;
100
100
  const { onLoadImage } = this.props;
101
- if (img && img.complete && lodash_1.isFunction(onLoadImage)) {
101
+ if (img && img.complete && (0, lodash_1.isFunction)(onLoadImage)) {
102
102
  onLoadImage(Date.now() - this.bootStartTime);
103
103
  }
104
104
  }
@@ -33,9 +33,9 @@ const typesList = Object.values(constants_1.MODIFIERS_TYPES);
33
33
  /**
34
34
  * Компонент модификатора.
35
35
  */
36
- exports.ModifierButton = react_1.forwardRef(function ModifierButton({ count = null, content, selected, color, image, type: typeProp = 'text', className, onClick, isMarkdown: hasMarkdown, squared = [constants_1.MODIFIERS_TYPES.color, constants_1.MODIFIERS_TYPES.image].includes(typeProp), 'data-testid': testId = 'modifier-button', }, ref) {
36
+ exports.ModifierButton = (0, react_1.forwardRef)(function ModifierButton({ count = null, content, selected, color, image, type: typeProp = 'text', className, onClick, isMarkdown: hasMarkdown, squared = [constants_1.MODIFIERS_TYPES.color, constants_1.MODIFIERS_TYPES.image].includes(typeProp), 'data-testid': testId = 'modifier-button', }, ref) {
37
37
  const type = typesList.includes(typeProp) ? typeProp : 'text';
38
- const hasCount = lodash_1.isNumber(count) && count >= 0;
38
+ const hasCount = (0, lodash_1.isNumber)(count) && count >= 0;
39
39
  return (react_1.default.createElement("div", { ref: ref, className: cx('modifier-button', squared && 'squared', selected && 'selected', className), style: color ? { background: color } : undefined, onClick: onClick, "data-testid": testId },
40
40
  (hasCount || hasMarkdown) && (react_1.default.createElement("span", { className: cx('label', hasCount && 'with-count'), "data-testid": 'modifier-button:badge' },
41
41
  hasCount && (count > 99 ? '99+' : count),
@@ -48,13 +48,13 @@ const createHiddenNodeIndexFinder = (container) => (childNode) => {
48
48
  return childOffsetTop - container.offsetTop >= container.clientHeight;
49
49
  };
50
50
  exports.createHiddenNodeIndexFinder = createHiddenNodeIndexFinder;
51
- const defaultGetItemType = prop_1.default('type');
52
- const defaultGetItemCount = prop_1.default('count');
53
- const defaultGetItemColor = prop_1.default('color');
54
- const defaultGetItemContent = prop_1.default('content');
55
- const defaultIsSelectedItem = prop_1.default('selected');
56
- const defaultGetItemImage = prop_1.default('image');
57
- const defaultGetIsMarkdown = prop_1.default('isMarkdown');
51
+ const defaultGetItemType = (0, prop_1.default)('type');
52
+ const defaultGetItemCount = (0, prop_1.default)('count');
53
+ const defaultGetItemColor = (0, prop_1.default)('color');
54
+ const defaultGetItemContent = (0, prop_1.default)('content');
55
+ const defaultIsSelectedItem = (0, prop_1.default)('selected');
56
+ const defaultGetItemImage = (0, prop_1.default)('image');
57
+ const defaultGetIsMarkdown = (0, prop_1.default)('isMarkdown');
58
58
  /**
59
59
  * Возвращает компонент списка модификаторов.
60
60
  * @param {Object} props Свойства компонента.
@@ -82,12 +82,12 @@ class ModifiersGroup extends react_1.Component {
82
82
  lastVisibleChildIndex: null,
83
83
  };
84
84
  this.windowWidth = 0;
85
- this.containerRef = react_1.createRef();
86
- this.showingButtonRef = react_1.createRef();
85
+ this.containerRef = (0, react_1.createRef)();
86
+ this.showingButtonRef = (0, react_1.createRef)();
87
87
  /**
88
88
  * Сбрасывает информацию о видимых и невидимых дочерних узлах контейнера.
89
89
  */
90
- this.resetVisibleNodesData = lodash_1.debounce(() => {
90
+ this.resetVisibleNodesData = (0, lodash_1.debounce)(() => {
91
91
  if (document.documentElement.offsetWidth !== this.windowWidth) {
92
92
  this.windowWidth = document.documentElement.offsetWidth;
93
93
  this.setState({
@@ -107,7 +107,7 @@ class ModifiersGroup extends react_1.Component {
107
107
  const showingButtonEl = this.showingButtonRef.current;
108
108
  if (containerEl && showingButtonEl) {
109
109
  const childList = [...containerEl.children];
110
- const firstHiddenNodeIndex = childList.findIndex(exports.createHiddenNodeIndexFinder(containerEl));
110
+ const firstHiddenNodeIndex = childList.findIndex((0, exports.createHiddenNodeIndexFinder)(containerEl));
111
111
  if (firstHiddenNodeIndex !== -1) {
112
112
  const lastVisibleElIndex = firstHiddenNodeIndex - 1;
113
113
  const lastVisibleNode = childList[lastVisibleElIndex];
@@ -143,7 +143,7 @@ class ModifiersGroup extends react_1.Component {
143
143
  */
144
144
  componentDidMount() {
145
145
  this.windowWidth = document.documentElement.offsetWidth;
146
- this.removeGlobalListener = on_1.default(window, 'resize', this.resetVisibleNodesData);
146
+ this.removeGlobalListener = (0, on_1.default)(window, 'resize', this.resetVisibleNodesData);
147
147
  this.checkVisibleNodes();
148
148
  }
149
149
  /**
@@ -27,9 +27,9 @@ const ModifiersWidget = ({ title, items, sizesTableUrl, onSelectItem, }) => (rea
27
27
  " (",
28
28
  items.length,
29
29
  "\u00A0",
30
- get_declination_1.default(items.length, ['вариант', 'варианта', 'вариантов']),
30
+ (0, get_declination_1.default)(items.length, ['вариант', 'варианта', 'вариантов']),
31
31
  "):")),
32
- react_1.default.createElement(group_1.ModifiersGroup, { items: items, getItemContent: prop_1.default('name'), getItemCount: prop_1.default('inCartQty'), onSelectItem: (item, selected) => {
32
+ react_1.default.createElement(group_1.ModifiersGroup, { items: items, getItemContent: (0, prop_1.default)('name'), getItemCount: (0, prop_1.default)('inCartQty'), onSelectItem: (item, selected) => {
33
33
  !selected && onSelectItem && onSelectItem(item);
34
34
  } }),
35
35
  Boolean(sizesTableUrl) && (react_1.default.createElement(link_1.Link, { href: sizesTableUrl, className: cx('modifiers-link') }, "\u0422\u0430\u0431\u043B\u0438\u0446\u0430 \u0440\u0430\u0437\u043C\u0435\u0440\u043E\u0432"))));
@@ -21,7 +21,7 @@ const cx = bind_1.default.bind(person_modal_module_scss_1.default);
21
21
  * @return Элемент.
22
22
  */
23
23
  const PersonModal = ({ name, appointment, photoUrl, email, skype, social, phoneHref, phoneText, secondPhoneHref, secondPhoneText, arbitraryLinkProps, onClose, withScrollDisable, scrollDisableOptions, }) => {
24
- keydown_1.useKeydown('Escape', onClose);
24
+ (0, keydown_1.useKeydown)('Escape', onClose);
25
25
  return (react_1.default.createElement(modal_1.Modal, { size: 's', withScrollDisable: withScrollDisable, scrollDisableOptions: scrollDisableOptions, onClose: onClose },
26
26
  react_1.default.createElement(modal_1.Modal.Body, null,
27
27
  react_1.default.createElement("div", { className: cx('main') },
@@ -59,15 +59,15 @@ const CartControlSlot = ({ children, stepText, markupText, loading, }) => (react
59
59
  * @param props Свойства компонента.
60
60
  * @return Элемент.
61
61
  */
62
- exports.ProductCard = react_1.forwardRef((_a, rootRef) => {
62
+ exports.ProductCard = (0, react_1.forwardRef)((_a, rootRef) => {
63
63
  var { data, onLinkClick, onQuickViewClick, children,
64
64
  // div props
65
65
  className } = _a, rootProps = __rest(_a, ["data", "onLinkClick", "onQuickViewClick", "children", "className"]);
66
- const { cartControl } = define_slots_1.defineSlots(children, { cartControl: CartControlSlot });
66
+ const { cartControl } = (0, define_slots_1.defineSlots)(children, { cartControl: CartControlSlot });
67
67
  return (react_1.default.createElement("div", Object.assign({ ref: rootRef, className: cx('root', shapes_1.SmallRounds.all, shadows_1.BoxShadow.z4, className) }, rootProps),
68
68
  react_1.default.createElement(product_info_1.ProductInfo, { data: data, onLinkClick: onLinkClick },
69
69
  react_1.default.createElement(product_info_1.ProductInfo.OnImage, null,
70
- react_1.default.createElement(with_hint_1.WithHint, { hint: '\u0411\u044B\u0441\u0442\u0440\u044B\u0439 \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440', direction: 'left' }, (ref, toggle) => (react_1.default.createElement(quick_view_button_1.QuickViewButton, { ref: ref, onMouseEnter: () => toggle(true), onMouseLeave: () => toggle(false), className: cx('quick-view-button'), onClick: with_prevent_1.default(onQuickViewClick) }))))),
70
+ react_1.default.createElement(with_hint_1.WithHint, { hint: '\u0411\u044B\u0441\u0442\u0440\u044B\u0439 \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440', direction: 'left' }, (ref, toggle) => (react_1.default.createElement(quick_view_button_1.QuickViewButton, { ref: ref, onMouseEnter: () => toggle(true), onMouseLeave: () => toggle(false), className: cx('quick-view-button'), onClick: (0, with_prevent_1.default)(onQuickViewClick) }))))),
71
71
  cartControl));
72
72
  });
73
73
  exports.ProductCard.CartControl = CartControlSlot;
@@ -37,13 +37,13 @@ const cx = bind_1.default.bind(hover_card_module_scss_1.default);
37
37
  * @return Элемент.
38
38
  */
39
39
  const HoverCard = ({ data, targetRef, onMouseLeave, onQuickViewClick, onLinkClick, renderCartControl, }) => {
40
- const rootRef = react_1.useRef(null);
41
- const [ready, setReady] = react_1.useState(false);
42
- react_1.useLayoutEffect(() => {
40
+ const rootRef = (0, react_1.useRef)(null);
41
+ const [ready, setReady] = (0, react_1.useState)(false);
42
+ (0, react_1.useLayoutEffect)(() => {
43
43
  if (targetRef.current && rootRef.current) {
44
44
  const element = rootRef.current;
45
45
  const rect = targetRef.current.getBoundingClientRect();
46
- const correction = utils_1.getOriginCorrection(rootRef.current);
46
+ const correction = (0, utils_1.getOriginCorrection)(rootRef.current);
47
47
  element.style.left = `${correction.x + rect.left - 16}px`;
48
48
  element.style.top = `${correction.y + rect.top - 16}px`;
49
49
  element.style.width = `${rect.width + 32}px`;
@@ -51,24 +51,24 @@ const Item = () => null;
51
51
  * @return Элемент.
52
52
  */
53
53
  const ProductCarousel = ({ className, itemSize, onInViewport, onNeedRequest, withHoverCard, children, }) => {
54
- const [activeItemIndex, setActiveItemIndex] = react_1.useState(null);
55
- const cardShow = utils_1.useAllowFlag();
56
- const needBigArrows = media_1.useMedia('(min-width: 1600px)');
57
- const sectionRef = react_1.useRef(null);
58
- const stubRef = react_1.useRef(null);
59
- const targetItemRef = react_1.useRef(null);
54
+ const [activeItemIndex, setActiveItemIndex] = (0, react_1.useState)(null);
55
+ const cardShow = (0, utils_1.useAllowFlag)();
56
+ const needBigArrows = (0, media_1.useMedia)('(min-width: 1600px)');
57
+ const sectionRef = (0, react_1.useRef)(null);
58
+ const stubRef = (0, react_1.useRef)(null);
59
+ const targetItemRef = (0, react_1.useRef)(null);
60
60
  const items = react_1.Children.toArray(children).reduce((acc, item) => {
61
- react_1.isValidElement(item) && item.type === Item && acc.push(item.props);
61
+ (0, react_1.isValidElement)(item) && item.type === Item && acc.push(item.props);
62
62
  return acc;
63
63
  }, []);
64
64
  // вычисляем ширину элемента карусели для позиционирования стрелок
65
- const itemWidth = utils_1.useChildWidth(sectionRef, `.${cx('item')}`, [items.length]);
65
+ const itemWidth = (0, utils_1.useChildWidth)(sectionRef, `.${cx('item')}`, [items.length]);
66
66
  // инициируем загрузку данных, когда компонент почти попал в зону видимости
67
- utils_1.useViewport(stubRef, onNeedRequest, {
67
+ (0, utils_1.useViewport)(stubRef, onNeedRequest, {
68
68
  rootMargin: '200px 0px 200px 0px',
69
69
  });
70
70
  // отправляем статистку, когда компонент попадает в зону видимости
71
- utils_1.useViewport(sectionRef, onInViewport);
71
+ (0, utils_1.useViewport)(sectionRef, onInViewport);
72
72
  return Array.isArray(items) && items.length > 0 ? (react_1.default.createElement("div", { ref: sectionRef, className: cx('root', className) },
73
73
  react_1.default.createElement(carousel_1.Carousel, Object.assign({ step: 3, draggable: false,
74
74
  // докидываем индекс чтобы позже брать актуальные данные из списка по нему
@@ -13,7 +13,7 @@ const on_1 = __importDefault(require("@sima-land/ui-nucleons/helpers/on"));
13
13
  * @param options Опции IntersectionObserver.
14
14
  */
15
15
  const useViewport = (ref, callback, options) => {
16
- react_1.useEffect(() => {
16
+ (0, react_1.useEffect)(() => {
17
17
  const element = ref.current;
18
18
  if (element) {
19
19
  const observer = new IntersectionObserver(entries => {
@@ -33,15 +33,15 @@ exports.useViewport = useViewport;
33
33
  * @return Объект работы с флагом.
34
34
  */
35
35
  const useAllowFlag = () => {
36
- const ref = react_1.useRef(true);
37
- const timerIdRef = react_1.useRef();
38
- const allowed = react_1.useCallback(() => ref.current, []);
39
- const disallowFor = react_1.useCallback(timeout => {
36
+ const ref = (0, react_1.useRef)(true);
37
+ const timerIdRef = (0, react_1.useRef)();
38
+ const allowed = (0, react_1.useCallback)(() => ref.current, []);
39
+ const disallowFor = (0, react_1.useCallback)(timeout => {
40
40
  window.clearTimeout(timerIdRef.current);
41
41
  ref.current = false;
42
42
  timerIdRef.current = window.setTimeout(() => (ref.current = true), timeout);
43
43
  }, []);
44
- const controlRef = react_1.useRef({ allowed, disallowFor });
44
+ const controlRef = (0, react_1.useRef)({ allowed, disallowFor });
45
45
  return controlRef.current;
46
46
  };
47
47
  exports.useAllowFlag = useAllowFlag;
@@ -53,16 +53,16 @@ exports.useAllowFlag = useAllowFlag;
53
53
  * @return Ширина.
54
54
  */
55
55
  const useChildWidth = (ref, selector, deps) => {
56
- const [itemWidth, setItemWidth] = react_1.useState(null);
57
- const update = react_1.useCallback(() => {
56
+ const [itemWidth, setItemWidth] = (0, react_1.useState)(null);
57
+ const update = (0, react_1.useCallback)(() => {
58
58
  if (ref.current) {
59
59
  const child = ref.current.querySelector(selector);
60
60
  child && setItemWidth(child.clientWidth);
61
61
  }
62
62
  }, [ref]);
63
- react_1.useEffect(() => {
63
+ (0, react_1.useEffect)(() => {
64
64
  ref.current && update();
65
- return on_1.default(window, 'resize', update);
65
+ return (0, on_1.default)(window, 'resize', update);
66
66
  }, deps);
67
67
  return itemWidth;
68
68
  };
@@ -21,7 +21,7 @@ const BannerTitle = ({ promotionType, volumeDiscount, dueDate }) => {
21
21
  break;
22
22
  case 'volume-discount':
23
23
  if (volumeDiscount) {
24
- content = (react_1.default.createElement("div", { className: banner_title_module_scss_1.default.discount },
24
+ content = (react_1.default.createElement("div", { className: banner_title_module_scss_1.default.discount, "data-testid": 'promotion-card:banner-discount' },
25
25
  "\u0441\u043A\u0438\u0434\u043A\u0438 \u0434\u043E",
26
26
  react_1.default.createElement("div", { className: banner_title_module_scss_1.default.percent },
27
27
  volumeDiscount,
@@ -32,14 +32,14 @@ const BannerTitle = ({ promotionType, volumeDiscount, dueDate }) => {
32
32
  return react_1.default.createElement(react_1.default.Fragment, null, content);
33
33
  };
34
34
  exports.BannerTitle = BannerTitle;
35
- const CustomTimer = ({ dueDate }) => (react_1.default.createElement(timer_1.Timer, { date: date_fns_1.formatISO(dueDate), timeout: 1000 * 60, format: ({ days, hours, minutes }) => (react_1.default.createElement("div", { className: banner_title_module_scss_1.default.timer },
35
+ const CustomTimer = ({ dueDate }) => (react_1.default.createElement(timer_1.Timer, { date: (0, date_fns_1.formatISO)(dueDate), timeout: 1000 * 60, format: ({ days, hours, minutes }) => (react_1.default.createElement("div", { className: banner_title_module_scss_1.default.timer, "data-testid": 'promotion-card:banner-timer' },
36
36
  react_1.default.createElement(TimerPart, { label: '\u0434\u043D\u0435\u0439', value: Math.min(99, days) }),
37
- react_1.default.createElement(Divider, null),
37
+ react_1.default.createElement(TimerDivider, null),
38
38
  react_1.default.createElement(TimerPart, { label: '\u0447\u0430\u0441\u043E\u0432', value: hours % 24 }),
39
- react_1.default.createElement(Divider, null),
39
+ react_1.default.createElement(TimerDivider, null),
40
40
  react_1.default.createElement(TimerPart, { label: '\u043C\u0438\u043D\u0443\u0442', value: minutes % 60 }))) }));
41
41
  exports.CustomTimer = CustomTimer;
42
42
  const TimerPart = ({ label, value }) => (react_1.default.createElement("div", { className: banner_title_module_scss_1.default.part },
43
43
  react_1.default.createElement("div", null, `${value}`.padStart(2, '0')),
44
44
  react_1.default.createElement("div", { className: banner_title_module_scss_1.default.label }, label)));
45
- const Divider = () => react_1.default.createElement("div", { className: banner_title_module_scss_1.default.divider }, ":");
45
+ const TimerDivider = () => react_1.default.createElement("div", { className: banner_title_module_scss_1.default.divider }, ":");
@@ -24,12 +24,12 @@ const toTimePart = (n) => `${n}`.padStart(2, '0');
24
24
  const Estimate = ({ dueDate }) => {
25
25
  const now = new Date();
26
26
  let content = null;
27
- if (date_fns_1.getYear(dueDate) !== date_fns_1.getYear(now)) {
27
+ if ((0, date_fns_1.getYear)(dueDate) !== (0, date_fns_1.getYear)(now)) {
28
28
  const text = [date_fns_1.getDate, date_fns_1.getMonth, date_fns_1.getYear].map(fn => toTimePart(fn(dueDate))).join('.');
29
29
  content = `До ${text}`;
30
30
  }
31
31
  else {
32
- content = `До ${date_fns_1.getDate(dueDate)} ${MONTH_SHORT_NAME[date_fns_1.getMonth(dueDate)]}`;
32
+ content = `До ${(0, date_fns_1.getDate)(dueDate)} ${MONTH_SHORT_NAME[(0, date_fns_1.getMonth)(dueDate)]}`;
33
33
  }
34
34
  return react_1.default.createElement(react_1.default.Fragment, null, content);
35
35
  };
@@ -17,6 +17,8 @@ export interface PromotionCardProps extends React.HTMLAttributes<HTMLDivElement>
17
17
  promotionType?: PromotionType;
18
18
  /** Скидка за объем, указывается при соответствующем типе акции. */
19
19
  volumeDiscount?: number;
20
+ /** Идентификатор для систем автоматизированного тестирования. */
21
+ 'data-testid'?: string;
20
22
  }
21
23
  /**
22
24
  * Карточка акции.
@@ -24,6 +26,6 @@ export interface PromotionCardProps extends React.HTMLAttributes<HTMLDivElement>
24
26
  * @return Элемент.
25
27
  */
26
28
  export declare const PromotionCard: {
27
- ({ promotionType, href, imageSrc, title, subtitle, dueDate, volumeDiscount, postfix, className, ...restProps }: PromotionCardProps): JSX.Element;
29
+ ({ promotionType, href, imageSrc, title, subtitle, dueDate, volumeDiscount, postfix, className, "data-testid": testId, ...restProps }: PromotionCardProps): JSX.Element;
28
30
  Placeholder: (props: React.HTMLAttributes<HTMLDivElement>) => JSX.Element;
29
31
  };
@@ -55,13 +55,13 @@ const PromotionName = {
55
55
  const PromotionCard = (_a) => {
56
56
  var { promotionType, href, imageSrc, title, subtitle, dueDate, volumeDiscount, postfix = promotionType ? PromotionName[promotionType] : undefined,
57
57
  // div props
58
- className } = _a, restProps = __rest(_a, ["promotionType", "href", "imageSrc", "title", "subtitle", "dueDate", "volumeDiscount", "postfix", "className"]);
58
+ className, 'data-testid': testId = 'promotion-card' } = _a, restProps = __rest(_a, ["promotionType", "href", "imageSrc", "title", "subtitle", "dueDate", "volumeDiscount", "postfix", "className", 'data-testid']);
59
59
  // время нужно выводить только на клиенте - вводим состояние
60
- const [mounted, setMounted] = react_1.useState(false);
61
- react_1.useEffect(() => {
60
+ const [mounted, setMounted] = (0, react_1.useState)(false);
61
+ (0, react_1.useEffect)(() => {
62
62
  setMounted(true);
63
63
  }, []);
64
- return (react_1.default.createElement("div", Object.assign({ className: classnames_1.default(className, index_module_scss_1.default.root) }, restProps),
64
+ return (react_1.default.createElement("div", Object.assign({ className: (0, classnames_1.default)(className, index_module_scss_1.default.root) }, restProps, { "data-testid": testId }),
65
65
  react_1.default.createElement("a", { href: href, className: index_module_scss_1.default.link },
66
66
  react_1.default.createElement("div", { className: index_module_scss_1.default.banner },
67
67
  react_1.default.createElement("img", { src: imageSrc, alt: title, className: index_module_scss_1.default.image }),
@@ -72,10 +72,10 @@ const PromotionCard = (_a) => {
72
72
  react_1.default.createElement("h4", { className: index_module_scss_1.default.title }, title),
73
73
  subtitle && react_1.default.createElement("p", { className: index_module_scss_1.default.subtitle }, subtitle)),
74
74
  react_1.default.createElement("div", { className: index_module_scss_1.default.footer },
75
- mounted && (react_1.default.createElement("time", { className: index_module_scss_1.default.timer },
75
+ mounted && (react_1.default.createElement("time", { className: index_module_scss_1.default.timer, "data-testid": 'promotion-card:due-date' },
76
76
  react_1.default.createElement(watch_1.default, { className: index_module_scss_1.default['timer-svg'] }),
77
77
  react_1.default.createElement(estimate_1.Estimate, { dueDate: dueDate }))),
78
- postfix && react_1.default.createElement("div", { className: index_module_scss_1.default.postfix }, postfix))))));
78
+ postfix && (react_1.default.createElement("div", { "data-testid": 'promotion-card:postfix', className: index_module_scss_1.default.postfix }, postfix)))))));
79
79
  };
80
80
  exports.PromotionCard = PromotionCard;
81
81
  exports.PromotionCard.Placeholder = placeholder_1.PromotionCardPlaceholder;
@@ -12,8 +12,8 @@ const classnames_1 = __importDefault(require("classnames"));
12
12
  * @param props Свойства div.
13
13
  * @return Элемент.
14
14
  */
15
- const PromotionCardPlaceholder = (props) => (react_1.default.createElement("div", Object.assign({}, props),
16
- react_1.default.createElement("div", { className: classnames_1.default(placeholder_module_scss_1.default.part, placeholder_module_scss_1.default.banner) }),
17
- react_1.default.createElement("div", { className: classnames_1.default(placeholder_module_scss_1.default.part, placeholder_module_scss_1.default.text) }),
18
- react_1.default.createElement("div", { className: classnames_1.default(placeholder_module_scss_1.default.part, placeholder_module_scss_1.default.text) })));
15
+ const PromotionCardPlaceholder = (props) => (react_1.default.createElement("div", Object.assign({ "data-testid": 'promotion-card:placeholder' }, props),
16
+ react_1.default.createElement("div", { className: (0, classnames_1.default)(placeholder_module_scss_1.default.part, placeholder_module_scss_1.default.banner) }),
17
+ react_1.default.createElement("div", { className: (0, classnames_1.default)(placeholder_module_scss_1.default.part, placeholder_module_scss_1.default.text) }),
18
+ react_1.default.createElement("div", { className: (0, classnames_1.default)(placeholder_module_scss_1.default.part, placeholder_module_scss_1.default.text) })));
19
19
  exports.PromotionCardPlaceholder = PromotionCardPlaceholder;
@@ -58,7 +58,7 @@ class ItemImage extends react_1.Component {
58
58
  * @return {Object} Свойства для компонента.
59
59
  */
60
60
  this.getImage = ({ src, alt }, onClick) => (react_1.default.createElement("img", { className: cx('image'), src: src, alt: alt, ref: this.image, onClick: onClick }));
61
- this.image = react_1.createRef();
61
+ this.image = (0, react_1.createRef)();
62
62
  this.bootStartTime = Date.now();
63
63
  }
64
64
  /**
@@ -67,7 +67,7 @@ class ItemImage extends react_1.Component {
67
67
  componentDidMount() {
68
68
  const img = this.image.current;
69
69
  const { onLoadImage } = this.props;
70
- if (img && img.complete && lodash_1.isFunction(onLoadImage)) {
70
+ if (img && img.complete && (0, lodash_1.isFunction)(onLoadImage)) {
71
71
  onLoadImage(Date.now() - this.bootStartTime);
72
72
  }
73
73
  }
@@ -26,13 +26,13 @@ exports.cx = bind_1.default.bind(modifier_item_module_scss_1.default);
26
26
  * @param props.onClick Обработчик клика на модификатор.
27
27
  * @return Элемент.
28
28
  */
29
- const ModifierItem = ({ name, selected, type = 'text', color, image, price, currencyGrapheme, additionalText, onClick, }) => (react_1.default.createElement("div", { onClick: onClick, className: exports.cx('wrapper', selected && 'selected') },
30
- Boolean(type === constants_1.MODIFIERS_TYPES.image && image) && (react_1.default.createElement("img", { className: exports.cx('adornment'), src: image, alt: name })),
31
- Boolean(type === constants_1.MODIFIERS_TYPES.color && color) && (react_1.default.createElement("div", { className: exports.cx('adornment', 'color'), style: { backgroundColor: color } })),
32
- react_1.default.createElement("div", { className: exports.cx('info') },
33
- react_1.default.createElement("span", { className: exports.cx('name') }, name),
34
- Boolean(price) && (react_1.default.createElement(price_1.Price, { value: price, currencyGrapheme: currencyGrapheme, className: exports.cx('price', additionalText && 'additional') })),
29
+ const ModifierItem = ({ name, selected, type = 'text', color, image, price, currencyGrapheme, additionalText, onClick, }) => (react_1.default.createElement("div", { onClick: onClick, className: (0, exports.cx)('wrapper', selected && 'selected') },
30
+ Boolean(type === constants_1.MODIFIERS_TYPES.image && image) && (react_1.default.createElement("img", { className: (0, exports.cx)('adornment'), src: image, alt: name })),
31
+ Boolean(type === constants_1.MODIFIERS_TYPES.color && color) && (react_1.default.createElement("div", { className: (0, exports.cx)('adornment', 'color'), style: { backgroundColor: color } })),
32
+ react_1.default.createElement("div", { className: (0, exports.cx)('info') },
33
+ react_1.default.createElement("span", { className: (0, exports.cx)('name') }, name),
34
+ Boolean(price) && (react_1.default.createElement(price_1.Price, { value: price, currencyGrapheme: currencyGrapheme, className: (0, exports.cx)('price', additionalText && 'additional') })),
35
35
  Boolean(additionalText) && (react_1.default.createElement(text_1.Text, { color: 'gray38', children: additionalText, size: 12, lineHeight: 16 }))),
36
- react_1.default.createElement("div", { className: exports.cx('icon-wrapper') }, selected && (react_1.default.createElement("div", { className: exports.cx('icon') },
36
+ react_1.default.createElement("div", { className: (0, exports.cx)('icon-wrapper') }, selected && (react_1.default.createElement("div", { className: (0, exports.cx)('icon') },
37
37
  react_1.default.createElement(check_1.default, { fill: '#fff', role: 'presentation' }))))));
38
38
  exports.ModifierItem = ModifierItem;
@@ -31,19 +31,19 @@ const utils_2 = require("./utils");
31
31
  * @return Элемент.
32
32
  */
33
33
  const ProductSlider = ({ children, onInViewport, onNeedRequest, }) => {
34
- const rootRef = react_1.useRef(null);
35
- const [mounted, setMounted] = react_1.useState(false);
34
+ const rootRef = (0, react_1.useRef)(null);
35
+ const [mounted, setMounted] = (0, react_1.useState)(false);
36
36
  // инициируем загрузку данных, когда компонент почти попал в зону видимости
37
- utils_1.useViewport(rootRef, onNeedRequest, {
37
+ (0, utils_1.useViewport)(rootRef, onNeedRequest, {
38
38
  rootMargin: '200px 0px 200px 0px',
39
39
  });
40
40
  // сообщаем, когда компонент попадет в зону видимости
41
- utils_1.useViewport(rootRef, onInViewport);
41
+ (0, utils_1.useViewport)(rootRef, onInViewport);
42
42
  // разрешаем загружать картинки только после монтирования
43
- react_1.useEffect(() => setMounted(true), []);
43
+ (0, react_1.useEffect)(() => setMounted(true), []);
44
44
  return (react_1.default.createElement("div", { ref: rootRef },
45
45
  react_1.default.createElement(touch_slider_1.TouchSlider, null,
46
- react_1.default.createElement(utils_2.SliderContext.Provider, { value: { needLoadImages: mounted } }, react_1.Children.toArray(children).filter(x => react_1.isValidElement(x) && x.type === item_1.ProductSliderItem)))));
46
+ react_1.default.createElement(utils_2.SliderContext.Provider, { value: { needLoadImages: mounted } }, react_1.Children.toArray(children).filter(x => (0, react_1.isValidElement)(x) && x.type === item_1.ProductSliderItem)))));
47
47
  };
48
48
  exports.ProductSlider = ProductSlider;
49
49
  exports.ProductSlider.Item = item_1.ProductSliderItem;
@@ -48,7 +48,7 @@ const cx = bind_1.default.bind(item_module_scss_1.default);
48
48
  */
49
49
  const ProductSliderItem = (_a) => {
50
50
  var { data, favorite, footer, onFavoriteClick } = _a, restProps = __rest(_a, ["data", "favorite", "footer", "onFavoriteClick"]);
51
- const { needLoadImages } = react_1.useContext(utils_1.SliderContext);
51
+ const { needLoadImages } = (0, react_1.useContext)(utils_1.SliderContext);
52
52
  return (react_1.default.createElement("div", { className: cx('root') },
53
53
  react_1.default.createElement(product_info_1.ProductInfo, Object.assign({}, restProps, { data: Object.assign(Object.assign({}, data), { imageSrc: needLoadImages ? data.imageSrc : undefined }) }),
54
54
  react_1.default.createElement(product_info_1.ProductInfo.OnImage, null,
@@ -2,4 +2,4 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.SliderContext = void 0;
4
4
  const react_1 = require("react");
5
- exports.SliderContext = react_1.createContext({ needLoadImages: false });
5
+ exports.SliderContext = (0, react_1.createContext)({ needLoadImages: false });
@@ -55,39 +55,39 @@ exports.cx = bind_1.default.bind(search_bar_module_scss_1.default);
55
55
  * @return Элемент.
56
56
  */
57
57
  const SearchBar = ({ inputMode, value, onChange, placeholder = 'Поиск', onClear, endButtons = [], startButtons = [], withSearchIcon = true, autoFocus = true, description, }) => {
58
- const [shownDropdown, toggleDropdown] = react_1.useState(false);
59
- const inputRef = react_1.useRef(null);
60
- const dropDownRef = react_1.useRef(null);
61
- const dropDownOpenerRef = react_1.useRef(null);
58
+ const [shownDropdown, toggleDropdown] = (0, react_1.useState)(false);
59
+ const inputRef = (0, react_1.useRef)(null);
60
+ const dropDownRef = (0, react_1.useRef)(null);
61
+ const dropDownOpenerRef = (0, react_1.useRef)(null);
62
62
  const needHideEndButtons = endButtons.length > 1;
63
- hooks_1.useOutsideClick(dropDownRef, e => {
63
+ (0, hooks_1.useOutsideClick)(dropDownRef, e => {
64
64
  !dropDownOpenerRef.current.contains(e.target) &&
65
65
  toggleDropdown(false);
66
66
  });
67
- react_1.useEffect(() => needHideEndButtons
68
- ? on_1.default(window, 'resize', lodash_1.throttle(() => toggleDropdown(false), 500))
67
+ (0, react_1.useEffect)(() => needHideEndButtons
68
+ ? (0, on_1.default)(window, 'resize', (0, lodash_1.throttle)(() => toggleDropdown(false), 500))
69
69
  : undefined, [needHideEndButtons]);
70
- return (react_1.default.createElement("div", { className: exports.cx('wrapper') },
71
- Boolean(startButtons.length) && (react_1.default.createElement("div", { className: exports.cx('before-field') },
72
- react_1.default.createElement("div", { className: exports.cx('buttons-container') }, startButtons.map((props, index) => (react_1.default.createElement(Button, Object.assign({}, props, { key: index }))))))),
73
- react_1.default.createElement("label", { className: exports.cx('input-wrapper') },
74
- withSearchIcon && (react_1.default.createElement("span", { className: exports.cx('search-icon') },
70
+ return (react_1.default.createElement("div", { className: (0, exports.cx)('wrapper') },
71
+ Boolean(startButtons.length) && (react_1.default.createElement("div", { className: (0, exports.cx)('before-field') },
72
+ react_1.default.createElement("div", { className: (0, exports.cx)('buttons-container') }, startButtons.map((props, index) => (react_1.default.createElement(Button, Object.assign({}, props, { key: index }))))))),
73
+ react_1.default.createElement("label", { className: (0, exports.cx)('input-wrapper') },
74
+ withSearchIcon && (react_1.default.createElement("span", { className: (0, exports.cx)('search-icon') },
75
75
  react_1.default.createElement(search_1.default, { fill: colors_1.COLORS.get('gray38'), "aria-hidden": true }))),
76
- react_1.default.createElement("div", { className: exports.cx('input-container') },
77
- react_1.default.createElement("input", { ref: inputRef, value: value, onChange: onChange, className: exports.cx('search-field'), placeholder: placeholder, autoFocus: autoFocus, "data-testid": 'search-bar-input', type: 'text', inputMode: inputMode, tabIndex: 0 }),
78
- description && (react_1.default.createElement("div", { className: exports.cx('description-container') },
79
- react_1.default.createElement("span", { className: exports.cx('description') }, description)))),
80
- lodash_1.isFunction(onClear) && value && (react_1.default.createElement(link_1.Link, { onClick: event => {
76
+ react_1.default.createElement("div", { className: (0, exports.cx)('input-container') },
77
+ react_1.default.createElement("input", { ref: inputRef, value: value, onChange: onChange, className: (0, exports.cx)('search-field'), placeholder: placeholder, autoFocus: autoFocus, "data-testid": 'search-bar-input', type: 'text', inputMode: inputMode, tabIndex: 0 }),
78
+ description && (react_1.default.createElement("div", { className: (0, exports.cx)('description-container') },
79
+ react_1.default.createElement("span", { className: (0, exports.cx)('description') }, description)))),
80
+ (0, lodash_1.isFunction)(onClear) && value && (react_1.default.createElement(link_1.Link, { onClick: event => {
81
81
  onClear(event);
82
82
  inputRef.current && inputRef.current.focus();
83
- }, pseudo: true, "aria-label": '\u041E\u0447\u0438\u0441\u0442\u0438\u0442\u044C', "data-testid": 'search-bar:clear-icon', className: exports.cx('clear-icon'), children: react_1.default.createElement(cross_1.default, { fill: colors_1.COLORS.get('gray38'), "aria-hidden": true }) }))),
83
+ }, pseudo: true, "aria-label": '\u041E\u0447\u0438\u0441\u0442\u0438\u0442\u044C', "data-testid": 'search-bar:clear-icon', className: (0, exports.cx)('clear-icon'), children: react_1.default.createElement(cross_1.default, { fill: colors_1.COLORS.get('gray38'), "aria-hidden": true }) }))),
84
84
  Boolean(endButtons.length) && (react_1.default.createElement(react_1.default.Fragment, null,
85
- react_1.default.createElement("div", { className: exports.cx('after-field', needHideEndButtons && 'wide-screen') },
86
- react_1.default.createElement("div", { className: exports.cx('buttons-container') }, endButtons.map((props, index) => (react_1.default.createElement(Button, Object.assign({}, props, { key: index })))))),
87
- needHideEndButtons && (react_1.default.createElement("div", { className: exports.cx('after-field', 'narrow-screen') },
88
- react_1.default.createElement("div", { className: exports.cx('buttons-container') },
85
+ react_1.default.createElement("div", { className: (0, exports.cx)('after-field', needHideEndButtons && 'wide-screen') },
86
+ react_1.default.createElement("div", { className: (0, exports.cx)('buttons-container') }, endButtons.map((props, index) => (react_1.default.createElement(Button, Object.assign({}, props, { key: index })))))),
87
+ needHideEndButtons && (react_1.default.createElement("div", { className: (0, exports.cx)('after-field', 'narrow-screen') },
88
+ react_1.default.createElement("div", { className: (0, exports.cx)('buttons-container') },
89
89
  react_1.default.createElement(Button, { text: '\u0411\u043E\u043B\u044C\u0448\u0435', ref: dropDownOpenerRef, icon: more_vert_1.default, onClick: () => toggleDropdown(!shownDropdown) })),
90
- shownDropdown && (react_1.default.createElement("div", { ref: dropDownRef, className: exports.cx('dropdown-container') },
90
+ shownDropdown && (react_1.default.createElement("div", { ref: dropDownRef, className: (0, exports.cx)('dropdown-container') },
91
91
  react_1.default.createElement(dropdown_1.Dropdown, null, endButtons.map(({ text, onClick }, index) => (react_1.default.createElement(dropdown_item_1.DropdownItem, { size: 's', key: index, onClick: event => {
92
92
  onClick(event);
93
93
  toggleDropdown(false);
@@ -103,6 +103,6 @@ exports.SearchBar = SearchBar;
103
103
  * @param props.iconColor Цвет иконки.
104
104
  * @return Элемент.
105
105
  */
106
- const Button = react_1.forwardRef(function Button({ text, icon: Icon, iconColor = 'gray87', onClick }, ref) {
107
- return (react_1.default.createElement("div", { ref: ref, onClick: onClick, className: exports.cx('button'), role: 'button', "data-testid": 'search-bar-button', tabIndex: 0, "aria-label": Icon && text }, Icon ? react_1.default.createElement(Icon, { fill: colors_1.COLORS.get(iconColor), "aria-hidden": 'true' }) : text));
106
+ const Button = (0, react_1.forwardRef)(function Button({ text, icon: Icon, iconColor = 'gray87', onClick }, ref) {
107
+ return (react_1.default.createElement("div", { ref: ref, onClick: onClick, className: (0, exports.cx)('button'), role: 'button', "data-testid": 'search-bar-button', tabIndex: 0, "aria-label": Icon && text }, Icon ? react_1.default.createElement(Icon, { fill: colors_1.COLORS.get(iconColor), "aria-hidden": 'true' }) : text));
108
108
  });
@@ -34,10 +34,10 @@ const select_screen_module_scss_1 = __importDefault(require("./select-screen.mod
34
34
  * @return Экран выбора опции.
35
35
  */
36
36
  const SelectScreen = (_a) => {
37
- var { items, getItemName = prop_1.default('name'), displayItem = displayOption, isItemSelected = lodash_1.noop, onItemClick } = _a, screenProps = __rest(_a, ["items", "getItemName", "displayItem", "isItemSelected", "onItemClick"]);
37
+ var { items, getItemName = (0, prop_1.default)('name'), displayItem = displayOption, isItemSelected = lodash_1.noop, onItemClick } = _a, screenProps = __rest(_a, ["items", "getItemName", "displayItem", "isItemSelected", "onItemClick"]);
38
38
  return (react_1.default.createElement(screen_1.Screen, Object.assign({ withDivideHeader: false }, screenProps),
39
39
  react_1.default.createElement(layout_1.MobileLayout, { disabledOn: ['mxs', 'ms'] },
40
- react_1.default.createElement("div", { className: select_screen_module_scss_1.default.container }, lodash_1.map(items, (item, index) => {
40
+ react_1.default.createElement("div", { className: select_screen_module_scss_1.default.container }, (0, lodash_1.map)(items, (item, index) => {
41
41
  const isSelected = Boolean(isItemSelected(item));
42
42
  return (react_1.default.createElement("button", { key: index, className: select_screen_module_scss_1.default.item, onClick: () => onItemClick && onItemClick(item) },
43
43
  displayItem(item, { getItemName, isSelected }),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sima-land/moleculas",
3
- "version": "12.3.0",
3
+ "version": "12.3.1",
4
4
  "repository": "ssh://git@github.com:sima-land/moleculas.git",
5
5
  "author": "www.sima-land.ru team",
6
6
  "license": "Apache-2.0",
@@ -13,23 +13,24 @@
13
13
  "build:before": "rimraf build",
14
14
  "build:main": "tsc --project tsconfig.build.json",
15
15
  "build:after": "node .build/dist.js",
16
- "build": "yarn build:before && yarn build:main && yarn build:after",
16
+ "build": "npm run build:before && npm run build:main && npm run build:after",
17
17
  "type-check": "tsc -p . --noEmit",
18
18
  "test": "jest",
19
19
  "coverage": "jest --coverage",
20
20
  "lint:scripts": "eslint --cache src/ --ext .js,.jsx,.ts,.tsx",
21
21
  "lint:styles": "stylelint 'src/**/*.scss'",
22
22
  "storybook": "start-storybook -p 6006",
23
- "storybook:build": "build-storybook --no-dll --quiet --loglevel error -o build-storybook",
23
+ "storybook:build": "build-storybook --quiet --loglevel error -o build-storybook",
24
24
  "prettier": "prettier --write \"./src/**/*.{js,jsx,ts,tsx,css,scss}\" --loglevel error",
25
25
  "prettier:check": "prettier --check \"./src/**/*.{js,jsx,ts,tsx,css,scss}\" --loglevel error"
26
26
  },
27
27
  "dependencies": {
28
- "@sima-land/ui-nucleons": "^40.0.0",
29
- "@sima-land/ui-quarks": "^2.0.1",
28
+ "@sima-land/ui-nucleons": "^40.3.0",
29
+ "@sima-land/ui-quarks": "^2.2.0",
30
30
  "classnames": "^2.3.1",
31
+ "date-fns": "^2.26.0",
31
32
  "lodash": "^4.17.21",
32
- "react-svg": "^11.2.2",
33
+ "react-svg": "^14.1.3",
33
34
  "react-transition-group": "^4.4.1"
34
35
  },
35
36
  "peerDependencies": {
@@ -37,40 +38,39 @@
37
38
  "react-dom": ">=17"
38
39
  },
39
40
  "devDependencies": {
40
- "@babel/core": "^7.14.8",
41
- "@babel/preset-env": "^7.14.8",
42
- "@babel/preset-react": "^7.14.5",
43
- "@rushstack/eslint-patch": "^1.0.9",
44
- "@sima-land/linters": "^2.1.0",
41
+ "@babel/core": "^7.16.0",
42
+ "@babel/preset-env": "^7.16.4",
43
+ "@babel/preset-react": "^7.16.0",
44
+ "@rushstack/eslint-patch": "^1.1.0",
45
+ "@sima-land/linters": "^2.1.1",
45
46
  "@storybook/addon-actions": "^6.3.12",
46
47
  "@storybook/addon-docs": "^6.3.12",
47
48
  "@storybook/addon-storysource": "^6.3.12",
48
49
  "@storybook/addon-viewport": "^6.3.12",
50
+ "@storybook/builder-webpack5": "^6.3.12",
51
+ "@storybook/manager-webpack5": "^6.3.12",
49
52
  "@storybook/react": "^6.3.12",
50
53
  "@storybook/theming": "^6.3.12",
51
54
  "@svgr/webpack": "^5.5.0",
52
55
  "@testing-library/react": "^12.1.0",
53
- "@types/enzyme": "^3.10.8",
54
- "@types/jest": "^26.0.22",
55
- "@types/lodash": "^4.14.169",
56
- "@types/react-dom": "^17.0.4",
57
- "@types/react-transition-group": "^4.4.1",
58
- "@typescript-eslint/eslint-plugin": "^4.22.0",
59
- "@typescript-eslint/parser": "^4.22.0",
60
- "@wojtekmaj/enzyme-adapter-react-17": "^0.6.3",
61
- "babel-preset-jest": "^27.0.6",
56
+ "@types/enzyme": "^3.10.10",
57
+ "@types/jest": "^27.0.3",
58
+ "@types/lodash": "^4.14.177",
59
+ "@types/react-dom": "^17.0.11",
60
+ "@types/react-transition-group": "^4.4.4",
61
+ "@wojtekmaj/enzyme-adapter-react-17": "^0.6.5",
62
+ "babel-preset-jest": "^27.2.0",
62
63
  "copyfiles": "^2.4.1",
63
64
  "css-loader": "^5.0.1",
64
- "date-fns": "^2.16.1",
65
65
  "enzyme": "^3.11.0",
66
- "enzyme-adapter-react-16": "^1.15.2",
67
66
  "enzyme-to-json": "^3.4.4",
68
67
  "eslint": "^7.32.0",
69
- "husky": "^7.0.1",
68
+ "husky": "^7.0.4",
70
69
  "identity-obj-proxy": "^3.0.0",
71
- "jest": "^26.6.3",
72
- "lint-staged": "^11.1.1",
73
- "prettier": "^2.4.1",
70
+ "jest": "^27.3.1",
71
+ "lint-staged": "^12.1.2",
72
+ "postcss": "^8.3.11",
73
+ "prettier": "^2.5.0",
74
74
  "react": "^17.0.2",
75
75
  "react-docgen-typescript": "^2.1.1",
76
76
  "react-dom": "^17.0.2",
@@ -78,9 +78,9 @@
78
78
  "sass": "^1.36.0",
79
79
  "sass-loader": "^10.1.0",
80
80
  "style-loader": "^2.0.0",
81
- "stylelint": "^13.13.1",
82
- "ts-jest": "^26.5.5",
81
+ "stylelint": "^14.1.0",
82
+ "ts-jest": "^27.0.7",
83
83
  "typescript": "^4.2.4",
84
- "webpack": "^5.47.1"
84
+ "webpack": "^5.64.4"
85
85
  }
86
86
  }
package/README.md DELETED
@@ -1,86 +0,0 @@
1
- # Библиотека компонентов www.sima-land.ru
2
-
3
- React-компоненты, привязанные к контексту интернет-магазина.
4
-
5
- ## Начало работы
6
-
7
- ### Подключение
8
-
9
- Для подключения к проекту используйте
10
-
11
- ```bash
12
- # npm
13
- $ npm i -S @sima-land/moleculas
14
-
15
- # yarn
16
- $ yarn add @sima-land/moleculas
17
- ```
18
-
19
- ### Консольные команды, необходимые в процессе разработки
20
-
21
- * `yarn test` - запуск unit-тестов
22
- * `yarn lint` - запуск линтеров
23
- * `yarn storybook` - запуск *storybook*
24
-
25
- ## Соглашения
26
-
27
- 1. В проекте используется линтер *ESLint*. Чтобы сделать `commit` и `push` в репозиторий, изменения должны пройти проверку линтером.
28
- 1. Необходимо полное покрытие тестами всего функционала. Чтобы сделать `push` в репозиторий, все тесты должны пройти успешно.
29
- 1. Коммиты должны быть оформлены по следующему шаблону:
30
- ```
31
- [№ задачи] [Название задачи]
32
-
33
- [Изменение №1]
34
- [Изменение №2]
35
- ...
36
- [Изменение №n]
37
- ```
38
- Пример:
39
- ```
40
- #62 Подключить отладку серверного приложения, написать документацию по работе с проектом
41
-
42
- Внесены изменения в README.md, добавлены инструкции по началу работы в проекте
43
- Добавлены конфигурационные файлы для Jest
44
- Настроена отладка приложения в режиме разработки, инструкции по настройке IDE добавлены в README.md
45
- ```
46
-
47
- ## Отладка
48
-
49
- Для отладки иногда полезно подключить данную библиотеку к проекту напрямую, сделав `symlink` в файловой системе.
50
-
51
- 1. Клонируем библиотеку. Заходим в папку этой библиотеки и делаем ```yarn build && cd build && yarn link```. Это нужно сделать 1 раз.
52
- 2. Заходим в папку проекта к которому подключена библиотека и делаем ```yarn link "@sima-land/moleculas"```. Это
53
- приведет к тому, что код в node_modules будет заменен на ссылку в вашей FS.
54
- 3. Для возврата в нормальный режим ```yarn unlink "@sima-land/moleculas" && yarn install --force```
55
-
56
- Примечание: Если возникли ошибки с реактом/хуками, и одной из проблем в логе ошибки значится дублирование react'a,
57
- следует сделать линк реакта молекул с реактом проекта:
58
- 1. Директория проекта куда добавлены молекулы `cd ./node_modules/react && yarn link`.
59
- 2. Директория молекул `yarn link "react"`.
60
-
61
- ## Витрина компонентов
62
-
63
- В качестве витрины компонентов для отображения размещенных в библиотеке компонентов используется [storybook](https://storybook.js.org/)
64
-
65
- Истории и документация компонентов позволяют увидеть варианты использования компонента с различными свойствами и примеры использования не вникая в код и логику компонента, что позволяет ускорить разработку при использовании библиотеки.
66
- Поэтому, при создании историй/документации компонентов необходимо учитывать различные **варианты использования** и различные **комбинации входных параметров**.
67
-
68
- ### Соглашения
69
-
70
- Истории компонентов должны соответствовать формату `*.stories.(ts|tsx)`.
71
-
72
- Истории и вспомогательные файлы должны размещаться в директории `__stories__` в директории компонента.
73
-
74
- ### Требования к историям/документации
75
-
76
- **История должна содержать:**
77
- - Вариант использования компонента;
78
- - Наименование, соответствующее варианту использования;
79
- - Необходимые начальные свойства (их можно изменить в UI Storybook на вкладке _Controls_).
80
-
81
- **Документация/блок историй должны содержать:**
82
- - Наименование компонента с префиксом группы, например `desktop/MyComponent`;
83
- - Текстовое описание компонента;
84
- - Блок кода с примером использования компонента;
85
- - Если компонент принимает в параметрах функции-обработчики, то они должны быть объявлены как [action](https://storybook.js.org/docs/react/essentials/actions), для отображения выполнения обработчиков на вкладке _Actions_ в UI.
86
- Для свойств-обработчиков, чьи имена начинаются с `on*` добавление [action](https://storybook.js.org/docs/react/essentials/actions) происходит автоматически, дополнительных действий с ними не требуется.