@megafon/ui-core 5.2.2 → 5.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -3,6 +3,29 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ # [5.3.0](https://hq-gitlab.megafon.ru/site-portal/services/megafon-ui/compare/@megafon/ui-core@5.2.3...@megafon/ui-core@5.3.0) (2023-11-08)
7
+
8
+
9
+ ### Features
10
+
11
+ * **selector:** create component Selector ([73d6aec](https://hq-gitlab.megafon.ru/site-portal/services/megafon-ui/commit/73d6aec573fe500471f0b557f0cbe0a9485b1fa3))
12
+
13
+
14
+
15
+
16
+
17
+ ## [5.2.3](https://hq-gitlab.megafon.ru/site-portal/services/megafon-ui/compare/@megafon/ui-core@5.2.2...@megafon/ui-core@5.2.3) (2023-10-17)
18
+
19
+
20
+ ### Bug Fixes
21
+
22
+ * **preloader:** add new prop disableAnimate ([5b1fc46](https://hq-gitlab.megafon.ru/site-portal/services/megafon-ui/commit/5b1fc469ccab408679e07e64ce3e04474a410c09))
23
+ * **switcher:** add new prop waiting ([78b8bb9](https://hq-gitlab.megafon.ru/site-portal/services/megafon-ui/commit/78b8bb9d115ed0a45d529a1204f5a3d5d132a330))
24
+
25
+
26
+
27
+
28
+
6
29
  ## [5.2.2](https://hq-gitlab.megafon.ru/site-portal/services/megafon-ui/compare/@megafon/ui-core@5.2.1...@megafon/ui-core@5.2.2) (2023-09-14)
7
30
 
8
31
 
@@ -138,6 +138,10 @@
138
138
  -webkit-animation-delay: 0.33s;
139
139
  animation-delay: 0.33s;
140
140
  }
141
+ .mfui-preloader_disable-animate .mfui-preloader__item:before {
142
+ -webkit-animation: none;
143
+ animation: none;
144
+ }
141
145
  @-webkit-keyframes scaling {
142
146
  0% {
143
147
  -webkit-transform: scale(1);
@@ -26,6 +26,8 @@ export interface IPreloaderProps {
26
26
  sizeTablet?: PreloaderSizesType;
27
27
  /** Размер на разрешении экрана 0-767 */
28
28
  sizeMobile?: PreloaderSizesType;
29
+ /** Отмена анимации */
30
+ disableAnimate?: boolean;
29
31
  /** Дополнительный класс корневого элемента */
30
32
  className?: string;
31
33
  /** Дополнительные data атрибуты к внутренним элементам */
@@ -24,6 +24,8 @@ var Preloader = function Preloader(_ref) {
24
24
  sizeAll = _ref$sizeAll === void 0 ? 'medium' : _ref$sizeAll,
25
25
  _ref$delay = _ref.delay,
26
26
  delay = _ref$delay === void 0 ? true : _ref$delay,
27
+ _ref$disableAnimate = _ref.disableAnimate,
28
+ disableAnimate = _ref$disableAnimate === void 0 ? false : _ref$disableAnimate,
27
29
  sizeWide = _ref.sizeWide,
28
30
  sizeDesktop = _ref.sizeDesktop,
29
31
  sizeTablet = _ref.sizeTablet,
@@ -55,7 +57,8 @@ var Preloader = function Preloader(_ref) {
55
57
  'size-wide': sizeWide,
56
58
  'size-desktop': sizeDesktop,
57
59
  'size-tablet': sizeTablet,
58
- 'size-mobile': sizeMobile
60
+ 'size-mobile': sizeMobile,
61
+ 'disable-animate': disableAnimate
59
62
  }, className)
60
63
  }), /*#__PURE__*/React.createElement("div", {
61
64
  className: cn('item', {
@@ -79,6 +82,7 @@ Preloader.propTypes = {
79
82
  sizeDesktop: PropTypes.oneOf(Object.values(PreloaderSizes)),
80
83
  sizeTablet: PropTypes.oneOf(Object.values(PreloaderSizes)),
81
84
  sizeMobile: PropTypes.oneOf(Object.values(PreloaderSizes)),
85
+ disableAnimate: PropTypes.bool,
82
86
  className: PropTypes.string,
83
87
  dataAttrs: PropTypes.shape({
84
88
  root: PropTypes.objectOf(PropTypes.string.isRequired)
@@ -0,0 +1,98 @@
1
+ .mfui-selector__input {
2
+ position: absolute;
3
+ top: 0;
4
+ left: 0;
5
+ z-index: -1;
6
+ width: 0;
7
+ height: 0;
8
+ opacity: 0;
9
+ }
10
+ .mfui-selector__label {
11
+ position: relative;
12
+ display: -webkit-inline-box;
13
+ display: -ms-inline-flexbox;
14
+ display: inline-flex;
15
+ -webkit-box-align: center;
16
+ -ms-flex-align: center;
17
+ align-items: center;
18
+ outline: none;
19
+ cursor: pointer;
20
+ }
21
+ .mfui-selector__custom-input {
22
+ position: absolute;
23
+ display: -webkit-box;
24
+ display: -ms-flexbox;
25
+ display: flex;
26
+ -webkit-box-align: center;
27
+ -ms-flex-align: center;
28
+ align-items: center;
29
+ -webkit-box-pack: center;
30
+ -ms-flex-pack: center;
31
+ justify-content: center;
32
+ -webkit-box-sizing: border-box;
33
+ box-sizing: border-box;
34
+ width: 20px;
35
+ height: 20px;
36
+ border: 2px solid;
37
+ border-color: var(--spbSky2);
38
+ border-radius: 50%;
39
+ background-color: var(--base);
40
+ -webkit-transition: background-color, border-color;
41
+ transition: background-color, border-color;
42
+ -webkit-transition-duration: 0.3s;
43
+ transition-duration: 0.3s;
44
+ }
45
+ .mfui-selector__icon {
46
+ display: block;
47
+ width: 20px;
48
+ height: 20px;
49
+ opacity: 0;
50
+ -webkit-transition: fill, opacity;
51
+ transition: fill, opacity;
52
+ -webkit-transition-duration: 0.3s;
53
+ transition-duration: 0.3s;
54
+ fill: var(--stcWhite);
55
+ }
56
+ .mfui-selector__label:not(.mfui-selector__label_disabled):hover .mfui-selector__custom-input {
57
+ border-color: var(--buttonHoverGreen);
58
+ }
59
+ .mfui-selector__label:not(.mfui-selector__label_disabled):active .mfui-selector__custom-input {
60
+ border-color: var(--buttonDown);
61
+ }
62
+ .mfui-selector__label_disabled {
63
+ cursor: default;
64
+ }
65
+ .mfui-selector__label_disabled .mfui-selector__custom-input {
66
+ border-color: var(--spbSky2);
67
+ background-color: var(--spbSky1);
68
+ }
69
+ .mfui-selector__label_disabled .mfui-selector__input:checked + .mfui-selector__custom-input {
70
+ background-color: var(--spbSky2);
71
+ }
72
+ .mfui-selector__label_disabled .mfui-selector__input:checked + .mfui-selector__custom-input .mfui-selector__icon {
73
+ opacity: 1;
74
+ }
75
+ .mfui-selector__label:not(.mfui-selector__label_disabled):hover .mfui-selector__input:checked + .mfui-selector__custom-input {
76
+ border-color: var(--buttonHoverGreen);
77
+ background-color: var(--buttonHoverGreen);
78
+ }
79
+ .mfui-selector__label:not(.mfui-selector__label_disabled):hover .mfui-selector__input:checked + .mfui-selector__custom-input .mfui-selector__icon {
80
+ opacity: 1;
81
+ }
82
+ .mfui-selector__label:not(.mfui-selector__label_disabled):active .mfui-selector__input:checked + .mfui-selector__custom-input {
83
+ border-color: var(--buttonDown);
84
+ background-color: var(--buttonDown);
85
+ }
86
+ .mfui-selector__label:not(.mfui-selector__label_disabled):active .mfui-selector__input:checked + .mfui-selector__custom-input .mfui-selector__icon {
87
+ opacity: 1;
88
+ }
89
+ .mfui-selector__label:not(.mfui-selector__label_disabled) .mfui-selector__input:checked + .mfui-selector__custom-input {
90
+ border-color: var(--brandGreen);
91
+ background-color: var(--brandGreen);
92
+ }
93
+ .mfui-selector__label:not(.mfui-selector__label_disabled) .mfui-selector__input:checked + .mfui-selector__custom-input .mfui-selector__icon {
94
+ opacity: 1;
95
+ }
96
+ .mfui-selector__label_error .mfui-selector__custom-input {
97
+ border-color: var(--fury);
98
+ }
@@ -0,0 +1,39 @@
1
+ import * as React from 'react';
2
+ import './Selector.less';
3
+ export interface ISelectorProps {
4
+ /** Базовый тип компонента */
5
+ type?: 'radio' | 'checkbox';
6
+ /** Значение */
7
+ value: string;
8
+ /** Имя для тега form */
9
+ name?: string;
10
+ /** Управление состоянием вкл/выкл компонента */
11
+ checked?: boolean;
12
+ /** Управление состоянием компонента при типе checkbox */
13
+ checkedOptions?: string[];
14
+ /** Отключение компонента */
15
+ disabled?: boolean;
16
+ /** Отобразить компонент в состоянии ошибки */
17
+ error?: boolean;
18
+ /** Дополнительный класс корневого элемента */
19
+ className?: string;
20
+ /** Дополнительные классы для внутренних элементов */
21
+ classes?: {
22
+ label?: string;
23
+ customInput?: string;
24
+ };
25
+ /** Дополнительные data атрибуты к внутренним элементам */
26
+ dataAttrs?: {
27
+ root?: Record<string, string>;
28
+ label?: Record<string, string>;
29
+ input?: Record<string, string>;
30
+ customInput?: Record<string, string>;
31
+ };
32
+ children?: React.ReactNode;
33
+ /** Обработчик изменения значения 'value' */
34
+ onChange?: (value: string | string[]) => void;
35
+ /** Ссылка на input */
36
+ inputRef?: React.Ref<HTMLInputElement>;
37
+ }
38
+ declare const Selector: React.FC<ISelectorProps>;
39
+ export default Selector;
@@ -0,0 +1,94 @@
1
+ import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
2
+ import _extends from "@babel/runtime/helpers/extends";
3
+ import "core-js/modules/es.function.name.js";
4
+ import "core-js/modules/es.array.includes.js";
5
+ import "core-js/modules/es.string.includes.js";
6
+ import "core-js/modules/es.array.filter.js";
7
+ import "core-js/modules/es.array.concat.js";
8
+ import * as React from 'react';
9
+ import { cnCreate, filterDataAttrs } from '@megafon/ui-helpers';
10
+ import * as PropTypes from 'prop-types';
11
+ import "./Selector.css";
12
+
13
+ var CheckedIcon = function CheckedIcon(props) {
14
+ return /*#__PURE__*/React.createElement("svg", _extends({
15
+ viewBox: "0 0 20 20"
16
+ }, props), /*#__PURE__*/React.createElement("path", {
17
+ d: "M8.832 11.547L6.619 9.335l-1.414 1.413 2.462 2.462 1.445 1.446 5.932-8.486-1.638-1.148-4.574 6.525z"
18
+ }));
19
+ };
20
+
21
+ var cn = cnCreate('mfui-selector');
22
+
23
+ var Selector = function Selector(_ref) {
24
+ var _ref$type = _ref.type,
25
+ type = _ref$type === void 0 ? 'radio' : _ref$type,
26
+ value = _ref.value,
27
+ name = _ref.name,
28
+ checked = _ref.checked,
29
+ _ref$checkedOptions = _ref.checkedOptions,
30
+ checkedOptions = _ref$checkedOptions === void 0 ? [] : _ref$checkedOptions,
31
+ _ref$disabled = _ref.disabled,
32
+ disabled = _ref$disabled === void 0 ? false : _ref$disabled,
33
+ error = _ref.error,
34
+ className = _ref.className,
35
+ _ref$classes = _ref.classes,
36
+ classes = _ref$classes === void 0 ? {} : _ref$classes,
37
+ dataAttrs = _ref.dataAttrs,
38
+ children = _ref.children,
39
+ onChange = _ref.onChange,
40
+ inputRef = _ref.inputRef;
41
+
42
+ var handleChange = function handleChange() {
43
+ if (type === 'radio') {
44
+ return onChange === null || onChange === void 0 ? void 0 : onChange(value);
45
+ }
46
+
47
+ var isChecked = checkedOptions.includes(value);
48
+ var newCheckedOptions = isChecked ? checkedOptions.filter(function (option) {
49
+ return option !== value;
50
+ }) : [].concat(_toConsumableArray(checkedOptions), [value]);
51
+ return onChange === null || onChange === void 0 ? void 0 : onChange(newCheckedOptions);
52
+ };
53
+
54
+ return /*#__PURE__*/React.createElement("div", _extends({
55
+ className: cn('', className)
56
+ }, filterDataAttrs(dataAttrs === null || dataAttrs === void 0 ? void 0 : dataAttrs.root)), /*#__PURE__*/React.createElement("label", _extends({
57
+ className: cn('label', {
58
+ disabled: disabled,
59
+ error: error
60
+ }, classes.label)
61
+ }, filterDataAttrs(dataAttrs === null || dataAttrs === void 0 ? void 0 : dataAttrs.label)), /*#__PURE__*/React.createElement("input", _extends({
62
+ className: cn('input'),
63
+ type: type,
64
+ name: name,
65
+ value: value,
66
+ checked: type === 'radio' ? checked : checkedOptions.includes(value),
67
+ disabled: disabled,
68
+ onChange: handleChange,
69
+ ref: inputRef
70
+ }, filterDataAttrs(dataAttrs === null || dataAttrs === void 0 ? void 0 : dataAttrs.input))), /*#__PURE__*/React.createElement("div", _extends({
71
+ className: cn('custom-input', classes.customInput)
72
+ }, filterDataAttrs(dataAttrs === null || dataAttrs === void 0 ? void 0 : dataAttrs.customInput)), /*#__PURE__*/React.createElement(CheckedIcon, {
73
+ className: cn('icon')
74
+ })), children));
75
+ };
76
+
77
+ Selector.propTypes = {
78
+ type: PropTypes.oneOf(['radio', 'checkbox']),
79
+ value: PropTypes.string.isRequired,
80
+ name: PropTypes.string,
81
+ disabled: PropTypes.bool,
82
+ checked: PropTypes.bool,
83
+ checkedOptions: PropTypes.arrayOf(PropTypes.string.isRequired),
84
+ error: PropTypes.bool,
85
+ className: PropTypes.string,
86
+ classes: PropTypes.objectOf(PropTypes.string),
87
+ dataAttrs: PropTypes.objectOf(PropTypes.object),
88
+ children: PropTypes.node,
89
+ onChange: PropTypes.func,
90
+ inputRef: PropTypes.oneOfType([PropTypes.func, PropTypes.oneOfType([PropTypes.shape({
91
+ current: PropTypes.elementType
92
+ }), PropTypes.any])])
93
+ };
94
+ export default Selector;
@@ -0,0 +1,14 @@
1
+ .top-right {
2
+ top: 10px;
3
+ right: 10px;
4
+ }
5
+ .center {
6
+ top: 50%;
7
+ left: 50%;
8
+ -webkit-transform: translateX(-50%) translateY(-50%);
9
+ transform: translateX(-50%) translateY(-50%);
10
+ }
11
+ .bottom-left {
12
+ bottom: 10px;
13
+ left: 10px;
14
+ }
@@ -75,6 +75,27 @@
75
75
  transform: translateX(0);
76
76
  }
77
77
  }
78
+ .mfui-switcher__timer {
79
+ position: absolute;
80
+ top: 50%;
81
+ left: 50%;
82
+ width: 20px;
83
+ height: 20px;
84
+ border-radius: 50%;
85
+ background: var(--base);
86
+ -webkit-transform: translate(-50%, -50%);
87
+ transform: translate(-50%, -50%);
88
+ }
89
+ .mfui-switcher__timer-icon {
90
+ position: absolute;
91
+ top: 50%;
92
+ left: 50%;
93
+ width: 20px;
94
+ height: 20px;
95
+ -webkit-transform: translate(-50%, -50%);
96
+ transform: translate(-50%, -50%);
97
+ fill: var(--spbSky2);
98
+ }
78
99
  .mfui-switcher__input {
79
100
  position: relative;
80
101
  -ms-flex-item-align: start;
@@ -96,7 +117,8 @@
96
117
  background-color: var(--spbSky1);
97
118
  }
98
119
  .mfui-switcher__input_disabled,
99
- .mfui-switcher__input_loaded {
120
+ .mfui-switcher__input_loaded,
121
+ .mfui-switcher__input_waiting {
100
122
  cursor: default;
101
123
  }
102
124
  .mfui-switcher__input:hover:not(.mfui-switcher__input_disabled) {
@@ -7,12 +7,16 @@ export interface ISwitcherProps {
7
7
  root?: Record<string, string>;
8
8
  input?: Record<string, string>;
9
9
  loader?: Record<string, string>;
10
+ pointer?: Record<string, string>;
11
+ timer?: Record<string, string>;
10
12
  };
11
13
  /** Дополнительный класс корневого элемента */
12
14
  className?: string;
13
15
  /** Управление состоянием вкл/выкл компонента */
14
16
  checked?: boolean;
15
- /** Отключение переключателя */
17
+ /** Состояние ожидание */
18
+ waiting?: boolean;
19
+ /** сот */
16
20
  disabled?: boolean;
17
21
  /** Состояние загрузки */
18
22
  showLoader?: boolean;
@@ -3,6 +3,17 @@ import * as React from 'react';
3
3
  import { checkEventIsClickOrEnterPress, cnCreate, detectTouch, filterDataAttrs } from '@megafon/ui-helpers';
4
4
  import * as PropTypes from 'prop-types';
5
5
  import "./Switcher.css";
6
+
7
+ var WaitingIcon = function WaitingIcon(props) {
8
+ return /*#__PURE__*/React.createElement("svg", _extends({
9
+ viewBox: "0 0 20 20"
10
+ }, props), /*#__PURE__*/React.createElement("path", {
11
+ fillRule: "evenodd",
12
+ clipRule: "evenodd",
13
+ d: "M10 18a8 8 0 100-16 8 8 0 000 16zm1-8.414V5H9v5.414l3 3L13.414 12 11 9.586z"
14
+ }));
15
+ };
16
+
6
17
  var cn = cnCreate('mfui-switcher');
7
18
 
8
19
  var Switcher = function Switcher(_ref) {
@@ -14,6 +25,8 @@ var Switcher = function Switcher(_ref) {
14
25
  disabled = _ref$disabled === void 0 ? false : _ref$disabled,
15
26
  _ref$showLoader = _ref.showLoader,
16
27
  showLoader = _ref$showLoader === void 0 ? false : _ref$showLoader,
28
+ _ref$waiting = _ref.waiting,
29
+ waiting = _ref$waiting === void 0 ? false : _ref$waiting,
17
30
  children = _ref.children,
18
31
  _ref$textSize = _ref.textSize,
19
32
  textSize = _ref$textSize === void 0 ? 'medium' : _ref$textSize,
@@ -23,7 +36,9 @@ var Switcher = function Switcher(_ref) {
23
36
  var isTouch = detectTouch();
24
37
  var isLeftContent = !!children && textPosition === 'left';
25
38
  var isRightContent = !!children && textPosition === 'right';
26
- var isInteractiveDisabled = showLoader || disabled;
39
+ var isNoProcesses = disabled || waiting;
40
+ var isInteractiveDisabled = showLoader || isNoProcesses;
41
+ var isLoaderDisplayed = showLoader && !isNoProcesses;
27
42
  var handleChange = React.useCallback(function (e) {
28
43
  if (isInteractiveDisabled || !checkEventIsClickOrEnterPress(e)) {
29
44
  return;
@@ -42,19 +57,23 @@ var Switcher = function Switcher(_ref) {
42
57
  })
43
58
  }, children), /*#__PURE__*/React.createElement("div", _extends({}, filterDataAttrs(dataAttrs === null || dataAttrs === void 0 ? void 0 : dataAttrs.input), {
44
59
  className: cn('input', {
45
- checked: checked,
46
- disabled: disabled,
47
- loaded: showLoader,
60
+ checked: checked && !waiting,
61
+ disabled: isNoProcesses,
62
+ loaded: showLoader && !waiting,
48
63
  'no-touch': !isTouch
49
64
  }),
50
65
  onClick: handleChange,
51
66
  onKeyDown: handleChange,
52
67
  tabIndex: isInteractiveDisabled ? undefined : 0
53
- }), showLoader && !disabled && /*#__PURE__*/React.createElement("div", _extends({
68
+ }), isLoaderDisplayed && /*#__PURE__*/React.createElement("div", _extends({
54
69
  className: cn('loader')
55
- }, filterDataAttrs(dataAttrs === null || dataAttrs === void 0 ? void 0 : dataAttrs.loader))), /*#__PURE__*/React.createElement("div", {
70
+ }, filterDataAttrs(dataAttrs === null || dataAttrs === void 0 ? void 0 : dataAttrs.loader))), waiting ? /*#__PURE__*/React.createElement("div", _extends({
71
+ className: cn('timer')
72
+ }, filterDataAttrs(dataAttrs === null || dataAttrs === void 0 ? void 0 : dataAttrs.timer)), /*#__PURE__*/React.createElement(WaitingIcon, {
73
+ className: cn('timer-icon')
74
+ })) : /*#__PURE__*/React.createElement("div", _extends({}, filterDataAttrs(dataAttrs === null || dataAttrs === void 0 ? void 0 : dataAttrs.pointer), {
56
75
  className: cn('pointer')
57
- })), isRightContent && /*#__PURE__*/React.createElement("div", {
76
+ }))), isRightContent && /*#__PURE__*/React.createElement("div", {
58
77
  className: cn('content', {
59
78
  size: textSize
60
79
  })
@@ -72,6 +91,7 @@ Switcher.propTypes = {
72
91
  textPosition: PropTypes.oneOf(['left', 'right']),
73
92
  checked: PropTypes.bool,
74
93
  disabled: PropTypes.bool,
94
+ waiting: PropTypes.bool,
75
95
  showLoader: PropTypes.bool,
76
96
  onChange: PropTypes.func
77
97
  };
@@ -35,6 +35,7 @@ export { default as PromoBadge } from './components/Badges/components/PromoBadge
35
35
  export { default as RadioButton } from './components/RadioButton/RadioButton';
36
36
  export { default as Search } from './components/Search/Search';
37
37
  export { default as Select } from './components/Select/Select';
38
+ export { default as Selector } from './components/Selector/Selector';
38
39
  export { default as selectReducer } from './components/Select/reducer/selectReducer';
39
40
  export { default as Snackbar } from './components/Snackbar/Snackbar';
40
41
  export { default as SnackbarTimer } from './components/Snackbar/SnackbarTimer/SnackbarTimer';
package/dist/es/index.js CHANGED
@@ -35,6 +35,7 @@ export { default as PromoBadge } from "./components/Badges/components/PromoBadge
35
35
  export { default as RadioButton } from "./components/RadioButton/RadioButton";
36
36
  export { default as Search } from "./components/Search/Search";
37
37
  export { default as Select } from "./components/Select/Select";
38
+ export { default as Selector } from "./components/Selector/Selector";
38
39
  export { default as selectReducer } from "./components/Select/reducer/selectReducer";
39
40
  export { default as Snackbar } from "./components/Snackbar/Snackbar";
40
41
  export { default as SnackbarTimer } from "./components/Snackbar/SnackbarTimer/SnackbarTimer";
@@ -138,6 +138,10 @@
138
138
  -webkit-animation-delay: 0.33s;
139
139
  animation-delay: 0.33s;
140
140
  }
141
+ .mfui-preloader_disable-animate .mfui-preloader__item:before {
142
+ -webkit-animation: none;
143
+ animation: none;
144
+ }
141
145
  @-webkit-keyframes scaling {
142
146
  0% {
143
147
  -webkit-transform: scale(1);
@@ -26,6 +26,8 @@ export interface IPreloaderProps {
26
26
  sizeTablet?: PreloaderSizesType;
27
27
  /** Размер на разрешении экрана 0-767 */
28
28
  sizeMobile?: PreloaderSizesType;
29
+ /** Отмена анимации */
30
+ disableAnimate?: boolean;
29
31
  /** Дополнительный класс корневого элемента */
30
32
  className?: string;
31
33
  /** Дополнительные data атрибуты к внутренним элементам */
@@ -47,6 +47,8 @@ var Preloader = function Preloader(_ref) {
47
47
  sizeAll = _ref$sizeAll === void 0 ? 'medium' : _ref$sizeAll,
48
48
  _ref$delay = _ref.delay,
49
49
  delay = _ref$delay === void 0 ? true : _ref$delay,
50
+ _ref$disableAnimate = _ref.disableAnimate,
51
+ disableAnimate = _ref$disableAnimate === void 0 ? false : _ref$disableAnimate,
50
52
  sizeWide = _ref.sizeWide,
51
53
  sizeDesktop = _ref.sizeDesktop,
52
54
  sizeTablet = _ref.sizeTablet,
@@ -78,7 +80,8 @@ var Preloader = function Preloader(_ref) {
78
80
  'size-wide': sizeWide,
79
81
  'size-desktop': sizeDesktop,
80
82
  'size-tablet': sizeTablet,
81
- 'size-mobile': sizeMobile
83
+ 'size-mobile': sizeMobile,
84
+ 'disable-animate': disableAnimate
82
85
  }, className)
83
86
  }), /*#__PURE__*/React.createElement("div", {
84
87
  className: cn('item', {
@@ -102,6 +105,7 @@ Preloader.propTypes = {
102
105
  sizeDesktop: PropTypes.oneOf(Object.values(PreloaderSizes)),
103
106
  sizeTablet: PropTypes.oneOf(Object.values(PreloaderSizes)),
104
107
  sizeMobile: PropTypes.oneOf(Object.values(PreloaderSizes)),
108
+ disableAnimate: PropTypes.bool,
105
109
  className: PropTypes.string,
106
110
  dataAttrs: PropTypes.shape({
107
111
  root: PropTypes.objectOf(PropTypes.string.isRequired)
@@ -0,0 +1,98 @@
1
+ .mfui-selector__input {
2
+ position: absolute;
3
+ top: 0;
4
+ left: 0;
5
+ z-index: -1;
6
+ width: 0;
7
+ height: 0;
8
+ opacity: 0;
9
+ }
10
+ .mfui-selector__label {
11
+ position: relative;
12
+ display: -webkit-inline-box;
13
+ display: -ms-inline-flexbox;
14
+ display: inline-flex;
15
+ -webkit-box-align: center;
16
+ -ms-flex-align: center;
17
+ align-items: center;
18
+ outline: none;
19
+ cursor: pointer;
20
+ }
21
+ .mfui-selector__custom-input {
22
+ position: absolute;
23
+ display: -webkit-box;
24
+ display: -ms-flexbox;
25
+ display: flex;
26
+ -webkit-box-align: center;
27
+ -ms-flex-align: center;
28
+ align-items: center;
29
+ -webkit-box-pack: center;
30
+ -ms-flex-pack: center;
31
+ justify-content: center;
32
+ -webkit-box-sizing: border-box;
33
+ box-sizing: border-box;
34
+ width: 20px;
35
+ height: 20px;
36
+ border: 2px solid;
37
+ border-color: var(--spbSky2);
38
+ border-radius: 50%;
39
+ background-color: var(--base);
40
+ -webkit-transition: background-color, border-color;
41
+ transition: background-color, border-color;
42
+ -webkit-transition-duration: 0.3s;
43
+ transition-duration: 0.3s;
44
+ }
45
+ .mfui-selector__icon {
46
+ display: block;
47
+ width: 20px;
48
+ height: 20px;
49
+ opacity: 0;
50
+ -webkit-transition: fill, opacity;
51
+ transition: fill, opacity;
52
+ -webkit-transition-duration: 0.3s;
53
+ transition-duration: 0.3s;
54
+ fill: var(--stcWhite);
55
+ }
56
+ .mfui-selector__label:not(.mfui-selector__label_disabled):hover .mfui-selector__custom-input {
57
+ border-color: var(--buttonHoverGreen);
58
+ }
59
+ .mfui-selector__label:not(.mfui-selector__label_disabled):active .mfui-selector__custom-input {
60
+ border-color: var(--buttonDown);
61
+ }
62
+ .mfui-selector__label_disabled {
63
+ cursor: default;
64
+ }
65
+ .mfui-selector__label_disabled .mfui-selector__custom-input {
66
+ border-color: var(--spbSky2);
67
+ background-color: var(--spbSky1);
68
+ }
69
+ .mfui-selector__label_disabled .mfui-selector__input:checked + .mfui-selector__custom-input {
70
+ background-color: var(--spbSky2);
71
+ }
72
+ .mfui-selector__label_disabled .mfui-selector__input:checked + .mfui-selector__custom-input .mfui-selector__icon {
73
+ opacity: 1;
74
+ }
75
+ .mfui-selector__label:not(.mfui-selector__label_disabled):hover .mfui-selector__input:checked + .mfui-selector__custom-input {
76
+ border-color: var(--buttonHoverGreen);
77
+ background-color: var(--buttonHoverGreen);
78
+ }
79
+ .mfui-selector__label:not(.mfui-selector__label_disabled):hover .mfui-selector__input:checked + .mfui-selector__custom-input .mfui-selector__icon {
80
+ opacity: 1;
81
+ }
82
+ .mfui-selector__label:not(.mfui-selector__label_disabled):active .mfui-selector__input:checked + .mfui-selector__custom-input {
83
+ border-color: var(--buttonDown);
84
+ background-color: var(--buttonDown);
85
+ }
86
+ .mfui-selector__label:not(.mfui-selector__label_disabled):active .mfui-selector__input:checked + .mfui-selector__custom-input .mfui-selector__icon {
87
+ opacity: 1;
88
+ }
89
+ .mfui-selector__label:not(.mfui-selector__label_disabled) .mfui-selector__input:checked + .mfui-selector__custom-input {
90
+ border-color: var(--brandGreen);
91
+ background-color: var(--brandGreen);
92
+ }
93
+ .mfui-selector__label:not(.mfui-selector__label_disabled) .mfui-selector__input:checked + .mfui-selector__custom-input .mfui-selector__icon {
94
+ opacity: 1;
95
+ }
96
+ .mfui-selector__label_error .mfui-selector__custom-input {
97
+ border-color: var(--fury);
98
+ }
@@ -0,0 +1,39 @@
1
+ import * as React from 'react';
2
+ import './Selector.less';
3
+ export interface ISelectorProps {
4
+ /** Базовый тип компонента */
5
+ type?: 'radio' | 'checkbox';
6
+ /** Значение */
7
+ value: string;
8
+ /** Имя для тега form */
9
+ name?: string;
10
+ /** Управление состоянием вкл/выкл компонента */
11
+ checked?: boolean;
12
+ /** Управление состоянием компонента при типе checkbox */
13
+ checkedOptions?: string[];
14
+ /** Отключение компонента */
15
+ disabled?: boolean;
16
+ /** Отобразить компонент в состоянии ошибки */
17
+ error?: boolean;
18
+ /** Дополнительный класс корневого элемента */
19
+ className?: string;
20
+ /** Дополнительные классы для внутренних элементов */
21
+ classes?: {
22
+ label?: string;
23
+ customInput?: string;
24
+ };
25
+ /** Дополнительные data атрибуты к внутренним элементам */
26
+ dataAttrs?: {
27
+ root?: Record<string, string>;
28
+ label?: Record<string, string>;
29
+ input?: Record<string, string>;
30
+ customInput?: Record<string, string>;
31
+ };
32
+ children?: React.ReactNode;
33
+ /** Обработчик изменения значения 'value' */
34
+ onChange?: (value: string | string[]) => void;
35
+ /** Ссылка на input */
36
+ inputRef?: React.Ref<HTMLInputElement>;
37
+ }
38
+ declare const Selector: React.FC<ISelectorProps>;
39
+ export default Selector;
@@ -0,0 +1,118 @@
1
+ "use strict";
2
+
3
+ function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports["default"] = void 0;
9
+
10
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
11
+
12
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
13
+
14
+ require("core-js/modules/es.function.name.js");
15
+
16
+ require("core-js/modules/es.array.includes.js");
17
+
18
+ require("core-js/modules/es.string.includes.js");
19
+
20
+ require("core-js/modules/es.array.filter.js");
21
+
22
+ require("core-js/modules/es.array.concat.js");
23
+
24
+ var React = _interopRequireWildcard(require("react"));
25
+
26
+ var _uiHelpers = require("@megafon/ui-helpers");
27
+
28
+ var PropTypes = _interopRequireWildcard(require("prop-types"));
29
+
30
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
31
+
32
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
33
+
34
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
35
+
36
+ var CheckedIcon = function CheckedIcon(props) {
37
+ return /*#__PURE__*/React.createElement("svg", (0, _extends2["default"])({
38
+ viewBox: "0 0 20 20"
39
+ }, props), /*#__PURE__*/React.createElement("path", {
40
+ d: "M8.832 11.547L6.619 9.335l-1.414 1.413 2.462 2.462 1.445 1.446 5.932-8.486-1.638-1.148-4.574 6.525z"
41
+ }));
42
+ };
43
+
44
+ var cn = (0, _uiHelpers.cnCreate)('mfui-selector');
45
+
46
+ var Selector = function Selector(_ref) {
47
+ var _ref$type = _ref.type,
48
+ type = _ref$type === void 0 ? 'radio' : _ref$type,
49
+ value = _ref.value,
50
+ name = _ref.name,
51
+ checked = _ref.checked,
52
+ _ref$checkedOptions = _ref.checkedOptions,
53
+ checkedOptions = _ref$checkedOptions === void 0 ? [] : _ref$checkedOptions,
54
+ _ref$disabled = _ref.disabled,
55
+ disabled = _ref$disabled === void 0 ? false : _ref$disabled,
56
+ error = _ref.error,
57
+ className = _ref.className,
58
+ _ref$classes = _ref.classes,
59
+ classes = _ref$classes === void 0 ? {} : _ref$classes,
60
+ dataAttrs = _ref.dataAttrs,
61
+ children = _ref.children,
62
+ onChange = _ref.onChange,
63
+ inputRef = _ref.inputRef;
64
+
65
+ var handleChange = function handleChange() {
66
+ if (type === 'radio') {
67
+ return onChange === null || onChange === void 0 ? void 0 : onChange(value);
68
+ }
69
+
70
+ var isChecked = checkedOptions.includes(value);
71
+ var newCheckedOptions = isChecked ? checkedOptions.filter(function (option) {
72
+ return option !== value;
73
+ }) : [].concat((0, _toConsumableArray2["default"])(checkedOptions), [value]);
74
+ return onChange === null || onChange === void 0 ? void 0 : onChange(newCheckedOptions);
75
+ };
76
+
77
+ return /*#__PURE__*/React.createElement("div", (0, _extends2["default"])({
78
+ className: cn('', className)
79
+ }, (0, _uiHelpers.filterDataAttrs)(dataAttrs === null || dataAttrs === void 0 ? void 0 : dataAttrs.root)), /*#__PURE__*/React.createElement("label", (0, _extends2["default"])({
80
+ className: cn('label', {
81
+ disabled: disabled,
82
+ error: error
83
+ }, classes.label)
84
+ }, (0, _uiHelpers.filterDataAttrs)(dataAttrs === null || dataAttrs === void 0 ? void 0 : dataAttrs.label)), /*#__PURE__*/React.createElement("input", (0, _extends2["default"])({
85
+ className: cn('input'),
86
+ type: type,
87
+ name: name,
88
+ value: value,
89
+ checked: type === 'radio' ? checked : checkedOptions.includes(value),
90
+ disabled: disabled,
91
+ onChange: handleChange,
92
+ ref: inputRef
93
+ }, (0, _uiHelpers.filterDataAttrs)(dataAttrs === null || dataAttrs === void 0 ? void 0 : dataAttrs.input))), /*#__PURE__*/React.createElement("div", (0, _extends2["default"])({
94
+ className: cn('custom-input', classes.customInput)
95
+ }, (0, _uiHelpers.filterDataAttrs)(dataAttrs === null || dataAttrs === void 0 ? void 0 : dataAttrs.customInput)), /*#__PURE__*/React.createElement(CheckedIcon, {
96
+ className: cn('icon')
97
+ })), children));
98
+ };
99
+
100
+ Selector.propTypes = {
101
+ type: PropTypes.oneOf(['radio', 'checkbox']),
102
+ value: PropTypes.string.isRequired,
103
+ name: PropTypes.string,
104
+ disabled: PropTypes.bool,
105
+ checked: PropTypes.bool,
106
+ checkedOptions: PropTypes.arrayOf(PropTypes.string.isRequired),
107
+ error: PropTypes.bool,
108
+ className: PropTypes.string,
109
+ classes: PropTypes.objectOf(PropTypes.string),
110
+ dataAttrs: PropTypes.objectOf(PropTypes.object),
111
+ children: PropTypes.node,
112
+ onChange: PropTypes.func,
113
+ inputRef: PropTypes.oneOfType([PropTypes.func, PropTypes.oneOfType([PropTypes.shape({
114
+ current: PropTypes.elementType
115
+ }), PropTypes.any])])
116
+ };
117
+ var _default = Selector;
118
+ exports["default"] = _default;
@@ -0,0 +1,14 @@
1
+ .top-right {
2
+ top: 10px;
3
+ right: 10px;
4
+ }
5
+ .center {
6
+ top: 50%;
7
+ left: 50%;
8
+ -webkit-transform: translateX(-50%) translateY(-50%);
9
+ transform: translateX(-50%) translateY(-50%);
10
+ }
11
+ .bottom-left {
12
+ bottom: 10px;
13
+ left: 10px;
14
+ }
@@ -75,6 +75,27 @@
75
75
  transform: translateX(0);
76
76
  }
77
77
  }
78
+ .mfui-switcher__timer {
79
+ position: absolute;
80
+ top: 50%;
81
+ left: 50%;
82
+ width: 20px;
83
+ height: 20px;
84
+ border-radius: 50%;
85
+ background: var(--base);
86
+ -webkit-transform: translate(-50%, -50%);
87
+ transform: translate(-50%, -50%);
88
+ }
89
+ .mfui-switcher__timer-icon {
90
+ position: absolute;
91
+ top: 50%;
92
+ left: 50%;
93
+ width: 20px;
94
+ height: 20px;
95
+ -webkit-transform: translate(-50%, -50%);
96
+ transform: translate(-50%, -50%);
97
+ fill: var(--spbSky2);
98
+ }
78
99
  .mfui-switcher__input {
79
100
  position: relative;
80
101
  -ms-flex-item-align: start;
@@ -96,7 +117,8 @@
96
117
  background-color: var(--spbSky1);
97
118
  }
98
119
  .mfui-switcher__input_disabled,
99
- .mfui-switcher__input_loaded {
120
+ .mfui-switcher__input_loaded,
121
+ .mfui-switcher__input_waiting {
100
122
  cursor: default;
101
123
  }
102
124
  .mfui-switcher__input:hover:not(.mfui-switcher__input_disabled) {
@@ -7,12 +7,16 @@ export interface ISwitcherProps {
7
7
  root?: Record<string, string>;
8
8
  input?: Record<string, string>;
9
9
  loader?: Record<string, string>;
10
+ pointer?: Record<string, string>;
11
+ timer?: Record<string, string>;
10
12
  };
11
13
  /** Дополнительный класс корневого элемента */
12
14
  className?: string;
13
15
  /** Управление состоянием вкл/выкл компонента */
14
16
  checked?: boolean;
15
- /** Отключение переключателя */
17
+ /** Состояние ожидание */
18
+ waiting?: boolean;
19
+ /** сот */
16
20
  disabled?: boolean;
17
21
  /** Состояние загрузки */
18
22
  showLoader?: boolean;
@@ -21,6 +21,16 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
21
21
 
22
22
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
23
23
 
24
+ var WaitingIcon = function WaitingIcon(props) {
25
+ return /*#__PURE__*/React.createElement("svg", (0, _extends2["default"])({
26
+ viewBox: "0 0 20 20"
27
+ }, props), /*#__PURE__*/React.createElement("path", {
28
+ fillRule: "evenodd",
29
+ clipRule: "evenodd",
30
+ d: "M10 18a8 8 0 100-16 8 8 0 000 16zm1-8.414V5H9v5.414l3 3L13.414 12 11 9.586z"
31
+ }));
32
+ };
33
+
24
34
  var cn = (0, _uiHelpers.cnCreate)('mfui-switcher');
25
35
 
26
36
  var Switcher = function Switcher(_ref) {
@@ -32,6 +42,8 @@ var Switcher = function Switcher(_ref) {
32
42
  disabled = _ref$disabled === void 0 ? false : _ref$disabled,
33
43
  _ref$showLoader = _ref.showLoader,
34
44
  showLoader = _ref$showLoader === void 0 ? false : _ref$showLoader,
45
+ _ref$waiting = _ref.waiting,
46
+ waiting = _ref$waiting === void 0 ? false : _ref$waiting,
35
47
  children = _ref.children,
36
48
  _ref$textSize = _ref.textSize,
37
49
  textSize = _ref$textSize === void 0 ? 'medium' : _ref$textSize,
@@ -41,7 +53,9 @@ var Switcher = function Switcher(_ref) {
41
53
  var isTouch = (0, _uiHelpers.detectTouch)();
42
54
  var isLeftContent = !!children && textPosition === 'left';
43
55
  var isRightContent = !!children && textPosition === 'right';
44
- var isInteractiveDisabled = showLoader || disabled;
56
+ var isNoProcesses = disabled || waiting;
57
+ var isInteractiveDisabled = showLoader || isNoProcesses;
58
+ var isLoaderDisplayed = showLoader && !isNoProcesses;
45
59
  var handleChange = React.useCallback(function (e) {
46
60
  if (isInteractiveDisabled || !(0, _uiHelpers.checkEventIsClickOrEnterPress)(e)) {
47
61
  return;
@@ -60,19 +74,23 @@ var Switcher = function Switcher(_ref) {
60
74
  })
61
75
  }, children), /*#__PURE__*/React.createElement("div", (0, _extends2["default"])({}, (0, _uiHelpers.filterDataAttrs)(dataAttrs === null || dataAttrs === void 0 ? void 0 : dataAttrs.input), {
62
76
  className: cn('input', {
63
- checked: checked,
64
- disabled: disabled,
65
- loaded: showLoader,
77
+ checked: checked && !waiting,
78
+ disabled: isNoProcesses,
79
+ loaded: showLoader && !waiting,
66
80
  'no-touch': !isTouch
67
81
  }),
68
82
  onClick: handleChange,
69
83
  onKeyDown: handleChange,
70
84
  tabIndex: isInteractiveDisabled ? undefined : 0
71
- }), showLoader && !disabled && /*#__PURE__*/React.createElement("div", (0, _extends2["default"])({
85
+ }), isLoaderDisplayed && /*#__PURE__*/React.createElement("div", (0, _extends2["default"])({
72
86
  className: cn('loader')
73
- }, (0, _uiHelpers.filterDataAttrs)(dataAttrs === null || dataAttrs === void 0 ? void 0 : dataAttrs.loader))), /*#__PURE__*/React.createElement("div", {
87
+ }, (0, _uiHelpers.filterDataAttrs)(dataAttrs === null || dataAttrs === void 0 ? void 0 : dataAttrs.loader))), waiting ? /*#__PURE__*/React.createElement("div", (0, _extends2["default"])({
88
+ className: cn('timer')
89
+ }, (0, _uiHelpers.filterDataAttrs)(dataAttrs === null || dataAttrs === void 0 ? void 0 : dataAttrs.timer)), /*#__PURE__*/React.createElement(WaitingIcon, {
90
+ className: cn('timer-icon')
91
+ })) : /*#__PURE__*/React.createElement("div", (0, _extends2["default"])({}, (0, _uiHelpers.filterDataAttrs)(dataAttrs === null || dataAttrs === void 0 ? void 0 : dataAttrs.pointer), {
74
92
  className: cn('pointer')
75
- })), isRightContent && /*#__PURE__*/React.createElement("div", {
93
+ }))), isRightContent && /*#__PURE__*/React.createElement("div", {
76
94
  className: cn('content', {
77
95
  size: textSize
78
96
  })
@@ -90,6 +108,7 @@ Switcher.propTypes = {
90
108
  textPosition: PropTypes.oneOf(['left', 'right']),
91
109
  checked: PropTypes.bool,
92
110
  disabled: PropTypes.bool,
111
+ waiting: PropTypes.bool,
93
112
  showLoader: PropTypes.bool,
94
113
  onChange: PropTypes.func
95
114
  };
@@ -35,6 +35,7 @@ export { default as PromoBadge } from './components/Badges/components/PromoBadge
35
35
  export { default as RadioButton } from './components/RadioButton/RadioButton';
36
36
  export { default as Search } from './components/Search/Search';
37
37
  export { default as Select } from './components/Select/Select';
38
+ export { default as Selector } from './components/Selector/Selector';
38
39
  export { default as selectReducer } from './components/Select/reducer/selectReducer';
39
40
  export { default as Snackbar } from './components/Snackbar/Snackbar';
40
41
  export { default as SnackbarTimer } from './components/Snackbar/SnackbarTimer/SnackbarTimer';
package/dist/lib/index.js CHANGED
@@ -225,6 +225,12 @@ Object.defineProperty(exports, "Select", {
225
225
  return _Select["default"];
226
226
  }
227
227
  });
228
+ Object.defineProperty(exports, "Selector", {
229
+ enumerable: true,
230
+ get: function get() {
231
+ return _Selector["default"];
232
+ }
233
+ });
228
234
  Object.defineProperty(exports, "selectReducer", {
229
235
  enumerable: true,
230
236
  get: function get() {
@@ -384,6 +390,8 @@ var _Search = _interopRequireDefault(require("./components/Search/Search"));
384
390
 
385
391
  var _Select = _interopRequireDefault(require("./components/Select/Select"));
386
392
 
393
+ var _Selector = _interopRequireDefault(require("./components/Selector/Selector"));
394
+
387
395
  var _selectReducer = _interopRequireDefault(require("./components/Select/reducer/selectReducer"));
388
396
 
389
397
  var _Snackbar = _interopRequireDefault(require("./components/Snackbar/Snackbar"));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@megafon/ui-core",
3
- "version": "5.2.2",
3
+ "version": "5.3.0",
4
4
  "files": [
5
5
  "dist",
6
6
  "styles"
@@ -96,5 +96,5 @@
96
96
  "react-popper": "^2.2.3",
97
97
  "swiper": "^6.5.6"
98
98
  },
99
- "gitHead": "67d1595c72454846b31ebcd4acc8f7550a5f0df3"
99
+ "gitHead": "0a8f8d140ed863cb8bb9f05e4226edcb7925c74d"
100
100
  }