iguazio.dashboard-react-controls 0.0.9 → 0.0.12

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.
@@ -9,8 +9,6 @@ var _react = _interopRequireDefault(require("react"));
9
9
 
10
10
  var _propTypes = _interopRequireDefault(require("prop-types"));
11
11
 
12
- var _reactDom = require("react-dom");
13
-
14
12
  var _reactTransitionGroup = require("react-transition-group");
15
13
 
16
14
  require("./Backdrop.scss");
@@ -24,7 +22,7 @@ var Backdrop = function Backdrop(_ref) {
24
22
  duration = _ref$duration === void 0 ? 300 : _ref$duration,
25
23
  show = _ref.show,
26
24
  onClose = _ref.onClose;
27
- return /*#__PURE__*/(0, _reactDom.createPortal)( /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactTransitionGroup.CSSTransition, {
25
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactTransitionGroup.CSSTransition, {
28
26
  in: show,
29
27
  timeout: duration,
30
28
  classNames: "backdrop-transition",
@@ -34,7 +32,7 @@ var Backdrop = function Backdrop(_ref) {
34
32
  className: "backdrop",
35
33
  onClick: onClose
36
34
  })
37
- }), document.getElementById('overlay_container'));
35
+ });
38
36
  };
39
37
 
40
38
  Backdrop.defaultProps = {
@@ -25,7 +25,7 @@ require("./Button.scss");
25
25
 
26
26
  var _jsxRuntime = require("react/jsx-runtime");
27
27
 
28
- var _excluded = ["className", "icon", "label", "tooltip", "variant"];
28
+ var _excluded = ["className", "density", "icon", "label", "tooltip", "variant"];
29
29
 
30
30
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
31
31
 
@@ -45,13 +45,14 @@ function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) r
45
45
 
46
46
  var Button = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, ref) {
47
47
  var className = _ref.className,
48
+ density = _ref.density,
48
49
  icon = _ref.icon,
49
50
  label = _ref.label,
50
51
  tooltip = _ref.tooltip,
51
52
  variant = _ref.variant,
52
53
  restProps = _objectWithoutProperties(_ref, _excluded);
53
54
 
54
- var buttonClassName = (0, _classnames.default)('btn', "btn-".concat(variant), className);
55
+ var buttonClassName = (0, _classnames.default)('btn', "btn-".concat(variant), "btn-".concat(density), className);
55
56
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_Tooltip.default, {
56
57
  template: /*#__PURE__*/(0, _jsxRuntime.jsx)(_TextTooltipTemplate.default, {
57
58
  text: tooltip
@@ -68,12 +69,14 @@ var Button = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, ref) {
68
69
  });
69
70
  Button.defaultProps = {
70
71
  className: '',
72
+ density: 'normal',
71
73
  label: 'Button',
72
74
  tooltip: '',
73
75
  variant: _constants.TERTIARY_BUTTON
74
76
  };
75
77
  Button.propTypes = {
76
78
  className: _propTypes.default.string,
79
+ density: _propTypes.default.oneOf(['dense', 'normal', 'medium', 'chunky']),
77
80
  icon: _propTypes.default.element,
78
81
  label: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.element]),
79
82
  tooltip: _propTypes.default.string,
@@ -7,16 +7,31 @@
7
7
  align-items: center;
8
8
  justify-content: center;
9
9
  min-width: 90px;
10
- height: 36px;
10
+ height: $fieldNormal;
11
11
  padding: 0 16px;
12
12
  color: $white;
13
13
  font-weight: 500;
14
14
  font-size: 0.875rem;
15
15
  font-style: normal;
16
- line-height: 16px;
17
16
  border: $transparentBorder;
18
17
  border-radius: $mainBorderRadius;
19
18
 
19
+ &-dense {
20
+ height: $fieldDense;
21
+ }
22
+
23
+ &-normal {
24
+ height: $fieldNormal;
25
+ }
26
+
27
+ &-medium {
28
+ height: $fieldMedium;
29
+ }
30
+
31
+ &-chunky {
32
+ height: $fieldChunky;
33
+ }
34
+
20
35
  svg {
21
36
  & > * {
22
37
  fill: currentColor;
@@ -9,47 +9,65 @@ var _react = _interopRequireDefault(require("react"));
9
9
 
10
10
  var _propTypes = _interopRequireDefault(require("prop-types"));
11
11
 
12
- var _checkboxUnchecked = require("../../images/checkbox-unchecked.svg");
12
+ var _reactFinalForm = require("react-final-form");
13
13
 
14
- var _checkboxChecked = require("../../images/checkbox-checked.svg");
14
+ var _classnames = _interopRequireDefault(require("classnames"));
15
15
 
16
16
  require("./formCheckBox.scss");
17
17
 
18
18
  var _jsxRuntime = require("react/jsx-runtime");
19
19
 
20
+ var _excluded = ["children", "className", "name", "label"];
21
+
20
22
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
21
23
 
24
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
25
+
26
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
27
+
28
+ function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
29
+
30
+ function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
31
+
32
+ function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
33
+
22
34
  var FormCheckBox = function FormCheckBox(_ref) {
23
- var children = _ref.children,
35
+ var _children = _ref.children,
24
36
  className = _ref.className,
25
- item = _ref.item,
26
- onChange = _ref.onChange,
27
- selectedId = _ref.selectedId;
28
- return /*#__PURE__*/(0, _jsxRuntime.jsxs)("span", {
29
- className: "checkbox ".concat(className),
30
- onClick: function onClick() {
31
- onChange(item.id);
32
- },
33
- children: [item.id === selectedId ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_checkboxChecked.ReactComponent, {
34
- className: "checked"
35
- }) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_checkboxUnchecked.ReactComponent, {
36
- className: "unchecked"
37
- }), children || item.label]
37
+ name = _ref.name,
38
+ label = _ref.label,
39
+ inputProps = _objectWithoutProperties(_ref, _excluded);
40
+
41
+ var formFieldClassNames = (0, _classnames.default)('form-field-checkbox', className);
42
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactFinalForm.Field, {
43
+ name: name,
44
+ value: inputProps.value,
45
+ type: "checkbox",
46
+ children: function children(_ref2) {
47
+ var _inputProps$value, _inputProps$value2;
48
+
49
+ var input = _ref2.input;
50
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
51
+ className: formFieldClassNames,
52
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("input", _objectSpread(_objectSpread({}, _objectSpread(_objectSpread({}, input), inputProps)), {}, {
53
+ id: (_inputProps$value = inputProps.value) !== null && _inputProps$value !== void 0 ? _inputProps$value : name
54
+ })), /*#__PURE__*/(0, _jsxRuntime.jsxs)("label", {
55
+ htmlFor: (_inputProps$value2 = inputProps.value) !== null && _inputProps$value2 !== void 0 ? _inputProps$value2 : name,
56
+ children: [label ? label : '', _children]
57
+ })]
58
+ });
59
+ }
38
60
  });
39
61
  };
40
62
 
41
63
  FormCheckBox.defaultProps = {
42
64
  className: '',
43
- selectedId: ''
65
+ label: ''
44
66
  };
45
67
  FormCheckBox.propTypes = {
46
68
  className: _propTypes.default.string,
47
- item: _propTypes.default.shape({
48
- id: _propTypes.default.string.isRequired,
49
- label: _propTypes.default.string
50
- }).isRequired,
51
- onChange: _propTypes.default.func.isRequired,
52
- selectedId: _propTypes.default.string
69
+ name: _propTypes.default.string.isRequired,
70
+ label: _propTypes.default.string
53
71
  };
54
72
 
55
73
  var _default = /*#__PURE__*/_react.default.memo(FormCheckBox);
@@ -1,32 +1,50 @@
1
1
  @import '../../scss/colors';
2
+ @import '../../scss/mixins';
2
3
 
3
- .checkbox {
4
- display: flex;
4
+ .form-field-checkbox {
5
+ display: inline-flex;
5
6
  align-items: center;
7
+ justify-content: flex-start;
6
8
  color: $primary;
7
- cursor: pointer;
8
9
 
9
- &__label {
10
- flex: 1;
11
- font-size: 14px;
10
+ input[type='checkbox'] {
11
+ @include radioCheckField;
12
12
 
13
- &-tip {
14
- margin-left: 5px;
13
+ flex: 0 0 18px;
14
+ width: 18px;
15
+ height: 18px;
16
+ border-radius: 4px;
17
+ transition: background 0.2s ease-in-out;
18
+
19
+ &::before {
20
+ content: '';
21
+ display: block;
22
+ position: absolute;
23
+ top: 1px;
24
+ left: 5px;
25
+ width: 6px;
26
+ height: 11px;
27
+ border-style: solid;
28
+ border-color: $white;
29
+ border-width: 0 2px 2px 0;
30
+ transform: rotate(45deg);
15
31
  }
16
- }
17
32
 
18
- svg {
19
- margin-right: 5px;
33
+ &:checked {
34
+ background: currentColor;
35
+
36
+ &:hover {
37
+ background: currentColor;
20
38
 
21
- &.checked {
22
- path {
23
- fill: $malibu;
39
+ &:disabled {
40
+ background: currentColor;
41
+ }
24
42
  }
25
43
  }
26
44
 
27
- &.unchecked {
28
- path {
29
- fill: $spunPearl;
45
+ &:disabled {
46
+ &:hover {
47
+ background: $white;
30
48
  }
31
49
  }
32
50
  }
@@ -17,6 +17,8 @@ var _lodash = require("lodash");
17
17
 
18
18
  var _reactFinalForm = require("react-final-form");
19
19
 
20
+ var _InputNumberButtons = _interopRequireDefault(require("./InputNumberButtons/InputNumberButtons"));
21
+
20
22
  var _OptionsMenu = _interopRequireDefault(require("../../elements/OptionsMenu/OptionsMenu"));
21
23
 
22
24
  var _TextTooltipTemplate = _interopRequireDefault(require("../TooltipTemplate/TextTooltipTemplate"));
@@ -136,7 +138,7 @@ var FormInput = /*#__PURE__*/_react.default.forwardRef(function (_ref, ref) {
136
138
  (0, _useDetectOutsideClick.useDetectOutsideClick)(ref, function () {
137
139
  return setShowValidationRules(false);
138
140
  });
139
- var formFieldClassNames = (0, _classnames.default)('form-field', className);
141
+ var formFieldClassNames = (0, _classnames.default)('form-field-input', className);
140
142
  var inputWrapperClassNames = (0, _classnames.default)('form-field__wrapper', "form-field__wrapper-".concat(density), disabled && 'form-field__wrapper-disabled', isInvalid && 'form-field__wrapper-invalid', withoutBorder && 'without-border');
141
143
  var labelClassNames = (0, _classnames.default)('form-field__label', disabled && 'form-field__label-disabled');
142
144
  (0, _react.useEffect)(function () {
@@ -189,18 +191,15 @@ var FormInput = /*#__PURE__*/_react.default.forwardRef(function (_ref, ref) {
189
191
  }
190
192
  };
191
193
 
192
- var handleInputChange = function handleInputChange(event) {
193
- input.onChange(event);
194
- onChange && onChange(event.target.value);
195
- };
196
-
197
194
  var handleInputFocus = function handleInputFocus(event) {
198
195
  input.onFocus(event);
199
196
  setIsFocused(true);
200
197
  };
201
198
 
202
199
  var handleScroll = function handleScroll(event) {
203
- if (!event.target.closest('.options-menu') && !event.target.classList.contains('form-field')) {
200
+ if (inputRef.current.contains(event.target)) return;
201
+
202
+ if (!event.target.closest('.options-menu') && !event.target.classList.contains('form-field-input')) {
204
203
  setShowValidationRules(false);
205
204
  }
206
205
  };
@@ -229,7 +228,8 @@ var FormInput = /*#__PURE__*/_react.default.forwardRef(function (_ref, ref) {
229
228
  }, [meta.error]);
230
229
 
231
230
  var validateField = function validateField(value) {
232
- var valueToValidate = value !== null && value !== void 0 ? value : '';
231
+ var valueToValidate = (0, _lodash.isNil)(value) ? '' : String(value);
232
+ if (!valueToValidate && !required) return;
233
233
  var validationError = null;
234
234
 
235
235
  if (!(0, _lodash.isEmpty)(validationRules)) {
@@ -253,6 +253,22 @@ var FormInput = /*#__PURE__*/_react.default.forwardRef(function (_ref, ref) {
253
253
  }
254
254
 
255
255
  if ((0, _lodash.isEmpty)(validationError)) {
256
+ if (inputProps.type === 'number') {
257
+ if (inputProps.max && +valueToValidate > +inputProps.max) {
258
+ validationError = {
259
+ name: 'maxValue',
260
+ label: "Max value is ".concat(inputProps.max)
261
+ };
262
+ }
263
+
264
+ if (inputProps.min && +valueToValidate < +inputProps.min) {
265
+ validationError = {
266
+ name: 'minValue',
267
+ label: "Min value is ".concat(inputProps.min)
268
+ };
269
+ }
270
+ }
271
+
256
272
  if (pattern && !validationPattern.test(valueToValidate)) {
257
273
  validationError = {
258
274
  name: 'pattern',
@@ -278,9 +294,15 @@ var FormInput = /*#__PURE__*/_react.default.forwardRef(function (_ref, ref) {
278
294
  return validationError;
279
295
  };
280
296
 
297
+ var parseField = function parseField(val) {
298
+ if (!val) return;
299
+ return inputProps.type === 'number' ? +val : val;
300
+ };
301
+
281
302
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactFinalForm.Field, {
282
303
  validate: validateField,
283
304
  name: name,
305
+ parse: parseField,
284
306
  children: function children(_ref4) {
285
307
  var _inputProps$autocompl, _meta$error$label, _meta$error;
286
308
 
@@ -331,7 +353,6 @@ var FormInput = /*#__PURE__*/_react.default.forwardRef(function (_ref, ref) {
331
353
  pattern: pattern
332
354
  }, inputProps), input)), {}, {
333
355
  autoComplete: (_inputProps$autocompl = inputProps.autocomplete) !== null && _inputProps$autocompl !== void 0 ? _inputProps$autocompl : 'off',
334
- onChange: handleInputChange,
335
356
  onBlur: handleInputBlur,
336
357
  onFocus: handleInputFocus
337
358
  }))
@@ -356,7 +377,9 @@ var FormInput = /*#__PURE__*/_react.default.forwardRef(function (_ref, ref) {
356
377
  className: iconClass,
357
378
  children: inputIcon
358
379
  })]
359
- })]
380
+ }), inputProps.type === 'number' && /*#__PURE__*/(0, _jsxRuntime.jsx)(_InputNumberButtons.default, _objectSpread({}, _objectSpread(_objectSpread(_objectSpread({}, inputProps), input), {}, {
381
+ disabled: disabled
382
+ })))]
360
383
  }), (suggestionList === null || suggestionList === void 0 ? void 0 : suggestionList.length) > 0 && isFocused && /*#__PURE__*/(0, _jsxRuntime.jsx)("ul", {
361
384
  className: "form-field__suggestion-list",
362
385
  children: suggestionList.map(function (item, index) {
@@ -396,15 +419,15 @@ FormInput.defaultProps = {
396
419
  show: '',
397
420
  value: ''
398
421
  },
399
- maxLength: null,
400
422
  min: null,
423
+ max: null,
401
424
  onBlur: function onBlur() {},
402
425
  onChange: function onChange() {},
403
426
  onKeyDown: function onKeyDown() {},
404
427
  pattern: null,
405
428
  placeholder: '',
406
429
  required: false,
407
- step: '',
430
+ step: '1',
408
431
  suggestionList: [],
409
432
  tip: '',
410
433
  type: 'text',
@@ -423,8 +446,8 @@ FormInput.propTypes = {
423
446
  invalidText: _propTypes.default.string,
424
447
  label: _propTypes.default.string,
425
448
  link: _types.INPUT_LINK,
426
- maxLength: _propTypes.default.number,
427
- min: _propTypes.default.number,
449
+ min: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.number]),
450
+ max: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.number]),
428
451
  name: _propTypes.default.string.isRequired,
429
452
  onBlur: _propTypes.default.func,
430
453
  onChange: _propTypes.default.func,
@@ -0,0 +1,97 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _react = _interopRequireDefault(require("react"));
9
+
10
+ var _propTypes = _interopRequireDefault(require("prop-types"));
11
+
12
+ var _lodash = require("lodash");
13
+
14
+ var _rangeArrowSmall = require("igz-controls/images/range-arrow-small.svg");
15
+
16
+ require("./InputNumberButtons.scss");
17
+
18
+ var _jsxRuntime = require("react/jsx-runtime");
19
+
20
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
21
+
22
+ var InputNumberButtons = function InputNumberButtons(_ref) {
23
+ var disabled = _ref.disabled,
24
+ min = _ref.min,
25
+ max = _ref.max,
26
+ onChange = _ref.onChange,
27
+ step = _ref.step,
28
+ value = _ref.value;
29
+
30
+ var handleIncrease = function handleIncrease(event) {
31
+ event.preventDefault();
32
+ if (max && +value >= +max) return;
33
+ var currentValue = isCurrentValueEmpty() ? +step : +value + +step;
34
+ var nextValue = isInteger(currentValue) ? currentValue : currentValue.toFixed(3);
35
+ onChange(nextValue);
36
+ };
37
+
38
+ var handleDecrease = function handleDecrease(event) {
39
+ event.preventDefault();
40
+ if (value <= 0 || +value <= +min) return;
41
+ var currentValue = isCurrentValueEmpty() ? -step : +value - +step;
42
+ var nextValue = isInteger(currentValue) ? currentValue : currentValue.toFixed(3);
43
+ onChange(nextValue);
44
+ };
45
+
46
+ var isCurrentValueEmpty = function isCurrentValueEmpty() {
47
+ return (0, _lodash.isNil)(value) || value === '';
48
+ };
49
+
50
+ var isInteger = function isInteger(number) {
51
+ return Number(number) === number && number % 1 === 0;
52
+ };
53
+
54
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
55
+ "data-testid": "range-input-container",
56
+ className: "form-field-range",
57
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
58
+ className: "range__buttons",
59
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("button", {
60
+ "data-testid": "btn-increase",
61
+ className: "range__button range__button-increase",
62
+ disabled: disabled,
63
+ onClick: handleIncrease,
64
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_rangeArrowSmall.ReactComponent, {
65
+ className: "increase"
66
+ })
67
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)("button", {
68
+ "data-testid": "btn-decrease",
69
+ className: "range__button range__button-decrease",
70
+ disabled: disabled,
71
+ onClick: handleDecrease,
72
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_rangeArrowSmall.ReactComponent, {
73
+ className: "decrease"
74
+ })
75
+ })]
76
+ })
77
+ });
78
+ };
79
+
80
+ InputNumberButtons.defaultProps = {
81
+ disabled: false,
82
+ min: null,
83
+ max: null,
84
+ step: '1'
85
+ };
86
+ InputNumberButtons.propTypes = {
87
+ disabled: _propTypes.default.bool,
88
+ min: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.number]),
89
+ max: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.number]),
90
+ onChange: _propTypes.default.func.isRequired,
91
+ step: _propTypes.default.string,
92
+ value: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.number]).isRequired
93
+ };
94
+
95
+ var _default = /*#__PURE__*/_react.default.memo(InputNumberButtons);
96
+
97
+ exports.default = _default;
@@ -0,0 +1,123 @@
1
+ @import '../../../scss/colors';
2
+ @import '../../../scss/borders';
3
+
4
+ .form-field-range {
5
+ align-self: stretch;
6
+
7
+ .range {
8
+ &__buttons {
9
+ display: flex;
10
+ flex-direction: column;
11
+ justify-content: center;
12
+ width: 28px;
13
+ height: 100%;
14
+ }
15
+
16
+ &__button {
17
+ display: flex;
18
+ width: 100%;
19
+ height: 50%;
20
+ align-items: center;
21
+ justify-content: center;
22
+ padding: 0;
23
+ background-color: $wildSand;
24
+ cursor: pointer;
25
+
26
+ svg {
27
+ path {
28
+ fill: $topaz;
29
+ }
30
+ }
31
+
32
+ &:hover {
33
+ background-color: $mercury;
34
+
35
+ svg {
36
+ path {
37
+ fill: $primary;
38
+ }
39
+ }
40
+ }
41
+
42
+ &:focus {
43
+ border: $focusBorder;
44
+ }
45
+
46
+ &:active {
47
+ background-color: rgba($black, 0.2);
48
+ border: $focusBorder;
49
+
50
+ svg {
51
+ path {
52
+ fill: $primary;
53
+ }
54
+ }
55
+ }
56
+
57
+ &:disabled {
58
+ cursor: not-allowed;
59
+
60
+ svg {
61
+ path {
62
+ fill: $spunPearl;
63
+ }
64
+ }
65
+
66
+ &:focus {
67
+ border: none;
68
+ }
69
+
70
+ &:hover {
71
+ background-color: $wildSand;
72
+ }
73
+ }
74
+
75
+ &-increase {
76
+ border-bottom: $transparentBorder;
77
+ border-left: $transparentBorder;
78
+ border-top-right-radius: 4px;
79
+ }
80
+
81
+ &-decrease {
82
+ border-top: $transparentBorder;
83
+ border-left: $transparentBorder;
84
+ border-bottom-right-radius: 4px;
85
+ }
86
+
87
+ .decrease {
88
+ transform: rotate(180deg);
89
+ }
90
+ }
91
+
92
+ &-warning {
93
+ border: $errorBorder;
94
+
95
+ &_asterisk {
96
+ position: absolute;
97
+ top: 50%;
98
+ right: 35px;
99
+ color: $amaranth;
100
+ transform: translateY(-50%);
101
+ }
102
+
103
+ .range__button {
104
+ &-increase {
105
+ border-top: $errorBorder;
106
+ border-right: $errorBorder;
107
+ }
108
+
109
+ &-decrease {
110
+ border-right: $errorBorder;
111
+ border-bottom: $errorBorder;
112
+ }
113
+ }
114
+ }
115
+
116
+ &__warning-icon {
117
+ position: absolute;
118
+ top: 50%;
119
+ right: 30px;
120
+ transform: translateY(-50%);
121
+ }
122
+ }
123
+ }