@alfalab/core-components-number-input 1.3.0 → 2.0.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.
Files changed (90) hide show
  1. package/Component.desktop.d.ts +1 -1
  2. package/Component.desktop.js +9 -1
  3. package/Component.mobile.d.ts +1 -1
  4. package/Component.mobile.js +9 -1
  5. package/Component.responsive.d.ts +1 -1
  6. package/Component.responsive.js +14 -1
  7. package/components/number-input/Component.d.ts +21 -46
  8. package/components/number-input/Component.js +87 -84
  9. package/components/number-input/index.css +30 -0
  10. package/components/number-input/index.js +8 -0
  11. package/components/steppers/Component.d.ts +14 -0
  12. package/components/steppers/Component.js +33 -0
  13. package/components/steppers/index.css +32 -0
  14. package/components/steppers/index.d.ts +1 -0
  15. package/components/steppers/index.js +15 -0
  16. package/cssm/Component.desktop.d.ts +1 -1
  17. package/cssm/Component.desktop.js +11 -1
  18. package/cssm/Component.mobile.d.ts +1 -1
  19. package/cssm/Component.mobile.js +11 -1
  20. package/cssm/Component.responsive.d.ts +1 -1
  21. package/cssm/Component.responsive.js +16 -1
  22. package/cssm/components/number-input/Component.d.ts +21 -46
  23. package/cssm/components/number-input/Component.js +87 -84
  24. package/cssm/components/number-input/index.js +10 -0
  25. package/cssm/components/number-input/index.module.css +29 -0
  26. package/cssm/components/steppers/Component.d.ts +14 -0
  27. package/cssm/components/steppers/Component.js +32 -0
  28. package/cssm/components/steppers/index.d.ts +1 -0
  29. package/cssm/components/steppers/index.js +16 -0
  30. package/cssm/components/steppers/index.module.css +31 -0
  31. package/cssm/desktop/index.js +10 -0
  32. package/cssm/index.js +11 -0
  33. package/cssm/mobile/index.js +10 -0
  34. package/cssm/utils.d.ts +19 -9
  35. package/cssm/utils.js +244 -21
  36. package/desktop/index.js +8 -0
  37. package/esm/Component.desktop.d.ts +1 -1
  38. package/esm/Component.desktop.js +9 -1
  39. package/esm/Component.mobile.d.ts +1 -1
  40. package/esm/Component.mobile.js +9 -1
  41. package/esm/Component.responsive.d.ts +1 -1
  42. package/esm/Component.responsive.js +15 -2
  43. package/esm/components/number-input/Component.d.ts +21 -46
  44. package/esm/components/number-input/Component.js +88 -86
  45. package/esm/components/number-input/index.css +30 -0
  46. package/esm/components/number-input/index.js +8 -0
  47. package/esm/components/steppers/Component.d.ts +14 -0
  48. package/esm/components/steppers/Component.js +24 -0
  49. package/esm/components/steppers/index.css +32 -0
  50. package/esm/components/steppers/index.d.ts +1 -0
  51. package/esm/components/steppers/index.js +7 -0
  52. package/esm/desktop/index.js +8 -0
  53. package/esm/index.js +9 -0
  54. package/esm/mobile/index.js +8 -0
  55. package/esm/utils.d.ts +19 -9
  56. package/esm/utils.js +236 -19
  57. package/index.js +9 -0
  58. package/mobile/index.js +8 -0
  59. package/modern/Component.desktop.d.ts +1 -1
  60. package/modern/Component.desktop.js +9 -1
  61. package/modern/Component.mobile.d.ts +1 -1
  62. package/modern/Component.mobile.js +9 -1
  63. package/modern/Component.responsive.d.ts +1 -1
  64. package/modern/Component.responsive.js +13 -1
  65. package/modern/components/number-input/Component.d.ts +21 -46
  66. package/modern/components/number-input/Component.js +84 -86
  67. package/modern/components/number-input/index.css +30 -0
  68. package/modern/components/number-input/index.js +8 -0
  69. package/modern/components/steppers/Component.d.ts +14 -0
  70. package/modern/components/steppers/Component.js +23 -0
  71. package/modern/components/steppers/index.css +32 -0
  72. package/modern/components/steppers/index.d.ts +1 -0
  73. package/modern/components/steppers/index.js +7 -0
  74. package/modern/desktop/index.js +8 -0
  75. package/modern/index.js +9 -0
  76. package/modern/mobile/index.js +8 -0
  77. package/modern/utils.d.ts +19 -9
  78. package/modern/utils.js +223 -18
  79. package/package.json +9 -2
  80. package/src/Component.desktop.tsx +2 -2
  81. package/src/Component.mobile.tsx +2 -2
  82. package/src/Component.responsive.tsx +16 -2
  83. package/src/components/number-input/Component.tsx +195 -129
  84. package/src/components/number-input/index.module.css +18 -0
  85. package/src/components/steppers/Component.tsx +64 -0
  86. package/src/components/steppers/index.module.css +21 -0
  87. package/src/components/steppers/index.ts +1 -0
  88. package/src/utils.ts +302 -24
  89. package/utils.d.ts +19 -9
  90. package/utils.js +244 -21
@@ -1,6 +1,6 @@
1
1
  /// <reference types="react" />
2
2
  import React from 'react';
3
3
  import { NumberInputProps } from "./components/number-input/index";
4
- type NumberInputDesktopProps = Omit<NumberInputProps, 'Input' | 'breakpoint'>;
4
+ type NumberInputDesktopProps = Omit<NumberInputProps, 'Input' | 'breakpoint' | 'view'>;
5
5
  declare const NumberInputDesktop: React.ForwardRefExoticComponent<NumberInputDesktopProps & React.RefAttributes<HTMLInputElement>>;
6
6
  export { NumberInputDesktopProps, NumberInputDesktop };
@@ -7,12 +7,20 @@ var React = require('react');
7
7
  var desktop = require('@alfalab/core-components-input/desktop');
8
8
  var components_numberInput_Component = require('./components/number-input/Component.js');
9
9
  require('react-merge-refs');
10
+ require('@maskito/core');
11
+ require('@maskito/react');
12
+ require('classnames');
13
+ require('@alfalab/core-components-shared');
10
14
  require('./utils.js');
15
+ require('./components/steppers/Component.js');
16
+ require('@alfalab/core-components-icon-button');
17
+ require('@alfalab/icons-glyph/MinusMIcon');
18
+ require('@alfalab/icons-glyph/PlusMediumMIcon');
11
19
 
12
20
  function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
13
21
 
14
22
  var React__default = /*#__PURE__*/_interopDefaultCompat(React);
15
23
 
16
- var NumberInputDesktop = React.forwardRef(function (props, ref) { return React__default.default.createElement(components_numberInput_Component.NumberInput, tslib.__assign({}, props, { Input: desktop.InputDesktop, ref: ref })); });
24
+ var NumberInputDesktop = React.forwardRef(function (props, ref) { return React__default.default.createElement(components_numberInput_Component.NumberInput, tslib.__assign({}, props, { Input: desktop.InputDesktop, ref: ref, view: 'desktop' })); });
17
25
 
18
26
  exports.NumberInputDesktop = NumberInputDesktop;
@@ -1,6 +1,6 @@
1
1
  /// <reference types="react" />
2
2
  import React from 'react';
3
3
  import { NumberInputProps } from "./components/number-input/index";
4
- type NumberInputMobileProps = Omit<NumberInputProps, 'Input' | 'breakpoint'>;
4
+ type NumberInputMobileProps = Omit<NumberInputProps, 'Input' | 'breakpoint' | 'view'>;
5
5
  declare const NumberInputMobile: React.ForwardRefExoticComponent<NumberInputMobileProps & React.RefAttributes<HTMLInputElement>>;
6
6
  export { NumberInputMobileProps, NumberInputMobile };
@@ -7,12 +7,20 @@ var React = require('react');
7
7
  var mobile = require('@alfalab/core-components-input/mobile');
8
8
  var components_numberInput_Component = require('./components/number-input/Component.js');
9
9
  require('react-merge-refs');
10
+ require('@maskito/core');
11
+ require('@maskito/react');
12
+ require('classnames');
13
+ require('@alfalab/core-components-shared');
10
14
  require('./utils.js');
15
+ require('./components/steppers/Component.js');
16
+ require('@alfalab/core-components-icon-button');
17
+ require('@alfalab/icons-glyph/MinusMIcon');
18
+ require('@alfalab/icons-glyph/PlusMediumMIcon');
11
19
 
12
20
  function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
13
21
 
14
22
  var React__default = /*#__PURE__*/_interopDefaultCompat(React);
15
23
 
16
- var NumberInputMobile = React.forwardRef(function (props, ref) { return React__default.default.createElement(components_numberInput_Component.NumberInput, tslib.__assign({}, props, { Input: mobile.InputMobile, ref: ref })); });
24
+ var NumberInputMobile = React.forwardRef(function (props, ref) { return React__default.default.createElement(components_numberInput_Component.NumberInput, tslib.__assign({}, props, { Input: mobile.InputMobile, ref: ref, view: 'mobile' })); });
17
25
 
18
26
  exports.NumberInputMobile = NumberInputMobile;
@@ -1,6 +1,6 @@
1
1
  /// <reference types="react" />
2
2
  import React from 'react';
3
3
  import { NumberInputProps } from "./components/number-input/index";
4
- type NumberInputResponsiveProps = Omit<NumberInputProps, 'Input'>;
4
+ type NumberInputResponsiveProps = Omit<NumberInputProps, 'Input' | 'view'>;
5
5
  declare const NumberInputResponsive: React.ForwardRefExoticComponent<NumberInputResponsiveProps & React.RefAttributes<HTMLInputElement>>;
6
6
  export { NumberInputResponsiveProps, NumberInputResponsive };
@@ -5,14 +5,27 @@ Object.defineProperty(exports, '__esModule', { value: true });
5
5
  var tslib = require('tslib');
6
6
  var React = require('react');
7
7
  var coreComponentsInput = require('@alfalab/core-components-input');
8
+ var coreComponentsMq = require('@alfalab/core-components-mq');
8
9
  var components_numberInput_Component = require('./components/number-input/Component.js');
9
10
  require('react-merge-refs');
11
+ require('@maskito/core');
12
+ require('@maskito/react');
13
+ require('classnames');
14
+ require('@alfalab/core-components-shared');
10
15
  require('./utils.js');
16
+ require('./components/steppers/Component.js');
17
+ require('@alfalab/core-components-icon-button');
18
+ require('@alfalab/icons-glyph/MinusMIcon');
19
+ require('@alfalab/icons-glyph/PlusMediumMIcon');
11
20
 
12
21
  function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
13
22
 
14
23
  var React__default = /*#__PURE__*/_interopDefaultCompat(React);
15
24
 
16
- var NumberInputResponsive = React.forwardRef(function (props, ref) { return React__default.default.createElement(components_numberInput_Component.NumberInput, tslib.__assign({}, props, { Input: coreComponentsInput.Input, ref: ref })); });
25
+ var NumberInputResponsive = React.forwardRef(function (_a, ref) {
26
+ var _b = _a.breakpoint, breakpoint = _b === void 0 ? 1024 : _b, defaultMatchMediaValue = _a.defaultMatchMediaValue, restProps = tslib.__rest(_a, ["breakpoint", "defaultMatchMediaValue"]);
27
+ var isDesktop = coreComponentsMq.useMatchMedia("(min-width: ".concat(breakpoint, "px)"), defaultMatchMediaValue)[0];
28
+ return (React__default.default.createElement(components_numberInput_Component.NumberInput, tslib.__assign({}, restProps, { Input: coreComponentsInput.Input, ref: ref, view: isDesktop ? 'desktop' : 'mobile', breakpoint: breakpoint, defaultMatchMediaValue: defaultMatchMediaValue })));
29
+ });
17
30
 
18
31
  exports.NumberInputResponsive = NumberInputResponsive;
@@ -1,80 +1,55 @@
1
1
  /// <reference types="react" />
2
2
  import React from 'react';
3
+ import { ChangeEvent, FC, Ref } from "react";
3
4
  import { InputProps } from "@alfalab/core-components-input";
4
- type NumberInputProps = Omit<InputProps, 'value' | 'onChange' | 'type'> & {
5
+ interface NumberInputProps extends Omit<InputProps, 'value' | 'onChange' | 'type' | 'defaultValue'> {
5
6
  /**
6
7
  * Значение поля ввода
7
8
  */
8
9
  value?: string | number | null;
9
10
  /**
10
- * Учитывать знаки '+' и '-'
11
+ * Значение по-умолчанию
11
12
  */
12
- allowSigns?: boolean;
13
+ defaultValue?: string | number | null;
13
14
  /**
14
15
  * Разделитель ',' или '.'
15
16
  */
16
17
  separator?: '.' | ',';
17
18
  /**
18
19
  * Количество символов после разделителя
20
+ * Если указан проп step, то всегда 0
19
21
  */
20
22
  fractionLength?: number;
21
23
  /**
22
- * Компонент инпута
24
+ * Шаг инкремента/декремента. Используйте только целочисленные значения
23
25
  */
24
- Input: React.FC<InputProps & {
25
- ref?: React.Ref<HTMLInputElement>;
26
- }>;
26
+ step?: number;
27
27
  /**
28
- * Обработчик события изменения значения
28
+ * Минимальное значение
29
+ * @default Number.MIN_SAFE_INTEGER
29
30
  */
30
- onChange?: (e: React.ChangeEvent<HTMLInputElement>, payload: {
31
- /**
32
- * Числовое значение инпута
33
- */
34
- value: number | null;
35
- /**
36
- * Строковое значение инпута
37
- * Используйте для изменения значения инпута
38
- */
39
- valueString: string;
40
- }) => void;
41
- };
42
- declare const NumberInput: React.ForwardRefExoticComponent<Omit<InputProps, "value" | "onChange" | "type"> & {
31
+ min?: number;
43
32
  /**
44
- * Значение поля ввода
33
+ * Максимальное значение
34
+ * @default Number.MAX_SAFE_INTEGER
45
35
  */
46
- value?: string | number | null | undefined;
36
+ max?: number;
47
37
  /**
48
- * Учитывать знаки '+' и '-'
38
+ * Отображение компонента в мобильном или десктопном виде
49
39
  */
50
- allowSigns?: boolean | undefined;
51
- /**
52
- * Разделитель ',' или '.'
53
- */
54
- separator?: "," | "." | undefined;
55
- /**
56
- * Количество символов после разделителя
57
- */
58
- fractionLength?: number | undefined;
40
+ view?: 'desktop' | 'mobile';
59
41
  /**
60
42
  * Компонент инпута
61
43
  */
62
- Input: React.FC<InputProps & {
63
- ref?: React.Ref<HTMLInputElement>;
44
+ Input: FC<InputProps & {
45
+ ref?: Ref<HTMLInputElement>;
64
46
  }>;
65
47
  /**
66
48
  * Обработчик события изменения значения
67
49
  */
68
- onChange?: ((e: React.ChangeEvent<HTMLInputElement>, payload: {
69
- /**
70
- * Числовое значение инпута
71
- */
50
+ onChange?: (e: ChangeEvent<HTMLInputElement> | null, payload: {
72
51
  value: number | null;
73
- /**
74
- * Строковое значение инпута
75
- * Используйте для изменения значения инпута
76
- */
77
- valueString: string;
78
- }) => void) | undefined;
79
- } & React.RefAttributes<HTMLInputElement>>;
52
+ }) => void;
53
+ }
54
+ declare const NumberInput: React.ForwardRefExoticComponent<NumberInputProps & React.RefAttributes<HTMLInputElement>>;
80
55
  export { NumberInputProps, NumberInput };
@@ -5,106 +5,109 @@ Object.defineProperty(exports, '__esModule', { value: true });
5
5
  var tslib = require('tslib');
6
6
  var React = require('react');
7
7
  var mergeRefs = require('react-merge-refs');
8
+ var core = require('@maskito/core');
9
+ var react = require('@maskito/react');
10
+ var cn = require('classnames');
11
+ var coreComponentsShared = require('@alfalab/core-components-shared');
8
12
  var utils = require('../../utils.js');
13
+ var components_steppers_Component = require('../steppers/Component.js');
14
+ require('@alfalab/core-components-icon-button');
15
+ require('@alfalab/icons-glyph/MinusMIcon');
16
+ require('@alfalab/icons-glyph/PlusMediumMIcon');
9
17
 
10
18
  function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
11
19
 
12
20
  var React__default = /*#__PURE__*/_interopDefaultCompat(React);
13
21
  var mergeRefs__default = /*#__PURE__*/_interopDefaultCompat(mergeRefs);
22
+ var cn__default = /*#__PURE__*/_interopDefaultCompat(cn);
14
23
 
15
- var NumberInput = React__default.default.forwardRef(function (_a, ref) {
16
- var propValue = _a.value, onChange = _a.onChange, onBlur = _a.onBlur, _b = _a.allowSigns, allowSigns = _b === void 0 ? true : _b, _c = _a.separator, separator = _c === void 0 ? ',' : _c, fractionLength = _a.fractionLength, defaultValue = _a.defaultValue, Input = _a.Input, restProps = tslib.__rest(_a, ["value", "onChange", "onBlur", "allowSigns", "separator", "fractionLength", "defaultValue", "Input"]);
17
- var uncontrolled = propValue === undefined;
18
- var inputRef = React.useRef(null);
19
- var _d = React.useState(defaultValue || ''), value = _d[0], setValue = _d[1];
20
- var getNumberValueFromStr = function (valueString) {
21
- if (valueString === '')
22
- return null;
23
- if (valueString.includes(',')) {
24
- return parseFloat(valueString.replace(',', '.'));
25
- }
26
- return parseFloat(valueString);
27
- };
28
- var restoreCaret = function (target) {
29
- setTimeout(function () {
30
- var input = target;
31
- var positionCursor = input.selectionStart || 0;
32
- var isEndPosition = input.value.length === positionCursor;
33
- var enteredSign = utils.SIGNS.some(function (s) { return s === input.value[positionCursor - 1]; });
34
- var enteredSeparator = utils.SEPARATORS.filter(function (s) { return s !== separator; }).some(function (s) { return s === input.value[positionCursor - 1]; });
35
- var shouldRestore = enteredSeparator || enteredSign;
36
- if (!isEndPosition && shouldRestore) {
37
- input.selectionStart = positionCursor;
38
- input.selectionEnd = positionCursor;
39
- }
40
- });
41
- };
42
- var handleChange = function (event) {
43
- var input = event.target;
44
- var newValue = input.value.replace(utils.createSeparatorsRegExp(), separator);
45
- var allowedValue = utils.getAllowedValue({
46
- value: newValue,
47
- fractionLength: fractionLength,
48
- allowSigns: allowSigns,
24
+ var styles = {"steppers":"number-input__steppers_1g1qu","steppersFocused":"number-input__steppersFocused_1g1qu","steppersDisable":"number-input__steppersDisable_1g1qu","s":"number-input__s_1g1qu","m":"number-input__m_1g1qu"};
25
+ require('./index.css')
26
+
27
+ var NumberInput = React.forwardRef(function (_a, ref) {
28
+ var _b;
29
+ var propValue = _a.value, onChange = _a.onChange, _c = _a.separator, separator = _c === void 0 ? ',' : _c, _d = _a.fractionLength, fractionLength = _d === void 0 ? utils.MAX_DIGITS : _d, defaultValue = _a.defaultValue, Input = _a.Input, minProp = _a.min, maxProp = _a.max, rightAddons = _a.rightAddons, dataTestId = _a.dataTestId, disabled = _a.disabled, onBlur = _a.onBlur, onFocus = _a.onFocus; _a.view; var stepProp = _a.step, _e = _a.size, size = _e === void 0 ? 's' : _e, disableUserInput = _a.disableUserInput, clearProp = _a.clear, restProps = tslib.__rest(_a, ["value", "onChange", "separator", "fractionLength", "defaultValue", "Input", "min", "max", "rightAddons", "dataTestId", "disabled", "onBlur", "onFocus", "view", "step", "size", "disableUserInput", "clear"]);
30
+ var min = Math.max(utils.MIN_SAFE_INTEGER, minProp !== null && minProp !== void 0 ? minProp : utils.MIN_SAFE_INTEGER);
31
+ var max = Math.min(utils.MAX_SAFE_INTEGER, maxProp !== null && maxProp !== void 0 ? maxProp : utils.MAX_SAFE_INTEGER);
32
+ var withStepper = stepProp !== undefined;
33
+ var maskOptions = React.useMemo(function () {
34
+ return utils.createMaskOptions({
49
35
  separator: separator,
36
+ fractionLength: withStepper ? 0 : fractionLength,
37
+ min: min,
38
+ max: max,
50
39
  });
51
- if (onChange) {
52
- onChange(event, {
53
- value: getNumberValueFromStr(allowedValue),
54
- valueString: allowedValue,
55
- });
56
- }
57
- if (uncontrolled) {
58
- setValue(allowedValue);
59
- }
60
- restoreCaret(input);
61
- };
62
- var handleKeyDown = function (event) {
63
- var disallowedSymbols = /[/|?!@#$%^&*()_=A-Za-zА-Яа-яЁё ]/;
64
- var oneKeyPress = !event.altKey && !event.metaKey && !event.ctrlKey;
65
- var target = event.target;
66
- // Запрещаем вводить неразрешенные символы за исключением комбинаций клавиш
67
- if (oneKeyPress && event.key.length === 1 && disallowedSymbols.test(event.key)) {
68
- return event.preventDefault();
40
+ }, [separator, fractionLength, min, max, withStepper]);
41
+ var _f = React.useState(false), focused = _f[0], setFocused = _f[1];
42
+ var _g = React.useState(function () {
43
+ if (defaultValue == null) {
44
+ return withStepper ? coreComponentsShared.fnUtils.clamp(0, min, max).toString() : '';
69
45
  }
70
- var val = target.value;
71
- var hasSeparator = (val.match(utils.createSeparatorsRegExp()) || []).length > 0;
72
- // Запрещаем вводить второй сепаратор
73
- if (hasSeparator && utils.SEPARATORS.some(function (s) { return s === event.key; })) {
74
- return event.preventDefault();
75
- }
76
- // Запрещаем вводить лишний знак
77
- if ((!allowSigns || utils.SIGNS.some(function (s) { return s === val[0]; })) &&
78
- utils.SIGNS.some(function (s) { return s === event.key; })) {
79
- return event.preventDefault();
80
- }
81
- var selectionStart = target.selectionStart || 0;
82
- // Запрещаем вводить цифры в дробную часть, если кол-во цифр больше fractionLength
83
- if (hasSeparator &&
84
- fractionLength &&
85
- event.key.length === 1 &&
86
- selectionStart > val.indexOf(separator) &&
87
- val.split(separator)[1].length >= fractionLength) {
88
- return event.preventDefault();
46
+ return coreComponentsShared.fnUtils
47
+ .clamp(utils.parseNumber(core.maskitoTransform(defaultValue.toString(), maskOptions)), min, max)
48
+ .toString();
49
+ }), value = _g[0], setValue = _g[1];
50
+ var maskRef = react.useMaskito({ options: maskOptions });
51
+ React.useEffect(function () {
52
+ if (propValue !== undefined) {
53
+ setValue(function (prev) {
54
+ var parsedNumber = utils.parseNumber(propValue);
55
+ if (parsedNumber !== utils.parseNumber(prev)) {
56
+ return core.maskitoTransform(utils.stringifyNumberWithoutExp(parsedNumber), maskOptions);
57
+ }
58
+ return prev;
59
+ });
89
60
  }
90
- return undefined;
61
+ }, [maskOptions, propValue, separator]);
62
+ var getMaxLength = function (valueString) {
63
+ var hasSeparator = valueString === null || valueString === void 0 ? void 0 : valueString.includes(separator);
64
+ var hasSigns = valueString === null || valueString === void 0 ? void 0 : valueString.startsWith(utils.MINUS_SIGN);
65
+ return utils.MAX_DIGITS + (hasSeparator ? 1 : 0) + (hasSigns ? 1 : 0);
91
66
  };
92
- var handleBlur = function (event) {
93
- var valueBlur = event.target.value.replace(new RegExp("\\".concat(separator, "$")), '');
94
- if (onChange) {
95
- onChange(event, {
96
- value: getNumberValueFromStr(valueBlur),
97
- valueString: valueBlur,
67
+ var getStep = function () { return Math.round(stepProp !== null && stepProp !== void 0 ? stepProp : 1); };
68
+ var changeValue = function (event, newValue) {
69
+ var _a, _b;
70
+ var isNaNValue = Number.isNaN(newValue);
71
+ var valueString = (_b = (_a = event === null || event === void 0 ? void 0 : event.target.value) !== null && _a !== void 0 ? _a : newValue === null || newValue === void 0 ? void 0 : newValue.toString()) !== null && _b !== void 0 ? _b : '';
72
+ setValue(valueString);
73
+ if (valueString === '' || !isNaNValue) {
74
+ onChange === null || onChange === void 0 ? void 0 : onChange(event, {
75
+ value: isNaNValue ? null : newValue,
98
76
  });
99
77
  }
100
- if (uncontrolled) {
101
- setValue(valueBlur);
78
+ };
79
+ var handleChange = function (event) {
80
+ var valueString = event.target.value;
81
+ changeValue(event, utils.parseNumber(valueString));
82
+ };
83
+ var handleIncrement = function () {
84
+ var parsed = utils.parseNumber(value);
85
+ var nextValue = core.maskitoTransform((Number.isNaN(parsed) ? min : parsed + getStep()).toString(), maskOptions);
86
+ changeValue(null, utils.parseNumber(nextValue));
87
+ };
88
+ var handleDecrement = function () {
89
+ var parsed = utils.parseNumber(value);
90
+ var nextValue = core.maskitoTransform((Number.isNaN(parsed) ? max : parsed - getStep()).toString(), maskOptions);
91
+ changeValue(null, utils.parseNumber(nextValue));
92
+ };
93
+ var handleFocus = function (e) {
94
+ onFocus === null || onFocus === void 0 ? void 0 : onFocus(e);
95
+ if (!disableUserInput) {
96
+ setFocused(true);
102
97
  }
103
- if (onBlur)
104
- onBlur(event);
105
98
  };
106
- var visibleValue = uncontrolled ? value : propValue === null || propValue === void 0 ? void 0 : propValue.toString();
107
- return (React__default.default.createElement(Input, tslib.__assign({ ref: mergeRefs__default.default([ref, inputRef]), value: visibleValue, onBlur: handleBlur, onChange: handleChange, onKeyDown: handleKeyDown, inputMode: 'decimal' }, restProps)));
99
+ var handleBlur = function (e) {
100
+ onBlur === null || onBlur === void 0 ? void 0 : onBlur(e);
101
+ setFocused(false);
102
+ };
103
+ return (React__default.default.createElement(Input, tslib.__assign({ maxLength: getMaxLength(value) }, restProps, {
104
+ // В iOS в цифровой клавиатуре невозможно ввести минус.
105
+ inputMode: min < 0 && coreComponentsShared.os.isIOS() ? 'text' : 'decimal', ref: mergeRefs__default.default([ref, maskRef]), value: value, onInput: handleChange, dataTestId: dataTestId, disabled: disabled, onFocus: handleFocus, onBlur: handleBlur, size: size, disableUserInput: disableUserInput, clear: clearProp && /\d/.test(value), rightAddons: withStepper ? (React__default.default.createElement(React__default.default.Fragment, null,
106
+ rightAddons,
107
+ React__default.default.createElement(components_steppers_Component.Steppers, { dataTestId: dataTestId, disabled: disabled, value: utils.parseNumber(value), min: min, max: max, className: cn__default.default(styles.steppers, styles[size], (_b = {},
108
+ _b[styles.steppersFocused] = focused,
109
+ _b[styles.steppersDisable] = disabled,
110
+ _b)), onIncrement: handleIncrement, onDecrement: handleDecrement }))) : (rightAddons) })));
108
111
  });
109
112
 
110
113
  exports.NumberInput = NumberInput;
@@ -0,0 +1,30 @@
1
+ /* hash: ppwj9 */
2
+ :root {
3
+ } /* deprecated */ :root {
4
+ --color-light-neutral-0: #fff;
5
+ --color-light-neutral-translucent-200: rgba(30, 43, 68, 0.08); /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */
6
+ } :root { /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */
7
+ } :root {
8
+ } :root {
9
+
10
+ /* Hard */
11
+
12
+ /* Up */
13
+
14
+ /* Hard up */
15
+ } :root {
16
+ } :root {
17
+ --gap-2xs-neg: -4px;
18
+ --gap-xs-neg: -8px;
19
+ } :root {
20
+ } :root {
21
+ } .number-input__steppers_1g1qu {
22
+ background-color: var(--color-light-neutral-0);
23
+ } .number-input__steppersFocused_1g1qu,
24
+ .number-input__steppersDisable_1g1qu {
25
+ background-color: var(--color-light-neutral-translucent-200);
26
+ } .number-input__s_1g1qu {
27
+ margin-right: var(--gap-xs-neg);
28
+ } .number-input__m_1g1qu {
29
+ margin-right: var(--gap-2xs-neg);
30
+ }
@@ -6,7 +6,15 @@ var components_numberInput_Component = require('./Component.js');
6
6
  require('tslib');
7
7
  require('react');
8
8
  require('react-merge-refs');
9
+ require('@maskito/core');
10
+ require('@maskito/react');
11
+ require('classnames');
12
+ require('@alfalab/core-components-shared');
9
13
  require('../../utils.js');
14
+ require('../steppers/Component.js');
15
+ require('@alfalab/core-components-icon-button');
16
+ require('@alfalab/icons-glyph/MinusMIcon');
17
+ require('@alfalab/icons-glyph/PlusMediumMIcon');
10
18
 
11
19
 
12
20
 
@@ -0,0 +1,14 @@
1
+ /// <reference types="react" />
2
+ import React from 'react';
3
+ type SteppersProps = {
4
+ value: number;
5
+ min: number;
6
+ max: number;
7
+ className?: string;
8
+ disabled?: boolean;
9
+ onIncrement: () => void;
10
+ onDecrement: () => void;
11
+ dataTestId?: string;
12
+ };
13
+ declare const Steppers: React.FC<SteppersProps>;
14
+ export { SteppersProps, Steppers };
@@ -0,0 +1,33 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var React = require('react');
6
+ var cn = require('classnames');
7
+ var coreComponentsIconButton = require('@alfalab/core-components-icon-button');
8
+ var coreComponentsShared = require('@alfalab/core-components-shared');
9
+ var MinusMIcon = require('@alfalab/icons-glyph/MinusMIcon');
10
+ var PlusMediumMIcon = require('@alfalab/icons-glyph/PlusMediumMIcon');
11
+
12
+ function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
13
+
14
+ var React__default = /*#__PURE__*/_interopDefaultCompat(React);
15
+ var cn__default = /*#__PURE__*/_interopDefaultCompat(cn);
16
+
17
+ var styles = {"component":"number-input__component_1k8eq","separator":"number-input__separator_1k8eq","button":"number-input__button_1k8eq"};
18
+ require('./index.css')
19
+
20
+ function preventDefault(e) {
21
+ e.preventDefault();
22
+ }
23
+ var Steppers = function (_a) {
24
+ var className = _a.className, onIncrement = _a.onIncrement, onDecrement = _a.onDecrement, value = _a.value, min = _a.min, max = _a.max, disabled = _a.disabled, dataTestId = _a.dataTestId;
25
+ var decButtonDisabled = disabled || value <= min;
26
+ var incButtonDisabled = disabled || value >= max;
27
+ return (React__default.default.createElement("div", { className: cn__default.default(styles.component, className) },
28
+ React__default.default.createElement(coreComponentsIconButton.IconButton, { disabled: decButtonDisabled, className: styles.button, icon: React__default.default.createElement(MinusMIcon.MinusMIcon, null), "aria-label": '\u0443\u043C\u0435\u043D\u044C\u0448\u0438\u0442\u044C', onMouseDown: preventDefault, onClick: onDecrement, dataTestId: coreComponentsShared.getDataTestId(dataTestId, 'decrement-button'), view: 'secondary' }),
29
+ React__default.default.createElement("div", { className: styles.separator }),
30
+ React__default.default.createElement(coreComponentsIconButton.IconButton, { disabled: incButtonDisabled, className: styles.button, icon: React__default.default.createElement(PlusMediumMIcon.PlusMediumMIcon, null), "aria-label": '\u0443\u0432\u0435\u043B\u0438\u0447\u0438\u0442\u044C', onMouseDown: preventDefault, onClick: onIncrement, dataTestId: coreComponentsShared.getDataTestId(dataTestId, 'increment-button'), view: 'secondary' })));
31
+ };
32
+
33
+ exports.Steppers = Steppers;
@@ -0,0 +1,32 @@
1
+ /* hash: 1x7ch */
2
+ :root {
3
+ } /* deprecated */ :root {
4
+ --color-light-neutral-translucent-300: rgba(15, 25, 55, 0.1); /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */
5
+ } :root { /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */
6
+ } :root {
7
+ } :root {
8
+
9
+ /* Hard */
10
+
11
+ /* Up */
12
+
13
+ /* Hard up */
14
+ } :root {
15
+ } :root {
16
+ } :root {
17
+ } :root {
18
+ } .number-input__component_1k8eq {
19
+ display: flex;
20
+ flex-flow: row nowrap;
21
+ align-items: center;
22
+ border-radius: 5px;
23
+ transition: background-color 0.2s ease;
24
+ overflow: visible;
25
+ } .number-input__separator_1k8eq {
26
+ height: 18px;
27
+ width: 1px;
28
+ background-color: var(--color-light-neutral-translucent-300);
29
+ } .number-input__button_1k8eq {
30
+ width: 40px;
31
+ height: 40px;
32
+ }
@@ -0,0 +1 @@
1
+ export * from "./Component";
@@ -0,0 +1,15 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var components_steppers_Component = require('./Component.js');
6
+ require('react');
7
+ require('classnames');
8
+ require('@alfalab/core-components-icon-button');
9
+ require('@alfalab/core-components-shared');
10
+ require('@alfalab/icons-glyph/MinusMIcon');
11
+ require('@alfalab/icons-glyph/PlusMediumMIcon');
12
+
13
+
14
+
15
+ exports.Steppers = components_steppers_Component.Steppers;
@@ -1,6 +1,6 @@
1
1
  /// <reference types="react" />
2
2
  import React from 'react';
3
3
  import { NumberInputProps } from "./components/number-input/index";
4
- type NumberInputDesktopProps = Omit<NumberInputProps, 'Input' | 'breakpoint'>;
4
+ type NumberInputDesktopProps = Omit<NumberInputProps, 'Input' | 'breakpoint' | 'view'>;
5
5
  declare const NumberInputDesktop: React.ForwardRefExoticComponent<NumberInputDesktopProps & React.RefAttributes<HTMLInputElement>>;
6
6
  export { NumberInputDesktopProps, NumberInputDesktop };
@@ -7,12 +7,22 @@ var React = require('react');
7
7
  var desktop = require('@alfalab/core-components-input/cssm/desktop');
8
8
  var components_numberInput_Component = require('./components/number-input/Component.js');
9
9
  require('react-merge-refs');
10
+ require('@maskito/core');
11
+ require('@maskito/react');
12
+ require('classnames');
13
+ require('@alfalab/core-components-shared/cssm');
10
14
  require('./utils.js');
15
+ require('./components/steppers/Component.js');
16
+ require('@alfalab/core-components-icon-button/cssm');
17
+ require('@alfalab/icons-glyph/MinusMIcon');
18
+ require('@alfalab/icons-glyph/PlusMediumMIcon');
19
+ require('./components/steppers/index.module.css');
20
+ require('./components/number-input/index.module.css');
11
21
 
12
22
  function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
13
23
 
14
24
  var React__default = /*#__PURE__*/_interopDefaultCompat(React);
15
25
 
16
- var NumberInputDesktop = React.forwardRef(function (props, ref) { return React__default.default.createElement(components_numberInput_Component.NumberInput, tslib.__assign({}, props, { Input: desktop.InputDesktop, ref: ref })); });
26
+ var NumberInputDesktop = React.forwardRef(function (props, ref) { return React__default.default.createElement(components_numberInput_Component.NumberInput, tslib.__assign({}, props, { Input: desktop.InputDesktop, ref: ref, view: 'desktop' })); });
17
27
 
18
28
  exports.NumberInputDesktop = NumberInputDesktop;
@@ -1,6 +1,6 @@
1
1
  /// <reference types="react" />
2
2
  import React from 'react';
3
3
  import { NumberInputProps } from "./components/number-input/index";
4
- type NumberInputMobileProps = Omit<NumberInputProps, 'Input' | 'breakpoint'>;
4
+ type NumberInputMobileProps = Omit<NumberInputProps, 'Input' | 'breakpoint' | 'view'>;
5
5
  declare const NumberInputMobile: React.ForwardRefExoticComponent<NumberInputMobileProps & React.RefAttributes<HTMLInputElement>>;
6
6
  export { NumberInputMobileProps, NumberInputMobile };
@@ -7,12 +7,22 @@ var React = require('react');
7
7
  var mobile = require('@alfalab/core-components-input/cssm/mobile');
8
8
  var components_numberInput_Component = require('./components/number-input/Component.js');
9
9
  require('react-merge-refs');
10
+ require('@maskito/core');
11
+ require('@maskito/react');
12
+ require('classnames');
13
+ require('@alfalab/core-components-shared/cssm');
10
14
  require('./utils.js');
15
+ require('./components/steppers/Component.js');
16
+ require('@alfalab/core-components-icon-button/cssm');
17
+ require('@alfalab/icons-glyph/MinusMIcon');
18
+ require('@alfalab/icons-glyph/PlusMediumMIcon');
19
+ require('./components/steppers/index.module.css');
20
+ require('./components/number-input/index.module.css');
11
21
 
12
22
  function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
13
23
 
14
24
  var React__default = /*#__PURE__*/_interopDefaultCompat(React);
15
25
 
16
- var NumberInputMobile = React.forwardRef(function (props, ref) { return React__default.default.createElement(components_numberInput_Component.NumberInput, tslib.__assign({}, props, { Input: mobile.InputMobile, ref: ref })); });
26
+ var NumberInputMobile = React.forwardRef(function (props, ref) { return React__default.default.createElement(components_numberInput_Component.NumberInput, tslib.__assign({}, props, { Input: mobile.InputMobile, ref: ref, view: 'mobile' })); });
17
27
 
18
28
  exports.NumberInputMobile = NumberInputMobile;