@itcase/ui 1.0.5 → 1.0.6

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 (44) hide show
  1. package/dist/components/Avatar.js +56 -31
  2. package/dist/components/{Counter.js → Badge.js} +7 -7
  3. package/dist/components/Button.js +55 -56
  4. package/dist/components/Cell.js +14 -14
  5. package/dist/components/Checkbox.js +74 -22
  6. package/dist/components/Chips.js +2 -20
  7. package/dist/components/Divider.js +17 -1
  8. package/dist/components/Group.js +13 -1
  9. package/dist/components/Icon.js +45 -26
  10. package/dist/components/Input.js +19 -2
  11. package/dist/components/Label.js +11 -3
  12. package/dist/components/Logo.js +24 -12
  13. package/dist/components/MenuItem.js +11 -2
  14. package/dist/components/Modal.js +219 -41
  15. package/dist/components/Profile.js +10 -4
  16. package/dist/components/RadioButton.js +78 -26
  17. package/dist/components/Scrollbar.js +4 -4
  18. package/dist/components/Select.js +2 -2
  19. package/dist/components/Switch.js +2 -1
  20. package/dist/components/Tab.js +205 -0
  21. package/dist/components/Text.js +1 -3
  22. package/dist/components/Textarea.js +9 -1
  23. package/dist/components/Tile.js +43 -115
  24. package/dist/css/components/Avatar/Avatar.css +23 -10
  25. package/dist/css/components/Badge/Badge.css +55 -0
  26. package/dist/css/components/Button/Button.css +19 -8
  27. package/dist/css/components/Checkbox/Checkbox.css +60 -63
  28. package/dist/css/components/Chips/Chips.css +25 -7
  29. package/dist/css/components/Fader/Fader.css +0 -1
  30. package/dist/css/components/Icon/Icon.css +4 -4
  31. package/dist/css/components/Input/Input.css +6 -0
  32. package/dist/css/components/List/List.css +3 -3
  33. package/dist/css/components/Logo/Logo.css +23 -0
  34. package/dist/css/components/{Popup/Popup.css → Modal/Modal.css} +5 -4
  35. package/dist/css/components/RadioButton/RadioButton.css +60 -59
  36. package/dist/css/components/Switch/Switch.css +56 -46
  37. package/dist/css/components/Tab/Tab.css +46 -0
  38. package/dist/css/components/Tile/Tile.css +27 -10
  39. package/dist/css/styles/border-color/border-color.css +2 -2
  40. package/dist/css/styles/border-type/border-type.css +13 -0
  41. package/dist/css/styles/border-width/border-width.css +7 -0
  42. package/package.json +2 -1
  43. package/dist/components/Popup.js +0 -255
  44. package/dist/css/components/Counter/Counter.css +0 -55
@@ -73,11 +73,23 @@ function Group(props) {
73
73
  prefix: 'width_',
74
74
  propsKey: 'width'
75
75
  });
76
+ var borderColorClass = useDeviceTargetClass.useDeviceTargetClass(props, {
77
+ prefix: 'border-color_',
78
+ propsKey: 'borderColor'
79
+ });
80
+ var borderWidthClass = useDeviceTargetClass.useDeviceTargetClass(props, {
81
+ prefix: 'border-width_',
82
+ propsKey: 'borderWidth'
83
+ });
84
+ var borderTypeClass = useDeviceTargetClass.useDeviceTargetClass(props, {
85
+ prefix: 'border-type_',
86
+ propsKey: 'borderType'
87
+ });
76
88
  var _useStyles = useStyles.useStyles(props),
77
89
  groupStyles = _useStyles.styles,
78
90
  groupWrapperStyles = _useStyles.wrapper;
79
91
  return /*#__PURE__*/React__default.default.createElement("div", {
80
- className: clsx__default.default(className, 'group', widthClass, columnsClass, contentAlignClass, alignDirectionClass, directionClass, alignClass, fillClass, set && "group_set_" + set, horizontalScroll && 'group_type_horizontal_scroll', stackingClass, wrapClass, shapeClass),
92
+ className: clsx__default.default(className, 'group', widthClass, columnsClass, contentAlignClass, alignDirectionClass, directionClass, alignClass, fillClass, set && "group_set_" + set, horizontalScroll && 'group_type_horizontal_scroll', stackingClass, wrapClass, shapeClass, borderColorClass, borderWidthClass, borderTypeClass),
81
93
  id: id,
82
94
  style: Object.assign({}, groupStyles, style)
83
95
  }, horizontalScroll ? /*#__PURE__*/React__default.default.createElement("div", {
@@ -34,14 +34,20 @@ var PropTypes__default = /*#__PURE__*/_interopDefault(PropTypes);
34
34
  var clsx__default = /*#__PURE__*/_interopDefault(clsx);
35
35
  var SVG__default = /*#__PURE__*/_interopDefault(SVG);
36
36
 
37
+ var iconConfig = {
38
+ appearance: {},
39
+ setAppearance: function setAppearance(newComponent) {
40
+ iconConfig.appearance = newComponent;
41
+ }
42
+ };
37
43
  var Icon = /*#__PURE__*/React__default.default.forwardRef(function Icon(props, ref) {
38
44
  var before = props.before,
39
45
  after = props.after,
40
- Counter = props.Counter,
46
+ Badge = props.Badge,
41
47
  SvgImage = props.SvgImage,
42
- imageSrc = props.imageSrc,
43
- simple = props.simple,
44
- className = props.className,
48
+ imageSrc = props.imageSrc;
49
+ props.simple;
50
+ var className = props.className,
45
51
  href = props.href,
46
52
  link = props.link,
47
53
  linkTarget = props.linkTarget,
@@ -59,46 +65,58 @@ var Icon = /*#__PURE__*/React__default.default.forwardRef(function Icon(props, r
59
65
  }
60
66
  return sizes;
61
67
  }, []);
62
- var bgFillClass = useDeviceTargetClass.useDeviceTargetClass(props, {
63
- prefix: 'fill_',
64
- propsKey: 'bgFill'
65
- });
66
68
  var fillClass = useDeviceTargetClass.useDeviceTargetClass(props, {
67
- prefix: 'icon_fill_',
69
+ prefix: 'fill_',
68
70
  propsKey: 'fill'
69
71
  });
70
72
  var fillHoverClass = useDeviceTargetClass.useDeviceTargetClass(props, {
71
- prefix: 'icon_fill_hover_',
73
+ prefix: 'fill_hover_',
72
74
  propsKey: 'fillHover'
73
75
  });
74
- var bgFillSizeClass = useDeviceTargetClass.useDeviceTargetClass(props, {
76
+ var fillSizeClass = useDeviceTargetClass.useDeviceTargetClass(props, {
75
77
  prefix: 'icon_fill_size_',
76
- propsKey: 'bgFillSize'
78
+ propsKey: 'fillSize'
77
79
  });
78
- var strokeClass = useDeviceTargetClass.useDeviceTargetClass(props, {
80
+ var iconFillClass = useDeviceTargetClass.useDeviceTargetClass(props, {
81
+ prefix: 'icon_fill_',
82
+ propsKey: 'iconFill'
83
+ });
84
+ var iconFillHoverClass = useDeviceTargetClass.useDeviceTargetClass(props, {
85
+ prefix: 'icon_fill_hover_',
86
+ propsKey: 'iconFillHover'
87
+ });
88
+ var iconStrokeClass = useDeviceTargetClass.useDeviceTargetClass(props, {
79
89
  prefix: 'icon_stroke_',
80
- propsKey: 'stroke'
90
+ propsKey: 'iconStroke'
81
91
  });
82
- var strokeHoverClass = useDeviceTargetClass.useDeviceTargetClass(props, {
92
+ var iconStrokeHoverClass = useDeviceTargetClass.useDeviceTargetClass(props, {
83
93
  prefix: 'icon_stroke_hover_',
84
- propsKey: 'strokeHover'
94
+ propsKey: 'iconStrokeHover'
85
95
  });
86
- var sizeClass = useDeviceTargetClass.useDeviceTargetClass(props, {
96
+ var iconSizeClass = useDeviceTargetClass.useDeviceTargetClass(props, {
87
97
  prefix: 'icon_size_',
88
- propsKey: 'size'
98
+ propsKey: 'iconSize'
89
99
  });
90
100
  var shapeClass = useDeviceTargetClass.useDeviceTargetClass(props, {
91
101
  prefix: 'icon_shape_',
92
102
  propsKey: 'shape'
93
103
  });
94
- var borderClass = useDeviceTargetClass.useDeviceTargetClass(props, {
104
+ var borderColorClass = useDeviceTargetClass.useDeviceTargetClass(props, {
95
105
  prefix: 'border-color_',
96
- propsKey: 'border'
106
+ propsKey: 'borderColor'
97
107
  });
98
- var borderHoverClass = useDeviceTargetClass.useDeviceTargetClass(props, {
108
+ var borderColorHoverClass = useDeviceTargetClass.useDeviceTargetClass(props, {
99
109
  prefix: 'border-color_hover_',
100
110
  propsKey: 'borderHover'
101
111
  });
112
+ var borderWidthClass = useDeviceTargetClass.useDeviceTargetClass(props, {
113
+ prefix: 'border-width_',
114
+ propsKey: 'borderWidth'
115
+ });
116
+ var borderTypeClass = useDeviceTargetClass.useDeviceTargetClass(props, {
117
+ prefix: 'border-type_',
118
+ propsKey: 'borderType'
119
+ });
102
120
  var _useStyles = useStyles.useStyles(props),
103
121
  iconStyles = _useStyles.styles;
104
122
  var ImageComponent = React.useMemo(function () {
@@ -119,17 +137,17 @@ var Icon = /*#__PURE__*/React__default.default.forwardRef(function Icon(props, r
119
137
  return null;
120
138
  }, [SvgImage, imageSrc]);
121
139
  return /*#__PURE__*/React__default.default.createElement("div", {
122
- className: clsx__default.default(className, 'icon', simple && 'icon_type_simple', bgFillClass, bgFillSizeClass, borderClass, borderHoverClass, fillClass, fillHoverClass, shapeClass, strokeClass, strokeHoverClass, Counter && 'icon_type_with-counter', (link || href || onClick) && 'cursor_type_pointer'),
140
+ className: clsx__default.default(className, 'icon', fillClass, fillHoverClass, fillSizeClass, iconFillClass, iconFillHoverClass, shapeClass, iconStrokeClass, iconStrokeHoverClass, borderColorClass, borderColorHoverClass, borderWidthClass, borderTypeClass, Badge && 'icon_type_with-badge', (link || href || onClick) && 'cursor_type_pointer'),
123
141
  ref: ref,
124
142
  style: iconStyles,
125
143
  onClick: onClick
126
144
  }, /*#__PURE__*/React__default.default.createElement(index.LinkWrapper, {
145
+ className: clsx__default.default(link || href ? 'icon__link' : 'icon__item', iconSizeClass),
146
+ DefaultComponent: "div",
127
147
  href: link || href,
128
- target: linkTarget,
129
148
  rel: linkRel,
130
- className: clsx__default.default(link || href ? 'icon__link' : 'icon__item', sizeClass),
131
- DefaultComponent: "div"
132
- }, before, ImageComponent, after, Counter));
149
+ target: linkTarget
150
+ }, before, ImageComponent, after, Badge));
133
151
  });
134
152
  Icon.propTypes = {
135
153
  SvgImage: PropTypes__default.default.oneOfType([PropTypes__default.default.element, PropTypes__default.default.func, PropTypes__default.default.object]),
@@ -182,3 +200,4 @@ function removeFillStroke(code) {
182
200
  }
183
201
 
184
202
  exports.Icon = Icon;
203
+ exports.iconConfig = iconConfig;
@@ -16,8 +16,16 @@ var React__default = /*#__PURE__*/_interopDefault(React);
16
16
  var PropTypes__default = /*#__PURE__*/_interopDefault(PropTypes);
17
17
  var clsx__default = /*#__PURE__*/_interopDefault(clsx);
18
18
 
19
+ var inputConfig = {
20
+ state: {},
21
+ setState: function setState(newComponent) {
22
+ inputConfig.state = newComponent;
23
+ }
24
+ };
19
25
  function Input(props) {
20
- var id = props.id,
26
+ var _inputConfig$state$st, _inputConfig$state$st2, _inputConfig$state$st3;
27
+ var state = props.state,
28
+ id = props.id,
21
29
  type = props.type,
22
30
  className = props.className,
23
31
  placeholder = props.placeholder,
@@ -58,12 +66,20 @@ function Input(props) {
58
66
  prefix: 'text-weight_',
59
67
  propsKey: 'textWeight'
60
68
  });
69
+ var borderWidthClass = useDeviceTargetClass.useDeviceTargetClass(props, {
70
+ prefix: 'border-width_',
71
+ propsKey: 'borderWidth'
72
+ });
73
+ var borderColorClass = useDeviceTargetClass.useDeviceTargetClass(props, {
74
+ prefix: 'border-color_',
75
+ propsKey: 'borderColor'
76
+ });
61
77
  var widthClass = useDeviceTargetClass.useDeviceTargetClass(props, {
62
78
  prefix: 'width_',
63
79
  propsKey: 'width'
64
80
  });
65
81
  return /*#__PURE__*/React__default.default.createElement("input", {
66
- className: clsx__default.default(className, 'input', (textSizeClass || textColorClass || weightClass) && 'text', caretClass, fillClass, placeholderClass, shapeClass, textSizeClass, textColorClass, weightClass, widthClass, sizeClass),
82
+ className: clsx__default.default(className, 'input', (textSizeClass || textColorClass || weightClass) && 'text', caretClass, fillClass, placeholderClass, shapeClass, textSizeClass, textColorClass, weightClass, widthClass, borderWidthClass, borderColorClass, sizeClass, ((_inputConfig$state$st = inputConfig.state[state]) == null ? void 0 : _inputConfig$state$st.fillClass) && ("fill_" + inputConfig.state[state].fillClass).replace(/([A-Z])/g, '-$1').toLowerCase(), ((_inputConfig$state$st2 = inputConfig.state[state]) == null ? void 0 : _inputConfig$state$st2.borderColor) && ("border-color_" + inputConfig.state[state].borderColor).replace(/([A-Z])/g, '-$1').toLowerCase(), ((_inputConfig$state$st3 = inputConfig.state[state]) == null ? void 0 : _inputConfig$state$st3.shape) && "shape_" + inputConfig.state[state].shape),
67
83
  type: type,
68
84
  id: id,
69
85
  disabled: disabled,
@@ -92,3 +108,4 @@ Input.defaultProps = {
92
108
  };
93
109
 
94
110
  exports.Input = Input;
111
+ exports.inputConfig = inputConfig;
@@ -31,8 +31,15 @@ var React__default = /*#__PURE__*/_interopDefault(React);
31
31
  var PropTypes__default = /*#__PURE__*/_interopDefault(PropTypes);
32
32
  var clsx__default = /*#__PURE__*/_interopDefault(clsx);
33
33
 
34
+ var labelConfig = {
35
+ appearance: {},
36
+ setAppearance: function setAppearance(newComponent) {
37
+ labelConfig.appearance = newComponent;
38
+ }
39
+ };
34
40
  function Label(props) {
35
- var children = props.children,
41
+ var appearance = props.appearance,
42
+ children = props.children,
36
43
  className = props.className,
37
44
  label = props.label,
38
45
  labelTextSize = props.labelTextSize,
@@ -71,13 +78,13 @@ function Label(props) {
71
78
  var _useStyles = useStyles.useStyles(props),
72
79
  labelStyles = _useStyles.styles;
73
80
  return /*#__PURE__*/React__default.default.createElement("div", {
74
- className: clsx__default.default(className, 'label', fillClass, shapeClass, borderClass, borderTypeClass, sizeClass, alignDirectionClass, alignClass, type && "label_type_" + type, set && "label_set_" + set),
81
+ className: clsx__default.default(className, 'label', fillClass || appearance && ("fill_" + labelConfig.appearance[appearance].fillClass).replace(/([A-Z])/g, '-$1').toLowerCase(), shapeClass, borderClass, borderTypeClass, sizeClass, alignDirectionClass, alignClass, type && "label_type_" + type, set && "label_set_" + set),
75
82
  style: labelStyles
76
83
  }, /*#__PURE__*/React__default.default.createElement("div", {
77
84
  className: "label__inner"
78
85
  }, typeof label === 'string' ? /*#__PURE__*/React__default.default.createElement(index.Text, {
79
86
  className: "label__label",
80
- textColor: labelTextColor,
87
+ textColor: labelTextColor || appearance && labelConfig.appearance[appearance].labelTextColor.replace(/([A-Z])/g, '-$1').toLowerCase(),
81
88
  size: labelTextSize,
82
89
  textWrap: labelTextWrap
83
90
  }, label) : /*#__PURE__*/React__default.default.createElement("div", {
@@ -124,3 +131,4 @@ Label.defaultProps = {
124
131
  };
125
132
 
126
133
  exports.Label = Label;
134
+ exports.labelConfig = labelConfig;
@@ -21,24 +21,35 @@ var PropTypes__default = /*#__PURE__*/_interopDefault(PropTypes);
21
21
  var clsx__default = /*#__PURE__*/_interopDefault(clsx);
22
22
 
23
23
  function Logo(props) {
24
- var children = props.children,
25
- className = props.className;
26
- props.isLink;
27
- var logoSrc = props.logoSrc;
24
+ var className = props.className,
25
+ LinkComponent = props.LinkComponent,
26
+ size = props.size,
27
+ link = props.link,
28
+ href = props.href,
29
+ target = props.target,
30
+ rel = props.rel,
31
+ source = props.source,
32
+ src = props.src;
28
33
  var alignItemsClass = useDeviceTargetClass.useDeviceTargetClass(props, {
29
34
  prefix: 'logo_align-items_',
30
35
  propsKey: 'alignItems'
31
36
  });
32
37
  var _useStyles = useStyles.useStyles(props),
33
- logo = _useStyles.styles,
34
- logoStyles = _useStyles.logo;
38
+ logo = _useStyles.styles;
35
39
  return /*#__PURE__*/React__default.default.createElement("div", {
36
- className: clsx__default.default(className, 'logo', alignItemsClass),
40
+ className: clsx__default.default(className, 'logo', alignItemsClass, size && "logo_size_" + size),
37
41
  style: logo
38
- }, children, /*#__PURE__*/React__default.default.createElement("img", {
39
- className: "logo__link-second",
40
- src: logoSrc,
41
- style: logoStyles
42
+ }, link || href ? /*#__PURE__*/React__default.default.createElement(LinkComponent, {
43
+ className: 'logo__link',
44
+ href: link || href,
45
+ target: target,
46
+ rel: rel
47
+ }, /*#__PURE__*/React__default.default.createElement("img", {
48
+ className: "logo__image",
49
+ src: src || source
50
+ })) : /*#__PURE__*/React__default.default.createElement("img", {
51
+ className: "logo__image",
52
+ src: src || source
42
53
  }));
43
54
  }
44
55
  Logo.propTypes = {
@@ -46,8 +57,9 @@ Logo.propTypes = {
46
57
  className: PropTypes__default.default.string,
47
58
  isLink: PropTypes__default.default.bool,
48
59
  logoSrc: PropTypes__default.default.string,
49
- LinkComponent: PropTypes__default.default.any,
50
60
  href: PropTypes__default.default.string,
61
+ src: PropTypes__default.default.string,
62
+ source: PropTypes__default.default.string,
51
63
  link: PropTypes__default.default.string,
52
64
  target: PropTypes__default.default.string,
53
65
  rel: PropTypes__default.default.string
@@ -33,8 +33,16 @@ var React__default = /*#__PURE__*/_interopDefault(React);
33
33
  var PropTypes__default = /*#__PURE__*/_interopDefault(PropTypes);
34
34
  var clsx__default = /*#__PURE__*/_interopDefault(clsx);
35
35
 
36
+ var menuItemConfig = {
37
+ appearance: {},
38
+ setAppearance: function setAppearance(newComponent) {
39
+ menuItemConfig.appearance = newComponent;
40
+ }
41
+ };
36
42
  function MenuItem(props) {
37
43
  var isActive = props.isActive,
44
+ isHover = props.isHover,
45
+ appearance = props.appearance,
38
46
  after = props.after,
39
47
  before = props.before,
40
48
  children = props.children,
@@ -122,7 +130,7 @@ function MenuItem(props) {
122
130
  var _useStyles = useStyles.useStyles(props),
123
131
  menuItem = _useStyles.styles;
124
132
  return /*#__PURE__*/React__default.default.createElement("div", {
125
- className: clsx__default.default('menu-item', isActive && 'menu-item_state_active', directionClass, className, sizeClass, fillClass, fillHoverClass, fillActiveClass, fillActiveHoverClass, fillDisabledClass, shapeClass, typeClass, widthClass, set && "menu-item_set_" + set, justifyContentClass),
133
+ className: clsx__default.default('menu-item', isActive && 'menu-item_state_active', isHover && 'menu-item_state_hover', directionClass, className, sizeClass, fillClass || appearance && ("fill_" + menuItemConfig.appearance[appearance].fillClass).replace(/([A-Z])/g, '-$1').toLowerCase(), fillHoverClass, fillActiveClass, fillActiveHoverClass, fillDisabledClass, shapeClass, typeClass, widthClass, set && "menu-item_set_" + set, justifyContentClass),
126
134
  style: menuItem,
127
135
  onClick: onClick,
128
136
  onMouseEnter: onMouseEnter
@@ -139,7 +147,7 @@ function MenuItem(props) {
139
147
  textGradient: textGradient,
140
148
  size: textSize,
141
149
  textWeight: textWeight,
142
- textColor: textColor,
150
+ textColor: textColor || appearance && menuItemConfig.appearance[appearance].textColor.replace(/([A-Z])/g, '-$1').toLowerCase(),
143
151
  textWrap: textWrap,
144
152
  textColorHover: textColorHover,
145
153
  textStyle: textStyle
@@ -207,3 +215,4 @@ MenuItem.defaultProps = {
207
215
  };
208
216
 
209
217
  exports.MenuItem = MenuItem;
218
+ exports.menuItemConfig = menuItemConfig;
@@ -2,68 +2,246 @@
2
2
 
3
3
  var React = require('react');
4
4
  var PropTypes = require('prop-types');
5
- var ReactDOM = require('react-dom');
5
+ var require$$2 = require('react-dom');
6
6
  var clsx = require('clsx');
7
+ require('./Icon.js');
8
+ require('./Text.js');
9
+ var index = require('./Fader.js');
10
+ require('lodash/camelCase');
11
+ require('lodash/maxBy');
12
+ require('lodash/upperFirst');
13
+ require('../context/UIContext.js');
14
+ var useDeviceTargetClass = require('../hooks/useDeviceTargetClass.js');
15
+ var index$1 = require('./Loader.js');
16
+ require('react-inlinesvg');
17
+ require('../constants/componentProps/fill.js');
18
+ require('../constants/componentProps/iconSize.js');
19
+ require('../constants/componentProps/shape.js');
20
+ require('../constants/componentProps/strokeColor.js');
21
+ require('./Link.js');
22
+ require('../useStyles-e4accb53.js');
23
+ require('../hooks/styleAttributes.js');
24
+ require('../constants/componentProps/size.js');
25
+ require('../constants/componentProps/textColor.js');
26
+ require('../constants/componentProps/textGradient.js');
27
+ require('../constants/componentProps/textStyle.js');
28
+ require('../constants/componentProps/textWeight.js');
29
+ require('../constants/componentProps/type.js');
30
+ require('../constants/componentProps/underline.js');
31
+ require('../hooks/useMediaQueries.js');
32
+ require('react-responsive');
33
+ require('lodash/castArray');
34
+ require('../constants/componentProps/textColorActive.js');
35
+ require('../constants/componentProps/textColorHover.js');
36
+ require('../constants/componentProps/fillGradient.js');
7
37
 
8
38
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
9
39
 
10
40
  var React__default = /*#__PURE__*/_interopDefault(React);
11
41
  var PropTypes__default = /*#__PURE__*/_interopDefault(PropTypes);
12
- var ReactDOM__default = /*#__PURE__*/_interopDefault(ReactDOM);
42
+ var require$$2__default = /*#__PURE__*/_interopDefault(require$$2);
13
43
  var clsx__default = /*#__PURE__*/_interopDefault(clsx);
14
44
 
15
- var Modal = /*#__PURE__*/React__default.default.forwardRef(function (props, ref) {
45
+ var getOrCreateModalElement = function getOrCreateModalElement(modalQuerySelector, className) {
46
+ if (className === void 0) {
47
+ className = '';
48
+ }
49
+ // prettier-ignore
50
+ var classList = className && typeof className === 'string' ? className.split(' ').filter(Boolean) : [];
51
+ var modalElement = document.querySelector(modalQuerySelector);
52
+ if (!modalElement) {
53
+ // Add modal element into the DOM on mount.
54
+ modalElement = document.createElement('div');
55
+ modalElement.setAttribute('id', 'modal-global');
56
+ modalElement.classList.add('modal');
57
+ if (classList.length) {
58
+ var _modalElement$classLi;
59
+ (_modalElement$classLi = modalElement.classList).add.apply(_modalElement$classLi, classList);
60
+ }
61
+ document.body.prepend(modalElement);
62
+ }
63
+ return modalElement;
64
+ };
65
+
66
+ // Modal component that is an abstraction around the portal API.
67
+ var Modal = /*#__PURE__*/React__default.default.forwardRef(function Modal(props, ref) {
16
68
  var children = props.children,
17
69
  className = props.className,
18
- classNameWrapper = props.classNameWrapper,
19
- onOpen = props.onOpen,
20
- onClose = props.onClose,
21
- containerRef = props.containerRef;
22
- var _useState = React.useState(false),
23
- isOpen = _useState[0],
24
- setIsOpen = _useState[1];
25
- var _useState2 = React.useState(null),
26
- modalsNode = _useState2[0],
27
- setModalsNode = _useState2[1];
28
- var open = React.useCallback(function () {
70
+ closeButton = props.closeButton,
71
+ contentClassName = props.contentClassName,
72
+ id = props.id,
73
+ isFader = props.isFader,
74
+ faderFill = props.faderFill,
75
+ faderFillGradient = props.faderFillGradient,
76
+ faderOpacity = props.faderOpacity,
77
+ initialIsOpen = props.isOpen,
78
+ isScrollOnOpen = props.isScrollOnOpen,
79
+ isSetFocusOnOpen = props.isSetFocusOnOpen,
80
+ modalQuerySelector = props.modalQuerySelector,
81
+ isOutsideClose = props.isOutsideClose,
82
+ onCloseModal = props.onCloseModal,
83
+ onOpenModal = props.onOpenModal;
84
+
85
+ // Query DOM element
86
+ var _useState = React.useState(null),
87
+ modalElement = _useState[0],
88
+ setModalElement = _useState[1];
89
+ React.useLayoutEffect(function () {
90
+ var element = getOrCreateModalElement(modalQuerySelector, className);
91
+ setModalElement(element);
92
+ if (element) {
93
+ addModalProps(element);
94
+ }
95
+ }, []);
96
+ var modalContentRef = React.useRef(null);
97
+ var modalFaderRef = React.useRef(null);
98
+ var _useState2 = React.useState(initialIsOpen),
99
+ isOpen = _useState2[0],
100
+ setIsOpen = _useState2[1];
101
+ var addModalProps = React.useCallback(function (element) {
102
+ // Change class need in "useEffect"
103
+ if (isOpen) {
104
+ // Show modal
105
+ element.classList.add('modal_state_visible');
106
+ // Scroll to opened modal
107
+ if (isScrollOnOpen) {
108
+ // modalContentRef.current.style.top = `${window.visualViewport.pageTop}px`
109
+ element.scrollIntoView({
110
+ block: 'center',
111
+ behavior: 'smooth'
112
+ });
113
+ }
114
+
115
+ // "setTimeout" in this implementation is needs for set focus on modal
116
+ // after "onMouseDown" event on button
117
+ if (isSetFocusOnOpen) {
118
+ setTimeout(function () {
119
+ return modalContentRef.current.focus();
120
+ }, 0);
121
+ }
122
+ } else if (!element.children.length) {
123
+ // Hide modal if has no children
124
+ element.classList.remove('modal_state_visible');
125
+ }
126
+ }, [isOpen, isSetFocusOnOpen]);
127
+ React.useEffect(function () {
128
+ if (!modalElement) {
129
+ return;
130
+ }
131
+ addModalProps(modalElement);
132
+ }, [isOpen]); // eslint-disable-line
133
+
134
+ // Show modal with children content
135
+ var openModal = React.useCallback(function () {
29
136
  setIsOpen(true);
30
- onOpen && onOpen();
31
- }, [onOpen]);
32
- var close = React.useCallback(function () {
137
+
138
+ // Callback
139
+ if (typeof onOpenModal === 'function') {
140
+ onOpenModal();
141
+ }
142
+
143
+ /* SHOW TARGET POPUP ABOVE OTHERS POPUPS IF TARGET ALREADY OPENED
144
+ // If current modal is already opened
145
+ // Move content to end of modal root container. For order in DOM.
146
+ const modalContentElement = modalContentRef.current
147
+ if (modalContentElement) {
148
+ modalContentElement.parentNode.appendChild(modalContentElement)
149
+ }
150
+ // Also move fader to end of modal root container after container
151
+ const modalFaderElement = modalFaderRef.current
152
+ if (modalFaderElement) {
153
+ modalFaderElement.parentNode.appendChild(modalFaderElement)
154
+ }
155
+ */
156
+ }, [onOpenModal]);
157
+
158
+ // Hide modal and unmount children content
159
+ var closeModal = React.useCallback(function (event) {
160
+ if (event === void 0) {
161
+ event = {};
162
+ }
163
+ var hasRelatedTarget = event.relatedTarget && modalElement.contains(event.relatedTarget);
164
+ if (hasRelatedTarget) {
165
+ return event;
166
+ }
33
167
  setIsOpen(false);
34
- onClose && onClose();
35
- }, [onClose]);
168
+
169
+ // Callback
170
+ if (typeof onCloseModal === 'function') {
171
+ onCloseModal();
172
+ }
173
+ }, [modalElement, onCloseModal]);
174
+
175
+ // Save ref things
36
176
  React.useImperativeHandle(ref, function () {
37
177
  return {
38
178
  isOpen: isOpen,
39
- open: open,
40
- close: close
179
+ openModal: openModal,
180
+ closeModal: closeModal,
181
+ modalElement: modalElement
41
182
  };
42
183
  });
43
- React.useEffect(function () {
44
- setModalsNode(document.getElementById('modals'));
45
- }, []);
46
- if (!isOpen || !(modalsNode || containerRef)) {
47
- return null;
48
- }
49
- return /*#__PURE__*/ReactDOM__default.default.createPortal( /*#__PURE__*/React__default.default.createElement("div", {
50
- className: clsx__default.default('modal', className),
51
- onClick: close
52
- }, /*#__PURE__*/React__default.default.createElement("div", {
53
- className: clsx__default.default('modal__wrapper', classNameWrapper),
54
- onClick: function onClick(e) {
55
- return e.stopPropagation();
56
- }
57
- }, children)), (containerRef == null ? void 0 : containerRef.current) || modalsNode);
184
+ var contentFillClass = useDeviceTargetClass.useDeviceTargetClass(props, {
185
+ prefix: 'fill_',
186
+ propsKey: 'contentFill'
187
+ });
188
+
189
+ // Use a portal to render the children into the element
190
+ return modalElement && /*#__PURE__*/require$$2__default.default.createPortal(
191
+ // Any valid React child: JSX, strings, arrays, etc.
192
+ isOpen ? /*#__PURE__*/React__default.default.createElement(React__default.default.Fragment, null, /*#__PURE__*/React__default.default.createElement("div", {
193
+ className: clsx__default.default('modal-content', contentClassName, contentFillClass),
194
+ id: id,
195
+ ref: modalContentRef,
196
+ tabIndex: 0,
197
+ onBlur: isOutsideClose ? undefined : closeModal
198
+ }, closeButton && /*#__PURE__*/React__default.default.createElement("div", {
199
+ className: "modal-content__close",
200
+ onClick: closeModal
201
+ }, closeButton), children), /*#__PURE__*/React__default.default.createElement(index.Fader, {
202
+ ref: modalFaderRef,
203
+ fill: faderFill,
204
+ fillGradient: faderFillGradient,
205
+ opacity: faderOpacity,
206
+ className: "modal__fader",
207
+ isFader: isFader
208
+ })) : null,
209
+ // A DOM element
210
+ modalElement);
58
211
  });
59
212
  Modal.propTypes = {
60
213
  children: PropTypes__default.default.any,
61
214
  className: PropTypes__default.default.string,
62
- classNameWrapper: PropTypes__default.default.string,
63
- containerRef: PropTypes__default.default.any,
64
- onClose: PropTypes__default.default.func,
65
- onOpen: PropTypes__default.default.func
215
+ closeIcon: PropTypes__default.default.string,
216
+ closeText: PropTypes__default.default.string,
217
+ faderFill: PropTypes__default.default.string,
218
+ faderFillGradient: PropTypes__default.default.string,
219
+ faderOpacity: PropTypes__default.default.string,
220
+ contentClassName: PropTypes__default.default.string,
221
+ id: PropTypes__default.default.string,
222
+ isFader: PropTypes__default.default.bool,
223
+ isScrollOnOpen: PropTypes__default.default.bool,
224
+ isSetFocusOnOpen: PropTypes__default.default.bool,
225
+ modalQuerySelector: PropTypes__default.default.string,
226
+ isOutsideClose: PropTypes__default.default.bool,
227
+ onCloseModal: PropTypes__default.default.func,
228
+ onOpenModal: PropTypes__default.default.func
229
+ };
230
+ Modal.defaultProps = {
231
+ isFader: true,
232
+ isOpen: false,
233
+ isScrollOnOpen: true,
234
+ isSetFocusOnOpen: true,
235
+ modalQuerySelector: '#modal-global'
66
236
  };
67
- Modal.displayName = 'Modal';
237
+
238
+ function ModalLoader(props) {
239
+ return /*#__PURE__*/React__default.default.createElement("div", {
240
+ className: "modal-loading"
241
+ }, /*#__PURE__*/React__default.default.createElement("div", {
242
+ className: "modal-loading__inner"
243
+ }, /*#__PURE__*/React__default.default.createElement(index$1.Loader, null)));
244
+ }
68
245
 
69
246
  exports.Modal = Modal;
247
+ exports.ModalLoader = ModalLoader;
@@ -24,16 +24,22 @@ require('../context/UIContext.js');
24
24
  require('../hooks/useMediaQueries.js');
25
25
  require('react-responsive');
26
26
  require('lodash/castArray');
27
+ require('./Icon.js');
28
+ require('react-inlinesvg');
29
+ require('../constants/componentProps/iconSize.js');
30
+ require('../constants/componentProps/strokeColor.js');
31
+ require('./Link.js');
27
32
  require('../constants/componentProps/size.js');
28
33
  require('../constants/componentProps/textColor.js');
29
- require('../constants/componentProps/textColorActive.js');
30
- require('../constants/componentProps/textColorHover.js');
34
+ require('../constants/componentProps/textGradient.js');
31
35
  require('../constants/componentProps/textStyle.js');
32
36
  require('../constants/componentProps/textWeight.js');
37
+ require('../constants/componentProps/type.js');
38
+ require('../constants/componentProps/underline.js');
39
+ require('../constants/componentProps/textColorActive.js');
40
+ require('../constants/componentProps/textColorHover.js');
33
41
  require('../constants/componentProps/textAlign.js');
34
- require('../constants/componentProps/textGradient.js');
35
42
  require('../constants/componentProps/titleSize.js');
36
- require('../constants/componentProps/type.js');
37
43
  require('../constants/componentProps/wrap.js');
38
44
 
39
45
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }