@megafon/ui-core 8.0.4 → 8.1.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.
@@ -0,0 +1 @@
1
+ @charset "UTF-8";h1,h2,h3,h4,h5{margin:0}.mfui-parameter__wrapper{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding:24px 0}.mfui-parameter_border-top.mfui-parameter_border-color_default .mfui-parameter__wrapper{border-top:1px solid var(--spbSky1)}.mfui-parameter_border-bottom.mfui-parameter_border-color_default .mfui-parameter__wrapper{border-bottom:1px solid var(--spbSky1)}.mfui-parameter_border-top.mfui-parameter_border-color_darker .mfui-parameter__wrapper{border-top:1px solid var(--spbSky2)}.mfui-parameter_border-bottom.mfui-parameter_border-color_darker .mfui-parameter__wrapper{border-bottom:1px solid var(--spbSky2)}.mfui-parameter__main{display:-webkit-box;display:-ms-flexbox;display:flex;gap:20px;-webkit-box-align:baseline;-ms-flex-align:baseline;align-items:baseline;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.mfui-parameter__main:not(:first-child){margin-top:24px}.mfui-parameter__main_with-out-title{margin-top:16px!important}.mfui-parameter__main_with-badge{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.mfui-parameter__title-item_size_default{font-size:15px;font-weight:500;line-height:24px}.mfui-parameter__title-item_size_big{font-size:18px;font-weight:500;letter-spacing:.5px;line-height:24px}@media screen and (min-width:1280px){.mfui-parameter__title-item_size_big{font-size:20px;line-height:28px}}@media screen and (max-width:767px){.mfui-parameter__title-item{font-size:15px;font-weight:500;line-height:24px}}.mfui-parameter__icon{display:inline-block;height:24px;margin-left:1px;margin-right:8px;overflow:hidden;vertical-align:bottom;width:24px}.mfui-parameter__badge{margin-bottom:8px}@media screen and (min-width:768px){.mfui-parameter__title .mfui-parameter__desc{width:100%}}.mfui-parameter__tooltip{cursor:pointer;display:inline-block;height:20px;margin-left:8px;vertical-align:text-bottom;width:20px;fill:var(--spbSky2)}.mfui-parameter__tooltip-inner{max-width:350px}.mfui-parameter__desc{margin-top:12px}@media screen and (min-width:768px){.mfui-parameter__desc{width:70%}}.mfui-parameter__desc_collapsible{margin-top:12px}.mfui-parameter__value-wrapper{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:baseline;-ms-flex-align:baseline;align-items:baseline;border-radius:8px;padding:4px 8px;text-align:right;white-space:pre-line}.mfui-parameter__value-wrapper_frame_default{background:var(--base)}.mfui-parameter__value-wrapper_frame_gray{background:var(--spbSky0)}.mfui-parameter__value{font-size:18px;font-weight:500;letter-spacing:.5px;line-height:24px}@media screen and (min-width:1280px){.mfui-parameter__value{font-size:20px;line-height:28px}}@media screen and (max-width:767px){.mfui-parameter__value{font-size:15px;font-weight:500;line-height:24px}}.mfui-parameter__value-unit:before{content:" "}
@@ -0,0 +1,59 @@
1
+ import * as React from 'react';
2
+ import PromoBadge from '../Badges/PromoBadge/PromoBadge';
3
+ import { DescriptionType } from './components/ParameterDescription';
4
+ import './Parameter.scss';
5
+ type BadgeTypesType = React.ComponentProps<typeof PromoBadge>['type'];
6
+ type BadgeColorType = React.ComponentProps<typeof PromoBadge>['color'];
7
+ type TitleSizeType = 'default' | 'big';
8
+ type ValueFrameColorType = 'none' | 'default' | 'gray';
9
+ type ItemType = {
10
+ title?: React.ReactNode[];
11
+ titleSize?: TitleSizeType;
12
+ description?: DescriptionType[];
13
+ value?: string | React.ReactNode;
14
+ valueUnit?: string;
15
+ valueFrameColor?: ValueFrameColorType;
16
+ };
17
+ export interface IParameter {
18
+ /** Массив с данными для строки */
19
+ items: ItemType[];
20
+ /** Дополнительный класс для основного контейнера */
21
+ className?: string;
22
+ /** Текст для бейджа */
23
+ badge?: string;
24
+ /** DEPRECATED. Тип бэйджа (используйте badgeColor) */
25
+ badgeType?: BadgeTypesType;
26
+ /** Цвет бейджа */
27
+ badgeColor?: BadgeColorType;
28
+ /** Текст тултипа */
29
+ tooltip?: string;
30
+ /** Отключить верхнюю границу */
31
+ disableBorderTop?: boolean;
32
+ /** Наличие нижней границы */
33
+ borderBottom?: boolean;
34
+ /** Цвет верхней и нижней границ */
35
+ borderColor?: 'default' | 'darker';
36
+ /** Единое значение для всей строки */
37
+ mergedValue?: string;
38
+ /** Иконка для строки */
39
+ icon?: React.ReactNode;
40
+ /** Растягивание компонента на всю доступную ширину */
41
+ fullWidth?: boolean;
42
+ /** Дополнительные data атрибуты к внутренним элементам */
43
+ dataAttrs?: {
44
+ root?: Record<string, string>;
45
+ moreLink?: Record<string, string>;
46
+ itemTitle?: Record<string, string>;
47
+ itemValue?: Record<string, string>;
48
+ };
49
+ /** Дополнительные классы для внутренних элементов */
50
+ classes?: {
51
+ title?: string;
52
+ openedDescription?: string;
53
+ toggleDescription?: string;
54
+ };
55
+ /** Ссылка на корневой элемент */
56
+ rootRef?: React.Ref<HTMLDivElement>;
57
+ }
58
+ declare const Parameter: React.FC<IParameter>;
59
+ export default Parameter;
@@ -0,0 +1,139 @@
1
+ import _extends from "@babel/runtime/helpers/extends";
2
+ import "core-js/modules/es.symbol.js";
3
+ import "core-js/modules/es.symbol.description.js";
4
+ import "core-js/modules/es.array.map.js";
5
+ import * as React from 'react';
6
+ import { cnCreate, filterDataAttrs, convert } from '@megafon/ui-helpers';
7
+ import PromoBadge from "../Badges/PromoBadge/PromoBadge";
8
+ import Caption from "../Caption/Caption";
9
+ import Grid from "../Grid/Grid";
10
+ import GridColumn from "../Grid/GridColumn";
11
+ import Tooltip from "../Tooltip/Tooltip";
12
+ import ParameterDescription from "./components/ParameterDescription";
13
+ import { getColumnConfig } from "./helpers";
14
+ import "./Parameter.css";
15
+ var InfoIcon = function InfoIcon(props) {
16
+ return /*#__PURE__*/React.createElement("svg", _extends({
17
+ viewBox: "0 0 20 20"
18
+ }, props), /*#__PURE__*/React.createElement("path", {
19
+ d: "M10 2c4.4 0 8 3.6 8 8s-3.6 8-8 8-8-3.6-8-8 3.6-8 8-8zm0 5c.6 0 1-.4 1-1s-.4-1-1-1-1 .4-1 1 .4 1 1 1zm1 8V9H9v6h2z"
20
+ }));
21
+ };
22
+ var cn = cnCreate('mfui-parameter');
23
+ var Parameter = function Parameter(_ref) {
24
+ var items = _ref.items,
25
+ className = _ref.className,
26
+ _ref$badge = _ref.badge,
27
+ badge = _ref$badge === void 0 ? '' : _ref$badge,
28
+ _ref$badgeType = _ref.badgeType,
29
+ badgeType = _ref$badgeType === void 0 ? 'popular' : _ref$badgeType,
30
+ badgeColor = _ref.badgeColor,
31
+ tooltip = _ref.tooltip,
32
+ icon = _ref.icon,
33
+ _ref$disableBorderTop = _ref.disableBorderTop,
34
+ disableBorderTop = _ref$disableBorderTop === void 0 ? false : _ref$disableBorderTop,
35
+ _ref$borderBottom = _ref.borderBottom,
36
+ borderBottom = _ref$borderBottom === void 0 ? false : _ref$borderBottom,
37
+ _ref$borderColor = _ref.borderColor,
38
+ borderColor = _ref$borderColor === void 0 ? 'default' : _ref$borderColor,
39
+ _ref$mergedValue = _ref.mergedValue,
40
+ mergedValue = _ref$mergedValue === void 0 ? '' : _ref$mergedValue,
41
+ _ref$fullWidth = _ref.fullWidth,
42
+ fullWidth = _ref$fullWidth === void 0 ? false : _ref$fullWidth,
43
+ _ref$classes = _ref.classes,
44
+ classes = _ref$classes === void 0 ? {} : _ref$classes,
45
+ dataAttrs = _ref.dataAttrs,
46
+ rootRef = _ref.rootRef;
47
+ var tooltipRef = React.useRef(null);
48
+ var renderTitle = function renderTitle(titles, titleSize, isFirstItem) {
49
+ return titles === null || titles === void 0 ? void 0 : titles.map(function (titleItem, i) {
50
+ var isFirstTitle = i === 0;
51
+ return /*#__PURE__*/React.createElement("div", _extends({
52
+ key: i,
53
+ className: cn('title-item', {
54
+ size: titleSize
55
+ }, [classes.title])
56
+ }, filterDataAttrs(dataAttrs === null || dataAttrs === void 0 ? void 0 : dataAttrs.itemTitle, i + 1)), icon && isFirstTitle && /*#__PURE__*/React.createElement("div", {
57
+ className: cn('icon')
58
+ }, icon), titleItem, tooltip && isFirstItem && isFirstTitle && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
59
+ className: cn('tooltip'),
60
+ ref: tooltipRef
61
+ }, /*#__PURE__*/React.createElement(InfoIcon, null)), /*#__PURE__*/React.createElement(Tooltip, {
62
+ className: cn('tooltip-inner'),
63
+ triggerElement: tooltipRef
64
+ }, tooltip)));
65
+ });
66
+ };
67
+ var renderDescription = function renderDescription(description) {
68
+ return description === null || description === void 0 ? void 0 : description.map(function (_ref2, j) {
69
+ var value = _ref2.value,
70
+ isCollapsible = _ref2.isCollapsible;
71
+ return /*#__PURE__*/React.createElement("div", {
72
+ className: cn('desc', {
73
+ collapsible: isCollapsible
74
+ }),
75
+ key: j
76
+ }, /*#__PURE__*/React.createElement(ParameterDescription, {
77
+ value: value,
78
+ isCollapsible: isCollapsible,
79
+ dataAttrs: {
80
+ moreLink: dataAttrs === null || dataAttrs === void 0 ? void 0 : dataAttrs.moreLink
81
+ },
82
+ classes: {
83
+ open: classes.openedDescription,
84
+ toggle: classes.toggleDescription
85
+ }
86
+ }));
87
+ });
88
+ };
89
+ var renderValue = function renderValue(valueFrameColor, value, valueUnit) {
90
+ return /*#__PURE__*/React.createElement("div", _extends({
91
+ className: cn('value-wrapper', {
92
+ frame: valueFrameColor
93
+ })
94
+ }, filterDataAttrs(dataAttrs === null || dataAttrs === void 0 ? void 0 : dataAttrs.itemValue)), /*#__PURE__*/React.createElement("div", {
95
+ className: cn('value')
96
+ }, typeof value === 'string' ? convert(value, {}) : value), valueUnit && /*#__PURE__*/React.createElement(Caption, {
97
+ className: cn('value-unit'),
98
+ hasMargin: false
99
+ }, convert(valueUnit, {})));
100
+ };
101
+ return /*#__PURE__*/React.createElement("div", _extends({
102
+ className: cn({
103
+ 'border-top': !disableBorderTop,
104
+ 'border-bottom': borderBottom,
105
+ 'border-color': borderColor
106
+ }, [className])
107
+ }, filterDataAttrs(dataAttrs === null || dataAttrs === void 0 ? void 0 : dataAttrs.root), {
108
+ ref: rootRef
109
+ }), /*#__PURE__*/React.createElement(Grid, null, /*#__PURE__*/React.createElement(GridColumn, getColumnConfig(fullWidth), /*#__PURE__*/React.createElement("div", {
110
+ className: cn('wrapper')
111
+ }, items.map(function (_ref3, i) {
112
+ var title = _ref3.title,
113
+ value = _ref3.value,
114
+ description = _ref3.description,
115
+ _ref3$valueUnit = _ref3.valueUnit,
116
+ valueUnit = _ref3$valueUnit === void 0 ? '' : _ref3$valueUnit,
117
+ _ref3$titleSize = _ref3.titleSize,
118
+ titleSize = _ref3$titleSize === void 0 ? 'default' : _ref3$titleSize,
119
+ _ref3$valueFrameColor = _ref3.valueFrameColor,
120
+ valueFrameColor = _ref3$valueFrameColor === void 0 ? 'none' : _ref3$valueFrameColor;
121
+ var isFirstItem = i === 0;
122
+ var isRenderBadge = isFirstItem && !!badge;
123
+ return /*#__PURE__*/React.createElement(React.Fragment, {
124
+ key: i
125
+ }, /*#__PURE__*/React.createElement("div", {
126
+ className: cn('main', {
127
+ 'with-badge': isRenderBadge,
128
+ 'with-out-title': !title
129
+ })
130
+ }, /*#__PURE__*/React.createElement("div", {
131
+ className: cn('title')
132
+ }, isRenderBadge && /*#__PURE__*/React.createElement(PromoBadge, {
133
+ className: cn('badge'),
134
+ type: badgeType,
135
+ color: badgeColor
136
+ }, badge), title ? renderTitle(title, titleSize, isFirstItem) : renderDescription(description)), mergedValue && isFirstItem && renderValue(valueFrameColor, mergedValue, valueUnit), !mergedValue && value && renderValue(valueFrameColor, value, valueUnit)), title && renderDescription(description));
137
+ })))));
138
+ };
139
+ export default Parameter;
@@ -0,0 +1 @@
1
+ h1,h2,h3,h4,h5{margin:0}.mfui-parameter-description__collapse{color:var(--systemBlue);cursor:pointer;font-size:12px;-webkit-text-decoration:underline dashed var(--systemBlue);text-decoration:underline dashed var(--systemBlue)}.mfui-parameter-description__content-inner{margin-bottom:8px}
@@ -0,0 +1,16 @@
1
+ import * as React from 'react';
2
+ import './ParameterDescription.scss';
3
+ export type DescriptionType = {
4
+ value: string | React.ReactNode[];
5
+ isCollapsible?: boolean;
6
+ classes?: {
7
+ toggle?: string;
8
+ open?: string;
9
+ };
10
+ dataAttrs?: {
11
+ root?: Record<string, string>;
12
+ moreLink?: Record<string, string>;
13
+ };
14
+ };
15
+ declare const ParameterDescription: React.FC<DescriptionType>;
16
+ export default ParameterDescription;
@@ -0,0 +1,39 @@
1
+ import _extends from "@babel/runtime/helpers/extends";
2
+ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
3
+ import * as React from 'react';
4
+ import { cnCreate, filterDataAttrs } from '@megafon/ui-helpers';
5
+ import Collapse from "../../_Collapse/Collapse";
6
+ import "./ParameterDescription.css";
7
+ var cn = cnCreate('mfui-parameter-description');
8
+ var ParameterDescription = function ParameterDescription(_ref) {
9
+ var value = _ref.value,
10
+ _ref$isCollapsible = _ref.isCollapsible,
11
+ isCollapsible = _ref$isCollapsible === void 0 ? false : _ref$isCollapsible,
12
+ _ref$classes = _ref.classes,
13
+ classes = _ref$classes === void 0 ? {} : _ref$classes,
14
+ dataAttrs = _ref.dataAttrs;
15
+ var _React$useState = React.useState(false),
16
+ _React$useState2 = _slicedToArray(_React$useState, 2),
17
+ isOpened = _React$useState2[0],
18
+ setIsOpened = _React$useState2[1];
19
+ var handleClickDesc = React.useCallback(function () {
20
+ return setIsOpened(!isOpened);
21
+ }, [isOpened]);
22
+ if (isCollapsible) {
23
+ return /*#__PURE__*/React.createElement("div", _extends({
24
+ className: cn([isOpened ? classes.open : undefined])
25
+ }, filterDataAttrs(dataAttrs === null || dataAttrs === void 0 ? void 0 : dataAttrs.root)), /*#__PURE__*/React.createElement(Collapse, {
26
+ className: cn('content'),
27
+ classNameContainer: cn('content-inner'),
28
+ isOpened: isOpened
29
+ }, value), /*#__PURE__*/React.createElement("span", _extends({
30
+ className: cn('collapse', classes.toggle)
31
+ }, filterDataAttrs(dataAttrs === null || dataAttrs === void 0 ? void 0 : dataAttrs.moreLink), {
32
+ onClick: handleClickDesc
33
+ }), isOpened ? 'Скрыть' : 'Подробнее'));
34
+ }
35
+ return /*#__PURE__*/React.createElement("div", {
36
+ className: cn()
37
+ }, value);
38
+ };
39
+ export default ParameterDescription;
@@ -0,0 +1,6 @@
1
+ import React from 'react';
2
+ import GridColumn from '../Grid/GridColumn';
3
+ type GridColumnPropsType = React.ComponentProps<typeof GridColumn>;
4
+ type GridColumnConfigType = Partial<Pick<GridColumnPropsType, 'all' | 'wide' | 'desktop' | 'tablet' | 'mobile'>>;
5
+ export declare const getColumnConfig: (isFullWidth: boolean) => GridColumnConfigType;
6
+ export {};
@@ -0,0 +1,10 @@
1
+ export var getColumnConfig = function getColumnConfig(isFullWidth) {
2
+ return isFullWidth ? {
3
+ all: '12'
4
+ } : {
5
+ wide: '8',
6
+ desktop: '10',
7
+ tablet: '12',
8
+ mobile: '12'
9
+ };
10
+ };
@@ -324,8 +324,14 @@ var Search = function Search(_ref) {
324
324
  labelRef.current.style.top = "".concat(DEFAULT_LABEL_TOP_POSITION - scrollTop, "px");
325
325
  };
326
326
  React.useEffect(function () {
327
+ return setSearchQuery(value);
328
+ }, [value]);
329
+ React.useEffect(function () {
330
+ if (value !== searchQuery) {
331
+ return;
332
+ }
327
333
  textareaResize();
328
- }, [textareaResize]);
334
+ }, [searchQuery, value, textareaResize]);
329
335
  React.useEffect(function () {
330
336
  if (!resizerRef.current || !isTextarea || !showResizer) {
331
337
  return;
@@ -362,9 +368,6 @@ var Search = function Search(_ref) {
362
368
  resizerRef.current.addEventListener('mousedown', handleStartResize);
363
369
  resizerRef.current.addEventListener('touchstart', handleStartResize);
364
370
  }, [isTextarea, minTextareaHeight, showResizer]);
365
- React.useEffect(function () {
366
- return setSearchQuery(value);
367
- }, [value]);
368
371
  React.useEffect(function () {
369
372
  debouncedOnChange.current = debounce(function (inputValue) {
370
373
  return onChange && onChange(inputValue);
@@ -43,6 +43,8 @@ export { default as PaginationButton } from './components/Pagination/components/
43
43
  export { default as PaginationButtons } from './components/Pagination/components/PaginationButtons/PaginationButtons';
44
44
  export { default as PaginationNavigation } from './components/Pagination/components/PaginationNavigation/PaginationNavigation';
45
45
  export { default as Paragraph } from './components/Paragraph/Paragraph';
46
+ export { default as Parameter } from './components/Parameter/Parameter';
47
+ export { default as ParameterDescription } from './components/Parameter/components/ParameterDescription';
46
48
  export { default as Preloader } from './components/Preloader/Preloader';
47
49
  export { default as PriceBadge } from './components/Badges/PriceBadge/PriceBadge';
48
50
  export { default as PromoBadge } from './components/Badges/PromoBadge/PromoBadge';
package/dist/es/index.js CHANGED
@@ -43,6 +43,8 @@ export { default as PaginationButton } from "./components/Pagination/components/
43
43
  export { default as PaginationButtons } from "./components/Pagination/components/PaginationButtons/PaginationButtons";
44
44
  export { default as PaginationNavigation } from "./components/Pagination/components/PaginationNavigation/PaginationNavigation";
45
45
  export { default as Paragraph } from "./components/Paragraph/Paragraph";
46
+ export { default as Parameter } from "./components/Parameter/Parameter";
47
+ export { default as ParameterDescription } from "./components/Parameter/components/ParameterDescription";
46
48
  export { default as Preloader } from "./components/Preloader/Preloader";
47
49
  export { default as PriceBadge } from "./components/Badges/PriceBadge/PriceBadge";
48
50
  export { default as PromoBadge } from "./components/Badges/PromoBadge/PromoBadge";
@@ -0,0 +1 @@
1
+ @charset "UTF-8";h1,h2,h3,h4,h5{margin:0}.mfui-parameter__wrapper{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding:24px 0}.mfui-parameter_border-top.mfui-parameter_border-color_default .mfui-parameter__wrapper{border-top:1px solid var(--spbSky1)}.mfui-parameter_border-bottom.mfui-parameter_border-color_default .mfui-parameter__wrapper{border-bottom:1px solid var(--spbSky1)}.mfui-parameter_border-top.mfui-parameter_border-color_darker .mfui-parameter__wrapper{border-top:1px solid var(--spbSky2)}.mfui-parameter_border-bottom.mfui-parameter_border-color_darker .mfui-parameter__wrapper{border-bottom:1px solid var(--spbSky2)}.mfui-parameter__main{display:-webkit-box;display:-ms-flexbox;display:flex;gap:20px;-webkit-box-align:baseline;-ms-flex-align:baseline;align-items:baseline;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.mfui-parameter__main:not(:first-child){margin-top:24px}.mfui-parameter__main_with-out-title{margin-top:16px!important}.mfui-parameter__main_with-badge{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.mfui-parameter__title-item_size_default{font-size:15px;font-weight:500;line-height:24px}.mfui-parameter__title-item_size_big{font-size:18px;font-weight:500;letter-spacing:.5px;line-height:24px}@media screen and (min-width:1280px){.mfui-parameter__title-item_size_big{font-size:20px;line-height:28px}}@media screen and (max-width:767px){.mfui-parameter__title-item{font-size:15px;font-weight:500;line-height:24px}}.mfui-parameter__icon{display:inline-block;height:24px;margin-left:1px;margin-right:8px;overflow:hidden;vertical-align:bottom;width:24px}.mfui-parameter__badge{margin-bottom:8px}@media screen and (min-width:768px){.mfui-parameter__title .mfui-parameter__desc{width:100%}}.mfui-parameter__tooltip{cursor:pointer;display:inline-block;height:20px;margin-left:8px;vertical-align:text-bottom;width:20px;fill:var(--spbSky2)}.mfui-parameter__tooltip-inner{max-width:350px}.mfui-parameter__desc{margin-top:12px}@media screen and (min-width:768px){.mfui-parameter__desc{width:70%}}.mfui-parameter__desc_collapsible{margin-top:12px}.mfui-parameter__value-wrapper{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:baseline;-ms-flex-align:baseline;align-items:baseline;border-radius:8px;padding:4px 8px;text-align:right;white-space:pre-line}.mfui-parameter__value-wrapper_frame_default{background:var(--base)}.mfui-parameter__value-wrapper_frame_gray{background:var(--spbSky0)}.mfui-parameter__value{font-size:18px;font-weight:500;letter-spacing:.5px;line-height:24px}@media screen and (min-width:1280px){.mfui-parameter__value{font-size:20px;line-height:28px}}@media screen and (max-width:767px){.mfui-parameter__value{font-size:15px;font-weight:500;line-height:24px}}.mfui-parameter__value-unit:before{content:" "}
@@ -0,0 +1,59 @@
1
+ import * as React from 'react';
2
+ import PromoBadge from '../Badges/PromoBadge/PromoBadge';
3
+ import { DescriptionType } from './components/ParameterDescription';
4
+ import './Parameter.scss';
5
+ type BadgeTypesType = React.ComponentProps<typeof PromoBadge>['type'];
6
+ type BadgeColorType = React.ComponentProps<typeof PromoBadge>['color'];
7
+ type TitleSizeType = 'default' | 'big';
8
+ type ValueFrameColorType = 'none' | 'default' | 'gray';
9
+ type ItemType = {
10
+ title?: React.ReactNode[];
11
+ titleSize?: TitleSizeType;
12
+ description?: DescriptionType[];
13
+ value?: string | React.ReactNode;
14
+ valueUnit?: string;
15
+ valueFrameColor?: ValueFrameColorType;
16
+ };
17
+ export interface IParameter {
18
+ /** Массив с данными для строки */
19
+ items: ItemType[];
20
+ /** Дополнительный класс для основного контейнера */
21
+ className?: string;
22
+ /** Текст для бейджа */
23
+ badge?: string;
24
+ /** DEPRECATED. Тип бэйджа (используйте badgeColor) */
25
+ badgeType?: BadgeTypesType;
26
+ /** Цвет бейджа */
27
+ badgeColor?: BadgeColorType;
28
+ /** Текст тултипа */
29
+ tooltip?: string;
30
+ /** Отключить верхнюю границу */
31
+ disableBorderTop?: boolean;
32
+ /** Наличие нижней границы */
33
+ borderBottom?: boolean;
34
+ /** Цвет верхней и нижней границ */
35
+ borderColor?: 'default' | 'darker';
36
+ /** Единое значение для всей строки */
37
+ mergedValue?: string;
38
+ /** Иконка для строки */
39
+ icon?: React.ReactNode;
40
+ /** Растягивание компонента на всю доступную ширину */
41
+ fullWidth?: boolean;
42
+ /** Дополнительные data атрибуты к внутренним элементам */
43
+ dataAttrs?: {
44
+ root?: Record<string, string>;
45
+ moreLink?: Record<string, string>;
46
+ itemTitle?: Record<string, string>;
47
+ itemValue?: Record<string, string>;
48
+ };
49
+ /** Дополнительные классы для внутренних элементов */
50
+ classes?: {
51
+ title?: string;
52
+ openedDescription?: string;
53
+ toggleDescription?: string;
54
+ };
55
+ /** Ссылка на корневой элемент */
56
+ rootRef?: React.Ref<HTMLDivElement>;
57
+ }
58
+ declare const Parameter: React.FC<IParameter>;
59
+ export default Parameter;
@@ -0,0 +1,148 @@
1
+ "use strict";
2
+
3
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports["default"] = void 0;
8
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
9
+ require("core-js/modules/es.symbol.js");
10
+ require("core-js/modules/es.symbol.description.js");
11
+ require("core-js/modules/es.array.map.js");
12
+ var React = _interopRequireWildcard(require("react"));
13
+ var _uiHelpers = require("@megafon/ui-helpers");
14
+ var _PromoBadge = _interopRequireDefault(require("../Badges/PromoBadge/PromoBadge"));
15
+ var _Caption = _interopRequireDefault(require("../Caption/Caption"));
16
+ var _Grid = _interopRequireDefault(require("../Grid/Grid"));
17
+ var _GridColumn = _interopRequireDefault(require("../Grid/GridColumn"));
18
+ var _Tooltip = _interopRequireDefault(require("../Tooltip/Tooltip"));
19
+ var _ParameterDescription = _interopRequireDefault(require("./components/ParameterDescription"));
20
+ var _helpers = require("./helpers");
21
+ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
22
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
23
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
24
+ var InfoIcon = function InfoIcon(props) {
25
+ return /*#__PURE__*/React.createElement("svg", (0, _extends2["default"])({
26
+ viewBox: "0 0 20 20"
27
+ }, props), /*#__PURE__*/React.createElement("path", {
28
+ d: "M10 2c4.4 0 8 3.6 8 8s-3.6 8-8 8-8-3.6-8-8 3.6-8 8-8zm0 5c.6 0 1-.4 1-1s-.4-1-1-1-1 .4-1 1 .4 1 1 1zm1 8V9H9v6h2z"
29
+ }));
30
+ };
31
+ var cn = (0, _uiHelpers.cnCreate)('mfui-parameter');
32
+ var Parameter = function Parameter(_ref) {
33
+ var items = _ref.items,
34
+ className = _ref.className,
35
+ _ref$badge = _ref.badge,
36
+ badge = _ref$badge === void 0 ? '' : _ref$badge,
37
+ _ref$badgeType = _ref.badgeType,
38
+ badgeType = _ref$badgeType === void 0 ? 'popular' : _ref$badgeType,
39
+ badgeColor = _ref.badgeColor,
40
+ tooltip = _ref.tooltip,
41
+ icon = _ref.icon,
42
+ _ref$disableBorderTop = _ref.disableBorderTop,
43
+ disableBorderTop = _ref$disableBorderTop === void 0 ? false : _ref$disableBorderTop,
44
+ _ref$borderBottom = _ref.borderBottom,
45
+ borderBottom = _ref$borderBottom === void 0 ? false : _ref$borderBottom,
46
+ _ref$borderColor = _ref.borderColor,
47
+ borderColor = _ref$borderColor === void 0 ? 'default' : _ref$borderColor,
48
+ _ref$mergedValue = _ref.mergedValue,
49
+ mergedValue = _ref$mergedValue === void 0 ? '' : _ref$mergedValue,
50
+ _ref$fullWidth = _ref.fullWidth,
51
+ fullWidth = _ref$fullWidth === void 0 ? false : _ref$fullWidth,
52
+ _ref$classes = _ref.classes,
53
+ classes = _ref$classes === void 0 ? {} : _ref$classes,
54
+ dataAttrs = _ref.dataAttrs,
55
+ rootRef = _ref.rootRef;
56
+ var tooltipRef = React.useRef(null);
57
+ var renderTitle = function renderTitle(titles, titleSize, isFirstItem) {
58
+ return titles === null || titles === void 0 ? void 0 : titles.map(function (titleItem, i) {
59
+ var isFirstTitle = i === 0;
60
+ return /*#__PURE__*/React.createElement("div", (0, _extends2["default"])({
61
+ key: i,
62
+ className: cn('title-item', {
63
+ size: titleSize
64
+ }, [classes.title])
65
+ }, (0, _uiHelpers.filterDataAttrs)(dataAttrs === null || dataAttrs === void 0 ? void 0 : dataAttrs.itemTitle, i + 1)), icon && isFirstTitle && /*#__PURE__*/React.createElement("div", {
66
+ className: cn('icon')
67
+ }, icon), titleItem, tooltip && isFirstItem && isFirstTitle && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
68
+ className: cn('tooltip'),
69
+ ref: tooltipRef
70
+ }, /*#__PURE__*/React.createElement(InfoIcon, null)), /*#__PURE__*/React.createElement(_Tooltip["default"], {
71
+ className: cn('tooltip-inner'),
72
+ triggerElement: tooltipRef
73
+ }, tooltip)));
74
+ });
75
+ };
76
+ var renderDescription = function renderDescription(description) {
77
+ return description === null || description === void 0 ? void 0 : description.map(function (_ref2, j) {
78
+ var value = _ref2.value,
79
+ isCollapsible = _ref2.isCollapsible;
80
+ return /*#__PURE__*/React.createElement("div", {
81
+ className: cn('desc', {
82
+ collapsible: isCollapsible
83
+ }),
84
+ key: j
85
+ }, /*#__PURE__*/React.createElement(_ParameterDescription["default"], {
86
+ value: value,
87
+ isCollapsible: isCollapsible,
88
+ dataAttrs: {
89
+ moreLink: dataAttrs === null || dataAttrs === void 0 ? void 0 : dataAttrs.moreLink
90
+ },
91
+ classes: {
92
+ open: classes.openedDescription,
93
+ toggle: classes.toggleDescription
94
+ }
95
+ }));
96
+ });
97
+ };
98
+ var renderValue = function renderValue(valueFrameColor, value, valueUnit) {
99
+ return /*#__PURE__*/React.createElement("div", (0, _extends2["default"])({
100
+ className: cn('value-wrapper', {
101
+ frame: valueFrameColor
102
+ })
103
+ }, (0, _uiHelpers.filterDataAttrs)(dataAttrs === null || dataAttrs === void 0 ? void 0 : dataAttrs.itemValue)), /*#__PURE__*/React.createElement("div", {
104
+ className: cn('value')
105
+ }, typeof value === 'string' ? (0, _uiHelpers.convert)(value, {}) : value), valueUnit && /*#__PURE__*/React.createElement(_Caption["default"], {
106
+ className: cn('value-unit'),
107
+ hasMargin: false
108
+ }, (0, _uiHelpers.convert)(valueUnit, {})));
109
+ };
110
+ return /*#__PURE__*/React.createElement("div", (0, _extends2["default"])({
111
+ className: cn({
112
+ 'border-top': !disableBorderTop,
113
+ 'border-bottom': borderBottom,
114
+ 'border-color': borderColor
115
+ }, [className])
116
+ }, (0, _uiHelpers.filterDataAttrs)(dataAttrs === null || dataAttrs === void 0 ? void 0 : dataAttrs.root), {
117
+ ref: rootRef
118
+ }), /*#__PURE__*/React.createElement(_Grid["default"], null, /*#__PURE__*/React.createElement(_GridColumn["default"], (0, _helpers.getColumnConfig)(fullWidth), /*#__PURE__*/React.createElement("div", {
119
+ className: cn('wrapper')
120
+ }, items.map(function (_ref3, i) {
121
+ var title = _ref3.title,
122
+ value = _ref3.value,
123
+ description = _ref3.description,
124
+ _ref3$valueUnit = _ref3.valueUnit,
125
+ valueUnit = _ref3$valueUnit === void 0 ? '' : _ref3$valueUnit,
126
+ _ref3$titleSize = _ref3.titleSize,
127
+ titleSize = _ref3$titleSize === void 0 ? 'default' : _ref3$titleSize,
128
+ _ref3$valueFrameColor = _ref3.valueFrameColor,
129
+ valueFrameColor = _ref3$valueFrameColor === void 0 ? 'none' : _ref3$valueFrameColor;
130
+ var isFirstItem = i === 0;
131
+ var isRenderBadge = isFirstItem && !!badge;
132
+ return /*#__PURE__*/React.createElement(React.Fragment, {
133
+ key: i
134
+ }, /*#__PURE__*/React.createElement("div", {
135
+ className: cn('main', {
136
+ 'with-badge': isRenderBadge,
137
+ 'with-out-title': !title
138
+ })
139
+ }, /*#__PURE__*/React.createElement("div", {
140
+ className: cn('title')
141
+ }, isRenderBadge && /*#__PURE__*/React.createElement(_PromoBadge["default"], {
142
+ className: cn('badge'),
143
+ type: badgeType,
144
+ color: badgeColor
145
+ }, badge), title ? renderTitle(title, titleSize, isFirstItem) : renderDescription(description)), mergedValue && isFirstItem && renderValue(valueFrameColor, mergedValue, valueUnit), !mergedValue && value && renderValue(valueFrameColor, value, valueUnit)), title && renderDescription(description));
146
+ })))));
147
+ };
148
+ var _default = exports["default"] = Parameter;
@@ -0,0 +1 @@
1
+ h1,h2,h3,h4,h5{margin:0}.mfui-parameter-description__collapse{color:var(--systemBlue);cursor:pointer;font-size:12px;-webkit-text-decoration:underline dashed var(--systemBlue);text-decoration:underline dashed var(--systemBlue)}.mfui-parameter-description__content-inner{margin-bottom:8px}
@@ -0,0 +1,16 @@
1
+ import * as React from 'react';
2
+ import './ParameterDescription.scss';
3
+ export type DescriptionType = {
4
+ value: string | React.ReactNode[];
5
+ isCollapsible?: boolean;
6
+ classes?: {
7
+ toggle?: string;
8
+ open?: string;
9
+ };
10
+ dataAttrs?: {
11
+ root?: Record<string, string>;
12
+ moreLink?: Record<string, string>;
13
+ };
14
+ };
15
+ declare const ParameterDescription: React.FC<DescriptionType>;
16
+ export default ParameterDescription;
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+
3
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports["default"] = void 0;
8
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
9
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
10
+ var React = _interopRequireWildcard(require("react"));
11
+ var _uiHelpers = require("@megafon/ui-helpers");
12
+ var _Collapse = _interopRequireDefault(require("../../_Collapse/Collapse"));
13
+ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
14
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
15
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
16
+ var cn = (0, _uiHelpers.cnCreate)('mfui-parameter-description');
17
+ var ParameterDescription = function ParameterDescription(_ref) {
18
+ var value = _ref.value,
19
+ _ref$isCollapsible = _ref.isCollapsible,
20
+ isCollapsible = _ref$isCollapsible === void 0 ? false : _ref$isCollapsible,
21
+ _ref$classes = _ref.classes,
22
+ classes = _ref$classes === void 0 ? {} : _ref$classes,
23
+ dataAttrs = _ref.dataAttrs;
24
+ var _React$useState = React.useState(false),
25
+ _React$useState2 = (0, _slicedToArray2["default"])(_React$useState, 2),
26
+ isOpened = _React$useState2[0],
27
+ setIsOpened = _React$useState2[1];
28
+ var handleClickDesc = React.useCallback(function () {
29
+ return setIsOpened(!isOpened);
30
+ }, [isOpened]);
31
+ if (isCollapsible) {
32
+ return /*#__PURE__*/React.createElement("div", (0, _extends2["default"])({
33
+ className: cn([isOpened ? classes.open : undefined])
34
+ }, (0, _uiHelpers.filterDataAttrs)(dataAttrs === null || dataAttrs === void 0 ? void 0 : dataAttrs.root)), /*#__PURE__*/React.createElement(_Collapse["default"], {
35
+ className: cn('content'),
36
+ classNameContainer: cn('content-inner'),
37
+ isOpened: isOpened
38
+ }, value), /*#__PURE__*/React.createElement("span", (0, _extends2["default"])({
39
+ className: cn('collapse', classes.toggle)
40
+ }, (0, _uiHelpers.filterDataAttrs)(dataAttrs === null || dataAttrs === void 0 ? void 0 : dataAttrs.moreLink), {
41
+ onClick: handleClickDesc
42
+ }), isOpened ? 'Скрыть' : 'Подробнее'));
43
+ }
44
+ return /*#__PURE__*/React.createElement("div", {
45
+ className: cn()
46
+ }, value);
47
+ };
48
+ var _default = exports["default"] = ParameterDescription;
@@ -0,0 +1,6 @@
1
+ import React from 'react';
2
+ import GridColumn from '../Grid/GridColumn';
3
+ type GridColumnPropsType = React.ComponentProps<typeof GridColumn>;
4
+ type GridColumnConfigType = Partial<Pick<GridColumnPropsType, 'all' | 'wide' | 'desktop' | 'tablet' | 'mobile'>>;
5
+ export declare const getColumnConfig: (isFullWidth: boolean) => GridColumnConfigType;
6
+ export {};
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.getColumnConfig = void 0;
7
+ var getColumnConfig = exports.getColumnConfig = function getColumnConfig(isFullWidth) {
8
+ return isFullWidth ? {
9
+ all: '12'
10
+ } : {
11
+ wide: '8',
12
+ desktop: '10',
13
+ tablet: '12',
14
+ mobile: '12'
15
+ };
16
+ };
@@ -333,8 +333,14 @@ var Search = function Search(_ref) {
333
333
  labelRef.current.style.top = "".concat(DEFAULT_LABEL_TOP_POSITION - scrollTop, "px");
334
334
  };
335
335
  React.useEffect(function () {
336
+ return setSearchQuery(value);
337
+ }, [value]);
338
+ React.useEffect(function () {
339
+ if (value !== searchQuery) {
340
+ return;
341
+ }
336
342
  textareaResize();
337
- }, [textareaResize]);
343
+ }, [searchQuery, value, textareaResize]);
338
344
  React.useEffect(function () {
339
345
  if (!resizerRef.current || !isTextarea || !showResizer) {
340
346
  return;
@@ -371,9 +377,6 @@ var Search = function Search(_ref) {
371
377
  resizerRef.current.addEventListener('mousedown', handleStartResize);
372
378
  resizerRef.current.addEventListener('touchstart', handleStartResize);
373
379
  }, [isTextarea, minTextareaHeight, showResizer]);
374
- React.useEffect(function () {
375
- return setSearchQuery(value);
376
- }, [value]);
377
380
  React.useEffect(function () {
378
381
  debouncedOnChange.current = (0, _lodash["default"])(function (inputValue) {
379
382
  return onChange && onChange(inputValue);
@@ -43,6 +43,8 @@ export { default as PaginationButton } from './components/Pagination/components/
43
43
  export { default as PaginationButtons } from './components/Pagination/components/PaginationButtons/PaginationButtons';
44
44
  export { default as PaginationNavigation } from './components/Pagination/components/PaginationNavigation/PaginationNavigation';
45
45
  export { default as Paragraph } from './components/Paragraph/Paragraph';
46
+ export { default as Parameter } from './components/Parameter/Parameter';
47
+ export { default as ParameterDescription } from './components/Parameter/components/ParameterDescription';
46
48
  export { default as Preloader } from './components/Preloader/Preloader';
47
49
  export { default as PriceBadge } from './components/Badges/PriceBadge/PriceBadge';
48
50
  export { default as PromoBadge } from './components/Badges/PromoBadge/PromoBadge';
package/dist/lib/index.js CHANGED
@@ -261,6 +261,18 @@ Object.defineProperty(exports, "Paragraph", {
261
261
  return _Paragraph["default"];
262
262
  }
263
263
  });
264
+ Object.defineProperty(exports, "Parameter", {
265
+ enumerable: true,
266
+ get: function get() {
267
+ return _Parameter["default"];
268
+ }
269
+ });
270
+ Object.defineProperty(exports, "ParameterDescription", {
271
+ enumerable: true,
272
+ get: function get() {
273
+ return _ParameterDescription["default"];
274
+ }
275
+ });
264
276
  Object.defineProperty(exports, "Preloader", {
265
277
  enumerable: true,
266
278
  get: function get() {
@@ -528,6 +540,8 @@ var _PaginationButton = _interopRequireDefault(require("./components/Pagination/
528
540
  var _PaginationButtons = _interopRequireDefault(require("./components/Pagination/components/PaginationButtons/PaginationButtons"));
529
541
  var _PaginationNavigation = _interopRequireDefault(require("./components/Pagination/components/PaginationNavigation/PaginationNavigation"));
530
542
  var _Paragraph = _interopRequireDefault(require("./components/Paragraph/Paragraph"));
543
+ var _Parameter = _interopRequireDefault(require("./components/Parameter/Parameter"));
544
+ var _ParameterDescription = _interopRequireDefault(require("./components/Parameter/components/ParameterDescription"));
531
545
  var _Preloader = _interopRequireDefault(require("./components/Preloader/Preloader"));
532
546
  var _PriceBadge = _interopRequireDefault(require("./components/Badges/PriceBadge/PriceBadge"));
533
547
  var _PromoBadge = _interopRequireDefault(require("./components/Badges/PromoBadge/PromoBadge"));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@megafon/ui-core",
3
- "version": "8.0.4",
3
+ "version": "8.1.0",
4
4
  "files": [
5
5
  "dist",
6
6
  "styles"
@@ -50,7 +50,7 @@
50
50
  "@babel/preset-env": "^7.8.6",
51
51
  "@babel/preset-react": "^7.8.3",
52
52
  "@babel/preset-typescript": "^7.8.3",
53
- "@megafon/ui-icons": "^3.8.0",
53
+ "@megafon/ui-icons": "^3.8.1",
54
54
  "@svgr/core": "^2.4.1",
55
55
  "@testing-library/jest-dom": "^6.5.0",
56
56
  "@testing-library/react": "^16.0.1",
@@ -89,7 +89,7 @@
89
89
  "@datepicker-react/hooks": "^2.7.0",
90
90
  "@dnd-kit/core": "^6.1.0",
91
91
  "@dnd-kit/sortable": "^8.0.0",
92
- "@megafon/ui-helpers": "^4.0.0",
92
+ "@megafon/ui-helpers": "^4.0.1",
93
93
  "@mona-health/react-input-mask": "^3.0.3",
94
94
  "@popperjs/core": "^2.11.8",
95
95
  "core-js": "^3.6.4",
@@ -104,5 +104,5 @@
104
104
  "simplebar-react": "^3.2.5",
105
105
  "swiper": "^11.1.1"
106
106
  },
107
- "gitHead": "95b87bbb028911fd285fc00d4aa524f8ce0eb867"
107
+ "gitHead": "d9a710f4c5a27033a3b69898b7baa6e997b3b2f4"
108
108
  }