@skbkontur/react-ui 6.1.4-6d143.0 → 6.1.4-d7626.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.
- package/components/MaskedInput/MaskedInput.d.ts +1 -1
- package/components/MaskedInput/MaskedInput.js +3 -3
- package/components/MaskedInput/MaskedInput.js.map +1 -1
- package/components/MaskedInputV2/MaskedInputV2.d.ts +1 -1
- package/components/MaskedInputV2/MaskedInputV2.js +2 -2
- package/components/MaskedInputV2/MaskedInputV2.js.map +1 -1
- package/components/MaskedInputV2/internal/showOverlay.js +3 -1
- package/components/MaskedInputV2/internal/showOverlay.js.map +1 -1
- package/components/MaskedInputV2/internal/useInputOverflow.js +5 -1
- package/components/MaskedInputV2/internal/useInputOverflow.js.map +1 -1
- package/lib/featureFlagsContext/ReactUIFeatureFlagsContext.d.ts +1 -1
- package/lib/featureFlagsContext/ReactUIFeatureFlagsContext.js +1 -1
- package/lib/featureFlagsContext/ReactUIFeatureFlagsContext.js.map +1 -1
- package/package.json +1 -1
|
@@ -51,6 +51,6 @@ export interface MaskedInputProps extends MaskedProps, Omit<InputProps, 'showCle
|
|
|
51
51
|
}
|
|
52
52
|
/** Поле ввода, которое ограничивает формат вводимого значения по заданной маске. Такое поле облегчает пользователю ввод и снижает количество ошибок.
|
|
53
53
|
*
|
|
54
|
-
* Для исправленной реализации включите фичафлаг `
|
|
54
|
+
* Для исправленной реализации включите фичафлаг `maskedInputUseFixes` в {@link ReactUIFeatureFlagsContext}.
|
|
55
55
|
*/
|
|
56
56
|
export declare const MaskedInput: import("../../lib/forwardRefAndName.js").ReactUIComponentWithRef<Input, MaskedInputProps> & Record<never, never>;
|
|
@@ -30,11 +30,11 @@ export var getSafeMaskInputType = function (type) {
|
|
|
30
30
|
};
|
|
31
31
|
/** Поле ввода, которое ограничивает формат вводимого значения по заданной маске. Такое поле облегчает пользователю ввод и снижает количество ошибок.
|
|
32
32
|
*
|
|
33
|
-
* Для исправленной реализации включите фичафлаг `
|
|
33
|
+
* Для исправленной реализации включите фичафлаг `maskedInputUseFixes` в {@link ReactUIFeatureFlagsContext}.
|
|
34
34
|
*/
|
|
35
35
|
export var MaskedInput = forwardRefAndName('MaskedInput', function MaskedInput(props, ref) {
|
|
36
|
-
var
|
|
37
|
-
if (
|
|
36
|
+
var maskedInputUseFixes = useContext(ReactUIFeatureFlagsContext).maskedInputUseFixes;
|
|
37
|
+
if (maskedInputUseFixes) {
|
|
38
38
|
return React.createElement(MaskedInputV2, __assign({ ref: ref, __fromMaskedInputFacade: true }, props));
|
|
39
39
|
}
|
|
40
40
|
return React.createElement(MaskedInputLegacy, __assign({ ref: ref }, props));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MaskedInput.js","sourceRoot":"","sources":["MaskedInput.tsx"],"names":[],"mappings":";;;;;;;;;;;AACA,OAAO,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAG1C,OAAO,EAAE,0BAA0B,EAAE,MAAM,wCAAwC,CAAC;AACpF,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAEnE,OAAO,EAAE,aAAa,EAA2B,MAAM,2BAA2B,CAAC;AACnF,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AA0D3D,MAAM,CAAC,IAAM,oBAAoB,GAAG,UAAC,IAAgB;IACnD,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,IAAI,CAAC;IACd,CAAC;IAED,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,QAAQ,CAAC;QACd,KAAK,MAAM,CAAC;QACZ,KAAK,MAAM,CAAC;QACZ,KAAK,UAAU;YACb,OAAO,MAAM,CAAC;QAChB;YACE,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC,CAAC;AAYF;;;GAGG;AACH,MAAM,CAAC,IAAM,WAAW,GAAG,iBAAiB,CAC1C,aAAa,EACb,SAAS,WAAW,CAAC,KAAuB,EAAE,GAAsB;IAC1D,IAAA,mBAAmB,GAAK,UAAU,CAAC,0BAA0B,CAAC,oBAA3C,CAA4C;IAEvE,IAAI,mBAAmB,EAAE,CAAC;QACxB,OAAO,oBAAC,aAAa,aAAC,GAAG,EAAE,GAAG,EAAE,uBAAuB,UAAM,KAA4B,EAAI,CAAC;IAChG,CAAC;IAED,OAAO,oBAAC,iBAAiB,aAAC,GAAG,EAAE,GAAG,IAAM,KAAK,EAAI,CAAC;AACpD,CAAC,CACF,CAAC","sourcesContent":["import type { IMaskInputProps } from '@skbkontur/react-imask';\nimport React, { useContext } from 'react';\nimport type { Ref } from 'react';\n\nimport { ReactUIFeatureFlagsContext } from '../../lib/featureFlagsContext/index.js';\nimport { forwardRefAndName } from '../../lib/forwardRefAndName.js';\nimport type { Input, InputProps, InputType } from '../Input/index.js';\nimport { MaskedInputV2, type MaskedInputV2Props } from '../MaskedInputV2/index.js';\nimport { MaskedInputLegacy } from './MaskedInputLegacy.js';\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 * ключ — символ для использования в маске;\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 *\n * @param value значение поля\n * @param blink метод вспыхивания рамки поля\n */\n onUnexpectedInput?: (value: string, blink: () => void) => void;\n\n /**\n * Событие перед вставкой текста в поле.\n * Вызывается с аргументом value — текст из буфера.\n *\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\n MaskedProps,\n Omit<\n InputProps,\n 'showClearIcon' | 'mask' | 'maxLength' | 'type' | 'alwaysShowMask' | 'onUnexpectedInput' | 'maskChar'\n > {\n type?: MaskInputType;\n}\n\n/** Поле ввода, которое ограничивает формат вводимого значения по заданной маске. Такое поле облегчает пользователю ввод и снижает количество ошибок.\n *\n * Для исправленной реализации включите фичафлаг `
|
|
1
|
+
{"version":3,"file":"MaskedInput.js","sourceRoot":"","sources":["MaskedInput.tsx"],"names":[],"mappings":";;;;;;;;;;;AACA,OAAO,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAG1C,OAAO,EAAE,0BAA0B,EAAE,MAAM,wCAAwC,CAAC;AACpF,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAEnE,OAAO,EAAE,aAAa,EAA2B,MAAM,2BAA2B,CAAC;AACnF,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AA0D3D,MAAM,CAAC,IAAM,oBAAoB,GAAG,UAAC,IAAgB;IACnD,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,IAAI,CAAC;IACd,CAAC;IAED,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,QAAQ,CAAC;QACd,KAAK,MAAM,CAAC;QACZ,KAAK,MAAM,CAAC;QACZ,KAAK,UAAU;YACb,OAAO,MAAM,CAAC;QAChB;YACE,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC,CAAC;AAYF;;;GAGG;AACH,MAAM,CAAC,IAAM,WAAW,GAAG,iBAAiB,CAC1C,aAAa,EACb,SAAS,WAAW,CAAC,KAAuB,EAAE,GAAsB;IAC1D,IAAA,mBAAmB,GAAK,UAAU,CAAC,0BAA0B,CAAC,oBAA3C,CAA4C;IAEvE,IAAI,mBAAmB,EAAE,CAAC;QACxB,OAAO,oBAAC,aAAa,aAAC,GAAG,EAAE,GAAG,EAAE,uBAAuB,UAAM,KAA4B,EAAI,CAAC;IAChG,CAAC;IAED,OAAO,oBAAC,iBAAiB,aAAC,GAAG,EAAE,GAAG,IAAM,KAAK,EAAI,CAAC;AACpD,CAAC,CACF,CAAC","sourcesContent":["import type { IMaskInputProps } from '@skbkontur/react-imask';\nimport React, { useContext } from 'react';\nimport type { Ref } from 'react';\n\nimport { ReactUIFeatureFlagsContext } from '../../lib/featureFlagsContext/index.js';\nimport { forwardRefAndName } from '../../lib/forwardRefAndName.js';\nimport type { Input, InputProps, InputType } from '../Input/index.js';\nimport { MaskedInputV2, type MaskedInputV2Props } from '../MaskedInputV2/index.js';\nimport { MaskedInputLegacy } from './MaskedInputLegacy.js';\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 * ключ — символ для использования в маске;\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 *\n * @param value значение поля\n * @param blink метод вспыхивания рамки поля\n */\n onUnexpectedInput?: (value: string, blink: () => void) => void;\n\n /**\n * Событие перед вставкой текста в поле.\n * Вызывается с аргументом value — текст из буфера.\n *\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\n MaskedProps,\n Omit<\n InputProps,\n 'showClearIcon' | 'mask' | 'maxLength' | 'type' | 'alwaysShowMask' | 'onUnexpectedInput' | 'maskChar'\n > {\n type?: MaskInputType;\n}\n\n/** Поле ввода, которое ограничивает формат вводимого значения по заданной маске. Такое поле облегчает пользователю ввод и снижает количество ошибок.\n *\n * Для исправленной реализации включите фичафлаг `maskedInputUseFixes` в {@link ReactUIFeatureFlagsContext}.\n */\nexport const MaskedInput = forwardRefAndName(\n 'MaskedInput',\n function MaskedInput(props: MaskedInputProps, ref: Ref<Input | null>) {\n const { maskedInputUseFixes } = useContext(ReactUIFeatureFlagsContext);\n\n if (maskedInputUseFixes) {\n return <MaskedInputV2 ref={ref} __fromMaskedInputFacade {...(props as MaskedInputV2Props)} />;\n }\n\n return <MaskedInputLegacy ref={ref} {...props} />;\n },\n);\n"]}
|
|
@@ -53,6 +53,6 @@ export interface MaskedInputV2Props extends MaskedInputV2MaskedProps, Omit<Input
|
|
|
53
53
|
/** @ignore */
|
|
54
54
|
__fromMaskedInputFacade?: boolean;
|
|
55
55
|
}
|
|
56
|
-
/** @deprecated Используйте {@link MaskedInput} с фичафлагом `
|
|
56
|
+
/** @deprecated Используйте {@link MaskedInput} с фичафлагом `maskedInputUseFixes` в {@link ReactUIFeatureFlagsContext}. */
|
|
57
57
|
export declare const MaskedInputV2: import("../../lib/forwardRefAndName.js").ReactUIComponentWithRef<Input, MaskedInputV2Props> & Record<never, never>;
|
|
58
58
|
export { getDefinitions, getMaskChar };
|
|
@@ -52,7 +52,7 @@ function getMaskInputMode(type, inputMode) {
|
|
|
52
52
|
}
|
|
53
53
|
return undefined;
|
|
54
54
|
}
|
|
55
|
-
/** @deprecated Используйте {@link MaskedInput} с фичафлагом `
|
|
55
|
+
/** @deprecated Используйте {@link MaskedInput} с фичафлагом `maskedInputUseFixes` в {@link ReactUIFeatureFlagsContext}. */
|
|
56
56
|
export var MaskedInputV2 = forwardRefAndName('MaskedInputV2', function MaskedInputV2(props, ref) {
|
|
57
57
|
var mask = props.mask, maskChar = props.maskChar, formatChars = props.formatChars, _a = props.alwaysShowMask, alwaysShowMask = _a === void 0 ? false : _a, _b = props.colored, colored = _b === void 0 ? true : _b, _c = props.imaskProps, customIMaskProps = _c === void 0 ? EMPTY_IMASK_PROPS : _c, _d = props.unmask, unmask = _d === void 0 ? false : _d, onValueChange = props.onValueChange, onUnexpectedInput = props.onUnexpectedInput, onBeforePasteValue = props.onBeforePasteValue, _element = props.element, className = props.className,
|
|
58
58
|
// @ts-expect-error: могут передавать игнорируя ошибку
|
|
@@ -61,7 +61,7 @@ export var MaskedInputV2 = forwardRefAndName('MaskedInputV2', function MaskedInp
|
|
|
61
61
|
_showClearIcon = props.showClearIcon, selectAllOnFocus = props.selectAllOnFocus, type = props.type, __fromMaskedInputFacade = props.__fromMaskedInputFacade, inputProps = __rest(props, ["mask", "maskChar", "formatChars", "alwaysShowMask", "colored", "imaskProps", "unmask", "onValueChange", "onUnexpectedInput", "onBeforePasteValue", "element", "className", "maxLength", "showClearIcon", "selectAllOnFocus", "type", "__fromMaskedInputFacade"]);
|
|
62
62
|
useEffect(function () {
|
|
63
63
|
if (!__fromMaskedInputFacade) {
|
|
64
|
-
warning(false, '[MaskedInputV2]:
|
|
64
|
+
warning(false, '[MaskedInputV2]: This component is for internal use only. Please use MaskedInput with the maskedInputUseFixes feature flag instead.');
|
|
65
65
|
}
|
|
66
66
|
}, [__fromMaskedInputFacade]);
|
|
67
67
|
var theme = useContext(ThemeContext);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MaskedInputV2.js","sourceRoot":"","sources":["MaskedInputV2.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,KAAK,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,mBAAmB,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEtH,OAAO,OAAO,MAAM,SAAS,CAAC;AAE9B,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,sCAAsC,CAAC;AAC7E,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAEjE,OAAO,EAAE,KAAK,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AACjG,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,0BAA0B,EAAE,MAAM,0CAA0C,CAAC;AACtF,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzE,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AA2DrE,IAAM,iBAAiB,GAAG,EAAE,CAAC;AAE7B,MAAM,CAAC,IAAM,oBAAoB,GAAG,UAAC,IAAyB;IAC5D,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAM,cAAc,GAAG,IAAI,CAAC,IAAI,EAAe,CAAC;IAEhD,IAAI,cAAc,KAAK,UAAU,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;QACrF,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,OAAO,cAA+B,CAAC;AACzC,CAAC,CAAC;AAEF,SAAS,gBAAgB,CACvB,IAAoC,EACpC,SAAmE;IAEnE,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,IAAI,EAAE,MAAK,OAAO,EAAE,CAAC;QAC7B,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAeD,2HAA2H;AAC3H,MAAM,CAAC,IAAM,aAAa,GAAG,iBAAiB,CAC5C,eAAe,EACf,SAAS,aAAa,CAAC,KAAyB,EAAE,GAAsB;IAEpE,IAAA,IAAI,GAoBF,KAAK,KApBH,EACJ,QAAQ,GAmBN,KAAK,SAnBC,EACR,WAAW,GAkBT,KAAK,YAlBI,EACX,KAiBE,KAAK,eAjBe,EAAtB,cAAc,mBAAG,KAAK,KAAA,EACtB,KAgBE,KAAK,QAhBO,EAAd,OAAO,mBAAG,IAAI,KAAA,EACd,KAeE,KAAK,WAfyC,EAApC,gBAAgB,mBAAG,iBAAiB,KAAA,EAChD,KAcE,KAAK,OAdO,EAAd,MAAM,mBAAG,KAAK,KAAA,EACd,aAAa,GAaX,KAAK,cAbM,EACb,iBAAiB,GAYf,KAAK,kBAZU,EACjB,kBAAkB,GAWhB,KAAK,mBAXW,EACT,QAAQ,GAUf,KAAK,QAVU,EACjB,SAAS,GASP,KAAK,UATE;IACT,sDAAsD;IACtD,SAAS,GAOP,KAAK,UAPE;IACT,sDAAsD;IACvC,cAAc,GAK3B,KAAK,cALsB,EAC7B,gBAAgB,GAId,KAAK,iBAJS,EAChB,IAAI,GAGF,KAAK,KAHH,EACJ,uBAAuB,GAErB,KAAK,wBAFgB,EACpB,UAAU,UACX,KAAK,EArBH,iQAqBL,CADc,CACL;IAEV,SAAS,CAAC;QACR,IAAI,CAAC,uBAAuB,EAAE,CAAC;YAC7B,OAAO,CACL,KAAK,EACL,iIAAiI,CAClI,CAAC;QACJ,CAAC;IACH,CAAC,EAAE,CAAC,uBAAuB,CAAC,CAAC,CAAC;IAE9B,IAAM,KAAK,GAAG,UAAU,CAAC,YAAY,CAAC,CAAC;IAC/B,IAAA,EAAE,GAAK,UAAU,EAAE,GAAjB,CAAkB;IAC5B,IAAM,MAAM,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;IAEpC,IAAM,QAAQ,GAAG,MAAM,CAAQ,IAAI,CAAC,CAAC;IACrC,IAAM,YAAY,GAAG,MAAM,CAAmB,IAAI,CAAC,CAAC;IAE9C,IAAA,KAAwB,QAAQ,CAAC,KAAK,CAAC,EAAtC,OAAO,QAAA,EAAE,UAAU,QAAmB,CAAC;IAE9C,IAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACvC,IAAM,uBAAuB,GAAG,MAAM,CAAgB,IAAI,CAAC,CAAC;IAC5D,IAAM,0BAA0B,GAAG,MAAM,CAAwC,IAAI,CAAC,CAAC;IACvF,IAAM,YAAY,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IAE/B,IAAM,UAAU,GAAG,MAAM,CAA4C,EAAE,CAAC,CAAC;IACzE,IAAM,eAAe,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAEnC,kFAAkF;IAClF,wEAAwE;IACxE,gEAAgE;IAChE,IAAI,WAAW,CAAC,OAAO,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC;QACvC,uBAAuB,CAAC,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC;QACvD,WAAW,CAAC,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC;QACjC,UAAU,CAAC,OAAO,GAAG,EAAE,CAAC;QACxB,eAAe,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;IAC/B,CAAC;IAED,6DAA6D;IAC7D,IAAM,MAAM,GAAG,aAAa,CAAC;QAC3B,IAAI,MAAA;QACJ,QAAQ,UAAA;QACR,WAAW,aAAA;QACX,MAAM,QAAA;QACN,cAAc,gBAAA;QACd,UAAU,EAAE,gBAAgB;KAC7B,CAAC,CAAC;IAEH,mFAAmF;IAC7E,IAAA,KAAgB,QAAQ,CAAS,sBACrC,OAAA,UAAU,CAAC,CAAC,MAAA,KAAK,CAAC,KAAK,mCAAI,KAAK,CAAC,YAAY,CAAgC,EAAE,MAAM,CAAC,CAAA,EAAA,CACvF,EAFM,GAAG,QAAA,EAAE,MAAM,QAEjB,CAAC;IAEF,8EAA8E;IAC9E,IAAM,SAAS,GAAG,OAAO,CAAC,cAAM,OAAA,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,EAA5B,CAA4B,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;IAEtF,IAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC5C,IAAM,kBAAkB,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAE/C,kEAAkE;IAClE,SAAS,CAAC;QACR,IAAM,aAAa,GAAG,cAAc,CAAC,OAAO,KAAK,MAAM,CAAC,KAAK,CAAC;QAC9D,IAAM,YAAY,GAAG,kBAAkB,CAAC,OAAO,KAAK,KAAK,CAAC,KAAK,CAAC;QAChE,cAAc,CAAC,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC;QACtC,kBAAkB,CAAC,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC;QAEzC,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAC9B,IAAI,YAAY,IAAI,aAAa,EAAE,CAAC;gBAClC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;YAC1C,CAAC;YACD,OAAO;QACT,CAAC;QAED,IAAI,aAAa,EAAE,CAAC;YAClB,MAAM,CAAC,UAAC,IAAI;gBACV,MAAM,CAAC,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC;gBAClC,OAAO,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC;YACpC,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;IAE1B,oEAAoE;IACpE,sEAAsE;IACtE,IAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IACnC,IAAM,eAAe,GAAG,MAAM,CAAS,SAAS,CAAC,WAAW,CAAC,CAAC;IAC9D,SAAS,CAAC;QACR,IAAI,aAAa,CAAC,OAAO,EAAE,CAAC;YAC1B,aAAa,CAAC,OAAO,GAAG,KAAK,CAAC;YAC9B,eAAe,CAAC,OAAO,GAAG,SAAS,CAAC,WAAW,CAAC;YAChD,OAAO;QACT,CAAC;QACD,IAAI,SAAS,CAAC,WAAW,KAAK,eAAe,CAAC,OAAO,EAAE,CAAC;YACtD,eAAe,CAAC,OAAO,GAAG,SAAS,CAAC,WAAW,CAAC;YAChD,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAG,SAAS,CAAC,WAAW,CAAC,CAAC;QACzC,CAAC;IACH,CAAC,EAAE,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC;IAE5B,mBAAmB,CAA2D,GAAG,EAAE;QACjF,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;YACtB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE;YACrC,SAAS,EAAE;;gBACT,MAAA,QAAQ,CAAC,OAAO,0CAAE,KAAK,EAAE,CAAC;gBAC1B,0BAA0B,CAAC,OAAO,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,SAAS,CAAC,WAAW,EAAE,CAAC;YAChF,CAAC;SACF,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC;IAE5B,eAAe,CAAC;QACd,IAAI,0BAA0B,CAAC,OAAO,KAAK,IAAI,IAAI,YAAY,CAAC,OAAO,EAAE,CAAC;YAClE,IAAA,KAAiB,0BAA0B,CAAC,OAAO,EAAjD,KAAK,WAAA,EAAE,GAAG,SAAuC,CAAC;YAC1D,0BAA0B,CAAC,OAAO,GAAG,IAAI,CAAC;YAC1C,0BAA0B,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;YAC7D,YAAY,CAAC,OAAO,GAAG,GAAG,CAAC;YAC3B,OAAO;QACT,CAAC;QAED,IAAI,uBAAuB,CAAC,OAAO,KAAK,IAAI,IAAI,YAAY,CAAC,OAAO,EAAE,CAAC;YACrE,0BAA0B,CAAC,YAAY,CAAC,OAAO,EAAE,uBAAuB,CAAC,OAAO,CAAC,CAAC;YAClF,YAAY,CAAC,OAAO,GAAG,uBAAuB,CAAC,OAAO,CAAC;YACvD,uBAAuB,CAAC,OAAO,GAAG,IAAI,CAAC;QACzC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC;QACR,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO;QACT,CAAC;QAED,IAAM,EAAE,GAAG,YAAY,CAAC,OAAO,CAAC;QAChC,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,OAAO;QACT,CAAC;QAED,IAAM,SAAS,GAAG;;YAChB,IAAI,QAAQ,CAAC,aAAa,KAAK,EAAE,EAAE,CAAC;gBAClC,YAAY,CAAC,OAAO,GAAG,MAAA,EAAE,CAAC,cAAc,mCAAI,CAAC,CAAC;YAChD,CAAC;QACH,CAAC,CAAC;QAEF,QAAQ,CAAC,gBAAgB,CAAC,iBAAiB,EAAE,SAAS,CAAC,CAAC;QACxD,OAAO,cAAM,OAAA,QAAQ,CAAC,mBAAmB,CAAC,iBAAiB,EAAE,SAAS,CAAC,EAA1D,CAA0D,CAAC;IAC1E,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEd,OAAO,CACL,oBAAC,KAAK,aACJ,GAAG,EAAE,QAAQ,IACT,UAAU,IACd,IAAI,EAAE,oBAAoB,CAAC,IAAI,CAAC,EAChC,SAAS,EAAE,gBAAgB,CAAC,IAAI,EAAE,UAAU,CAAC,SAAS,CAAC,EACvD,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,UAAU,EAClB,QAAQ,EAAE,YAAY,EACtB,SAAS,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAChE,OAAO,EACL,oBAAC,UAAU,IACT,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,MAAM,CAAC,OAAO,EACvB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,GAAG,EACf,WAAW,EAAE,eAAe,EAC5B,iBAAiB,EAAE,sBAAsB,EACzC,MAAM,EAAE,UAAU,EAClB,MAAM,EAAE,UAAU,EAClB,YAAY,EAAE,YAAY,EAC1B,OAAO,EAAE,OAAO,EAChB,gBAAgB,EAAE,gBAAgB,GAClC,IAEJ,CACH,CAAC;IAEF,SAAS,eAAe,CAAC,KAAa,EAAE,MAAyB,EAAE,SAAkB;QACnF,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;YACvB,iBAAiB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QACtC,CAAC;aAAM,CAAC;YACN,IAAI,KAAK,KAAK,GAAG,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;gBAC7C,WAAW,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;YAChC,CAAC;YACD,MAAM,CAAC,KAAK,CAAC,CAAC;QAChB,CAAC;IACH,CAAC;IAED,SAAS,iBAAiB,CAAC,MAAc,EAAE,UAAmB;;QAC5D,IAAM,EAAE,GAAG,YAAY,CAAC,OAAO,CAAC;QAChC,IAAM,cAAc,GAAG,MAAA,EAAE,aAAF,EAAE,uBAAF,EAAE,CAAE,cAAc,mCAAI,CAAC,CAAC;QAE/C,sCAAsC;QACtC,IAAM,YAAY,GAChB,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,cAAc,CAAC,KAAK,IAAI,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,cAAc,CAAC,KAAK,SAAS;YAC7G,CAAC,CAAE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,cAAc,CAAY;YACxD,CAAC,CAAC,kBAAkB,CAAC,cAAc,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QAEzD,IAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;QAC7C,IAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QACzC,IAAM,WAAW,GAAG,kBAAkB,CAAC,CAAC,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAC7E,IAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC;QAEjE,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACpB,gDAAgD;YAChD,sBAAsB,EAAE,CAAC;QAC3B,CAAC;QAED,IAAM,kBAAkB,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC5D,IAAM,eAAe,GAAG,wBAAwB,CAC9C,SAAS,EACT,QAAQ,EACR,MAAM,CAAC,GAAG,EACV,YAAY,EACZ,MAAM,CAAC,OAAO,EACd,kBAAkB,CAAC,WAAW,CAC/B,CAAC;QAEF,IAAI,MAAM,CAAC,GAAG,KAAK,GAAG,EAAE,CAAC;YACvB,WAAW,CAAC,MAAM,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;QAC3C,CAAC;QAED,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACnB,uBAAuB,CAAC,OAAO,GAAG,eAAe,CAAC;QAElD,IAAI,kBAAkB,IAAI,aAAa,EAAE,CAAC;YACxC,qFAAqF;YACrF,sFAAsF;YACtF,eAAe,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,WAAW,CAAC;YAC1E,aAAa,CAAC,WAAW,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,SAAS,WAAW,CAAC,MAAc,EAAE,SAAiB;QACpD,IAAM,kBAAkB,GAAG,GAAG,CAAC;QAE/B,IAAI,UAAU,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,KAAA,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;YAC/C,eAAe,CAAC,OAAO,GAAG,CAAC,CAAC;QAC9B,CAAC;QAED,IAAI,eAAe,CAAC,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5D,UAAU,CAAC,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,eAAe,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;QAChF,CAAC;QAED,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,WAAA,EAAE,CAAC,CAAC;QACpD,IAAI,UAAU,CAAC,OAAO,CAAC,MAAM,GAAG,kBAAkB,EAAE,CAAC;YACnD,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAC7B,CAAC;QACD,eAAe,CAAC,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;IAC1D,CAAC;IAED,SAAS,UAAU;QACjB,IAAI,UAAU,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpC,OAAO;QACT,CAAC;QACD,IAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,eAAe,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;QAC3D,IAAI,SAAS,KAAK,eAAe,CAAC,OAAO,EAAE,CAAC;YAC1C,eAAe,CAAC,OAAO,GAAG,SAAS,CAAC;YACpC,IAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAC5C,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAClB,uBAAuB,CAAC,OAAO,GAAG,KAAK,CAAC,SAAS,CAAC;QACpD,CAAC;IACH,CAAC;IAED,SAAS,UAAU;QACjB,IAAI,UAAU,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpC,OAAO;QACT,CAAC;QACD,IAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,eAAe,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;QACvF,IAAI,SAAS,KAAK,eAAe,CAAC,OAAO,EAAE,CAAC;YAC1C,eAAe,CAAC,OAAO,GAAG,SAAS,CAAC;YACpC,IAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAC5C,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAClB,uBAAuB,CAAC,OAAO,GAAG,KAAK,CAAC,SAAS,CAAC;QACpD,CAAC;IACH,CAAC;IAED,SAAS,sBAAsB;;QAC7B,IAAM,KAAK,GAAG,MAAA,MAAA,QAAQ,CAAC,OAAO,0CAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,mCAAI,CAAC,cAAM,OAAA,SAAS,EAAT,CAAS,CAAC,CAAC;QAClF,iBAAiB,CAAC,CAAC,CAAC,iBAAiB,CAAC,SAAS,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;IAChF,CAAC;IAED,SAAS,WAAW,CAAC,CAAqC;;QACxD,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,MAAA,KAAK,CAAC,OAAO,sDAAG,CAAC,CAAC,CAAC;IACrB,CAAC;IAED,SAAS,UAAU,CAAC,CAAqC;;QACvD,UAAU,CAAC,KAAK,CAAC,CAAC;QAClB,MAAA,KAAK,CAAC,MAAM,sDAAG,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,SAAS,YAAY,CAAC,CAAyC;;QAC7D,IAAI,YAAY,CAAC,OAAO,EAAE,CAAC;YACzB,YAAY,CAAC,OAAO,GAAG,MAAA,YAAY,CAAC,OAAO,CAAC,cAAc,mCAAI,CAAC,CAAC;QAClE,CAAC;QACD,MAAA,UAAU,CAAC,QAAQ,2DAAG,CAAC,CAAC,CAAC;IAC3B,CAAC;AACH,CAAC,CACF,CAAC;AAEF,4EAA4E;AAC5E,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC","sourcesContent":["import React, { useContext, useEffect, useImperativeHandle, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport type { Ref } from 'react';\nimport warning from 'warning';\n\nimport { forwardRefAndName } from '../../lib/forwardRefAndName.js';\nimport { useEmotion, useStyles } from '../../lib/renderEnvironment/index.js';\nimport { ThemeContext } from '../../lib/theming/ThemeContext.js';\nimport type { InputProps, InputType } from '../Input/index.js';\nimport { Input, selectionAllowedTypes } from '../Input/index.js';\nimport { extractRaw, findNearestRawLeft, computePasteMaskedCursor } from './internal/helpers.js';\nimport { MaskedCore } from './internal/MaskedCore.js';\nimport { setMaskInputSelectionRange } from './internal/setMaskInputSelectionRange.js';\nimport { useMaskEngine } from './internal/useMaskEngine.js';\nimport { getDefinitions, getMaskChar } from './MaskedInputV2.helpers.js';\nimport { getStyles, globalClasses } from './MaskedInputV2.styles.js';\nimport type { IMaskInputProps } from './react-imask/mixin.js';\n\nexport type MaskedInputV2OnBeforePasteValue = (value: string) => string;\n\nexport interface MaskedInputV2MaskedProps {\n /** Шаблон ввода, определяющий допустимые символы. */\n mask: string;\n\n /** Плейсхолдер, который отображается на месте ещё не введённых пользователем символов.\n * @default _ */\n maskChar?: string;\n\n /** Словарь правил для настройки маски, где:\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 *\n * @param value значение поля\n * @param blink метод вспыхивания рамки поля\n */\n onUnexpectedInput?: (value: string, blink: () => void) => void;\n\n /**\n * Событие перед вставкой текста в поле.\n * Вызывается с аргументом value — текст из буфера.\n *\n * Обработчик должен вернуть текст — он попадёт в поле.\n *\n * @param value значение вставки.\n */\n onBeforePasteValue?: MaskedInputV2OnBeforePasteValue;\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\nconst EMPTY_IMASK_PROPS = {};\n\nexport const getSafeMaskInputType = (type?: InputType | string): MaskInputType | undefined => {\n if (!type) {\n return undefined;\n }\n\n const normalizedType = type.trim() as InputType;\n\n if (normalizedType === 'password' || !selectionAllowedTypes.includes(normalizedType)) {\n return 'text';\n }\n\n return normalizedType as MaskInputType;\n};\n\nfunction getMaskInputMode(\n type: InputType | string | undefined,\n inputMode: React.InputHTMLAttributes<HTMLInputElement>['inputMode'],\n): React.InputHTMLAttributes<HTMLInputElement>['inputMode'] {\n if (inputMode) {\n return inputMode;\n }\n\n if (type?.trim() === 'email') {\n return 'email';\n }\n\n return undefined;\n}\n\nexport interface MaskedInputV2Props\n extends\n MaskedInputV2MaskedProps,\n Omit<\n InputProps,\n 'showClearIcon' | 'mask' | 'maxLength' | 'type' | 'alwaysShowMask' | 'onUnexpectedInput' | 'maskChar'\n > {\n type?: MaskInputType;\n\n /** @ignore */\n __fromMaskedInputFacade?: boolean;\n}\n\n/** @deprecated Используйте {@link MaskedInput} с фичафлагом `useFixedMaskedInput` в {@link ReactUIFeatureFlagsContext}. */\nexport const MaskedInputV2 = forwardRefAndName(\n 'MaskedInputV2',\n function MaskedInputV2(props: MaskedInputV2Props, ref: Ref<Input | null>) {\n const {\n mask,\n maskChar,\n formatChars,\n alwaysShowMask = false,\n colored = true,\n imaskProps: customIMaskProps = EMPTY_IMASK_PROPS,\n unmask = false,\n onValueChange,\n onUnexpectedInput,\n onBeforePasteValue,\n element: _element,\n className,\n // @ts-expect-error: могут передавать игнорируя ошибку\n maxLength,\n // @ts-expect-error: могут передавать игнорируя ошибку\n showClearIcon: _showClearIcon,\n selectAllOnFocus,\n type,\n __fromMaskedInputFacade,\n ...inputProps\n } = props;\n\n useEffect(() => {\n if (!__fromMaskedInputFacade) {\n warning(\n false,\n '[MaskedInputV2]: компонент не предназначен для прямого использования. Используйте MaskedInput с фичафлагом useFixedMaskedInput.',\n );\n }\n }, [__fromMaskedInputFacade]);\n\n const theme = useContext(ThemeContext);\n const { cx } = useEmotion();\n const styles = useStyles(getStyles);\n\n const inputRef = useRef<Input>(null);\n const coreInputRef = useRef<HTMLInputElement>(null);\n\n const [focused, setFocused] = useState(false);\n\n const prevMaskRef = useRef(props.mask);\n const pendingCursorRestoreRef = useRef<number | null>(null);\n const pendingSelectionRestoreRef = useRef<{ start: number; end: number } | null>(null);\n const lastCaretRef = useRef(0);\n\n const historyRef = useRef<Array<{ raw: string; cursorPos: number }>>([]);\n const historyIndexRef = useRef(-1);\n\n // Сохраняем позицию курсора перед сменой маски (render-phase read of stable ref).\n // При коммите DOM браузер сбросит курсор в конец из-за изменения value,\n // поэтому восстанавливаем его синхронно в useLayoutEffect ниже.\n if (prevMaskRef.current !== props.mask) {\n pendingCursorRestoreRef.current = lastCaretRef.current;\n prevMaskRef.current = props.mask;\n historyRef.current = [];\n historyIndexRef.current = -1;\n }\n\n // Движок: IMask как чистый калькулятор, не привязанный к DOM\n const engine = useMaskEngine({\n mask,\n maskChar,\n formatChars,\n unmask,\n alwaysShowMask,\n imaskProps: customIMaskProps,\n });\n\n // Единственный источник истины — raw (только то, что ввёл пользователь, без маски)\n const [raw, setRaw] = useState<string>(() =>\n extractRaw((props.value ?? props.defaultValue) as string | number | undefined, engine),\n );\n\n // MaskState вычисляется синхронно из raw — оба визуальных слоя читают из него\n const maskState = useMemo(() => engine.compute(raw, focused), [raw, focused, engine]);\n\n const syncedImaskRef = useRef(engine.imask);\n const prevSyncedValueRef = useRef(props.value);\n\n // Синхронизировать raw при изменении props.value или правил маски\n useEffect(() => {\n const engineChanged = syncedImaskRef.current !== engine.imask;\n const valueChanged = prevSyncedValueRef.current !== props.value;\n syncedImaskRef.current = engine.imask;\n prevSyncedValueRef.current = props.value;\n\n if (props.value !== undefined) {\n if (valueChanged || engineChanged) {\n setRaw(extractRaw(props.value, engine));\n }\n return;\n }\n\n if (engineChanged) {\n setRaw((prev) => {\n engine.imask.unmaskedValue = prev;\n return engine.imask.rawInputValue;\n });\n }\n }, [props.value, engine]);\n\n // Вызывать onValueChange только при реальном изменении outputValue,\n // и НЕ при первом рендере (воспроизводит нативное поведение onChange)\n const isFirstRender = useRef(true);\n const prevOutputValue = useRef<string>(maskState.outputValue);\n useEffect(() => {\n if (isFirstRender.current) {\n isFirstRender.current = false;\n prevOutputValue.current = maskState.outputValue;\n return;\n }\n if (maskState.outputValue !== prevOutputValue.current) {\n prevOutputValue.current = maskState.outputValue;\n onValueChange?.(maskState.outputValue);\n }\n }, [maskState.outputValue]);\n\n useImperativeHandle<Input | null, (Input & { selectAll: () => void }) | null>(ref, () => {\n if (!inputRef.current) {\n return null;\n }\n return Object.assign(inputRef.current, {\n selectAll: () => {\n inputRef.current?.focus();\n pendingSelectionRestoreRef.current = { start: 0, end: maskState.typedLength };\n },\n });\n }, [maskState.typedLength]);\n\n useLayoutEffect(() => {\n if (pendingSelectionRestoreRef.current !== null && coreInputRef.current) {\n const { start, end } = pendingSelectionRestoreRef.current;\n pendingSelectionRestoreRef.current = null;\n setMaskInputSelectionRange(coreInputRef.current, start, end);\n lastCaretRef.current = end;\n return;\n }\n\n if (pendingCursorRestoreRef.current !== null && coreInputRef.current) {\n setMaskInputSelectionRange(coreInputRef.current, pendingCursorRestoreRef.current);\n lastCaretRef.current = pendingCursorRestoreRef.current;\n pendingCursorRestoreRef.current = null;\n }\n });\n\n useEffect(() => {\n if (!focused) {\n return;\n }\n\n const el = coreInputRef.current;\n if (!el) {\n return;\n }\n\n const syncCaret = () => {\n if (document.activeElement === el) {\n lastCaretRef.current = el.selectionStart ?? 0;\n }\n };\n\n document.addEventListener('selectionchange', syncCaret);\n return () => document.removeEventListener('selectionchange', syncCaret);\n }, [focused]);\n\n return (\n <Input\n ref={inputRef}\n {...inputProps}\n type={getSafeMaskInputType(type)}\n inputMode={getMaskInputMode(type, inputProps.inputMode)}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onSelect={handleSelect}\n className={cx(globalClasses.root, className, styles.root(theme))}\n element={\n <MaskedCore\n maskState={maskState}\n slotMap={engine.slotMap}\n engine={engine}\n focused={focused}\n currentRaw={raw}\n onRawChange={handleRawChange}\n onUnexpectedInput={triggerUnexpectedInput}\n onUndo={handleUndo}\n onRedo={handleRedo}\n coreInputRef={coreInputRef}\n colored={colored}\n selectAllOnFocus={selectAllOnFocus}\n />\n }\n />\n );\n\n function handleRawChange(input: string, source: 'input' | 'paste', cursorPos?: number) {\n if (source === 'paste') {\n handlePasteChange(input, cursorPos);\n } else {\n if (input !== raw && cursorPos !== undefined) {\n pushHistory(input, cursorPos);\n }\n setRaw(input);\n }\n }\n\n function handlePasteChange(pasted: string, _cursorPos?: number) {\n const el = coreInputRef.current;\n const selectionStart = el?.selectionStart ?? 0;\n\n // Находим rawPos по maskedPos курсора\n const rawCursorPos =\n engine.slotMap.maskedToRaw[selectionStart] !== null && engine.slotMap.maskedToRaw[selectionStart] !== undefined\n ? (engine.slotMap.maskedToRaw[selectionStart] as number)\n : findNearestRawLeft(selectionStart, engine.slotMap);\n\n const rawBefore = raw.slice(0, rawCursorPos);\n const rawAfter = raw.slice(rawCursorPos);\n const transformed = onBeforePasteValue ? onBeforePasteValue(pasted) : pasted;\n const result = engine.applyPaste(raw, rawCursorPos, transformed);\n\n if (result.overflow) {\n // IF-1157: paste с overflow → onUnexpectedInput\n triggerUnexpectedInput();\n }\n\n const postPasteMaskState = engine.compute(result.raw, true);\n const maskedCursorPos = computePasteMaskedCursor(\n rawBefore,\n rawAfter,\n result.raw,\n rawCursorPos,\n engine.slotMap,\n postPasteMaskState.typedLength,\n );\n\n if (result.raw !== raw) {\n pushHistory(result.raw, maskedCursorPos);\n }\n\n setRaw(result.raw);\n pendingCursorRestoreRef.current = maskedCursorPos;\n\n if (onBeforePasteValue && onValueChange) {\n // Legacy-контракт: при кастомной вставке наружу уходит результат onBeforePasteValue,\n // а не masked/unmasked outputValue (нужно для ComboBox и совместимости с IMaskInput).\n prevOutputValue.current = engine.compute(result.raw, focused).outputValue;\n onValueChange(transformed);\n }\n }\n\n function pushHistory(newRaw: string, cursorPos: number) {\n const MAX_HISTORY_LENGTH = 100;\n\n if (historyRef.current.length === 0) {\n historyRef.current.push({ raw, cursorPos: 0 });\n historyIndexRef.current = 0;\n }\n\n if (historyIndexRef.current < historyRef.current.length - 1) {\n historyRef.current = historyRef.current.slice(0, historyIndexRef.current + 1);\n }\n\n historyRef.current.push({ raw: newRaw, cursorPos });\n if (historyRef.current.length > MAX_HISTORY_LENGTH) {\n historyRef.current.shift();\n }\n historyIndexRef.current = historyRef.current.length - 1;\n }\n\n function handleUndo() {\n if (historyRef.current.length === 0) {\n return;\n }\n const nextIndex = Math.max(0, historyIndexRef.current - 1);\n if (nextIndex !== historyIndexRef.current) {\n historyIndexRef.current = nextIndex;\n const state = historyRef.current[nextIndex];\n setRaw(state.raw);\n pendingCursorRestoreRef.current = state.cursorPos;\n }\n }\n\n function handleRedo() {\n if (historyRef.current.length === 0) {\n return;\n }\n const nextIndex = Math.min(historyRef.current.length - 1, historyIndexRef.current + 1);\n if (nextIndex !== historyIndexRef.current) {\n historyIndexRef.current = nextIndex;\n const state = historyRef.current[nextIndex];\n setRaw(state.raw);\n pendingCursorRestoreRef.current = state.cursorPos;\n }\n }\n\n function triggerUnexpectedInput() {\n const blink = inputRef.current?.blink.bind(inputRef.current) ?? (() => undefined);\n onUnexpectedInput ? onUnexpectedInput(maskState.outputValue, blink) : blink();\n }\n\n function handleFocus(e: React.FocusEvent<HTMLInputElement>) {\n setFocused(true);\n props.onFocus?.(e);\n }\n\n function handleBlur(e: React.FocusEvent<HTMLInputElement>) {\n setFocused(false);\n props.onBlur?.(e);\n }\n\n function handleSelect(e: React.SyntheticEvent<HTMLInputElement>) {\n if (coreInputRef.current) {\n lastCaretRef.current = coreInputRef.current.selectionStart ?? 0;\n }\n inputProps.onSelect?.(e);\n }\n },\n);\n\n// Вспомогательные функции для совместимости (используются в стори и тестах)\nexport { getDefinitions, getMaskChar };\n"]}
|
|
1
|
+
{"version":3,"file":"MaskedInputV2.js","sourceRoot":"","sources":["MaskedInputV2.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useContext, useEffect, useImperativeHandle, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport type { Ref } from 'react';\nimport warning from 'warning';\n\nimport { forwardRefAndName } from '../../lib/forwardRefAndName.js';\nimport { useEmotion, useStyles } from '../../lib/renderEnvironment/index.js';\nimport { ThemeContext } from '../../lib/theming/ThemeContext.js';\nimport type { InputProps, InputType } from '../Input/index.js';\nimport { Input, selectionAllowedTypes } from '../Input/index.js';\nimport { extractRaw, findNearestRawLeft, computePasteMaskedCursor } from './internal/helpers.js';\nimport { MaskedCore } from './internal/MaskedCore.js';\nimport { setMaskInputSelectionRange } from './internal/setMaskInputSelectionRange.js';\nimport { useMaskEngine } from './internal/useMaskEngine.js';\nimport { getDefinitions, getMaskChar } from './MaskedInputV2.helpers.js';\nimport { getStyles, globalClasses } from './MaskedInputV2.styles.js';\nimport type { IMaskInputProps } from './react-imask/mixin.js';\n\nexport type MaskedInputV2OnBeforePasteValue = (value: string) => string;\n\nexport interface MaskedInputV2MaskedProps {\n /** Шаблон ввода, определяющий допустимые символы. */\n mask: string;\n\n /** Плейсхолдер, который отображается на месте ещё не введённых пользователем символов.\n * @default _ */\n maskChar?: string;\n\n /** Словарь правил для настройки маски, где:\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 *\n * @param value значение поля\n * @param blink метод вспыхивания рамки поля\n */\n onUnexpectedInput?: (value: string, blink: () => void) => void;\n\n /**\n * Событие перед вставкой текста в поле.\n * Вызывается с аргументом value — текст из буфера.\n *\n * Обработчик должен вернуть текст — он попадёт в поле.\n *\n * @param value значение вставки.\n */\n onBeforePasteValue?: MaskedInputV2OnBeforePasteValue;\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\nconst EMPTY_IMASK_PROPS = {};\n\nexport const getSafeMaskInputType = (type?: InputType | string): MaskInputType | undefined => {\n if (!type) {\n return undefined;\n }\n\n const normalizedType = type.trim() as InputType;\n\n if (normalizedType === 'password' || !selectionAllowedTypes.includes(normalizedType)) {\n return 'text';\n }\n\n return normalizedType as MaskInputType;\n};\n\nfunction getMaskInputMode(\n type: InputType | string | undefined,\n inputMode: React.InputHTMLAttributes<HTMLInputElement>['inputMode'],\n): React.InputHTMLAttributes<HTMLInputElement>['inputMode'] {\n if (inputMode) {\n return inputMode;\n }\n\n if (type?.trim() === 'email') {\n return 'email';\n }\n\n return undefined;\n}\n\nexport interface MaskedInputV2Props\n extends\n MaskedInputV2MaskedProps,\n Omit<\n InputProps,\n 'showClearIcon' | 'mask' | 'maxLength' | 'type' | 'alwaysShowMask' | 'onUnexpectedInput' | 'maskChar'\n > {\n type?: MaskInputType;\n\n /** @ignore */\n __fromMaskedInputFacade?: boolean;\n}\n\n/** @deprecated Используйте {@link MaskedInput} с фичафлагом `maskedInputUseFixes` в {@link ReactUIFeatureFlagsContext}. */\nexport const MaskedInputV2 = forwardRefAndName(\n 'MaskedInputV2',\n function MaskedInputV2(props: MaskedInputV2Props, ref: Ref<Input | null>) {\n const {\n mask,\n maskChar,\n formatChars,\n alwaysShowMask = false,\n colored = true,\n imaskProps: customIMaskProps = EMPTY_IMASK_PROPS,\n unmask = false,\n onValueChange,\n onUnexpectedInput,\n onBeforePasteValue,\n element: _element,\n className,\n // @ts-expect-error: могут передавать игнорируя ошибку\n maxLength,\n // @ts-expect-error: могут передавать игнорируя ошибку\n showClearIcon: _showClearIcon,\n selectAllOnFocus,\n type,\n __fromMaskedInputFacade,\n ...inputProps\n } = props;\n\n useEffect(() => {\n if (!__fromMaskedInputFacade) {\n warning(\n false,\n '[MaskedInputV2]: This component is for internal use only. Please use MaskedInput with the maskedInputUseFixes feature flag instead.',\n );\n }\n }, [__fromMaskedInputFacade]);\n\n const theme = useContext(ThemeContext);\n const { cx } = useEmotion();\n const styles = useStyles(getStyles);\n\n const inputRef = useRef<Input>(null);\n const coreInputRef = useRef<HTMLInputElement>(null);\n\n const [focused, setFocused] = useState(false);\n\n const prevMaskRef = useRef(props.mask);\n const pendingCursorRestoreRef = useRef<number | null>(null);\n const pendingSelectionRestoreRef = useRef<{ start: number; end: number } | null>(null);\n const lastCaretRef = useRef(0);\n\n const historyRef = useRef<Array<{ raw: string; cursorPos: number }>>([]);\n const historyIndexRef = useRef(-1);\n\n // Сохраняем позицию курсора перед сменой маски (render-phase read of stable ref).\n // При коммите DOM браузер сбросит курсор в конец из-за изменения value,\n // поэтому восстанавливаем его синхронно в useLayoutEffect ниже.\n if (prevMaskRef.current !== props.mask) {\n pendingCursorRestoreRef.current = lastCaretRef.current;\n prevMaskRef.current = props.mask;\n historyRef.current = [];\n historyIndexRef.current = -1;\n }\n\n // Движок: IMask как чистый калькулятор, не привязанный к DOM\n const engine = useMaskEngine({\n mask,\n maskChar,\n formatChars,\n unmask,\n alwaysShowMask,\n imaskProps: customIMaskProps,\n });\n\n // Единственный источник истины — raw (только то, что ввёл пользователь, без маски)\n const [raw, setRaw] = useState<string>(() =>\n extractRaw((props.value ?? props.defaultValue) as string | number | undefined, engine),\n );\n\n // MaskState вычисляется синхронно из raw — оба визуальных слоя читают из него\n const maskState = useMemo(() => engine.compute(raw, focused), [raw, focused, engine]);\n\n const syncedImaskRef = useRef(engine.imask);\n const prevSyncedValueRef = useRef(props.value);\n\n // Синхронизировать raw при изменении props.value или правил маски\n useEffect(() => {\n const engineChanged = syncedImaskRef.current !== engine.imask;\n const valueChanged = prevSyncedValueRef.current !== props.value;\n syncedImaskRef.current = engine.imask;\n prevSyncedValueRef.current = props.value;\n\n if (props.value !== undefined) {\n if (valueChanged || engineChanged) {\n setRaw(extractRaw(props.value, engine));\n }\n return;\n }\n\n if (engineChanged) {\n setRaw((prev) => {\n engine.imask.unmaskedValue = prev;\n return engine.imask.rawInputValue;\n });\n }\n }, [props.value, engine]);\n\n // Вызывать onValueChange только при реальном изменении outputValue,\n // и НЕ при первом рендере (воспроизводит нативное поведение onChange)\n const isFirstRender = useRef(true);\n const prevOutputValue = useRef<string>(maskState.outputValue);\n useEffect(() => {\n if (isFirstRender.current) {\n isFirstRender.current = false;\n prevOutputValue.current = maskState.outputValue;\n return;\n }\n if (maskState.outputValue !== prevOutputValue.current) {\n prevOutputValue.current = maskState.outputValue;\n onValueChange?.(maskState.outputValue);\n }\n }, [maskState.outputValue]);\n\n useImperativeHandle<Input | null, (Input & { selectAll: () => void }) | null>(ref, () => {\n if (!inputRef.current) {\n return null;\n }\n return Object.assign(inputRef.current, {\n selectAll: () => {\n inputRef.current?.focus();\n pendingSelectionRestoreRef.current = { start: 0, end: maskState.typedLength };\n },\n });\n }, [maskState.typedLength]);\n\n useLayoutEffect(() => {\n if (pendingSelectionRestoreRef.current !== null && coreInputRef.current) {\n const { start, end } = pendingSelectionRestoreRef.current;\n pendingSelectionRestoreRef.current = null;\n setMaskInputSelectionRange(coreInputRef.current, start, end);\n lastCaretRef.current = end;\n return;\n }\n\n if (pendingCursorRestoreRef.current !== null && coreInputRef.current) {\n setMaskInputSelectionRange(coreInputRef.current, pendingCursorRestoreRef.current);\n lastCaretRef.current = pendingCursorRestoreRef.current;\n pendingCursorRestoreRef.current = null;\n }\n });\n\n useEffect(() => {\n if (!focused) {\n return;\n }\n\n const el = coreInputRef.current;\n if (!el) {\n return;\n }\n\n const syncCaret = () => {\n if (document.activeElement === el) {\n lastCaretRef.current = el.selectionStart ?? 0;\n }\n };\n\n document.addEventListener('selectionchange', syncCaret);\n return () => document.removeEventListener('selectionchange', syncCaret);\n }, [focused]);\n\n return (\n <Input\n ref={inputRef}\n {...inputProps}\n type={getSafeMaskInputType(type)}\n inputMode={getMaskInputMode(type, inputProps.inputMode)}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onSelect={handleSelect}\n className={cx(globalClasses.root, className, styles.root(theme))}\n element={\n <MaskedCore\n maskState={maskState}\n slotMap={engine.slotMap}\n engine={engine}\n focused={focused}\n currentRaw={raw}\n onRawChange={handleRawChange}\n onUnexpectedInput={triggerUnexpectedInput}\n onUndo={handleUndo}\n onRedo={handleRedo}\n coreInputRef={coreInputRef}\n colored={colored}\n selectAllOnFocus={selectAllOnFocus}\n />\n }\n />\n );\n\n function handleRawChange(input: string, source: 'input' | 'paste', cursorPos?: number) {\n if (source === 'paste') {\n handlePasteChange(input, cursorPos);\n } else {\n if (input !== raw && cursorPos !== undefined) {\n pushHistory(input, cursorPos);\n }\n setRaw(input);\n }\n }\n\n function handlePasteChange(pasted: string, _cursorPos?: number) {\n const el = coreInputRef.current;\n const selectionStart = el?.selectionStart ?? 0;\n\n // Находим rawPos по maskedPos курсора\n const rawCursorPos =\n engine.slotMap.maskedToRaw[selectionStart] !== null && engine.slotMap.maskedToRaw[selectionStart] !== undefined\n ? (engine.slotMap.maskedToRaw[selectionStart] as number)\n : findNearestRawLeft(selectionStart, engine.slotMap);\n\n const rawBefore = raw.slice(0, rawCursorPos);\n const rawAfter = raw.slice(rawCursorPos);\n const transformed = onBeforePasteValue ? onBeforePasteValue(pasted) : pasted;\n const result = engine.applyPaste(raw, rawCursorPos, transformed);\n\n if (result.overflow) {\n // IF-1157: paste с overflow → onUnexpectedInput\n triggerUnexpectedInput();\n }\n\n const postPasteMaskState = engine.compute(result.raw, true);\n const maskedCursorPos = computePasteMaskedCursor(\n rawBefore,\n rawAfter,\n result.raw,\n rawCursorPos,\n engine.slotMap,\n postPasteMaskState.typedLength,\n );\n\n if (result.raw !== raw) {\n pushHistory(result.raw, maskedCursorPos);\n }\n\n setRaw(result.raw);\n pendingCursorRestoreRef.current = maskedCursorPos;\n\n if (onBeforePasteValue && onValueChange) {\n // Legacy-контракт: при кастомной вставке наружу уходит результат onBeforePasteValue,\n // а не masked/unmasked outputValue (нужно для ComboBox и совместимости с IMaskInput).\n prevOutputValue.current = engine.compute(result.raw, focused).outputValue;\n onValueChange(transformed);\n }\n }\n\n function pushHistory(newRaw: string, cursorPos: number) {\n const MAX_HISTORY_LENGTH = 100;\n\n if (historyRef.current.length === 0) {\n historyRef.current.push({ raw, cursorPos: 0 });\n historyIndexRef.current = 0;\n }\n\n if (historyIndexRef.current < historyRef.current.length - 1) {\n historyRef.current = historyRef.current.slice(0, historyIndexRef.current + 1);\n }\n\n historyRef.current.push({ raw: newRaw, cursorPos });\n if (historyRef.current.length > MAX_HISTORY_LENGTH) {\n historyRef.current.shift();\n }\n historyIndexRef.current = historyRef.current.length - 1;\n }\n\n function handleUndo() {\n if (historyRef.current.length === 0) {\n return;\n }\n const nextIndex = Math.max(0, historyIndexRef.current - 1);\n if (nextIndex !== historyIndexRef.current) {\n historyIndexRef.current = nextIndex;\n const state = historyRef.current[nextIndex];\n setRaw(state.raw);\n pendingCursorRestoreRef.current = state.cursorPos;\n }\n }\n\n function handleRedo() {\n if (historyRef.current.length === 0) {\n return;\n }\n const nextIndex = Math.min(historyRef.current.length - 1, historyIndexRef.current + 1);\n if (nextIndex !== historyIndexRef.current) {\n historyIndexRef.current = nextIndex;\n const state = historyRef.current[nextIndex];\n setRaw(state.raw);\n pendingCursorRestoreRef.current = state.cursorPos;\n }\n }\n\n function triggerUnexpectedInput() {\n const blink = inputRef.current?.blink.bind(inputRef.current) ?? (() => undefined);\n onUnexpectedInput ? onUnexpectedInput(maskState.outputValue, blink) : blink();\n }\n\n function handleFocus(e: React.FocusEvent<HTMLInputElement>) {\n setFocused(true);\n props.onFocus?.(e);\n }\n\n function handleBlur(e: React.FocusEvent<HTMLInputElement>) {\n setFocused(false);\n props.onBlur?.(e);\n }\n\n function handleSelect(e: React.SyntheticEvent<HTMLInputElement>) {\n if (coreInputRef.current) {\n lastCaretRef.current = coreInputRef.current.selectionStart ?? 0;\n }\n inputProps.onSelect?.(e);\n }\n },\n);\n\n// Вспомогательные функции для совместимости (используются в стори и тестах)\nexport { getDefinitions, getMaskChar };\n"]}
|
|
@@ -9,6 +9,8 @@ export function getShowOverlay(maskState, focused, overflows) {
|
|
|
9
9
|
// (плейсхолдеры) всегда рисуется через overlay, а не через value input.
|
|
10
10
|
return hasMaskPart(maskState);
|
|
11
11
|
}
|
|
12
|
-
|
|
12
|
+
// Полностью введённое значение (без декоративной части маски) рисуем нативным
|
|
13
|
+
// текстом input — иначе overlay с overflow:hidden обрезает конец при горизонтальном скролле.
|
|
14
|
+
return hasMaskPart(maskState);
|
|
13
15
|
}
|
|
14
16
|
//# sourceMappingURL=showOverlay.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"showOverlay.js","sourceRoot":"","sources":["showOverlay.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,WAAW,CAAC,SAAoB;IAC9C,OAAO,SAAS,CAAC,YAAY,CAAC,MAAM,GAAG,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,SAAoB,EAAE,OAAgB,EAAE,SAAiB;IAAjB,0BAAA,EAAA,iBAAiB;IACtF,IAAI,SAAS,EAAE,CAAC;QACd,8EAA8E;QAC9E,0EAA0E;QAC1E,wEAAwE;QACxE,OAAO,WAAW,CAAC,SAAS,CAAC,CAAC;IAChC,CAAC;IAED,OAAO,WAAW,CAAC,SAAS,CAAC,
|
|
1
|
+
{"version":3,"file":"showOverlay.js","sourceRoot":"","sources":["showOverlay.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,WAAW,CAAC,SAAoB;IAC9C,OAAO,SAAS,CAAC,YAAY,CAAC,MAAM,GAAG,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,SAAoB,EAAE,OAAgB,EAAE,SAAiB;IAAjB,0BAAA,EAAA,iBAAiB;IACtF,IAAI,SAAS,EAAE,CAAC;QACd,8EAA8E;QAC9E,0EAA0E;QAC1E,wEAAwE;QACxE,OAAO,WAAW,CAAC,SAAS,CAAC,CAAC;IAChC,CAAC;IAED,8EAA8E;IAC9E,6FAA6F;IAC7F,OAAO,WAAW,CAAC,SAAS,CAAC,CAAC;AAChC,CAAC","sourcesContent":["import type { MaskState } from './types.js';\n\nexport function hasMaskPart(maskState: MaskState): boolean {\n return maskState.displayValue.length > maskState.typedValue.length;\n}\n\nexport function getShowOverlay(maskState: MaskState, focused: boolean, overflows = false): boolean {\n if (overflows) {\n // При переполнении скрываем overlay только для полностью введённого значения:\n // иначе overlay не совпадает с прокруткой input. Декоративная часть маски\n // (плейсхолдеры) всегда рисуется через overlay, а не через value input.\n return hasMaskPart(maskState);\n }\n\n // Полностью введённое значение (без декоративной части маски) рисуем нативным\n // текстом input — иначе overlay с overflow:hidden обрезает конец при горизонтальном скролле.\n return hasMaskPart(maskState);\n}\n"]}
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
import { useLayoutEffect, useState } from 'react';
|
|
2
2
|
import { measureInputTextWidth } from './measureInputTextWidth.js';
|
|
3
3
|
export function isInputTextOverflowing(input, displayValue) {
|
|
4
|
-
|
|
4
|
+
if (input.scrollWidth > input.clientWidth) {
|
|
5
|
+
return true;
|
|
6
|
+
}
|
|
7
|
+
var text = input.value || displayValue;
|
|
8
|
+
return measureInputTextWidth(input, text) > input.clientWidth;
|
|
5
9
|
}
|
|
6
10
|
/** Горизонтальное переполнение текста внутри input. */
|
|
7
11
|
export function useInputOverflow(inputRef, displayValue, remeasureKey) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useInputOverflow.js","sourceRoot":"","sources":["useInputOverflow.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAElD,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAEnE,MAAM,UAAU,sBAAsB,CAAC,KAAuB,EAAE,YAAoB;IAClF,OAAO,qBAAqB,CAAC,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"useInputOverflow.js","sourceRoot":"","sources":["useInputOverflow.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAElD,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAEnE,MAAM,UAAU,sBAAsB,CAAC,KAAuB,EAAE,YAAoB;IAClF,IAAI,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;QAC1C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAM,IAAI,GAAG,KAAK,CAAC,KAAK,IAAI,YAAY,CAAC;IACzC,OAAO,qBAAqB,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,KAAK,CAAC,WAAW,CAAC;AAChE,CAAC;AAED,uDAAuD;AACvD,MAAM,UAAU,gBAAgB,CAC9B,QAAkD,EAClD,YAAoB,EACpB,YAAqB;IAEf,IAAA,KAA0B,QAAQ,CAAC,KAAK,CAAC,EAAxC,QAAQ,QAAA,EAAE,WAAW,QAAmB,CAAC;IAEhD,eAAe,CAAC;QACd,IAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO;QACT,CAAC;QAED,IAAM,OAAO,GAAG;YACd,WAAW,CAAC,UAAC,IAAI;gBACf,IAAM,IAAI,GAAG,sBAAsB,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;gBACzD,OAAO,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;YACrC,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QAEF,OAAO,EAAE,CAAC;QAEV,IAAI,OAAO,cAAc,KAAK,WAAW,EAAE,CAAC;YAC1C,OAAO;QACT,CAAC;QAED,IAAM,QAAQ,GAAG,IAAI,cAAc,CAAC,OAAO,CAAC,CAAC;QAC7C,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAExB,OAAO,cAAM,OAAA,QAAQ,CAAC,UAAU,EAAE,EAArB,CAAqB,CAAC;IACrC,CAAC,EAAE,CAAC,YAAY,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC;IAE3C,OAAO,QAAQ,CAAC;AAClB,CAAC","sourcesContent":["import type React from 'react';\nimport { useLayoutEffect, useState } from 'react';\n\nimport { measureInputTextWidth } from './measureInputTextWidth.js';\n\nexport function isInputTextOverflowing(input: HTMLInputElement, displayValue: string): boolean {\n if (input.scrollWidth > input.clientWidth) {\n return true;\n }\n\n const text = input.value || displayValue;\n return measureInputTextWidth(input, text) > input.clientWidth;\n}\n\n/** Горизонтальное переполнение текста внутри input. */\nexport function useInputOverflow(\n inputRef: React.RefObject<HTMLInputElement | null>,\n displayValue: string,\n remeasureKey: unknown,\n): boolean {\n const [overflow, setOverflow] = useState(false);\n\n useLayoutEffect(() => {\n const input = inputRef.current;\n if (!input) {\n return;\n }\n\n const measure = () => {\n setOverflow((prev) => {\n const next = isInputTextOverflowing(input, displayValue);\n return prev === next ? prev : next;\n });\n };\n\n measure();\n\n if (typeof ResizeObserver === 'undefined') {\n return;\n }\n\n const observer = new ResizeObserver(measure);\n observer.observe(input);\n\n return () => observer.disconnect();\n }, [displayValue, inputRef, remeasureKey]);\n\n return overflow;\n}\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
export interface ReactUIFeatureFlags {
|
|
3
3
|
/** Использовать исправленную реализацию MaskedInput (MaskedInputV2) вместо legacy-версии (в т.ч. при прямом использовании `<MaskedInput />`). */
|
|
4
|
-
|
|
4
|
+
maskedInputUseFixes?: boolean;
|
|
5
5
|
selectAutoScrollToSelectedItem?: boolean;
|
|
6
6
|
}
|
|
7
7
|
export declare const reactUIFeatureFlagsDefault: ReactUIFeatureFlags;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
export var reactUIFeatureFlagsDefault = {
|
|
3
3
|
selectAutoScrollToSelectedItem: false,
|
|
4
|
-
|
|
4
|
+
maskedInputUseFixes: false,
|
|
5
5
|
};
|
|
6
6
|
export var ReactUIFeatureFlagsContext = React.createContext(reactUIFeatureFlagsDefault);
|
|
7
7
|
ReactUIFeatureFlagsContext.displayName = 'ReactUIFeatureFlagsContext';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ReactUIFeatureFlagsContext.js","sourceRoot":"","sources":["ReactUIFeatureFlagsContext.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAQ1B,MAAM,CAAC,IAAM,0BAA0B,GAAwB;IAC7D,8BAA8B,EAAE,KAAK;IACrC,mBAAmB,EAAE,KAAK;CAC3B,CAAC;AAEF,MAAM,CAAC,IAAM,0BAA0B,GAAG,KAAK,CAAC,aAAa,CAAsB,0BAA0B,CAAC,CAAC;AAE/G,0BAA0B,CAAC,WAAW,GAAG,4BAA4B,CAAC;AACtE,0BAA0B,CAAC,mBAAmB,GAAG,4BAA4B,CAAC","sourcesContent":["import React from 'react';\n\nexport interface ReactUIFeatureFlags {\n /** Использовать исправленную реализацию MaskedInput (MaskedInputV2) вместо legacy-версии (в т.ч. при прямом использовании `<MaskedInput />`). */\n
|
|
1
|
+
{"version":3,"file":"ReactUIFeatureFlagsContext.js","sourceRoot":"","sources":["ReactUIFeatureFlagsContext.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAQ1B,MAAM,CAAC,IAAM,0BAA0B,GAAwB;IAC7D,8BAA8B,EAAE,KAAK;IACrC,mBAAmB,EAAE,KAAK;CAC3B,CAAC;AAEF,MAAM,CAAC,IAAM,0BAA0B,GAAG,KAAK,CAAC,aAAa,CAAsB,0BAA0B,CAAC,CAAC;AAE/G,0BAA0B,CAAC,WAAW,GAAG,4BAA4B,CAAC;AACtE,0BAA0B,CAAC,mBAAmB,GAAG,4BAA4B,CAAC","sourcesContent":["import React from 'react';\n\nexport interface ReactUIFeatureFlags {\n /** Использовать исправленную реализацию MaskedInput (MaskedInputV2) вместо legacy-версии (в т.ч. при прямом использовании `<MaskedInput />`). */\n maskedInputUseFixes?: boolean;\n selectAutoScrollToSelectedItem?: boolean;\n}\n\nexport const reactUIFeatureFlagsDefault: ReactUIFeatureFlags = {\n selectAutoScrollToSelectedItem: false,\n maskedInputUseFixes: false,\n};\n\nexport const ReactUIFeatureFlagsContext = React.createContext<ReactUIFeatureFlags>(reactUIFeatureFlagsDefault);\n\nReactUIFeatureFlagsContext.displayName = 'ReactUIFeatureFlagsContext';\nReactUIFeatureFlagsContext.__KONTUR_REACT_UI__ = 'ReactUIFeatureFlagsContext';\n"]}
|