@itcase/ui 1.0.9 → 1.0.11

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,234 @@
1
+ 'use strict';
2
+
3
+ var React = require('react');
4
+ var PropTypes = require('prop-types');
5
+ var ReactDOM = require('react-dom');
6
+ var clsx = require('clsx');
7
+ var index = require('./components/Fader.js');
8
+ var useStyles = require('./useStyles-e4accb53.js');
9
+ var useDeviceTargetClass = require('./hooks/useDeviceTargetClass.js');
10
+
11
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
12
+
13
+ var React__default = /*#__PURE__*/_interopDefault(React);
14
+ var PropTypes__default = /*#__PURE__*/_interopDefault(PropTypes);
15
+ var ReactDOM__default = /*#__PURE__*/_interopDefault(ReactDOM);
16
+ var clsx__default = /*#__PURE__*/_interopDefault(clsx);
17
+
18
+ var getOrCreateModalElement = function getOrCreateModalElement(modalQuerySelector, className) {
19
+ if (className === void 0) {
20
+ className = '';
21
+ }
22
+ // prettier-ignore
23
+ var classList = className && typeof className === 'string' ? className.split(' ').filter(Boolean) : [];
24
+ var modalElement = document.querySelector(modalQuerySelector);
25
+ if (!modalElement) {
26
+ // Add modal element into the DOM on mount.
27
+ modalElement = document.createElement('div');
28
+ modalElement.setAttribute('id', 'modal-global');
29
+ modalElement.classList.add('modal');
30
+ if (classList.length) {
31
+ var _modalElement$classLi;
32
+ (_modalElement$classLi = modalElement.classList).add.apply(_modalElement$classLi, classList);
33
+ }
34
+ document.body.prepend(modalElement);
35
+ }
36
+ return modalElement;
37
+ };
38
+
39
+ // Modal component that is an abstraction around the portal API.
40
+ var Modal = /*#__PURE__*/React__default.default.forwardRef(function Modal(props, ref) {
41
+ var children = props.children,
42
+ className = props.className,
43
+ closeButton = props.closeButton,
44
+ contentClassName = props.contentClassName,
45
+ id = props.id,
46
+ isFader = props.isFader,
47
+ faderFill = props.faderFill,
48
+ faderFillGradient = props.faderFillGradient,
49
+ faderOpacity = props.faderOpacity,
50
+ initialIsOpen = props.isOpen,
51
+ isScrollOnOpen = props.isScrollOnOpen,
52
+ isSetFocusOnOpen = props.isSetFocusOnOpen,
53
+ modalQuerySelector = props.modalQuerySelector,
54
+ isOutsideClose = props.isOutsideClose,
55
+ onCloseModal = props.onCloseModal,
56
+ onOpenModal = props.onOpenModal;
57
+
58
+ // Query DOM element
59
+ var _useState = React.useState(null),
60
+ modalElement = _useState[0],
61
+ setModalElement = _useState[1];
62
+ React.useLayoutEffect(function () {
63
+ var element = getOrCreateModalElement(modalQuerySelector, className);
64
+ setModalElement(element);
65
+ if (element) {
66
+ addModalProps(element);
67
+ }
68
+ }, []);
69
+ var modalContentRef = React.useRef(null);
70
+ var modalFaderRef = React.useRef(null);
71
+ var _useState2 = React.useState(initialIsOpen),
72
+ isOpen = _useState2[0],
73
+ setIsOpen = _useState2[1];
74
+ var addModalProps = React.useCallback(function (element) {
75
+ // Change class need in "useEffect"
76
+ if (isOpen) {
77
+ // Show modal
78
+ element.classList.add('modal_state_visible');
79
+ // Scroll to opened modal
80
+ if (isScrollOnOpen) {
81
+ // modalContentRef.current.style.top = `${window.visualViewport.pageTop}px`
82
+ element.scrollIntoView({
83
+ block: 'center',
84
+ behavior: 'smooth'
85
+ });
86
+ }
87
+
88
+ // "setTimeout" in this implementation is needs for set focus on modal
89
+ // after "onMouseDown" event on button
90
+ if (isSetFocusOnOpen) {
91
+ setTimeout(function () {
92
+ return modalContentRef.current.focus();
93
+ }, 0);
94
+ }
95
+ } else if (!element.children.length) {
96
+ // Hide modal if has no children
97
+ element.classList.remove('modal_state_visible');
98
+ }
99
+ }, [isOpen, isSetFocusOnOpen]);
100
+ React.useEffect(function () {
101
+ if (!modalElement) {
102
+ return;
103
+ }
104
+ addModalProps(modalElement);
105
+ }, [isOpen]); // eslint-disable-line
106
+
107
+ // Show modal with children content
108
+ var openModal = React.useCallback(function () {
109
+ setIsOpen(true);
110
+
111
+ // Callback
112
+ if (typeof onOpenModal === 'function') {
113
+ onOpenModal();
114
+ }
115
+
116
+ /* SHOW TARGET POPUP ABOVE OTHERS POPUPS IF TARGET ALREADY OPENED
117
+ // If current modal is already opened
118
+ // Move content to end of modal root container. For order in DOM.
119
+ const modalContentElement = modalContentRef.current
120
+ if (modalContentElement) {
121
+ modalContentElement.parentNode.appendChild(modalContentElement)
122
+ }
123
+ // Also move fader to end of modal root container after container
124
+ const modalFaderElement = modalFaderRef.current
125
+ if (modalFaderElement) {
126
+ modalFaderElement.parentNode.appendChild(modalFaderElement)
127
+ }
128
+ */
129
+ }, [onOpenModal]);
130
+
131
+ // Hide modal and unmount children content
132
+ var closeModal = React.useCallback(function (event) {
133
+ if (event === void 0) {
134
+ event = {};
135
+ }
136
+ var hasRelatedTarget = event.relatedTarget && modalElement.contains(event.relatedTarget);
137
+ if (hasRelatedTarget) {
138
+ return event;
139
+ }
140
+ setIsOpen(false);
141
+
142
+ // Callback
143
+ if (typeof onCloseModal === 'function') {
144
+ onCloseModal();
145
+ }
146
+ }, [modalElement, onCloseModal]);
147
+
148
+ // Save ref things
149
+ React.useImperativeHandle(ref, function () {
150
+ return {
151
+ isOpen: isOpen,
152
+ openModal: openModal,
153
+ closeModal: closeModal,
154
+ modalElement: modalElement
155
+ };
156
+ });
157
+ var contentFillClass = useDeviceTargetClass.useDeviceTargetClass(props, {
158
+ prefix: 'fill_',
159
+ propsKey: 'contentFill'
160
+ });
161
+ var shapeClass = useDeviceTargetClass.useDeviceTargetClass(props, {
162
+ prefix: 'modal-shape_',
163
+ propsKey: 'shape'
164
+ });
165
+ var borderColorClass = useDeviceTargetClass.useDeviceTargetClass(props, {
166
+ prefix: 'border-color_',
167
+ propsKey: 'borderColor'
168
+ });
169
+ var borderWidthClass = useDeviceTargetClass.useDeviceTargetClass(props, {
170
+ prefix: 'border-width_',
171
+ propsKey: 'borderWidth'
172
+ });
173
+ var borderTypeClass = useDeviceTargetClass.useDeviceTargetClass(props, {
174
+ prefix: 'border-type_',
175
+ propsKey: 'borderType'
176
+ });
177
+ var elevationClass = useDeviceTargetClass.useDeviceTargetClass(props, {
178
+ prefix: 'elevation_',
179
+ propsKey: 'elevation'
180
+ });
181
+ var _useStyles = useStyles.useStyles(props),
182
+ modalStyles = _useStyles.styles;
183
+
184
+ // Use a portal to render the children into the element
185
+ return modalElement && /*#__PURE__*/ReactDOM__default.default.createPortal(
186
+ // Any valid React child: JSX, strings, arrays, etc.
187
+ isOpen ? /*#__PURE__*/React__default.default.createElement(React__default.default.Fragment, null, /*#__PURE__*/React__default.default.createElement("div", {
188
+ className: clsx__default.default('modal-content', contentClassName, contentFillClass, shapeClass, borderColorClass, borderWidthClass, borderTypeClass, elevationClass),
189
+ id: id,
190
+ ref: modalContentRef,
191
+ tabIndex: 0,
192
+ onBlur: isOutsideClose ? undefined : closeModal,
193
+ style: modalStyles
194
+ }, closeButton && /*#__PURE__*/React__default.default.createElement("div", {
195
+ className: "modal-content__close",
196
+ onClick: closeModal
197
+ }, closeButton), children), /*#__PURE__*/React__default.default.createElement(index.Fader, {
198
+ ref: modalFaderRef,
199
+ fill: faderFill,
200
+ fillGradient: faderFillGradient,
201
+ opacity: faderOpacity,
202
+ className: "modal__fader",
203
+ isFader: isFader
204
+ })) : null,
205
+ // A DOM element
206
+ modalElement);
207
+ });
208
+ Modal.propTypes = {
209
+ children: PropTypes__default.default.any,
210
+ className: PropTypes__default.default.string,
211
+ closeIcon: PropTypes__default.default.string,
212
+ closeText: PropTypes__default.default.string,
213
+ faderFill: PropTypes__default.default.string,
214
+ faderFillGradient: PropTypes__default.default.string,
215
+ faderOpacity: PropTypes__default.default.string,
216
+ contentClassName: PropTypes__default.default.string,
217
+ id: PropTypes__default.default.string,
218
+ isFader: PropTypes__default.default.bool,
219
+ isScrollOnOpen: PropTypes__default.default.bool,
220
+ isSetFocusOnOpen: PropTypes__default.default.bool,
221
+ modalQuerySelector: PropTypes__default.default.string,
222
+ isOutsideClose: PropTypes__default.default.bool,
223
+ onCloseModal: PropTypes__default.default.func,
224
+ onOpenModal: PropTypes__default.default.func
225
+ };
226
+ Modal.defaultProps = {
227
+ isFader: true,
228
+ isOpen: false,
229
+ isScrollOnOpen: true,
230
+ isSetFocusOnOpen: true,
231
+ modalQuerySelector: '#modal-global'
232
+ };
233
+
234
+ exports.Modal = Modal;
@@ -36,6 +36,7 @@ function Chips(props) {
36
36
  label = props.label,
37
37
  labelSize = props.labelSize,
38
38
  labelTextColor = props.labelTextColor,
39
+ labelTextWeight = props.labelTextWeight,
39
40
  type = props.type;
40
41
  var alignDirectionClass = useDeviceTargetClass.useDeviceTargetClass(props, {
41
42
  prefix: 'align_',
@@ -75,6 +76,7 @@ function Chips(props) {
75
76
  }, typeof label === 'string' ? /*#__PURE__*/React__default.default.createElement(index.Text, {
76
77
  className: "chips__label",
77
78
  textColor: labelTextColor,
79
+ textWeight: labelTextWeight,
78
80
  size: labelSize
79
81
  }, label) : /*#__PURE__*/React__default.default.createElement("div", {
80
82
  className: "chips__label"
@@ -0,0 +1,118 @@
1
+ 'use strict';
2
+
3
+ var React = require('react');
4
+ var PropTypes = require('prop-types');
5
+ var clsx = require('clsx');
6
+ var index = require('./Text.js');
7
+ var useDeviceTargetClass = require('../hooks/useDeviceTargetClass.js');
8
+ require('../constants/componentProps/textColor.js');
9
+ require('../constants/componentProps/textColorActive.js');
10
+ require('../constants/componentProps/textColorHover.js');
11
+ require('../constants/componentProps/size.js');
12
+ require('../constants/componentProps/textStyle.js');
13
+ require('../constants/componentProps/textWeight.js');
14
+ require('../useStyles-e4accb53.js');
15
+ require('lodash/camelCase');
16
+ require('lodash/maxBy');
17
+ require('lodash/upperFirst');
18
+ require('../hooks/styleAttributes.js');
19
+ require('../context/UIContext.js');
20
+ require('../hooks/useMediaQueries.js');
21
+ require('react-responsive');
22
+ require('lodash/castArray');
23
+
24
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
25
+
26
+ var React__default = /*#__PURE__*/_interopDefault(React);
27
+ var PropTypes__default = /*#__PURE__*/_interopDefault(PropTypes);
28
+ var clsx__default = /*#__PURE__*/_interopDefault(clsx);
29
+
30
+ var Choice = /*#__PURE__*/React__default.default.forwardRef(function (props, ref) {
31
+ var name = props.name,
32
+ className = props.className,
33
+ type = props.type,
34
+ options = props.options,
35
+ active = props.active,
36
+ setActiveSegment = props.setActiveSegment,
37
+ size = props.size,
38
+ labelTextColor = props.labelTextColor,
39
+ labelTextActiveColor = props.labelTextActiveColor,
40
+ labelTextSize = props.labelTextSize;
41
+ var controlRef = React.useRef(null);
42
+ var optionsRefs = React.useMemo(function () {
43
+ return new Map(options.map(function (item) {
44
+ return [item.value, /*#__PURE__*/React.createRef()];
45
+ }));
46
+ }, [options]);
47
+ var borderColorClass = useDeviceTargetClass.useDeviceTargetClass(props, {
48
+ prefix: 'border-color_',
49
+ propsKey: 'borderColor'
50
+ });
51
+ var borderWidthClass = useDeviceTargetClass.useDeviceTargetClass(props, {
52
+ prefix: 'border-width_',
53
+ propsKey: 'borderWidth'
54
+ });
55
+ var borderTypeClass = useDeviceTargetClass.useDeviceTargetClass(props, {
56
+ prefix: 'border-type_',
57
+ propsKey: 'borderType'
58
+ });
59
+ var shapeClass = useDeviceTargetClass.useDeviceTargetClass(props, {
60
+ prefix: 'choice_shape_',
61
+ propsKey: 'shape'
62
+ });
63
+ var fillClass = useDeviceTargetClass.useDeviceTargetClass(props, {
64
+ prefix: 'fill_',
65
+ propsKey: 'fill'
66
+ });
67
+ var fillHoverClass = useDeviceTargetClass.useDeviceTargetClass(props, {
68
+ prefix: 'fill_hover_',
69
+ propsKey: 'fillHover'
70
+ });
71
+ var fillActiveClass = useDeviceTargetClass.useDeviceTargetClass(props, {
72
+ prefix: 'fill_active_',
73
+ propsKey: 'fillActive'
74
+ });
75
+ return /*#__PURE__*/React__default.default.createElement("div", {
76
+ className: clsx__default.default(className, 'choice', shapeClass, fillClass, borderColorClass, borderWidthClass, borderTypeClass, size && "choice_size_" + size, type && "choice_type_" + type),
77
+ ref: controlRef
78
+ }, /*#__PURE__*/React__default.default.createElement("div", {
79
+ className: "choice__wrapper"
80
+ }, options == null ? void 0 : options.map(function (item, i) {
81
+ return /*#__PURE__*/React__default.default.createElement("div", {
82
+ className: clsx__default.default('choice__item', borderColorClass, borderWidthClass, borderTypeClass, fillHoverClass, item.value === active.value && fillActiveClass, item.value === active.value && 'choice__item_active'),
83
+ key: item.value,
84
+ ref: optionsRefs.get(item.value)
85
+ }, /*#__PURE__*/React__default.default.createElement("input", {
86
+ checked: item.value === active.value,
87
+ className: "choice__item-radio",
88
+ id: item.label,
89
+ name: name,
90
+ type: "radio",
91
+ value: item.value,
92
+ onChange: function onChange() {
93
+ return setActiveSegment(item);
94
+ }
95
+ }), /*#__PURE__*/React__default.default.createElement("label", {
96
+ className: clsx__default.default('choice__item-label'),
97
+ htmlFor: item.label
98
+ }, /*#__PURE__*/React__default.default.createElement(index.Text, {
99
+ textColor: item.value === active.value ? labelTextActiveColor : labelTextColor,
100
+ size: labelTextSize
101
+ }, item.label)));
102
+ })));
103
+ });
104
+ Choice.displayName = 'Choice';
105
+ Choice.propTypes = {
106
+ active: PropTypes__default.default.object,
107
+ className: PropTypes__default.default.string,
108
+ fill: PropTypes__default.default.string,
109
+ name: PropTypes__default.default.string,
110
+ options: PropTypes__default.default.array,
111
+ setActiveSegment: PropTypes__default.default.func,
112
+ type: PropTypes__default.default.string
113
+ };
114
+ Choice.defaultProps = {
115
+ active: {}
116
+ };
117
+
118
+ exports.Choice = Choice;