@skbkontur/react-ui 5.4.0 → 5.4.2

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 (81) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/cjs/components/Autocomplete/Autocomplete.d.ts +10 -2
  3. package/cjs/components/Autocomplete/Autocomplete.js +18 -2
  4. package/cjs/components/Autocomplete/Autocomplete.js.map +1 -1
  5. package/cjs/components/Button/Button.d.ts +23 -13
  6. package/cjs/components/Button/Button.js +13 -3
  7. package/cjs/components/Button/Button.js.map +1 -1
  8. package/cjs/components/CurrencyInput/CurrencyInput.d.ts +11 -22
  9. package/cjs/components/CurrencyInput/CurrencyInput.js +10 -17
  10. package/cjs/components/CurrencyInput/CurrencyInput.js.map +1 -1
  11. package/cjs/components/FxInput/FxInput.d.ts +23 -16
  12. package/cjs/components/FxInput/FxInput.js +142 -65
  13. package/cjs/components/FxInput/FxInput.js.map +1 -1
  14. package/cjs/components/Input/Input.d.ts +27 -37
  15. package/cjs/components/Input/Input.js +9 -19
  16. package/cjs/components/Input/Input.js.map +1 -1
  17. package/cjs/components/Link/Link.d.ts +10 -10
  18. package/cjs/components/Link/Link.js +1 -1
  19. package/cjs/components/Link/Link.js.map +1 -1
  20. package/cjs/components/MaskedInput/ColorableInputElement/ColorableInputElement.d.ts +1 -0
  21. package/cjs/components/MaskedInput/ColorableInputElement/ColorableInputElement.js +107 -78
  22. package/cjs/components/MaskedInput/ColorableInputElement/ColorableInputElement.js.map +1 -1
  23. package/cjs/components/MaskedInput/MaskedInput.js +5 -3
  24. package/cjs/components/MaskedInput/MaskedInput.js.map +1 -1
  25. package/cjs/components/PasswordInput/PasswordInput.d.ts +5 -6
  26. package/cjs/components/PasswordInput/PasswordInput.js +4 -5
  27. package/cjs/components/PasswordInput/PasswordInput.js.map +1 -1
  28. package/cjs/components/__stories__/Form.js +95 -0
  29. package/cjs/components/__stories__/Form.js.map +1 -0
  30. package/cjs/internal/CommonWrapper/types.d.ts +1 -1
  31. package/cjs/internal/CommonWrapper/types.js.map +1 -1
  32. package/cjs/lib/featureFlagsContext/FeatureFlagsHelpers.d.ts +1 -0
  33. package/cjs/lib/featureFlagsContext/ReactUIFeatureFlagsContext.d.ts +1 -0
  34. package/cjs/lib/featureFlagsContext/ReactUIFeatureFlagsContext.js +2 -0
  35. package/cjs/lib/featureFlagsContext/ReactUIFeatureFlagsContext.js.map +1 -1
  36. package/cjs/lib/utils.d.ts +5 -1
  37. package/cjs/lib/utils.js +20 -4
  38. package/cjs/lib/utils.js.map +1 -1
  39. package/cjs/test-setup.d.ts +1 -0
  40. package/cjs/vitest.config.d.ts +2 -0
  41. package/components/Autocomplete/Autocomplete/Autocomplete.js +10 -2
  42. package/components/Autocomplete/Autocomplete/Autocomplete.js.map +1 -1
  43. package/components/Autocomplete/Autocomplete.d.ts +10 -2
  44. package/components/Button/Button/Button.js +4 -2
  45. package/components/Button/Button/Button.js.map +1 -1
  46. package/components/Button/Button.d.ts +23 -13
  47. package/components/CurrencyInput/CurrencyInput/CurrencyInput.js +6 -17
  48. package/components/CurrencyInput/CurrencyInput/CurrencyInput.js.map +1 -1
  49. package/components/CurrencyInput/CurrencyInput.d.ts +11 -22
  50. package/components/FxInput/FxInput/FxInput.js +122 -71
  51. package/components/FxInput/FxInput/FxInput.js.map +1 -1
  52. package/components/FxInput/FxInput.d.ts +23 -16
  53. package/components/Input/Input/Input.js +8 -16
  54. package/components/Input/Input/Input.js.map +1 -1
  55. package/components/Input/Input.d.ts +27 -37
  56. package/components/Link/Link/Link.js +1 -1
  57. package/components/Link/Link/Link.js.map +1 -1
  58. package/components/Link/Link.d.ts +10 -10
  59. package/components/MaskedInput/ColorableInputElement/ColorableInputElement/ColorableInputElement.js +81 -66
  60. package/components/MaskedInput/ColorableInputElement/ColorableInputElement/ColorableInputElement.js.map +1 -1
  61. package/components/MaskedInput/ColorableInputElement/ColorableInputElement.d.ts +1 -0
  62. package/components/MaskedInput/MaskedInput/MaskedInput.js +4 -2
  63. package/components/MaskedInput/MaskedInput/MaskedInput.js.map +1 -1
  64. package/components/PasswordInput/PasswordInput/PasswordInput.js +4 -5
  65. package/components/PasswordInput/PasswordInput/PasswordInput.js.map +1 -1
  66. package/components/PasswordInput/PasswordInput.d.ts +5 -6
  67. package/components/__stories__/Form/Form.js +98 -0
  68. package/components/__stories__/Form/Form.js.map +1 -0
  69. package/components/__stories__/Form/package.json +6 -0
  70. package/internal/CommonWrapper/types/types.js.map +1 -1
  71. package/internal/CommonWrapper/types.d.ts +1 -1
  72. package/lib/featureFlagsContext/FeatureFlagsHelpers.d.ts +1 -0
  73. package/lib/featureFlagsContext/ReactUIFeatureFlagsContext/ReactUIFeatureFlagsContext.js +1 -0
  74. package/lib/featureFlagsContext/ReactUIFeatureFlagsContext/ReactUIFeatureFlagsContext.js.map +1 -1
  75. package/lib/featureFlagsContext/ReactUIFeatureFlagsContext.d.ts +1 -0
  76. package/lib/utils/utils.js +18 -2
  77. package/lib/utils/utils.js.map +1 -1
  78. package/lib/utils.d.ts +5 -1
  79. package/package.json +8 -14
  80. package/test-setup.d.ts +1 -0
  81. package/vitest.config.d.ts +2 -0
@@ -1,15 +1,16 @@
1
1
  "use strict";var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;exports.__esModule = true;exports.ColorableInputElement = void 0;var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutPropertiesLoose"));
2
2
 
3
3
  var _react = _interopRequireWildcard(require("react"));
4
- var _globalObject = require("@skbkontur/global-object");
5
4
  var _lodash = _interopRequireDefault(require("lodash.debounce"));
6
5
 
7
6
  var _ThemeContext = require("../../../lib/theming/ThemeContext");
8
7
 
9
8
  var _forwardRefAndName = require("../../../lib/forwardRefAndName");
10
9
  var _Emotion = require("../../../lib/theming/Emotion");
10
+ var _utils = require("../../../lib/utils");
11
+
12
+ var _ColorableInputElement = require("./ColorableInputElement.styles");var _excluded = ["children", "onInput", "onFocus", "onBlur", "showOnFocus", "alwaysShowMask"]; /* eslint react-hooks/exhaustive-deps: 2 */
11
13
 
12
- var _ColorableInputElement = require("./ColorableInputElement.styles");var _excluded = ["children", "onInput", "onFocus", "onBlur", "showOnFocus"]; /* eslint react-hooks/exhaustive-deps: 2 */
13
14
 
14
15
 
15
16
 
@@ -23,61 +24,86 @@ var _ColorableInputElement = require("./ColorableInputElement.styles");var _excl
23
24
 
24
25
  var ColorableInputElement = exports.ColorableInputElement = (0, _forwardRefAndName.forwardRefAndName)(
25
26
  'ColorableInputElement',
26
- function ColorableInputElement(props, ref) {
27
+ function ColorableInputElement(props, ref) {var _props$style3;
27
28
  var inputRef = (0, _react.useRef)(null);
28
29
  var spanRef = (0, _react.useRef)(null);
29
30
  var focused = (0, _react.useRef)(false);
30
- var inputStyle = _react.default.useRef();
31
+ var updateActiveTimer = (0, _react.useRef)();
31
32
  var theme = (0, _react.useContext)(_ThemeContext.ThemeContext);
32
- var _useState = (0, _react.useState)(true),active = _useState[0],setActive = _useState[1];
33
-
34
- var children = props.children,onInput = props.onInput,onFocus = props.onFocus,onBlur = props.onBlur,showOnFocus = props.showOnFocus,inputProps = (0, _objectWithoutPropertiesLoose2.default)(props, _excluded);
35
-
36
- (0, _react.useImperativeHandle)(
37
- ref,
38
- function () {return {
39
- input: inputRef.current,
40
- getRootNode: function getRootNode() {return inputRef.current;}
41
- };},
42
- []
43
- );
44
-
45
- (0, _react.useEffect)(updateActive, []);
33
+ var _useState = (0, _react.useState)(
34
+ Boolean(props.alwaysShowMask || !props.placeholder && (props.value || props.defaultValue))
35
+ ),active = _useState[0],setActive = _useState[1];
36
+
37
+ var children = props.children,onInput = props.onInput,onFocus = props.onFocus,onBlur = props.onBlur,showOnFocus = props.showOnFocus,alwaysShowMask = props.alwaysShowMask,inputProps = (0, _objectWithoutPropertiesLoose2.default)(props, _excluded);
38
+
39
+ var stopUpdateActive = (0, _react.useCallback)(function () {
40
+ clearTimeout(updateActiveTimer.current);
41
+ }, []);
42
+
43
+ var updateActive = (0, _react.useCallback)(function () {
44
+ stopUpdateActive();
45
+ updateActiveTimer.current = setTimeout(function () {
46
+ var nextActive = true;
47
+ if (inputRef.current) {var _inputRef$current2;
48
+ var _inputRef$current = inputRef.current,clientWidth = _inputRef$current.clientWidth,scrollWidth = _inputRef$current.scrollWidth;
49
+ var scrollable = scrollWidth > clientWidth;
50
+
51
+ var placeholderShown = (_inputRef$current2 = inputRef.current) == null || (_inputRef$current2 = _inputRef$current2.parentElement) == null ? void 0 : _inputRef$current2.querySelector(':placeholder-shown');
52
+
53
+ nextActive = !(scrollable || placeholderShown);
54
+ }
55
+ setActive(nextActive);
56
+ }, 0);
57
+ }, [stopUpdateActive]);
58
+
59
+ var paintText = (0, _react.useCallback)(function () {var _inputRef$current4, _shadow, _shadow2, _props$style, _props$style2;
60
+ var win = (0, _utils.tryGetWindow)(inputRef.current);
61
+ var doc = (0, _utils.tryGetDocument)(inputRef.current);
62
+ if (!spanRef.current || !inputRef.current || !(0, _utils.isWindow)(win) || !(0, _utils.isDocument)(doc) || !active) {var _inputRef$current3;
63
+ inputRef.current && (inputRef.current.style.backgroundImage = '');
64
+ (_inputRef$current3 = inputRef.current) == null || _inputRef$current3.classList.remove(_ColorableInputElement.globalClasses.input);
46
65
 
47
- var paintText = (0, _react.useCallback)(function () {var _inputRef$current, _shadow;
48
- if (!spanRef.current || !inputRef.current || !inputStyle.current || !(0, _globalObject.isBrowser)(_globalObject.globalObject)) {
49
66
  return;
50
67
  }
51
68
 
52
- (_inputRef$current = inputRef.current) == null || _inputRef$current.classList.add(_ColorableInputElement.globalClasses.input);
69
+ (_inputRef$current4 = inputRef.current) == null || _inputRef$current4.classList.add(_ColorableInputElement.globalClasses.input);
53
70
 
54
71
  var shadow = spanRef.current.shadowRoot;
55
- var typedValueElement = (_shadow = shadow) == null ? void 0 : _shadow.getElementById('span');
72
+ var typedValueElement = (_shadow = shadow) == null ? void 0 : _shadow.getElementById('typed-value');
73
+ var fullValueElement = (_shadow2 = shadow) == null ? void 0 : _shadow2.getElementById('full-value');
56
74
 
57
- if (!typedValueElement) {
75
+ if (!typedValueElement || !fullValueElement) {
58
76
  shadow = spanRef.current.attachShadow({ mode: 'open' });
59
77
 
60
- typedValueElement = _globalObject.globalObject.document.createElement('span');
61
- typedValueElement.setAttribute('id', 'span');
78
+ typedValueElement = doc.createElement('span');
79
+ fullValueElement = doc.createElement('span');
80
+ typedValueElement.setAttribute('id', 'typed-value');
81
+ fullValueElement.setAttribute('id', 'full-value');
62
82
 
63
- shadow.appendChild(typedValueElement);
83
+ shadow.append(typedValueElement, fullValueElement);
64
84
  }
65
85
 
66
- var style = inputStyle.current;
86
+ var style = getComputedStyle(inputRef.current);
67
87
 
68
88
  typedValueElement.textContent =
69
89
  (inputRef.current.getAttribute('data-unmasked-value') || focused.current) &&
70
90
  inputRef.current.getAttribute('data-typed-value') ||
71
91
  '';
72
92
 
93
+ fullValueElement.textContent = inputRef.current.value || inputRef.current.defaultValue || '';
94
+
73
95
  var inputRect = inputRef.current.getBoundingClientRect();
74
- var filledRect = spanRef.current.getBoundingClientRect();
96
+ var typedValueRect = typedValueElement.getBoundingClientRect();
97
+ var fullValueRect = fullValueElement.getBoundingClientRect();
75
98
 
76
- var threshold = filledRect.width / (inputRect.width / 100);
99
+ var threshold = typedValueRect.width / (inputRect.width / 100);
77
100
  var degree = style.fontStyle === 'italic' ? 100 : 90;
101
+ var restValueWidth = 1 - Math.min(fullValueRect.width / inputRect.width, 1);
78
102
 
79
103
  var typedValueColor = theme.inputTextColor;
80
104
  var maskColor = theme.inputPlaceholderColor;
105
+ var indent = 0;
106
+
81
107
  if (props.disabled) {
82
108
  typedValueColor = theme.inputTextColorDisabled;
83
109
  maskColor = theme.inputTextColorDisabled;
@@ -85,43 +111,77 @@ var ColorableInputElement = exports.ColorableInputElement = (0, _forwardRefAndNa
85
111
  if (props.showOnFocus) {
86
112
  maskColor = focused.current ? maskColor : 'transparent';
87
113
  }
114
+ if (((_props$style = props.style) == null ? void 0 : _props$style.textAlign) === 'right') {
115
+ indent = 100 * restValueWidth;
116
+ }
117
+ if (((_props$style2 = props.style) == null ? void 0 : _props$style2.textAlign) === 'center') {
118
+ indent = 50 * restValueWidth;
119
+ }
88
120
 
89
121
  inputRef.current.style.backgroundImage = "\n linear-gradient(\n " +
90
122
 
91
123
  degree + "deg,\n " +
92
- typedValueColor + " " + threshold + "%,\n " +
93
- maskColor + " " + threshold + "%\n )";
124
+ typedValueColor + " " + (threshold + indent) + "%,\n " +
125
+ maskColor + " " + (threshold + indent) + "%\n )";
94
126
 
95
127
  }, [
128
+ active,
96
129
  props.showOnFocus,
97
130
  props.disabled,
98
131
  theme.inputTextColor,
99
132
  theme.inputPlaceholderColor,
100
- theme.inputTextColorDisabled]
133
+ theme.inputTextColorDisabled, (_props$style3 =
134
+ props.style) == null ? void 0 : _props$style3.textAlign]
101
135
  );
102
136
 
103
137
  var debouncedPaintText = (0, _react.useCallback)(function () {return (0, _lodash.default)(paintText);}, [paintText])();
104
138
 
105
- var activation = (0, _react.useCallback)(function () {
106
- if (active) {
139
+ var handleInput = (0, _react.useCallback)(
140
+ function (e) {
107
141
  debouncedPaintText();
108
- } else {var _inputRef$current2;
109
- debouncedPaintText.cancel();
110
- inputRef.current && (inputRef.current.style.backgroundImage = '');
111
- (_inputRef$current2 = inputRef.current) == null || _inputRef$current2.classList.remove(_ColorableInputElement.globalClasses.input);
112
- }
113
- }, [debouncedPaintText, active]);
142
+
143
+ onInput == null || onInput(e);
144
+ },
145
+ [debouncedPaintText, onInput]
146
+ );
147
+
148
+ var handleFocus = (0, _react.useCallback)(
149
+ function (e) {
150
+ updateActive();
151
+
152
+ focused.current = true;
153
+
154
+ onFocus == null || onFocus(e);
155
+ },
156
+ [onFocus, updateActive]
157
+ );
158
+
159
+ var handleBlur = (0, _react.useCallback)(
160
+ function (e) {
161
+ updateActive();
162
+
163
+ focused.current = false;
164
+
165
+ onBlur == null || onBlur(e);
166
+ },
167
+ [onBlur, updateActive]
168
+ );
169
+
170
+ (0, _react.useImperativeHandle)(
171
+ ref,
172
+ function () {return {
173
+ input: inputRef.current,
174
+ getRootNode: function getRootNode() {return inputRef.current;}
175
+ };},
176
+ []
177
+ );
114
178
 
115
179
  (0, _react.useEffect)(function () {
116
- activation();
180
+ debouncedPaintText();
117
181
  updateActive();
118
- }, [props.value, props.defaultValue, theme, activation]);
119
182
 
120
- (0, _react.useEffect)(function () {
121
- if (inputRef.current) {
122
- inputStyle.current = getComputedStyle(inputRef.current);
123
- }
124
- });
183
+ return stopUpdateActive;
184
+ }, [updateActive, props.value, props.defaultValue, theme, debouncedPaintText, stopUpdateActive]);
125
185
 
126
186
  return /*#__PURE__*/(
127
187
  _react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/
@@ -136,36 +196,5 @@ var ColorableInputElement = exports.ColorableInputElement = (0, _forwardRefAndNa
136
196
  active && /*#__PURE__*/_react.default.createElement("span", { style: { visibility: 'hidden', position: 'absolute', whiteSpace: 'pre' }, ref: spanRef })
137
197
  ));
138
198
 
139
-
140
- function handleInput(e) {var _inputRef$current3;
141
- var isActive = !((_inputRef$current3 = inputRef.current) != null && (_inputRef$current3 = _inputRef$current3.parentElement) != null && _inputRef$current3.querySelector(':placeholder-shown'));
142
- setActive(isActive);
143
-
144
- activation();
145
-
146
- onInput == null || onInput(e);
147
- }
148
-
149
- function handleFocus(e) {
150
- setTimeout(updateActive);
151
-
152
- focused.current = true;
153
-
154
- onFocus == null || onFocus(e);
155
- }
156
-
157
- function handleBlur(e) {
158
- updateActive();
159
-
160
- focused.current = false;
161
-
162
- onBlur == null || onBlur(e);
163
- }
164
-
165
- function updateActive() {
166
- setTimeout(function () {var _inputRef$current4;
167
- setActive(!((_inputRef$current4 = inputRef.current) != null && (_inputRef$current4 = _inputRef$current4.parentElement) != null && _inputRef$current4.querySelector(':placeholder-shown')));
168
- });
169
- }
170
199
  }
171
200
  );
@@ -1 +1 @@
1
- {"version":3,"names":["_react","_interopRequireWildcard","require","_globalObject","_lodash","_interopRequireDefault","_ThemeContext","_forwardRefAndName","_Emotion","_ColorableInputElement","_excluded","ColorableInputElement","exports","forwardRefAndName","props","ref","inputRef","useRef","spanRef","focused","inputStyle","React","theme","useContext","ThemeContext","_useState","useState","active","setActive","children","onInput","onFocus","onBlur","showOnFocus","inputProps","_objectWithoutPropertiesLoose2","default","useImperativeHandle","input","current","getRootNode","useEffect","updateActive","paintText","useCallback","_inputRef$current","_shadow","isBrowser","globalObject","classList","add","globalClasses","shadow","shadowRoot","typedValueElement","getElementById","attachShadow","mode","document","createElement","setAttribute","appendChild","style","textContent","getAttribute","inputRect","getBoundingClientRect","filledRect","threshold","width","degree","fontStyle","typedValueColor","inputTextColor","maskColor","inputPlaceholderColor","disabled","inputTextColorDisabled","backgroundImage","debouncedPaintText","debounce","activation","_inputRef$current2","cancel","remove","value","defaultValue","getComputedStyle","Fragment","cloneElement","_extends2","handleInput","handleFocus","handleBlur","className","cx","visibility","position","whiteSpace","e","_inputRef$current3","isActive","parentElement","querySelector","setTimeout","_inputRef$current4"],"sources":["ColorableInputElement.tsx"],"sourcesContent":["/* eslint react-hooks/exhaustive-deps: 2 */\nimport type { ForwardedRef } from 'react';\nimport React, { useContext, useEffect, useImperativeHandle, useRef, useCallback, useState } from 'react';\nimport { globalObject, isBrowser } from '@skbkontur/global-object';\nimport debounce from 'lodash.debounce';\n\nimport { ThemeContext } from '../../../lib/theming/ThemeContext';\nimport type { InputElement, InputElementProps } from '../../Input';\nimport { forwardRefAndName } from '../../../lib/forwardRefAndName';\nimport { cx } from '../../../lib/theming/Emotion';\n\nimport { globalClasses } from './ColorableInputElement.styles';\n\nexport type ColorableInputElementProps = InputElementProps & {\n showOnFocus?: boolean;\n children: React.ReactElement;\n};\n\n// Возможно придётся включить.\n// Иногда, на тяжёлых страницах, текст рендерится итеративно.\n// Из-за этого могут оставаться артефакты при покраске компонента, которые пропадут только после фокуса.\n// setInterval(() => window.requestAnimationFrame(() => dictionary.forEach((paint) => paint())), 1000);\n\nexport const ColorableInputElement = forwardRefAndName(\n 'ColorableInputElement',\n function ColorableInputElement(props: ColorableInputElementProps, ref: ForwardedRef<InputElement>) {\n const inputRef = useRef<HTMLInputElement | null>(null);\n const spanRef = useRef<HTMLSpanElement | null>(null);\n const focused = useRef(false);\n const inputStyle = React.useRef<CSSStyleDeclaration>();\n const theme = useContext(ThemeContext);\n const [active, setActive] = useState(true);\n\n const { children, onInput, onFocus, onBlur, showOnFocus, ...inputProps } = props;\n\n useImperativeHandle(\n ref,\n () => ({\n input: inputRef.current,\n getRootNode: () => inputRef.current,\n }),\n [],\n );\n\n useEffect(updateActive, []);\n\n const paintText = useCallback(() => {\n if (!spanRef.current || !inputRef.current || !inputStyle.current || !isBrowser(globalObject)) {\n return;\n }\n\n inputRef.current?.classList.add(globalClasses.input);\n\n let shadow = spanRef.current.shadowRoot;\n let typedValueElement = shadow?.getElementById('span');\n\n if (!typedValueElement) {\n shadow = spanRef.current.attachShadow({ mode: 'open' });\n\n typedValueElement = globalObject.document.createElement('span');\n typedValueElement.setAttribute('id', 'span');\n\n shadow.appendChild(typedValueElement);\n }\n\n const style = inputStyle.current;\n\n typedValueElement.textContent =\n ((inputRef.current.getAttribute('data-unmasked-value') || focused.current) &&\n inputRef.current.getAttribute('data-typed-value')) ||\n '';\n\n const inputRect = inputRef.current.getBoundingClientRect();\n const filledRect = spanRef.current.getBoundingClientRect();\n\n const threshold = filledRect.width / (inputRect.width / 100);\n const degree = style.fontStyle === 'italic' ? 100 : 90;\n\n let typedValueColor = theme.inputTextColor;\n let maskColor = theme.inputPlaceholderColor;\n if (props.disabled) {\n typedValueColor = theme.inputTextColorDisabled;\n maskColor = theme.inputTextColorDisabled;\n }\n if (props.showOnFocus) {\n maskColor = focused.current ? maskColor : 'transparent';\n }\n\n inputRef.current.style.backgroundImage = `\n linear-gradient(\n ${degree}deg,\n ${typedValueColor} ${threshold}%,\n ${maskColor} ${threshold}%\n )`;\n }, [\n props.showOnFocus,\n props.disabled,\n theme.inputTextColor,\n theme.inputPlaceholderColor,\n theme.inputTextColorDisabled,\n ]);\n\n const debouncedPaintText = useCallback(() => debounce(paintText), [paintText])();\n\n const activation = useCallback(() => {\n if (active) {\n debouncedPaintText();\n } else {\n debouncedPaintText.cancel();\n inputRef.current && (inputRef.current.style.backgroundImage = '');\n inputRef.current?.classList.remove(globalClasses.input);\n }\n }, [debouncedPaintText, active]);\n\n useEffect(() => {\n activation();\n updateActive();\n }, [props.value, props.defaultValue, theme, activation]);\n\n useEffect(() => {\n if (inputRef.current) {\n inputStyle.current = getComputedStyle(inputRef.current);\n }\n });\n\n return (\n <>\n {React.cloneElement(children, {\n ...inputProps,\n onInput: handleInput,\n onFocus: handleFocus,\n onBlur: handleBlur,\n inputRef,\n className: cx(props.className, active && globalClasses.input),\n })}\n {active && <span style={{ visibility: 'hidden', position: 'absolute', whiteSpace: 'pre' }} ref={spanRef} />}\n </>\n );\n\n function handleInput(e: React.ChangeEvent<HTMLInputElement>) {\n const isActive = !inputRef.current?.parentElement?.querySelector(':placeholder-shown');\n setActive(isActive);\n\n activation();\n\n onInput?.(e);\n }\n\n function handleFocus(e: React.FocusEvent<HTMLInputElement>) {\n setTimeout(updateActive);\n\n focused.current = true;\n\n onFocus?.(e);\n }\n\n function handleBlur(e: React.FocusEvent<HTMLInputElement>) {\n updateActive();\n\n focused.current = false;\n\n onBlur?.(e);\n }\n\n function updateActive() {\n setTimeout(() => {\n setActive(!inputRef.current?.parentElement?.querySelector(':placeholder-shown'));\n });\n }\n },\n);\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_react","_interopRequireWildcard","require","_lodash","_interopRequireDefault","_ThemeContext","_forwardRefAndName","_Emotion","_utils","_ColorableInputElement","_excluded","ColorableInputElement","exports","forwardRefAndName","props","ref","_props$style3","inputRef","useRef","spanRef","focused","updateActiveTimer","theme","useContext","ThemeContext","_useState","useState","Boolean","alwaysShowMask","placeholder","value","defaultValue","active","setActive","children","onInput","onFocus","onBlur","showOnFocus","inputProps","_objectWithoutPropertiesLoose2","default","stopUpdateActive","useCallback","clearTimeout","current","updateActive","setTimeout","nextActive","_inputRef$current2","_inputRef$current","clientWidth","scrollWidth","scrollable","placeholderShown","parentElement","querySelector","paintText","_inputRef$current4","_shadow","_shadow2","_props$style","_props$style2","win","tryGetWindow","doc","tryGetDocument","isWindow","isDocument","_inputRef$current3","style","backgroundImage","classList","remove","globalClasses","input","add","shadow","shadowRoot","typedValueElement","getElementById","fullValueElement","attachShadow","mode","createElement","setAttribute","append","getComputedStyle","textContent","getAttribute","inputRect","getBoundingClientRect","typedValueRect","fullValueRect","threshold","width","degree","fontStyle","restValueWidth","Math","min","typedValueColor","inputTextColor","maskColor","inputPlaceholderColor","indent","disabled","inputTextColorDisabled","textAlign","debouncedPaintText","debounce","handleInput","e","handleFocus","handleBlur","useImperativeHandle","getRootNode","useEffect","Fragment","React","cloneElement","_extends2","className","cx","visibility","position","whiteSpace"],"sources":["ColorableInputElement.tsx"],"sourcesContent":["/* eslint react-hooks/exhaustive-deps: 2 */\nimport type { ForwardedRef } from 'react';\nimport React, { useEffect, useContext, useImperativeHandle, useRef, useCallback, useState } from 'react';\nimport debounce from 'lodash.debounce';\n\nimport { ThemeContext } from '../../../lib/theming/ThemeContext';\nimport type { InputElement, InputElementProps } from '../../Input';\nimport { forwardRefAndName } from '../../../lib/forwardRefAndName';\nimport { cx } from '../../../lib/theming/Emotion';\nimport { isDocument, isWindow, tryGetDocument, tryGetWindow } from '../../../lib/utils';\n\nimport { globalClasses } from './ColorableInputElement.styles';\n\nexport type ColorableInputElementProps = InputElementProps & {\n alwaysShowMask?: boolean;\n showOnFocus?: boolean;\n children: React.ReactElement;\n};\n\n// Возможно придётся включить.\n// Иногда, на тяжёлых страницах, текст рендерится итеративно.\n// Из-за этого могут оставаться артефакты при покраске компонента, которые пропадут только после фокуса.\n// setInterval(() => window.requestAnimationFrame(() => dictionary.forEach((paint) => paint())), 1000);\n\nexport const ColorableInputElement = forwardRefAndName(\n 'ColorableInputElement',\n function ColorableInputElement(props: ColorableInputElementProps, ref: ForwardedRef<InputElement>) {\n const inputRef = useRef<HTMLInputElement | null>(null);\n const spanRef = useRef<HTMLSpanElement | null>(null);\n const focused = useRef(false);\n const updateActiveTimer = useRef<ReturnType<typeof setTimeout>>();\n const theme = useContext(ThemeContext);\n const [active, setActive] = useState(\n Boolean(props.alwaysShowMask || (!props.placeholder && (props.value || props.defaultValue))),\n );\n\n const { children, onInput, onFocus, onBlur, showOnFocus, alwaysShowMask, ...inputProps } = props;\n\n const stopUpdateActive = useCallback(() => {\n clearTimeout(updateActiveTimer.current);\n }, []);\n\n const updateActive = useCallback(() => {\n stopUpdateActive();\n updateActiveTimer.current = setTimeout(() => {\n let nextActive = true;\n if (inputRef.current) {\n const { clientWidth, scrollWidth } = inputRef.current;\n const scrollable = scrollWidth > clientWidth;\n\n const placeholderShown = inputRef.current?.parentElement?.querySelector(':placeholder-shown');\n\n nextActive = !(scrollable || placeholderShown);\n }\n setActive(nextActive);\n }, 0);\n }, [stopUpdateActive]);\n\n const paintText = useCallback(() => {\n const win = tryGetWindow(inputRef.current);\n const doc = tryGetDocument(inputRef.current);\n if (!spanRef.current || !inputRef.current || !isWindow(win) || !isDocument(doc) || !active) {\n inputRef.current && (inputRef.current.style.backgroundImage = '');\n inputRef.current?.classList.remove(globalClasses.input);\n\n return;\n }\n\n inputRef.current?.classList.add(globalClasses.input);\n\n let shadow = spanRef.current.shadowRoot;\n let typedValueElement = shadow?.getElementById('typed-value');\n let fullValueElement = shadow?.getElementById('full-value');\n\n if (!typedValueElement || !fullValueElement) {\n shadow = spanRef.current.attachShadow({ mode: 'open' });\n\n typedValueElement = doc.createElement('span');\n fullValueElement = doc.createElement('span');\n typedValueElement.setAttribute('id', 'typed-value');\n fullValueElement.setAttribute('id', 'full-value');\n\n shadow.append(typedValueElement, fullValueElement);\n }\n\n const style = getComputedStyle(inputRef.current);\n\n typedValueElement.textContent =\n ((inputRef.current.getAttribute('data-unmasked-value') || focused.current) &&\n inputRef.current.getAttribute('data-typed-value')) ||\n '';\n\n fullValueElement.textContent = inputRef.current.value || inputRef.current.defaultValue || '';\n\n const inputRect = inputRef.current.getBoundingClientRect();\n const typedValueRect = typedValueElement.getBoundingClientRect();\n const fullValueRect = fullValueElement.getBoundingClientRect();\n\n const threshold = typedValueRect.width / (inputRect.width / 100);\n const degree = style.fontStyle === 'italic' ? 100 : 90;\n const restValueWidth = 1 - Math.min(fullValueRect.width / inputRect.width, 1);\n\n let typedValueColor = theme.inputTextColor;\n let maskColor = theme.inputPlaceholderColor;\n let indent = 0;\n\n if (props.disabled) {\n typedValueColor = theme.inputTextColorDisabled;\n maskColor = theme.inputTextColorDisabled;\n }\n if (props.showOnFocus) {\n maskColor = focused.current ? maskColor : 'transparent';\n }\n if (props.style?.textAlign === 'right') {\n indent = 100 * restValueWidth;\n }\n if (props.style?.textAlign === 'center') {\n indent = 50 * restValueWidth;\n }\n\n inputRef.current.style.backgroundImage = `\n linear-gradient(\n ${degree}deg,\n ${typedValueColor} ${threshold + indent}%,\n ${maskColor} ${threshold + indent}%\n )`;\n }, [\n active,\n props.showOnFocus,\n props.disabled,\n theme.inputTextColor,\n theme.inputPlaceholderColor,\n theme.inputTextColorDisabled,\n props.style?.textAlign,\n ]);\n\n const debouncedPaintText = useCallback(() => debounce(paintText), [paintText])();\n\n const handleInput = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n debouncedPaintText();\n\n onInput?.(e);\n },\n [debouncedPaintText, onInput],\n );\n\n const handleFocus = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n updateActive();\n\n focused.current = true;\n\n onFocus?.(e);\n },\n [onFocus, updateActive],\n );\n\n const handleBlur = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n updateActive();\n\n focused.current = false;\n\n onBlur?.(e);\n },\n [onBlur, updateActive],\n );\n\n useImperativeHandle(\n ref,\n () => ({\n input: inputRef.current,\n getRootNode: () => inputRef.current,\n }),\n [],\n );\n\n useEffect(() => {\n debouncedPaintText();\n updateActive();\n\n return stopUpdateActive;\n }, [updateActive, props.value, props.defaultValue, theme, debouncedPaintText, stopUpdateActive]);\n\n return (\n <>\n {React.cloneElement(children, {\n ...inputProps,\n onInput: handleInput,\n onFocus: handleFocus,\n onBlur: handleBlur,\n inputRef,\n className: cx(props.className, active && globalClasses.input),\n })}\n {active && <span style={{ visibility: 'hidden', position: 'absolute', whiteSpace: 'pre' }} ref={spanRef} />}\n </>\n );\n },\n);\n"],"mappings":"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","ignoreList":[]}
@@ -12,7 +12,7 @@ var _ThemeContext = require("../../lib/theming/ThemeContext");
12
12
  var _MaskedInput = require("./MaskedInput.styles");
13
13
  var _MaskedInput2 = require("./MaskedInput.helpers");
14
14
  var _ColorableInputElement = require("./ColorableInputElement");
15
- var _FixedIMaskInput = require("./FixedIMaskInput");var _excluded = ["mask", "maskChar", "formatChars", "alwaysShowMask", "colored", "imaskProps", "unmask", "onValueChange", "onUnexpectedInput", "onChange", "onBeforePasteValue", "element", "className"];
15
+ var _FixedIMaskInput = require("./FixedIMaskInput");var _excluded = ["mask", "maskChar", "formatChars", "alwaysShowMask", "colored", "imaskProps", "unmask", "onValueChange", "onUnexpectedInput", "onChange", "onBeforePasteValue", "element", "className", "maxLength"];
16
16
 
17
17
 
18
18
 
@@ -112,7 +112,9 @@ var MaskedInput = exports.MaskedInput = (0, _forwardRefAndName.forwardRefAndName
112
112
 
113
113
 
114
114
 
115
- props.mask,maskChar = props.maskChar,formatChars = props.formatChars,_props$alwaysShowMask = props.alwaysShowMask,alwaysShowMask = _props$alwaysShowMask === void 0 ? false : _props$alwaysShowMask,_props$colored = props.colored,colored = _props$colored === void 0 ? true : _props$colored,_props$imaskProps = props.imaskProps,customIMaskProps = _props$imaskProps === void 0 ? {} : _props$imaskProps,_props$unmask = props.unmask,unmask = _props$unmask === void 0 ? false : _props$unmask,onValueChange = props.onValueChange,onUnexpectedInput = props.onUnexpectedInput,onChange = props.onChange,onBeforePasteValue = props.onBeforePasteValue,element = props.element,className = props.className,inputProps = (0, _objectWithoutPropertiesLoose2.default)(props, _excluded);
115
+
116
+
117
+ props.mask,maskChar = props.maskChar,formatChars = props.formatChars,_props$alwaysShowMask = props.alwaysShowMask,alwaysShowMask = _props$alwaysShowMask === void 0 ? false : _props$alwaysShowMask,_props$colored = props.colored,colored = _props$colored === void 0 ? true : _props$colored,_props$imaskProps = props.imaskProps,customIMaskProps = _props$imaskProps === void 0 ? {} : _props$imaskProps,_props$unmask = props.unmask,unmask = _props$unmask === void 0 ? false : _props$unmask,onValueChange = props.onValueChange,onUnexpectedInput = props.onUnexpectedInput,onChange = props.onChange,onBeforePasteValue = props.onBeforePasteValue,element = props.element,className = props.className,maxLength = props.maxLength,inputProps = (0, _objectWithoutPropertiesLoose2.default)(props, _excluded);
116
118
  var theme = (0, _react.useContext)(_ThemeContext.ThemeContext);
117
119
 
118
120
  var inputRef = (0, _react.useRef)(null);
@@ -162,7 +164,7 @@ var MaskedInput = exports.MaskedInput = (0, _forwardRefAndName.forwardRefAndName
162
164
  className: (0, _Emotion.cx)(_MaskedInput.globalClasses.root, uiFontGlobalClassesRoot, className, _MaskedInput.styles.root(theme)),
163
165
  element:
164
166
  colored ? /*#__PURE__*/
165
- _react.default.createElement(_ColorableInputElement.ColorableInputElement, { showOnFocus: false }, /*#__PURE__*/
167
+ _react.default.createElement(_ColorableInputElement.ColorableInputElement, { showOnFocus: false, alwaysShowMask: alwaysShowMask }, /*#__PURE__*/
166
168
  _react.default.createElement(_FixedIMaskInput.FixedIMaskInput, (0, _extends2.default)({}, imaskProps, { onAccept: handleAccept }))
167
169
  ) : /*#__PURE__*/
168
170
 
@@ -1 +1 @@
1
- {"version":3,"names":["_react","_interopRequireWildcard","require","_forwardRefAndName","_Emotion","_Input","_identifiers","_ThemeContext","_MaskedInput","_MaskedInput2","_ColorableInputElement","_FixedIMaskInput","_excluded","getSafeMaskInputType","exports","type","MaskedInput","forwardRefAndName","props","ref","mask","maskChar","formatChars","_props$alwaysShowMask","alwaysShowMask","_props$colored","colored","_props$imaskProps","imaskProps","customIMaskProps","_props$unmask","unmask","onValueChange","onUnexpectedInput","onChange","onBeforePasteValue","element","className","inputProps","_objectWithoutPropertiesLoose2","default","theme","useContext","ThemeContext","inputRef","useRef","_useState","useState","focused","setFocused","prevValue","value","String","defaultValue","prevSelectionStart","useImperativeHandle","current","Object","assign","selectAll","_inputRef$current","_inputRef$current2","focus","delaySelectAll","useEffect","_inputRef$current3","input","selectionStart","getCompatibleIMaskProps","uiFontGlobalClassesRoot","createElement","Input","_extends2","onFocus","handleFocus","onBlur","handleBlur","onInput","handleInput","onKeyDown","handleKeyDown","onPaste","handlePaste","cx","globalClasses","root","styles","ColorableInputElement","showOnFocus","FixedIMaskInput","onAccept","handleAccept","event","_event$clipboardData$","_event$clipboardData","preventDefault","clipboardData","getData","replace","placeholderChar","getMaskChar","definitions","getDefinitions","eager","overwrite","lazy","disabled","_len","arguments","length","args","Array","_key","e","_e$currentTarget","currentTarget","handleUnexpectedInput","_inputRef$current4","selectAllOnFocus","_inputRef$current5","blink","bind","undefined","_e$currentTarget2","selectionEnd","isKeyBackspace","isKeyDelete"],"sources":["MaskedInput.tsx"],"sourcesContent":["import React, { useImperativeHandle, useRef, useState, useEffect, useContext } from 'react';\nimport type { IMaskInputProps } from '@skbkontur/react-imask';\nimport type { Ref } from 'react';\n\nimport { forwardRefAndName } from '../../lib/forwardRefAndName';\nimport { cx } from '../../lib/theming/Emotion';\nimport type { InputProps, InputType } from '../Input';\nimport { Input } from '../Input';\nimport { isKeyBackspace, isKeyDelete } from '../../lib/events/keyboard/identifiers';\nimport { ThemeContext } from '../../lib/theming/ThemeContext';\n\nimport { globalClasses, styles } from './MaskedInput.styles';\nimport { getDefinitions, getMaskChar } from './MaskedInput.helpers';\nimport { ColorableInputElement } from './ColorableInputElement';\nimport { FixedIMaskInput } from './FixedIMaskInput';\n\nexport type MaskedInputOnBeforePasteValue = (value: string) => string;\n\nexport interface MaskedProps {\n /** Паттерн маски */\n mask: string;\n\n /** Устанавливает символ маски\n * @default _ */\n maskChar?: string;\n\n /** Задает словарь символов-регулярок для задания маски.\n * @default { '9': '[0-9]', 'a': '[A-Za-z]', '*': '[A-Za-z0-9]' } */\n formatChars?: Record<string, string>;\n\n /** Включает показ символов маски.\n * @default false */\n alwaysShowMask?: boolean;\n\n /** Задает обработчик неправильного ввода.\n * Вторым агрументом будет передан метод вспыхивания акцентным цветом.\n *\n * Если обработчик не задан, то инпут вспыхивает по-умолчанию.\n * @param value значение инпута.\n * @param blink вспыхнуть акцентным цвтетом.\n */\n onUnexpectedInput?: (value: string, blink: () => void) => void;\n\n /** Задает обработчик вставки значения в инпут.\n * В value будет передано значение из буфера обмена.\n * Возвращаемое значение будет использовано как значение инпута.\n * Используется для фильтрации значения при вставке из буфера обмена.\n * @param value значение вставки.\n */\n onBeforePasteValue?: MaskedInputOnBeforePasteValue;\n\n /** Убирает из value символы, не введённые пользователем\n * @default false */\n unmask?: boolean;\n\n /** Раскрашивает символы маски.\n * @default true\n * @ignore */\n colored?: boolean;\n\n /** Задает пропы для компонента `IMaskInput`. Необходимы для юнит-тестов\n * @ignore */\n imaskProps?: IMaskInputProps<HTMLInputElement>;\n}\n\nexport type MaskInputType = Exclude<InputType, 'number' | 'date' | 'time' | 'password'>;\n\nexport const getSafeMaskInputType = (type?: InputType): MaskInputType | undefined => {\n if (!type) {\n return type;\n }\n\n switch (type) {\n case 'number':\n case 'date':\n case 'time':\n case 'password':\n return 'text';\n default:\n return type;\n }\n};\n\nexport interface MaskedInputProps\n extends MaskedProps,\n Omit<\n InputProps,\n 'showClearIcon' | 'mask' | 'maxLength' | 'type' | 'alwaysShowMask' | 'onUnexpectedInput' | 'maskChar'\n > {\n type?: MaskInputType;\n}\n\n/**\n * Интерфейс пропсов наследуется от `Input`.\n * Из пропсов `Input` исключены некоторые не применимые к полю с маской пропсы и сокращен список возможных значений в type.\n */\nexport const MaskedInput = forwardRefAndName(\n 'MaskedInput',\n function MaskedInput(props: MaskedInputProps, ref: Ref<Input | null>) {\n const {\n mask,\n maskChar,\n formatChars,\n alwaysShowMask = false,\n colored = true,\n imaskProps: customIMaskProps = {},\n unmask = false,\n onValueChange,\n onUnexpectedInput,\n onChange,\n onBeforePasteValue,\n element,\n className,\n ...inputProps\n } = props;\n const theme = useContext(ThemeContext);\n\n const inputRef = useRef<Input>(null);\n\n const [focused, setFocused] = useState(false);\n const prevValue = useRef<string>(props.value || String(props.defaultValue) || '');\n const prevSelectionStart = useRef<number | null>(null);\n\n useImperativeHandle(\n ref,\n () =>\n inputRef.current &&\n Object.assign(inputRef.current, {\n selectAll: () => {\n inputRef.current?.focus();\n inputRef.current?.delaySelectAll();\n },\n }),\n [],\n );\n\n useEffect(() => {\n // Для корректной работы onUnexpectedInput надо знать предыдущий value,\n // но imask при монтировании не вызывает onAccept, если value невалиден или laze=false.\n // Поэтому актуальный value при монтировании надо получать вручную\n if (inputRef.current?.input) {\n prevValue.current = inputRef.current.input.value;\n prevSelectionStart.current = inputRef.current.input.selectionStart;\n }\n }, []);\n\n const imaskProps = getCompatibleIMaskProps();\n\n // TODO: Удалить в следующем мажоре\n // Селекторы могут ожидать определённый порядок классов\n const uiFontGlobalClassesRoot = 'react-ui-ui-font-root';\n\n return (\n <Input\n ref={inputRef}\n {...inputProps}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onInput={handleInput}\n onKeyDown={handleKeyDown}\n onPaste={handlePaste}\n className={cx(globalClasses.root, uiFontGlobalClassesRoot, className, styles.root(theme))}\n element={\n colored ? (\n <ColorableInputElement showOnFocus={false}>\n <FixedIMaskInput {...imaskProps} onAccept={handleAccept} />\n </ColorableInputElement>\n ) : (\n <FixedIMaskInput {...imaskProps} onAccept={handleAccept} />\n )\n }\n />\n );\n\n function handlePaste(event: React.ClipboardEvent<HTMLInputElement>) {\n if (onBeforePasteValue && onValueChange) {\n event.preventDefault();\n onValueChange?.(onBeforePasteValue(event.clipboardData?.getData('text') ?? ''));\n }\n\n props.onPaste?.(event);\n }\n\n function getCompatibleIMaskProps(): IMaskInputProps<HTMLInputElement> {\n return {\n mask: mask.replace(/0/g, '{\\\\0}') as any,\n placeholderChar: getMaskChar(maskChar),\n definitions: getDefinitions(formatChars),\n // FIXME: Должно быть eager=true, но в imask ломается удаление по delete\n eager: 'append',\n overwrite: 'shift',\n lazy: !alwaysShowMask && (props.disabled || !focused),\n unmask,\n ...customIMaskProps,\n } as IMaskInputProps<HTMLInputElement>;\n }\n\n function handleAccept(...args: Parameters<Required<IMaskInputProps<HTMLInputElement>>['onAccept']>) {\n const [value, , e] = args;\n\n // Метод onAccept может вызываться при монтировании, если не задан проп defaultValue.\n // Но нативный input никогда не вызывает onChange при монтировании.\n // Наше событие onValueChange в Input вывается в тех же случаях, что и нативный onChange,\n // поэтому чтобы сохранить консинстентность будем ориентироваться на наличие аргумента e.\n // Он содержит нативное событие, вызвавшее изменение.\n e && onValueChange?.(value);\n !e && (prevValue.current = value);\n }\n\n /**\n * Отслеживаем неожиданные нажатия\n * handleAccept не вызывается когда значение с маской не меняется\n * Сначала вызывается handleAccept, затем handleInput\n */\n function handleInput(e: React.ChangeEvent<HTMLInputElement>) {\n const { value, selectionStart } = e.currentTarget;\n\n // При вводе неожиданных символов или удалении каретка может перепрыгивать фиксированные символы.\n // Такие случаи не расцениваем как неожиданный ввод, т.к. пользователь может намеренно их вводить.\n if (prevValue.current === value && selectionStart === prevSelectionStart.current) {\n handleUnexpectedInput(value);\n }\n prevValue.current = value;\n prevSelectionStart.current = selectionStart;\n\n props.onInput?.(e);\n }\n\n function handleFocus(e: React.FocusEvent<HTMLInputElement>) {\n setFocused(true);\n props.onFocus?.(e);\n\n // Если value из пропов отличается от value, которое получит input после обработки,\n // то imask будет ставить каретку за последним валидным символом.\n props.selectAllOnFocus && inputRef.current?.delaySelectAll();\n }\n\n function handleUnexpectedInput(value: string) {\n const blink = inputRef.current?.blink.bind(inputRef.current) || (() => undefined);\n onUnexpectedInput ? onUnexpectedInput(value, blink) : blink();\n }\n\n function handleBlur(e: React.FocusEvent<HTMLInputElement>) {\n setFocused(false);\n props.onBlur?.(e);\n }\n\n function handleKeyDown(e: React.KeyboardEvent<HTMLInputElement>) {\n const { value, selectionStart, selectionEnd } = e.currentTarget;\n\n if (\n (isKeyBackspace(e) && selectionStart === 0 && selectionEnd === 0) ||\n (isKeyDelete(e) && prevSelectionStart.current === value.length)\n ) {\n // Случаи, когда нажатие клавиш не тригерит `onInput`\n handleUnexpectedInput(value);\n prevValue.current = e.currentTarget.value;\n }\n prevSelectionStart.current = selectionStart;\n\n props.onKeyDown?.(e);\n }\n },\n);\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_react","_interopRequireWildcard","require","_forwardRefAndName","_Emotion","_Input","_identifiers","_ThemeContext","_MaskedInput","_MaskedInput2","_ColorableInputElement","_FixedIMaskInput","_excluded","getSafeMaskInputType","exports","type","MaskedInput","forwardRefAndName","props","ref","mask","maskChar","formatChars","_props$alwaysShowMask","alwaysShowMask","_props$colored","colored","_props$imaskProps","imaskProps","customIMaskProps","_props$unmask","unmask","onValueChange","onUnexpectedInput","onChange","onBeforePasteValue","element","className","maxLength","inputProps","_objectWithoutPropertiesLoose2","default","theme","useContext","ThemeContext","inputRef","useRef","_useState","useState","focused","setFocused","prevValue","value","String","defaultValue","prevSelectionStart","useImperativeHandle","current","Object","assign","selectAll","_inputRef$current","_inputRef$current2","focus","delaySelectAll","useEffect","_inputRef$current3","input","selectionStart","getCompatibleIMaskProps","uiFontGlobalClassesRoot","createElement","Input","_extends2","onFocus","handleFocus","onBlur","handleBlur","onInput","handleInput","onKeyDown","handleKeyDown","onPaste","handlePaste","cx","globalClasses","root","styles","ColorableInputElement","showOnFocus","FixedIMaskInput","onAccept","handleAccept","event","_event$clipboardData$","_event$clipboardData","preventDefault","clipboardData","getData","replace","placeholderChar","getMaskChar","definitions","getDefinitions","eager","overwrite","lazy","disabled","_len","arguments","length","args","Array","_key","e","_e$currentTarget","currentTarget","handleUnexpectedInput","_inputRef$current4","selectAllOnFocus","_inputRef$current5","blink","bind","undefined","_e$currentTarget2","selectionEnd","isKeyBackspace","isKeyDelete"],"sources":["MaskedInput.tsx"],"sourcesContent":["import React, { useImperativeHandle, useRef, useState, useEffect, useContext } from 'react';\nimport type { IMaskInputProps } from '@skbkontur/react-imask';\nimport type { Ref } from 'react';\n\nimport { forwardRefAndName } from '../../lib/forwardRefAndName';\nimport { cx } from '../../lib/theming/Emotion';\nimport type { InputProps, InputType } from '../Input';\nimport { Input } from '../Input';\nimport { isKeyBackspace, isKeyDelete } from '../../lib/events/keyboard/identifiers';\nimport { ThemeContext } from '../../lib/theming/ThemeContext';\n\nimport { globalClasses, styles } from './MaskedInput.styles';\nimport { getDefinitions, getMaskChar } from './MaskedInput.helpers';\nimport { ColorableInputElement } from './ColorableInputElement';\nimport { FixedIMaskInput } from './FixedIMaskInput';\n\nexport type MaskedInputOnBeforePasteValue = (value: string) => string;\n\nexport interface MaskedProps {\n /** Паттерн маски */\n mask: string;\n\n /** Устанавливает символ маски\n * @default _ */\n maskChar?: string;\n\n /** Задает словарь символов-регулярок для задания маски.\n * @default { '9': '[0-9]', 'a': '[A-Za-z]', '*': '[A-Za-z0-9]' } */\n formatChars?: Record<string, string>;\n\n /** Включает показ символов маски.\n * @default false */\n alwaysShowMask?: boolean;\n\n /** Задает обработчик неправильного ввода.\n * Вторым агрументом будет передан метод вспыхивания акцентным цветом.\n *\n * Если обработчик не задан, то инпут вспыхивает по-умолчанию.\n * @param value значение инпута.\n * @param blink вспыхнуть акцентным цвтетом.\n */\n onUnexpectedInput?: (value: string, blink: () => void) => void;\n\n /** Задает обработчик вставки значения в инпут.\n * В value будет передано значение из буфера обмена.\n * Возвращаемое значение будет использовано как значение инпута.\n * Используется для фильтрации значения при вставке из буфера обмена.\n * @param value значение вставки.\n */\n onBeforePasteValue?: MaskedInputOnBeforePasteValue;\n\n /** Убирает из value символы, не введённые пользователем\n * @default false */\n unmask?: boolean;\n\n /** Раскрашивает символы маски.\n * @default true\n * @ignore */\n colored?: boolean;\n\n /** Задает пропы для компонента `IMaskInput`. Необходимы для юнит-тестов\n * @ignore */\n imaskProps?: IMaskInputProps<HTMLInputElement>;\n}\n\nexport type MaskInputType = Exclude<InputType, 'number' | 'date' | 'time' | 'password'>;\n\nexport const getSafeMaskInputType = (type?: InputType): MaskInputType | undefined => {\n if (!type) {\n return type;\n }\n\n switch (type) {\n case 'number':\n case 'date':\n case 'time':\n case 'password':\n return 'text';\n default:\n return type;\n }\n};\n\nexport interface MaskedInputProps\n extends MaskedProps,\n Omit<\n InputProps,\n 'showClearIcon' | 'mask' | 'maxLength' | 'type' | 'alwaysShowMask' | 'onUnexpectedInput' | 'maskChar'\n > {\n type?: MaskInputType;\n}\n\n/**\n * Интерфейс пропсов наследуется от `Input`.\n * Из пропсов `Input` исключены некоторые не применимые к полю с маской пропсы и сокращен список возможных значений в type.\n */\nexport const MaskedInput = forwardRefAndName(\n 'MaskedInput',\n function MaskedInput(props: MaskedInputProps, ref: Ref<Input | null>) {\n const {\n mask,\n maskChar,\n formatChars,\n alwaysShowMask = false,\n colored = true,\n imaskProps: customIMaskProps = {},\n unmask = false,\n onValueChange,\n onUnexpectedInput,\n onChange,\n onBeforePasteValue,\n element,\n className,\n // @ts-expect-error: могут передавать игнорируя ошибку\n maxLength,\n ...inputProps\n } = props;\n const theme = useContext(ThemeContext);\n\n const inputRef = useRef<Input>(null);\n\n const [focused, setFocused] = useState(false);\n const prevValue = useRef<string>(props.value || String(props.defaultValue) || '');\n const prevSelectionStart = useRef<number | null>(null);\n\n useImperativeHandle(\n ref,\n () =>\n inputRef.current &&\n Object.assign(inputRef.current, {\n selectAll: () => {\n inputRef.current?.focus();\n inputRef.current?.delaySelectAll();\n },\n }),\n [],\n );\n\n useEffect(() => {\n // Для корректной работы onUnexpectedInput надо знать предыдущий value,\n // но imask при монтировании не вызывает onAccept, если value невалиден или laze=false.\n // Поэтому актуальный value при монтировании надо получать вручную\n if (inputRef.current?.input) {\n prevValue.current = inputRef.current.input.value;\n prevSelectionStart.current = inputRef.current.input.selectionStart;\n }\n }, []);\n\n const imaskProps = getCompatibleIMaskProps();\n\n // TODO: Удалить в следующем мажоре\n // Селекторы могут ожидать определённый порядок классов\n const uiFontGlobalClassesRoot = 'react-ui-ui-font-root';\n\n return (\n <Input\n ref={inputRef}\n {...inputProps}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onInput={handleInput}\n onKeyDown={handleKeyDown}\n onPaste={handlePaste}\n className={cx(globalClasses.root, uiFontGlobalClassesRoot, className, styles.root(theme))}\n element={\n colored ? (\n <ColorableInputElement showOnFocus={false} alwaysShowMask={alwaysShowMask}>\n <FixedIMaskInput {...imaskProps} onAccept={handleAccept} />\n </ColorableInputElement>\n ) : (\n <FixedIMaskInput {...imaskProps} onAccept={handleAccept} />\n )\n }\n />\n );\n\n function handlePaste(event: React.ClipboardEvent<HTMLInputElement>) {\n if (onBeforePasteValue && onValueChange) {\n event.preventDefault();\n onValueChange?.(onBeforePasteValue(event.clipboardData?.getData('text') ?? ''));\n }\n\n props.onPaste?.(event);\n }\n\n function getCompatibleIMaskProps(): IMaskInputProps<HTMLInputElement> {\n return {\n mask: mask.replace(/0/g, '{\\\\0}') as any,\n placeholderChar: getMaskChar(maskChar),\n definitions: getDefinitions(formatChars),\n // FIXME: Должно быть eager=true, но в imask ломается удаление по delete\n eager: 'append',\n overwrite: 'shift',\n lazy: !alwaysShowMask && (props.disabled || !focused),\n unmask,\n ...customIMaskProps,\n } as IMaskInputProps<HTMLInputElement>;\n }\n\n function handleAccept(...args: Parameters<Required<IMaskInputProps<HTMLInputElement>>['onAccept']>) {\n const [value, , e] = args;\n\n // Метод onAccept может вызываться при монтировании, если не задан проп defaultValue.\n // Но нативный input никогда не вызывает onChange при монтировании.\n // Наше событие onValueChange в Input вывается в тех же случаях, что и нативный onChange,\n // поэтому чтобы сохранить консинстентность будем ориентироваться на наличие аргумента e.\n // Он содержит нативное событие, вызвавшее изменение.\n e && onValueChange?.(value);\n !e && (prevValue.current = value);\n }\n\n /**\n * Отслеживаем неожиданные нажатия\n * handleAccept не вызывается когда значение с маской не меняется\n * Сначала вызывается handleAccept, затем handleInput\n */\n function handleInput(e: React.ChangeEvent<HTMLInputElement>) {\n const { value, selectionStart } = e.currentTarget;\n\n // При вводе неожиданных символов или удалении каретка может перепрыгивать фиксированные символы.\n // Такие случаи не расцениваем как неожиданный ввод, т.к. пользователь может намеренно их вводить.\n if (prevValue.current === value && selectionStart === prevSelectionStart.current) {\n handleUnexpectedInput(value);\n }\n prevValue.current = value;\n prevSelectionStart.current = selectionStart;\n\n props.onInput?.(e);\n }\n\n function handleFocus(e: React.FocusEvent<HTMLInputElement>) {\n setFocused(true);\n props.onFocus?.(e);\n\n // Если value из пропов отличается от value, которое получит input после обработки,\n // то imask будет ставить каретку за последним валидным символом.\n props.selectAllOnFocus && inputRef.current?.delaySelectAll();\n }\n\n function handleUnexpectedInput(value: string) {\n const blink = inputRef.current?.blink.bind(inputRef.current) || (() => undefined);\n onUnexpectedInput ? onUnexpectedInput(value, blink) : blink();\n }\n\n function handleBlur(e: React.FocusEvent<HTMLInputElement>) {\n setFocused(false);\n props.onBlur?.(e);\n }\n\n function handleKeyDown(e: React.KeyboardEvent<HTMLInputElement>) {\n const { value, selectionStart, selectionEnd } = e.currentTarget;\n\n if (\n (isKeyBackspace(e) && selectionStart === 0 && selectionEnd === 0) ||\n (isKeyDelete(e) && prevSelectionStart.current === value.length)\n ) {\n // Случаи, когда нажатие клавиш не тригерит `onInput`\n handleUnexpectedInput(value);\n prevValue.current = e.currentTarget.value;\n }\n prevSelectionStart.current = selectionStart;\n\n props.onKeyDown?.(e);\n }\n },\n);\n"],"mappings":"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","ignoreList":[]}
@@ -4,7 +4,7 @@ import type { InputProps } from '../Input';
4
4
  import type { CommonProps } from '../../internal/CommonWrapper';
5
5
  import type { TGetRootNode } from '../../lib/rootNode';
6
6
  export interface PasswordInputProps extends Pick<AriaAttributes, 'aria-label'>, CommonProps, Omit<InputProps, 'showClearIcon'> {
7
- /** Включает CapsLock детектор. */
7
+ /** Визуально показывает, что активен CapsLock. */
8
8
  detectCapsLock?: boolean;
9
9
  }
10
10
  export interface PasswordInputState {
@@ -18,9 +18,7 @@ export declare const PasswordInputDataTids: {
18
18
  readonly eyeIcon: "PasswordInputEyeIcon";
19
19
  };
20
20
  /**
21
- * `PasswordInput` — однострочное поле для ввода пароля, в котором символы заменяются на точки.
22
- *
23
- * Не используйте такое поле для ввода одноразовых кодов из смс. У них короткий срок действия и используются они только один раз.
21
+ * Однострочное поле для ввода пароля, в котором символы заменяются на точки.
24
22
  */
25
23
  export declare class PasswordInput extends React.PureComponent<PasswordInputProps, PasswordInputState> {
26
24
  static __KONTUR_REACT_UI__: string;
@@ -38,11 +36,12 @@ export declare class PasswordInput extends React.PureComponent<PasswordInputProp
38
36
  visible: boolean;
39
37
  };
40
38
  render(): JSX.Element;
41
- /**
39
+ /** Программно устанавливает фокус на поле.
40
+ * Появляется фокусная рамка, элемент получает клавиатурные события и воспринимается как текущий элемент для чтения скринридерами.
42
41
  * @public
43
42
  */
44
43
  focus: () => void;
45
- /**
44
+ /** Программно снимает фокус с кнопки.
46
45
  * @public
47
46
  */
48
47
  blur: () => void;
@@ -48,9 +48,7 @@ var PasswordInputDataTids = exports.PasswordInputDataTids = {
48
48
  };
49
49
 
50
50
  /**
51
- * `PasswordInput` — однострочное поле для ввода пароля, в котором символы заменяются на точки.
52
- *
53
- * Не используйте такое поле для ввода одноразовых кодов из смс. У них короткий срок действия и используются они только один раз.
51
+ * Однострочное поле для ввода пароля, в котором символы заменяются на точки.
54
52
  */var
55
53
 
56
54
 
@@ -112,7 +110,8 @@ PasswordInput = exports.PasswordInput = (_dec = (0, _decorators.locale)('Passwor
112
110
 
113
111
 
114
112
 
115
- /**
113
+ /** Программно устанавливает фокус на поле.
114
+ * Появляется фокусная рамка, элемент получает клавиатурные события и воспринимается как текущий элемент для чтения скринридерами.
116
115
  * @public
117
116
  */_this.
118
117
  focus = function () {
@@ -121,7 +120,7 @@ PasswordInput = exports.PasswordInput = (_dec = (0, _decorators.locale)('Passwor
121
120
  }
122
121
  };
123
122
 
124
- /**
123
+ /** Программно снимает фокус с кнопки.
125
124
  * @public
126
125
  */_this.
127
126
  blur = function () {