@skbkontur/react-ui 6.3.0 → 6.3.1

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/CHANGELOG.md CHANGED
@@ -3,6 +3,20 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## [6.3.1](https://github.com/skbkontur/retail-ui/compare/@skbkontur/react-ui@6.3.0...@skbkontur/react-ui@6.3.1) (2026-08-21)
7
+
8
+
9
+ ### Bug Fixes
10
+
11
+ * **MaskedInput:** do not fire onUnexpectedInput on deletion in empty input ([cb8e1d5](https://github.com/skbkontur/retail-ui/commit/cb8e1d5b04122c488b6978872ec5e3cd360b0ae4))
12
+ * **MaskedInput:** make showClearIcon work with mask ([2f302c3](https://github.com/skbkontur/retail-ui/commit/2f302c3e9db54d6cb8fb6d5e71cafcc5ec345ffd))
13
+ * **TimePicker:** add SizeControlContext support ([8e56133](https://github.com/skbkontur/retail-ui/commit/8e561338d4b1420187eef2a641c83a3d4dd08c2d))
14
+ * **MenuHeader,MenuFooter:** add SizeControlContext support ([8e33cad](https://github.com/skbkontur/retail-ui/commit/8e33cad2f22431f0984119e82975a3ef1e16643e))
15
+
16
+
17
+
18
+
19
+
6
20
  # [6.3.0](https://github.com/skbkontur/retail-ui/compare/@skbkontur/react-ui@6.2.1...@skbkontur/react-ui@6.3.0) (2026-08-14)
7
21
 
8
22
 
@@ -49,7 +49,7 @@ export interface MaskedProps {
49
49
  }
50
50
  export type MaskInputType = Exclude<InputType, 'number' | 'date' | 'time' | 'password'>;
51
51
  export declare const getSafeMaskInputType: (type?: InputType) => MaskInputType | undefined;
52
- export interface MaskedInputProps extends MaskedProps, Omit<InputProps, 'showClearIcon' | 'mask' | 'maxLength' | 'type' | 'alwaysShowMask' | 'onUnexpectedInput' | 'maskChar'> {
52
+ export interface MaskedInputProps extends MaskedProps, Omit<InputProps, 'mask' | 'maxLength' | 'type' | 'alwaysShowMask' | 'onUnexpectedInput' | 'maskChar'> {
53
53
  type?: MaskInputType;
54
54
  }
55
55
  /** Поле ввода, которое ограничивает формат вводимого значения по заданной маске. Такое поле облегчает пользователю ввод и снижает количество ошибок.
@@ -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;AA6D3D,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,4BAA4B,GAAK,UAAU,CAAC,0BAA0B,CAAC,6BAA3C,CAA4C;IAEhF,IAAI,4BAA4B,EAAE,CAAC;QACjC,OAAO,oBAAC,iBAAiB,aAAC,GAAG,EAAE,GAAG,IAAM,KAAK,EAAI,CAAC;IACpD,CAAC;IAED,OAAO,oBAAC,aAAa,aAAC,GAAG,EAAE,GAAG,EAAE,uBAAuB,UAAM,KAA4B,EAAI,CAAC;AAChG,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 * При `type=\"tel\"` и отсутствии обработчика применяется\n * `normalizeRussianPhonePaste` (только в MaskedInputV2).\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 * По умолчанию используется исправленная реализация MaskedInputV2. Для legacy-поведения включите фичафлаг `maskedInputUseLegacyBehavior` в {@link ReactUIFeatureFlagsContext}.\n */\nexport const MaskedInput = forwardRefAndName(\n 'MaskedInput',\n function MaskedInput(props: MaskedInputProps, ref: Ref<Input | null>) {\n const { maskedInputUseLegacyBehavior } = useContext(ReactUIFeatureFlagsContext);\n\n if (maskedInputUseLegacyBehavior) {\n return <MaskedInputLegacy ref={ref} {...props} />;\n }\n\n return <MaskedInputV2 ref={ref} __fromMaskedInputFacade {...(props as MaskedInputV2Props)} />;\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;AA6D3D,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;AASF;;;GAGG;AACH,MAAM,CAAC,IAAM,WAAW,GAAG,iBAAiB,CAC1C,aAAa,EACb,SAAS,WAAW,CAAC,KAAuB,EAAE,GAAsB;IAC1D,IAAA,4BAA4B,GAAK,UAAU,CAAC,0BAA0B,CAAC,6BAA3C,CAA4C;IAEhF,IAAI,4BAA4B,EAAE,CAAC;QACjC,OAAO,oBAAC,iBAAiB,aAAC,GAAG,EAAE,GAAG,IAAM,KAAK,EAAI,CAAC;IACpD,CAAC;IAED,OAAO,oBAAC,aAAa,aAAC,GAAG,EAAE,GAAG,EAAE,uBAAuB,UAAM,KAA4B,EAAI,CAAC;AAChG,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 * При `type=\"tel\"` и отсутствии обработчика применяется\n * `normalizeRussianPhonePaste` (только в MaskedInputV2).\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<InputProps, 'mask' | 'maxLength' | 'type' | 'alwaysShowMask' | 'onUnexpectedInput' | 'maskChar'> {\n type?: MaskInputType;\n}\n\n/** Поле ввода, которое ограничивает формат вводимого значения по заданной маске. Такое поле облегчает пользователю ввод и снижает количество ошибок.\n *\n * По умолчанию используется исправленная реализация MaskedInputV2. Для legacy-поведения включите фичафлаг `maskedInputUseLegacyBehavior` в {@link ReactUIFeatureFlagsContext}.\n */\nexport const MaskedInput = forwardRefAndName(\n 'MaskedInput',\n function MaskedInput(props: MaskedInputProps, ref: Ref<Input | null>) {\n const { maskedInputUseLegacyBehavior } = useContext(ReactUIFeatureFlagsContext);\n\n if (maskedInputUseLegacyBehavior) {\n return <MaskedInputLegacy ref={ref} {...props} />;\n }\n\n return <MaskedInputV2 ref={ref} __fromMaskedInputFacade {...(props as MaskedInputV2Props)} />;\n },\n);\n"]}
@@ -52,7 +52,7 @@ export interface MaskedInputV2MaskedProps {
52
52
  }
53
53
  export type MaskInputType = Exclude<InputType, 'number' | 'date' | 'time' | 'password'>;
54
54
  export declare const getSafeMaskInputType: (type?: InputType | string) => MaskInputType | undefined;
55
- export interface MaskedInputV2Props extends MaskedInputV2MaskedProps, Omit<InputProps, 'showClearIcon' | 'mask' | 'maxLength' | 'type' | 'alwaysShowMask' | 'onUnexpectedInput' | 'maskChar'> {
55
+ export interface MaskedInputV2Props extends MaskedInputV2MaskedProps, Omit<InputProps, 'mask' | 'maxLength' | 'type' | 'alwaysShowMask' | 'onUnexpectedInput' | 'maskChar'> {
56
56
  type?: MaskInputType;
57
57
  /** @ignore */
58
58
  __fromMaskedInputFacade?: boolean;
@@ -56,11 +56,12 @@ function getMaskInputMode(type, inputMode) {
56
56
  }
57
57
  /** @deprecated Используйте {@link MaskedInput}. Для legacy-поведения включите фичафлаг `maskedInputUseLegacyBehavior` в {@link ReactUIFeatureFlagsContext}. */
58
58
  export var MaskedInputV2 = forwardRefAndName('MaskedInputV2', function MaskedInputV2(props, ref) {
59
- 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,
59
+ 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,
60
+ // Значение меняет MaskedCore, поэтому onChange к Input не относится:
61
+ // иначе потребитель получил бы внутреннее событие пересчёта крестика очистки.
62
+ _onChange = props.onChange, _element = props.element, className = props.className,
60
63
  // @ts-expect-error: могут передавать игнорируя ошибку
61
- maxLength = props.maxLength,
62
- // @ts-expect-error: могут передавать игнорируя ошибку
63
- _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"]);
64
+ maxLength = props.maxLength, 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", "onChange", "element", "className", "maxLength", "showClearIcon", "selectAllOnFocus", "type", "__fromMaskedInputFacade"]);
64
65
  useEffect(function () {
65
66
  if (!__fromMaskedInputFacade) {
66
67
  warning(false, '[MaskedInputV2]: This component is for internal use only. Please use MaskedInput instead.');
@@ -179,7 +180,25 @@ export var MaskedInputV2 = forwardRefAndName('MaskedInputV2', function MaskedInp
179
180
  document.addEventListener('selectionchange', syncCaret);
180
181
  return function () { return document.removeEventListener('selectionchange', syncCaret); };
181
182
  }, [focused]);
182
- return (React.createElement(Input, __assign({ ref: inputRef }, inputProps, { type: getSafeMaskInputType(type), inputMode: getMaskInputMode(type, inputProps.inputMode), onFocus: handleFocus, onBlur: handleBlur, onSelect: handleSelect, className: cx(globalClasses.root, className, styles.root(theme)), element: React.createElement(MaskedCore, { maskState: maskState, slotMap: engine.slotMap, engine: engine, focused: focused, currentRaw: raw, onRawChange: handleRawChange, onUnexpectedInput: triggerUnexpectedInput, onUndo: handleUndo, onRedo: handleRedo, coreInputRef: coreInputRef, colored: colored, selectAllOnFocus: selectAllOnFocus, selectionIntent: selectionIntent, onSelectionIntentChange: requestSelectionIntent }) })));
183
+ return (React.createElement(Input, __assign({ ref: inputRef }, inputProps, { type: getSafeMaskInputType(type), inputMode: getMaskInputMode(type, inputProps.inputMode),
184
+ // Непустоту значения Input считает по value нативного инпута, где лежат символы маски,
185
+ // поэтому на пустом значении крестик выключаем сами.
186
+ showClearIcon: raw === '' ? 'never' : showClearIcon, onValueChange: handleInputValueChange, onFocus: handleFocus, onBlur: handleBlur, onSelect: handleSelect, className: cx(globalClasses.root, className, styles.root(theme)), element: React.createElement(MaskedCore, { maskState: maskState, slotMap: engine.slotMap, engine: engine, focused: focused, currentRaw: raw, onRawChange: handleRawChange, onUnexpectedInput: triggerUnexpectedInput, onUndo: handleUndo, onRedo: handleRedo, coreInputRef: coreInputRef, colored: colored, selectAllOnFocus: selectAllOnFocus, selectionIntent: selectionIntent, onSelectionIntentChange: requestSelectionIntent }) })));
187
+ // Клик по крестику очистки Input отдаёт наружу через onValueChange, а сам чистит поле
188
+ // записью в DOM — мимо модели маски, из-за чего значение вернулось бы при следующем рендере.
189
+ // Поэтому очищаем через raw, как при обычном вводе.
190
+ function handleInputValueChange(value) {
191
+ if (value !== '') {
192
+ return;
193
+ }
194
+ // При очистке крестиком raw ещё не пуст — записываем шаг в историю, чтобы undo вернул значение.
195
+ // При удалении с клавиатуры сюда приходит уже применённый пустой raw, шаг записан в handleRawChange.
196
+ if (raw !== '') {
197
+ pushHistory('', 0);
198
+ }
199
+ setRaw('');
200
+ pendingCursorRestoreRef.current = 0;
201
+ }
183
202
  function handleRawChange(input, source, cursorPos) {
184
203
  if (source === 'paste') {
185
204
  handlePasteChange(input, cursorPos);
@@ -279,10 +298,10 @@ export var MaskedInputV2 = forwardRefAndName('MaskedInputV2', function MaskedInp
279
298
  pendingCursorRestoreRef.current = state.cursorPos;
280
299
  }
281
300
  }
282
- function triggerUnexpectedInput() {
301
+ function triggerUnexpectedInput(blinkOnly) {
283
302
  var _a, _b;
284
303
  var blink = (_b = (_a = inputRef.current) === null || _a === void 0 ? void 0 : _a.blink.bind(inputRef.current)) !== null && _b !== void 0 ? _b : (function () { return undefined; });
285
- onUnexpectedInput ? onUnexpectedInput(maskState.outputValue, blink) : blink();
304
+ onUnexpectedInput && !blinkOnly ? onUnexpectedInput(maskState.outputValue, blink) : blink();
286
305
  }
287
306
  function handleFocus(e) {
288
307
  var _a;
@@ -1 +1 @@
1
- {"version":3,"file":"MaskedInputV2.js","sourceRoot":"","sources":["MaskedInputV2.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, {\n useCallback,\n useContext,\n useEffect,\n useImperativeHandle,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} 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 type { MaskedSelectionIntent } from './internal/MaskedCore.types.js';\nimport { getSelectionRawRange } from './internal/maskedCoreClipboard.js';\nimport { setMaskInputSelectionRange } from './internal/setMaskInputSelectionRange.js';\nimport { useMaskEngine } from './internal/useMaskEngine.js';\nimport { getDefinitions, getMaskChar } from './MaskedInputV2.helpers.js';\nimport { normalizeRussianPhonePaste } from './MaskedInputV2.phone.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 — текст из буфера, браузерного autofill\n * или иной bulk-вставки без clipboard-события.\n *\n * Обработчик должен вернуть текст — он попадёт в поле.\n *\n * При `type=\"tel\"` и отсутствии обработчика применяется\n * {@link normalizeRussianPhonePaste}.\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}. Для legacy-поведения включите фичафлаг `maskedInputUseLegacyBehavior` в {@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(false, '[MaskedInputV2]: This component is for internal use only. Please use MaskedInput instead.');\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 const [selectionIntent, setSelectionIntent] = useState<MaskedSelectionIntent>(null);\n\n const prevMaskRef = useRef(props.mask);\n const pendingCursorRestoreRef = useRef<number | null>(null);\n const lastCaretRef = useRef(0);\n\n const requestSelectionIntent = useCallback((intent: MaskedSelectionIntent) => {\n setSelectionIntent((current) => (current === 'select-all' && intent === 'caret-end' ? current : intent));\n }, []);\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 requestSelectionIntent('select-all');\n inputRef.current?.focus();\n const el = coreInputRef.current;\n if (el && el.ownerDocument.activeElement !== el) {\n requestSelectionIntent(null);\n }\n },\n });\n }, [requestSelectionIntent]);\n\n useLayoutEffect(() => {\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 selectionIntent={selectionIntent}\n onSelectionIntentChange={requestSelectionIntent}\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 const selectionEnd = el?.selectionEnd ?? selectionStart;\n\n // При непустом выделении сначала убираем попавший в него raw (в т.ч. если край на литерале `-`),\n // иначе paste склеивает старое значение с новым.\n const selectedRawRange =\n selectionEnd > selectionStart ? getSelectionRawRange(selectionStart, selectionEnd, engine.slotMap) : null;\n\n let baseRaw = raw;\n let rawCursorPos: number;\n if (selectedRawRange) {\n baseRaw = raw.slice(0, selectedRawRange.rawStart) + raw.slice(selectedRawRange.rawEnd);\n rawCursorPos = selectedRawRange.rawStart;\n } else {\n rawCursorPos =\n engine.slotMap.maskedToRaw[selectionStart] !== null &&\n engine.slotMap.maskedToRaw[selectionStart] !== undefined\n ? (engine.slotMap.maskedToRaw[selectionStart] as number)\n : findNearestRawLeft(selectionStart, engine.slotMap);\n }\n\n const rawBefore = baseRaw.slice(0, rawCursorPos);\n const rawAfter = baseRaw.slice(rawCursorPos);\n\n let transformed = pasted;\n if (onBeforePasteValue) {\n transformed = onBeforePasteValue(pasted);\n } else if (getSafeMaskInputType(type) === 'tel') {\n transformed = normalizeRussianPhonePaste(pasted);\n }\n\n const result = engine.applyPaste(baseRaw, rawCursorPos, transformed);\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, {\n useCallback,\n useContext,\n useEffect,\n useImperativeHandle,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} 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 type { MaskedSelectionIntent } from './internal/MaskedCore.types.js';\nimport { getSelectionRawRange } from './internal/maskedCoreClipboard.js';\nimport { setMaskInputSelectionRange } from './internal/setMaskInputSelectionRange.js';\nimport { useMaskEngine } from './internal/useMaskEngine.js';\nimport { getDefinitions, getMaskChar } from './MaskedInputV2.helpers.js';\nimport { normalizeRussianPhonePaste } from './MaskedInputV2.phone.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 — текст из буфера, браузерного autofill\n * или иной bulk-вставки без clipboard-события.\n *\n * Обработчик должен вернуть текст — он попадёт в поле.\n *\n * При `type=\"tel\"` и отсутствии обработчика применяется\n * {@link normalizeRussianPhonePaste}.\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<InputProps, 'mask' | 'maxLength' | 'type' | 'alwaysShowMask' | 'onUnexpectedInput' | 'maskChar'> {\n type?: MaskInputType;\n\n /** @ignore */\n __fromMaskedInputFacade?: boolean;\n}\n\n/** @deprecated Используйте {@link MaskedInput}. Для legacy-поведения включите фичафлаг `maskedInputUseLegacyBehavior` в {@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 // Значение меняет MaskedCore, поэтому onChange к Input не относится:\n // иначе потребитель получил бы внутреннее событие пересчёта крестика очистки.\n onChange: _onChange,\n element: _element,\n className,\n // @ts-expect-error: могут передавать игнорируя ошибку\n maxLength,\n showClearIcon,\n selectAllOnFocus,\n type,\n __fromMaskedInputFacade,\n ...inputProps\n } = props;\n\n useEffect(() => {\n if (!__fromMaskedInputFacade) {\n warning(false, '[MaskedInputV2]: This component is for internal use only. Please use MaskedInput instead.');\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 const [selectionIntent, setSelectionIntent] = useState<MaskedSelectionIntent>(null);\n\n const prevMaskRef = useRef(props.mask);\n const pendingCursorRestoreRef = useRef<number | null>(null);\n const lastCaretRef = useRef(0);\n\n const requestSelectionIntent = useCallback((intent: MaskedSelectionIntent) => {\n setSelectionIntent((current) => (current === 'select-all' && intent === 'caret-end' ? current : intent));\n }, []);\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 requestSelectionIntent('select-all');\n inputRef.current?.focus();\n const el = coreInputRef.current;\n if (el && el.ownerDocument.activeElement !== el) {\n requestSelectionIntent(null);\n }\n },\n });\n }, [requestSelectionIntent]);\n\n useLayoutEffect(() => {\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 // Непустоту значения Input считает по value нативного инпута, где лежат символы маски,\n // поэтому на пустом значении крестик выключаем сами.\n showClearIcon={raw === '' ? 'never' : showClearIcon}\n onValueChange={handleInputValueChange}\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 selectionIntent={selectionIntent}\n onSelectionIntentChange={requestSelectionIntent}\n />\n }\n />\n );\n\n // Клик по крестику очистки Input отдаёт наружу через onValueChange, а сам чистит поле\n // записью в DOM — мимо модели маски, из-за чего значение вернулось бы при следующем рендере.\n // Поэтому очищаем через raw, как при обычном вводе.\n function handleInputValueChange(value: string) {\n if (value !== '') {\n return;\n }\n\n // При очистке крестиком raw ещё не пуст — записываем шаг в историю, чтобы undo вернул значение.\n // При удалении с клавиатуры сюда приходит уже применённый пустой raw, шаг записан в handleRawChange.\n if (raw !== '') {\n pushHistory('', 0);\n }\n\n setRaw('');\n pendingCursorRestoreRef.current = 0;\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 const selectionEnd = el?.selectionEnd ?? selectionStart;\n\n // При непустом выделении сначала убираем попавший в него raw (в т.ч. если край на литерале `-`),\n // иначе paste склеивает старое значение с новым.\n const selectedRawRange =\n selectionEnd > selectionStart ? getSelectionRawRange(selectionStart, selectionEnd, engine.slotMap) : null;\n\n let baseRaw = raw;\n let rawCursorPos: number;\n if (selectedRawRange) {\n baseRaw = raw.slice(0, selectedRawRange.rawStart) + raw.slice(selectedRawRange.rawEnd);\n rawCursorPos = selectedRawRange.rawStart;\n } else {\n rawCursorPos =\n engine.slotMap.maskedToRaw[selectionStart] !== null &&\n engine.slotMap.maskedToRaw[selectionStart] !== undefined\n ? (engine.slotMap.maskedToRaw[selectionStart] as number)\n : findNearestRawLeft(selectionStart, engine.slotMap);\n }\n\n const rawBefore = baseRaw.slice(0, rawCursorPos);\n const rawAfter = baseRaw.slice(rawCursorPos);\n\n let transformed = pasted;\n if (onBeforePasteValue) {\n transformed = onBeforePasteValue(pasted);\n } else if (getSafeMaskInputType(type) === 'tel') {\n transformed = normalizeRussianPhonePaste(pasted);\n }\n\n const result = engine.applyPaste(baseRaw, rawCursorPos, transformed);\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(blinkOnly?: boolean) {\n const blink = inputRef.current?.blink.bind(inputRef.current) ?? (() => undefined);\n onUnexpectedInput && !blinkOnly ? 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"]}
@@ -40,7 +40,7 @@ import { useMaskedCoreHandlers } from './useMaskedCoreHandlers.js';
40
40
  */
41
41
  export var MaskedCore = forwardRefAndName('MaskedCore', function MaskedCore(props, ref) {
42
42
  var _a, _b;
43
- var maskState = props.maskState, slotMap = props.slotMap, engine = props.engine, focused = props.focused, currentRaw = props.currentRaw, onRawChange = props.onRawChange, onUnexpectedInput = props.onUnexpectedInput, onUndo = props.onUndo, onRedo = props.onRedo, coreInputRef = props.coreInputRef, _c = props.colored, colored = _c === void 0 ? true : _c, selectAllOnFocus = props.selectAllOnFocus, externalSelectionIntent = props.selectionIntent, onSelectionIntentChange = props.onSelectionIntentChange, onKeyDown = props.onKeyDown, onMouseUp = props.onMouseUp, onInput = props.onInput, onSelect = props.onSelect, onFocus = props.onFocus, onPaste = props.onPaste, onBlur = props.onBlur, placeholder = props.placeholder, className = props.className, disabled = props.disabled, rest = __rest(props, ["maskState", "slotMap", "engine", "focused", "currentRaw", "onRawChange", "onUnexpectedInput", "onUndo", "onRedo", "coreInputRef", "colored", "selectAllOnFocus", "selectionIntent", "onSelectionIntentChange", "onKeyDown", "onMouseUp", "onInput", "onSelect", "onFocus", "onPaste", "onBlur", "placeholder", "className", "disabled"]);
43
+ var maskState = props.maskState, slotMap = props.slotMap, engine = props.engine, focused = props.focused, currentRaw = props.currentRaw, onRawChange = props.onRawChange, onUnexpectedInput = props.onUnexpectedInput, onUndo = props.onUndo, onRedo = props.onRedo, coreInputRef = props.coreInputRef, _c = props.colored, colored = _c === void 0 ? true : _c, selectAllOnFocus = props.selectAllOnFocus, externalSelectionIntent = props.selectionIntent, onSelectionIntentChange = props.onSelectionIntentChange, onKeyDown = props.onKeyDown, onMouseUp = props.onMouseUp, onInput = props.onInput, onSelect = props.onSelect, onFocus = props.onFocus, onPaste = props.onPaste, onBlur = props.onBlur, inputOnChange = props.onChange, placeholder = props.placeholder, className = props.className, disabled = props.disabled, rest = __rest(props, ["maskState", "slotMap", "engine", "focused", "currentRaw", "onRawChange", "onUnexpectedInput", "onUndo", "onRedo", "coreInputRef", "colored", "selectAllOnFocus", "selectionIntent", "onSelectionIntentChange", "onKeyDown", "onMouseUp", "onInput", "onSelect", "onFocus", "onPaste", "onBlur", "onChange", "placeholder", "className", "disabled"]);
44
44
  var styles = useStyles(getStyles);
45
45
  var globalObject = useGlobal();
46
46
  var overlayRef = useRef(null);
@@ -157,6 +157,15 @@ export var MaskedCore = forwardRefAndName('MaskedCore', function MaskedCore(prop
157
157
  }, 0);
158
158
  return function () { var _a; return (_a = globalObject.clearTimeout) === null || _a === void 0 ? void 0 : _a.call(globalObject, timer); };
159
159
  }, [applySelectionIntent, coreInputRef, focused, globalObject, requestSelectionIntent, selectionIntent]);
160
+ // Значение маски живёт в React-состоянии, а Input пересчитывает своё (показ крестика очистки)
161
+ // только в onChange, которого при удалении и undo не бывает — они идут через keydown.
162
+ // Поэтому дёргаем его сами на каждое изменение значения.
163
+ useEffect(function () {
164
+ var el = coreInputRef.current;
165
+ if (el) {
166
+ inputOnChange === null || inputOnChange === void 0 ? void 0 : inputOnChange({ target: el, currentTarget: el });
167
+ }
168
+ }, [maskState.typedValue]);
160
169
  useEffect(function () {
161
170
  if (!focused) {
162
171
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"MaskedCore.js","sourceRoot":"","sources":["MaskedCore.tsx"],"names":[],"mappings":"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","sourcesContent":["import { cx } from '@emotion/css';\nimport React, {\n useCallback,\n useContext,\n useEffect,\n useImperativeHandle,\n useLayoutEffect,\n useRef,\n useState,\n} from 'react';\n\nimport { forwardRefAndName } from '../../../lib/forwardRefAndName.js';\nimport { useGlobal, useStyles } from '../../../lib/renderEnvironment/index.js';\nimport { scrollInputCaretIntoView } from '../../../lib/scrollInputCaretIntoView.js';\nimport { ThemeContext } from '../../../lib/theming/ThemeContext.js';\nimport type { InputElement } from '../../Input/Input.typings.js';\nimport { needsMaskAlignPadding } from './computeMaskAlignPadding.js';\nimport type { MaskedCoreProps } from './MaskedCore.types.js';\nimport { getStyles, globalClasses } from './MaskedInternal.styles.js';\nimport { MaskOverlay } from './MaskOverlay.js';\nimport { setMaskInputSelectionRange } from './setMaskInputSelectionRange.js';\nimport { getShowOverlay } from './showOverlay.js';\nimport { useInputOverflow } from './useInputOverflow.js';\nimport { useMaskAlignPadding } from './useMaskAlignPadding.js';\nimport { useMaskedCoreHandlers } from './useMaskedCoreHandlers.js';\n\nexport type { MaskedCoreProps } from './MaskedCore.types.js';\n\n/**\n * Headless-слой MaskedInputV2: прозрачный `<input>` для ввода и {@link MaskOverlay} для отображения маски.\n * Управляется через {@link useMaskedCoreHandlers}.\n */\nexport const MaskedCore = forwardRefAndName(\n 'MaskedCore',\n function MaskedCore(props: MaskedCoreProps, ref: React.ForwardedRef<InputElement | null>) {\n const {\n maskState,\n slotMap,\n engine,\n focused,\n currentRaw,\n onRawChange,\n onUnexpectedInput,\n onUndo,\n onRedo,\n coreInputRef,\n colored = true,\n selectAllOnFocus,\n selectionIntent: externalSelectionIntent,\n onSelectionIntentChange,\n onKeyDown,\n onMouseUp,\n onInput,\n onSelect,\n onFocus,\n onPaste,\n onBlur,\n placeholder,\n className,\n disabled,\n ...rest\n } = props;\n\n const styles = useStyles(getStyles);\n const globalObject = useGlobal();\n const overlayRef = useRef<HTMLSpanElement>(null);\n const theme = useContext(ThemeContext);\n const textAlign = rest.style?.textAlign;\n const [internalSelectionIntent, setInternalSelectionIntent] = useState<NonNullable<\n MaskedCoreProps['selectionIntent']\n > | null>(null);\n const selectionIntent = externalSelectionIntent === undefined ? internalSelectionIntent : externalSelectionIntent;\n const selectionIntentRef = useRef(selectionIntent);\n selectionIntentRef.current = selectionIntent;\n\n const requestSelectionIntent = useCallback(\n (intent: NonNullable<MaskedCoreProps['selectionIntent']> | null) => {\n if (onSelectionIntentChange) {\n onSelectionIntentChange(intent);\n return;\n }\n setInternalSelectionIntent((current) =>\n current === 'select-all' && intent === 'caret-end' ? current : intent,\n );\n },\n [onSelectionIntentChange],\n );\n\n const syncOverlayScroll = useCallback(() => {\n if (overlayRef.current && coreInputRef.current) {\n overlayRef.current.style.transform = `translateX(-${coreInputRef.current.scrollLeft}px)`;\n }\n }, [coreInputRef]);\n\n const overflows = useInputOverflow(coreInputRef, maskState.displayValue, focused);\n const showOverlay = getShowOverlay(maskState, focused, overflows);\n\n const {\n pendingCursorRef,\n selectionRange,\n syncSelection,\n handleChange,\n handleKeyDown,\n handleSelect,\n handlePaste,\n handleBeforeInput,\n handleCopy,\n handleCut,\n handleInput,\n handleMouseDown,\n handleMouseUp,\n handleFocus,\n handleBlur,\n } = useMaskedCoreHandlers({\n maskState,\n slotMap,\n engine,\n currentRaw,\n onRawChange,\n onUnexpectedInput,\n onUndo,\n onRedo,\n coreInputRef,\n selectAllOnFocus,\n onKeyDown,\n onMouseUp,\n onInput,\n onSelect,\n onFocus,\n onBlur,\n onPaste,\n syncOverlayScroll,\n requestSelectionIntent,\n });\n\n useImperativeHandle(\n ref,\n () => ({\n input: coreInputRef.current,\n getRootNode: () => coreInputRef.current,\n }),\n [coreInputRef],\n );\n\n const applySelectionIntent = useCallback(\n (intent: NonNullable<MaskedCoreProps['selectionIntent']>) => {\n const el = coreInputRef.current;\n if (!el || !focused) {\n return;\n }\n\n if (intent === 'select-all') {\n setMaskInputSelectionRange(el, 0, maskState.typedLength);\n } else {\n const start = el.selectionStart ?? 0;\n const end = el.selectionEnd ?? 0;\n if (start === end && start !== 0 && start !== maskState.typedLength) {\n return;\n }\n setMaskInputSelectionRange(el, maskState.typedLength);\n }\n scrollInputCaretIntoView(el);\n syncSelection(el);\n },\n [coreInputRef, focused, maskState.typedLength, syncSelection],\n );\n\n useLayoutEffect(() => {\n const el = coreInputRef.current;\n\n if (selectionIntent) {\n applySelectionIntent(selectionIntent);\n } else if (pendingCursorRef.current !== null && el) {\n const pos = pendingCursorRef.current;\n pendingCursorRef.current = null;\n setMaskInputSelectionRange(el, pos);\n scrollInputCaretIntoView(el);\n syncSelection(el);\n } else if (el && focused) {\n scrollInputCaretIntoView(el);\n }\n\n syncOverlayScroll();\n // typedValue в deps обязателен: после controlled-update React сбрасывает selection,\n // а typedLength при shift-перезаписи в полной маске может не измениться (1212 → 1251).\n }, [applySelectionIntent, focused, maskState.typedValue, selectionIntent, syncOverlayScroll, syncSelection]);\n\n // Браузер может применить свою Tab-selection после focus-хендлеров.\n // Один отменяемый retry после события оставляет последнее намерение победителем.\n useEffect(() => {\n if (!selectionIntent || !focused) {\n return;\n }\n\n const appliedIntent = selectionIntent;\n const setTimeout = globalObject.setTimeout;\n if (!setTimeout) {\n requestSelectionIntent(null);\n return;\n }\n const timer = setTimeout(() => {\n if (selectionIntentRef.current !== appliedIntent) {\n return;\n }\n const el = coreInputRef.current;\n if (!el || globalObject.document?.activeElement !== el) {\n requestSelectionIntent(null);\n return;\n }\n applySelectionIntent(appliedIntent);\n requestSelectionIntent(null);\n }, 0);\n\n return () => globalObject.clearTimeout?.(timer);\n }, [applySelectionIntent, coreInputRef, focused, globalObject, requestSelectionIntent, selectionIntent]);\n\n useEffect(() => {\n if (!focused) {\n return;\n }\n\n const el = coreInputRef.current;\n if (!el) {\n return;\n }\n\n const handleSelectionChange = () => {\n if (document.activeElement === el) {\n handleSelect();\n }\n };\n\n document.addEventListener('selectionchange', handleSelectionChange);\n return () => document.removeEventListener('selectionchange', handleSelectionChange);\n }, [focused, handleSelect]);\n\n const alignPadding = useMaskAlignPadding(\n coreInputRef,\n overlayRef,\n maskState.displayValue,\n textAlign,\n focused && showOverlay && needsMaskAlignPadding(textAlign),\n );\n const inputStyle =\n alignPadding > 0 ? { ...rest.style, textAlign: 'left' as const, paddingLeft: alignPadding } : rest.style;\n\n return (\n <>\n <input\n {...rest}\n style={inputStyle}\n placeholder={showOverlay ? undefined : placeholder}\n aria-disabled={disabled}\n disabled={disabled}\n ref={coreInputRef}\n className={cx(globalClasses.input, styles.input(theme), showOverlay && globalClasses.masked, className)}\n value={maskState.typedValue}\n onChange={handleChange}\n onBeforeInput={handleBeforeInput}\n onKeyDown={handleKeyDown}\n onSelect={handleSelect}\n onPaste={handlePaste}\n onCopy={handleCopy}\n onCut={handleCut}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onInput={handleInput}\n onMouseDown={(e) => {\n handleMouseDown();\n rest.onMouseDown?.(e);\n }}\n onMouseUp={handleMouseUp}\n onScroll={syncOverlayScroll}\n />\n {showOverlay && (\n <MaskOverlay\n containerRef={overlayRef}\n typedValue={maskState.typedValue}\n displayValue={maskState.displayValue}\n selectionStart={selectionRange.start}\n selectionEnd={selectionRange.end}\n disabled={disabled}\n textAlign={rest.style?.textAlign}\n colored={colored}\n />\n )}\n </>\n );\n },\n);\n"]}
1
+ {"version":3,"file":"MaskedCore.js","sourceRoot":"","sources":["MaskedCore.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAClC,OAAO,KAAK,EAAE,EACZ,WAAW,EACX,UAAU,EACV,SAAS,EACT,mBAAmB,EACnB,eAAe,EACf,MAAM,EACN,QAAQ,GACT,MAAM,OAAO,CAAC;AAEf,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAC/E,OAAO,EAAE,wBAAwB,EAAE,MAAM,0CAA0C,CAAC;AACpF,OAAO,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAC;AAEpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAErE,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAC7E,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAInE;;;GAGG;AACH,MAAM,CAAC,IAAM,UAAU,GAAG,iBAAiB,CACzC,YAAY,EACZ,SAAS,UAAU,CAAC,KAAsB,EAAE,GAA4C;;IAEpF,IAAA,SAAS,GA0BP,KAAK,UA1BE,EACT,OAAO,GAyBL,KAAK,QAzBA,EACP,MAAM,GAwBJ,KAAK,OAxBD,EACN,OAAO,GAuBL,KAAK,QAvBA,EACP,UAAU,GAsBR,KAAK,WAtBG,EACV,WAAW,GAqBT,KAAK,YArBI,EACX,iBAAiB,GAoBf,KAAK,kBApBU,EACjB,MAAM,GAmBJ,KAAK,OAnBD,EACN,MAAM,GAkBJ,KAAK,OAlBD,EACN,YAAY,GAiBV,KAAK,aAjBK,EACZ,KAgBE,KAAK,QAhBO,EAAd,OAAO,mBAAG,IAAI,KAAA,EACd,gBAAgB,GAed,KAAK,iBAfS,EACC,uBAAuB,GActC,KAAK,gBAdiC,EACxC,uBAAuB,GAarB,KAAK,wBAbgB,EACvB,SAAS,GAYP,KAAK,UAZE,EACT,SAAS,GAWP,KAAK,UAXE,EACT,OAAO,GAUL,KAAK,QAVA,EACP,QAAQ,GASN,KAAK,SATC,EACR,OAAO,GAQL,KAAK,QARA,EACP,OAAO,GAOL,KAAK,QAPA,EACP,MAAM,GAMJ,KAAK,OAND,EACI,aAAa,GAKrB,KAAK,SALgB,EACvB,WAAW,GAIT,KAAK,YAJI,EACX,SAAS,GAGP,KAAK,UAHE,EACT,QAAQ,GAEN,KAAK,SAFC,EACL,IAAI,UACL,KAAK,EA3BH,qVA2BL,CADQ,CACC;IAEV,IAAM,MAAM,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;IACpC,IAAM,YAAY,GAAG,SAAS,EAAE,CAAC;IACjC,IAAM,UAAU,GAAG,MAAM,CAAkB,IAAI,CAAC,CAAC;IACjD,IAAM,KAAK,GAAG,UAAU,CAAC,YAAY,CAAC,CAAC;IACvC,IAAM,SAAS,GAAG,MAAA,IAAI,CAAC,KAAK,0CAAE,SAAS,CAAC;IAClC,IAAA,KAAwD,QAAQ,CAE5D,IAAI,CAAC,EAFR,uBAAuB,QAAA,EAAE,0BAA0B,QAE3C,CAAC;IAChB,IAAM,eAAe,GAAG,uBAAuB,KAAK,SAAS,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,uBAAuB,CAAC;IAClH,IAAM,kBAAkB,GAAG,MAAM,CAAC,eAAe,CAAC,CAAC;IACnD,kBAAkB,CAAC,OAAO,GAAG,eAAe,CAAC;IAE7C,IAAM,sBAAsB,GAAG,WAAW,CACxC,UAAC,MAA8D;QAC7D,IAAI,uBAAuB,EAAE,CAAC;YAC5B,uBAAuB,CAAC,MAAM,CAAC,CAAC;YAChC,OAAO;QACT,CAAC;QACD,0BAA0B,CAAC,UAAC,OAAO;YACjC,OAAA,OAAO,KAAK,YAAY,IAAI,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM;QAArE,CAAqE,CACtE,CAAC;IACJ,CAAC,EACD,CAAC,uBAAuB,CAAC,CAC1B,CAAC;IAEF,IAAM,iBAAiB,GAAG,WAAW,CAAC;QACpC,IAAI,UAAU,CAAC,OAAO,IAAI,YAAY,CAAC,OAAO,EAAE,CAAC;YAC/C,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,GAAG,sBAAe,YAAY,CAAC,OAAO,CAAC,UAAU,QAAK,CAAC;QAC3F,CAAC;IACH,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;IAEnB,IAAM,SAAS,GAAG,gBAAgB,CAAC,YAAY,EAAE,SAAS,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IAClF,IAAM,WAAW,GAAG,cAAc,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;IAE5D,IAAA,KAgBF,qBAAqB,CAAC;QACxB,SAAS,WAAA;QACT,OAAO,SAAA;QACP,MAAM,QAAA;QACN,UAAU,YAAA;QACV,WAAW,aAAA;QACX,iBAAiB,mBAAA;QACjB,MAAM,QAAA;QACN,MAAM,QAAA;QACN,YAAY,cAAA;QACZ,gBAAgB,kBAAA;QAChB,SAAS,WAAA;QACT,SAAS,WAAA;QACT,OAAO,SAAA;QACP,QAAQ,UAAA;QACR,OAAO,SAAA;QACP,MAAM,QAAA;QACN,OAAO,SAAA;QACP,iBAAiB,mBAAA;QACjB,sBAAsB,wBAAA;KACvB,CAAC,EAnCA,gBAAgB,sBAAA,EAChB,cAAc,oBAAA,EACd,aAAa,mBAAA,EACb,YAAY,kBAAA,EACZ,aAAa,mBAAA,EACb,YAAY,kBAAA,EACZ,WAAW,iBAAA,EACX,iBAAiB,uBAAA,EACjB,UAAU,gBAAA,EACV,SAAS,eAAA,EACT,WAAW,iBAAA,EACX,eAAe,qBAAA,EACf,aAAa,mBAAA,EACb,WAAW,iBAAA,EACX,UAAU,gBAqBV,CAAC;IAEH,mBAAmB,CACjB,GAAG,EACH,cAAM,OAAA,CAAC;QACL,KAAK,EAAE,YAAY,CAAC,OAAO;QAC3B,WAAW,EAAE,cAAM,OAAA,YAAY,CAAC,OAAO,EAApB,CAAoB;KACxC,CAAC,EAHI,CAGJ,EACF,CAAC,YAAY,CAAC,CACf,CAAC;IAEF,IAAM,oBAAoB,GAAG,WAAW,CACtC,UAAC,MAAuD;;QACtD,IAAM,EAAE,GAAG,YAAY,CAAC,OAAO,CAAC;QAChC,IAAI,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO;QACT,CAAC;QAED,IAAI,MAAM,KAAK,YAAY,EAAE,CAAC;YAC5B,0BAA0B,CAAC,EAAE,EAAE,CAAC,EAAE,SAAS,CAAC,WAAW,CAAC,CAAC;QAC3D,CAAC;aAAM,CAAC;YACN,IAAM,KAAK,GAAG,MAAA,EAAE,CAAC,cAAc,mCAAI,CAAC,CAAC;YACrC,IAAM,GAAG,GAAG,MAAA,EAAE,CAAC,YAAY,mCAAI,CAAC,CAAC;YACjC,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,SAAS,CAAC,WAAW,EAAE,CAAC;gBACpE,OAAO;YACT,CAAC;YACD,0BAA0B,CAAC,EAAE,EAAE,SAAS,CAAC,WAAW,CAAC,CAAC;QACxD,CAAC;QACD,wBAAwB,CAAC,EAAE,CAAC,CAAC;QAC7B,aAAa,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,EACD,CAAC,YAAY,EAAE,OAAO,EAAE,SAAS,CAAC,WAAW,EAAE,aAAa,CAAC,CAC9D,CAAC;IAEF,eAAe,CAAC;QACd,IAAM,EAAE,GAAG,YAAY,CAAC,OAAO,CAAC;QAEhC,IAAI,eAAe,EAAE,CAAC;YACpB,oBAAoB,CAAC,eAAe,CAAC,CAAC;QACxC,CAAC;aAAM,IAAI,gBAAgB,CAAC,OAAO,KAAK,IAAI,IAAI,EAAE,EAAE,CAAC;YACnD,IAAM,GAAG,GAAG,gBAAgB,CAAC,OAAO,CAAC;YACrC,gBAAgB,CAAC,OAAO,GAAG,IAAI,CAAC;YAChC,0BAA0B,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;YACpC,wBAAwB,CAAC,EAAE,CAAC,CAAC;YAC7B,aAAa,CAAC,EAAE,CAAC,CAAC;QACpB,CAAC;aAAM,IAAI,EAAE,IAAI,OAAO,EAAE,CAAC;YACzB,wBAAwB,CAAC,EAAE,CAAC,CAAC;QAC/B,CAAC;QAED,iBAAiB,EAAE,CAAC;QACpB,oFAAoF;QACpF,uFAAuF;IACzF,CAAC,EAAE,CAAC,oBAAoB,EAAE,OAAO,EAAE,SAAS,CAAC,UAAU,EAAE,eAAe,EAAE,iBAAiB,EAAE,aAAa,CAAC,CAAC,CAAC;IAE7G,oEAAoE;IACpE,iFAAiF;IACjF,SAAS,CAAC;QACR,IAAI,CAAC,eAAe,IAAI,CAAC,OAAO,EAAE,CAAC;YACjC,OAAO;QACT,CAAC;QAED,IAAM,aAAa,GAAG,eAAe,CAAC;QACtC,IAAM,UAAU,GAAG,YAAY,CAAC,UAAU,CAAC;QAC3C,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,sBAAsB,CAAC,IAAI,CAAC,CAAC;YAC7B,OAAO;QACT,CAAC;QACD,IAAM,KAAK,GAAG,UAAU,CAAC;;YACvB,IAAI,kBAAkB,CAAC,OAAO,KAAK,aAAa,EAAE,CAAC;gBACjD,OAAO;YACT,CAAC;YACD,IAAM,EAAE,GAAG,YAAY,CAAC,OAAO,CAAC;YAChC,IAAI,CAAC,EAAE,IAAI,CAAA,MAAA,YAAY,CAAC,QAAQ,0CAAE,aAAa,MAAK,EAAE,EAAE,CAAC;gBACvD,sBAAsB,CAAC,IAAI,CAAC,CAAC;gBAC7B,OAAO;YACT,CAAC;YACD,oBAAoB,CAAC,aAAa,CAAC,CAAC;YACpC,sBAAsB,CAAC,IAAI,CAAC,CAAC;QAC/B,CAAC,EAAE,CAAC,CAAC,CAAC;QAEN,OAAO,sBAAM,OAAA,MAAA,YAAY,CAAC,YAAY,6DAAG,KAAK,CAAC,CAAA,EAAA,CAAC;IAClD,CAAC,EAAE,CAAC,oBAAoB,EAAE,YAAY,EAAE,OAAO,EAAE,YAAY,EAAE,sBAAsB,EAAE,eAAe,CAAC,CAAC,CAAC;IAEzG,8FAA8F;IAC9F,sFAAsF;IACtF,yDAAyD;IACzD,SAAS,CAAC;QACR,IAAM,EAAE,GAAG,YAAY,CAAC,OAAO,CAAC;QAChC,IAAI,EAAE,EAAE,CAAC;YACP,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAG,EAAE,MAAM,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,EAAyC,CAAC,CAAC;QAC5F,CAAC;IACH,CAAC,EAAE,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC;IAE3B,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,qBAAqB,GAAG;YAC5B,IAAI,QAAQ,CAAC,aAAa,KAAK,EAAE,EAAE,CAAC;gBAClC,YAAY,EAAE,CAAC;YACjB,CAAC;QACH,CAAC,CAAC;QAEF,QAAQ,CAAC,gBAAgB,CAAC,iBAAiB,EAAE,qBAAqB,CAAC,CAAC;QACpE,OAAO,cAAM,OAAA,QAAQ,CAAC,mBAAmB,CAAC,iBAAiB,EAAE,qBAAqB,CAAC,EAAtE,CAAsE,CAAC;IACtF,CAAC,EAAE,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC;IAE5B,IAAM,YAAY,GAAG,mBAAmB,CACtC,YAAY,EACZ,UAAU,EACV,SAAS,CAAC,YAAY,EACtB,SAAS,EACT,OAAO,IAAI,WAAW,IAAI,qBAAqB,CAAC,SAAS,CAAC,CAC3D,CAAC;IACF,IAAM,UAAU,GACd,YAAY,GAAG,CAAC,CAAC,CAAC,uBAAM,IAAI,CAAC,KAAK,KAAE,SAAS,EAAE,MAAe,EAAE,WAAW,EAAE,YAAY,IAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;IAE3G,OAAO,CACL;QACE,0CACM,IAAI,IACR,KAAK,EAAE,UAAU,EACjB,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,mBACnC,QAAQ,EACvB,QAAQ,EAAE,QAAQ,EAClB,GAAG,EAAE,YAAY,EACjB,SAAS,EAAE,EAAE,CAAC,aAAa,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,WAAW,IAAI,aAAa,CAAC,MAAM,EAAE,SAAS,CAAC,EACvG,KAAK,EAAE,SAAS,CAAC,UAAU,EAC3B,QAAQ,EAAE,YAAY,EACtB,aAAa,EAAE,iBAAiB,EAChC,SAAS,EAAE,aAAa,EACxB,QAAQ,EAAE,YAAY,EACtB,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,UAAU,EAClB,KAAK,EAAE,SAAS,EAChB,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE,WAAW,EACpB,WAAW,EAAE,UAAC,CAAC;;gBACb,eAAe,EAAE,CAAC;gBAClB,MAAA,IAAI,CAAC,WAAW,qDAAG,CAAC,CAAC,CAAC;YACxB,CAAC,EACD,SAAS,EAAE,aAAa,EACxB,QAAQ,EAAE,iBAAiB,IAC3B;QACD,WAAW,IAAI,CACd,oBAAC,WAAW,IACV,YAAY,EAAE,UAAU,EACxB,UAAU,EAAE,SAAS,CAAC,UAAU,EAChC,YAAY,EAAE,SAAS,CAAC,YAAY,EACpC,cAAc,EAAE,cAAc,CAAC,KAAK,EACpC,YAAY,EAAE,cAAc,CAAC,GAAG,EAChC,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,MAAA,IAAI,CAAC,KAAK,0CAAE,SAAS,EAChC,OAAO,EAAE,OAAO,GAChB,CACH,CACA,CACJ,CAAC;AACJ,CAAC,CACF,CAAC","sourcesContent":["import { cx } from '@emotion/css';\nimport React, {\n useCallback,\n useContext,\n useEffect,\n useImperativeHandle,\n useLayoutEffect,\n useRef,\n useState,\n} from 'react';\n\nimport { forwardRefAndName } from '../../../lib/forwardRefAndName.js';\nimport { useGlobal, useStyles } from '../../../lib/renderEnvironment/index.js';\nimport { scrollInputCaretIntoView } from '../../../lib/scrollInputCaretIntoView.js';\nimport { ThemeContext } from '../../../lib/theming/ThemeContext.js';\nimport type { InputElement } from '../../Input/Input.typings.js';\nimport { needsMaskAlignPadding } from './computeMaskAlignPadding.js';\nimport type { MaskedCoreProps } from './MaskedCore.types.js';\nimport { getStyles, globalClasses } from './MaskedInternal.styles.js';\nimport { MaskOverlay } from './MaskOverlay.js';\nimport { setMaskInputSelectionRange } from './setMaskInputSelectionRange.js';\nimport { getShowOverlay } from './showOverlay.js';\nimport { useInputOverflow } from './useInputOverflow.js';\nimport { useMaskAlignPadding } from './useMaskAlignPadding.js';\nimport { useMaskedCoreHandlers } from './useMaskedCoreHandlers.js';\n\nexport type { MaskedCoreProps } from './MaskedCore.types.js';\n\n/**\n * Headless-слой MaskedInputV2: прозрачный `<input>` для ввода и {@link MaskOverlay} для отображения маски.\n * Управляется через {@link useMaskedCoreHandlers}.\n */\nexport const MaskedCore = forwardRefAndName(\n 'MaskedCore',\n function MaskedCore(props: MaskedCoreProps, ref: React.ForwardedRef<InputElement | null>) {\n const {\n maskState,\n slotMap,\n engine,\n focused,\n currentRaw,\n onRawChange,\n onUnexpectedInput,\n onUndo,\n onRedo,\n coreInputRef,\n colored = true,\n selectAllOnFocus,\n selectionIntent: externalSelectionIntent,\n onSelectionIntentChange,\n onKeyDown,\n onMouseUp,\n onInput,\n onSelect,\n onFocus,\n onPaste,\n onBlur,\n onChange: inputOnChange,\n placeholder,\n className,\n disabled,\n ...rest\n } = props;\n\n const styles = useStyles(getStyles);\n const globalObject = useGlobal();\n const overlayRef = useRef<HTMLSpanElement>(null);\n const theme = useContext(ThemeContext);\n const textAlign = rest.style?.textAlign;\n const [internalSelectionIntent, setInternalSelectionIntent] = useState<NonNullable<\n MaskedCoreProps['selectionIntent']\n > | null>(null);\n const selectionIntent = externalSelectionIntent === undefined ? internalSelectionIntent : externalSelectionIntent;\n const selectionIntentRef = useRef(selectionIntent);\n selectionIntentRef.current = selectionIntent;\n\n const requestSelectionIntent = useCallback(\n (intent: NonNullable<MaskedCoreProps['selectionIntent']> | null) => {\n if (onSelectionIntentChange) {\n onSelectionIntentChange(intent);\n return;\n }\n setInternalSelectionIntent((current) =>\n current === 'select-all' && intent === 'caret-end' ? current : intent,\n );\n },\n [onSelectionIntentChange],\n );\n\n const syncOverlayScroll = useCallback(() => {\n if (overlayRef.current && coreInputRef.current) {\n overlayRef.current.style.transform = `translateX(-${coreInputRef.current.scrollLeft}px)`;\n }\n }, [coreInputRef]);\n\n const overflows = useInputOverflow(coreInputRef, maskState.displayValue, focused);\n const showOverlay = getShowOverlay(maskState, focused, overflows);\n\n const {\n pendingCursorRef,\n selectionRange,\n syncSelection,\n handleChange,\n handleKeyDown,\n handleSelect,\n handlePaste,\n handleBeforeInput,\n handleCopy,\n handleCut,\n handleInput,\n handleMouseDown,\n handleMouseUp,\n handleFocus,\n handleBlur,\n } = useMaskedCoreHandlers({\n maskState,\n slotMap,\n engine,\n currentRaw,\n onRawChange,\n onUnexpectedInput,\n onUndo,\n onRedo,\n coreInputRef,\n selectAllOnFocus,\n onKeyDown,\n onMouseUp,\n onInput,\n onSelect,\n onFocus,\n onBlur,\n onPaste,\n syncOverlayScroll,\n requestSelectionIntent,\n });\n\n useImperativeHandle(\n ref,\n () => ({\n input: coreInputRef.current,\n getRootNode: () => coreInputRef.current,\n }),\n [coreInputRef],\n );\n\n const applySelectionIntent = useCallback(\n (intent: NonNullable<MaskedCoreProps['selectionIntent']>) => {\n const el = coreInputRef.current;\n if (!el || !focused) {\n return;\n }\n\n if (intent === 'select-all') {\n setMaskInputSelectionRange(el, 0, maskState.typedLength);\n } else {\n const start = el.selectionStart ?? 0;\n const end = el.selectionEnd ?? 0;\n if (start === end && start !== 0 && start !== maskState.typedLength) {\n return;\n }\n setMaskInputSelectionRange(el, maskState.typedLength);\n }\n scrollInputCaretIntoView(el);\n syncSelection(el);\n },\n [coreInputRef, focused, maskState.typedLength, syncSelection],\n );\n\n useLayoutEffect(() => {\n const el = coreInputRef.current;\n\n if (selectionIntent) {\n applySelectionIntent(selectionIntent);\n } else if (pendingCursorRef.current !== null && el) {\n const pos = pendingCursorRef.current;\n pendingCursorRef.current = null;\n setMaskInputSelectionRange(el, pos);\n scrollInputCaretIntoView(el);\n syncSelection(el);\n } else if (el && focused) {\n scrollInputCaretIntoView(el);\n }\n\n syncOverlayScroll();\n // typedValue в deps обязателен: после controlled-update React сбрасывает selection,\n // а typedLength при shift-перезаписи в полной маске может не измениться (1212 → 1251).\n }, [applySelectionIntent, focused, maskState.typedValue, selectionIntent, syncOverlayScroll, syncSelection]);\n\n // Браузер может применить свою Tab-selection после focus-хендлеров.\n // Один отменяемый retry после события оставляет последнее намерение победителем.\n useEffect(() => {\n if (!selectionIntent || !focused) {\n return;\n }\n\n const appliedIntent = selectionIntent;\n const setTimeout = globalObject.setTimeout;\n if (!setTimeout) {\n requestSelectionIntent(null);\n return;\n }\n const timer = setTimeout(() => {\n if (selectionIntentRef.current !== appliedIntent) {\n return;\n }\n const el = coreInputRef.current;\n if (!el || globalObject.document?.activeElement !== el) {\n requestSelectionIntent(null);\n return;\n }\n applySelectionIntent(appliedIntent);\n requestSelectionIntent(null);\n }, 0);\n\n return () => globalObject.clearTimeout?.(timer);\n }, [applySelectionIntent, coreInputRef, focused, globalObject, requestSelectionIntent, selectionIntent]);\n\n // Значение маски живёт в React-состоянии, а Input пересчитывает своё (показ крестика очистки)\n // только в onChange, которого при удалении и undo не бывает — они идут через keydown.\n // Поэтому дёргаем его сами на каждое изменение значения.\n useEffect(() => {\n const el = coreInputRef.current;\n if (el) {\n inputOnChange?.({ target: el, currentTarget: el } as React.ChangeEvent<HTMLInputElement>);\n }\n }, [maskState.typedValue]);\n\n useEffect(() => {\n if (!focused) {\n return;\n }\n\n const el = coreInputRef.current;\n if (!el) {\n return;\n }\n\n const handleSelectionChange = () => {\n if (document.activeElement === el) {\n handleSelect();\n }\n };\n\n document.addEventListener('selectionchange', handleSelectionChange);\n return () => document.removeEventListener('selectionchange', handleSelectionChange);\n }, [focused, handleSelect]);\n\n const alignPadding = useMaskAlignPadding(\n coreInputRef,\n overlayRef,\n maskState.displayValue,\n textAlign,\n focused && showOverlay && needsMaskAlignPadding(textAlign),\n );\n const inputStyle =\n alignPadding > 0 ? { ...rest.style, textAlign: 'left' as const, paddingLeft: alignPadding } : rest.style;\n\n return (\n <>\n <input\n {...rest}\n style={inputStyle}\n placeholder={showOverlay ? undefined : placeholder}\n aria-disabled={disabled}\n disabled={disabled}\n ref={coreInputRef}\n className={cx(globalClasses.input, styles.input(theme), showOverlay && globalClasses.masked, className)}\n value={maskState.typedValue}\n onChange={handleChange}\n onBeforeInput={handleBeforeInput}\n onKeyDown={handleKeyDown}\n onSelect={handleSelect}\n onPaste={handlePaste}\n onCopy={handleCopy}\n onCut={handleCut}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onInput={handleInput}\n onMouseDown={(e) => {\n handleMouseDown();\n rest.onMouseDown?.(e);\n }}\n onMouseUp={handleMouseUp}\n onScroll={syncOverlayScroll}\n />\n {showOverlay && (\n <MaskOverlay\n containerRef={overlayRef}\n typedValue={maskState.typedValue}\n displayValue={maskState.displayValue}\n selectionStart={selectionRange.start}\n selectionEnd={selectionRange.end}\n disabled={disabled}\n textAlign={rest.style?.textAlign}\n colored={colored}\n />\n )}\n </>\n );\n },\n);\n"]}
@@ -5,7 +5,7 @@ export type MaskedSelectionIntent = 'caret-end' | 'select-all' | null;
5
5
  /**
6
6
  * Пропсы headless-слоя {@link MaskedCore}: прозрачный `<input>` + overlay маски.
7
7
  */
8
- export interface MaskedCoreProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'value' | 'onChange' | 'defaultValue'> {
8
+ export interface MaskedCoreProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'value' | 'defaultValue'> {
9
9
  /** Вычисленное состояние маски для отображения. */
10
10
  maskState: MaskState;
11
11
  /** Карта слотов для clipboard/delete/navigation. */
@@ -18,8 +18,9 @@ export interface MaskedCoreProps extends Omit<React.InputHTMLAttributes<HTMLInpu
18
18
  currentRaw: string;
19
19
  /** Колбэк изменения raw от пользовательского ввода или paste. */
20
20
  onRawChange: (newRaw: string, source: 'input' | 'paste', cursorPos?: number) => void;
21
- /** Колбэк отклонённого ввода (невалидный символ или граничное удаление). */
22
- onUnexpectedInput: () => void;
21
+ /** Колбэк отклонённого ввода (невалидный символ или граничное удаление).
22
+ * `blinkOnly` — только мигнуть рамкой, не сообщая наружу (удаление в пустом поле). */
23
+ onUnexpectedInput: (blinkOnly?: boolean) => void;
23
24
  onUndo?: () => void;
24
25
  onRedo?: () => void;
25
26
  /** Ref на нативный `<input>` внутри MaskedCore. */
@@ -1 +1 @@
1
- {"version":3,"file":"MaskedCore.types.js","sourceRoot":"","sources":["MaskedCore.types.ts"],"names":[],"mappings":"","sourcesContent":["import type React from 'react';\n\nimport type { InputElement } from '../../Input/Input.typings.js';\nimport type { MaskEngine, MaskState, SlotMap } from './types.js';\n\nexport type MaskedSelectionIntent = 'caret-end' | 'select-all' | null;\n\n/**\n * Пропсы headless-слоя {@link MaskedCore}: прозрачный `<input>` + overlay маски.\n */\nexport interface MaskedCoreProps extends Omit<\n React.InputHTMLAttributes<HTMLInputElement>,\n 'value' | 'onChange' | 'defaultValue'\n> {\n /** Вычисленное состояние маски для отображения. */\n maskState: MaskState;\n /** Карта слотов для clipboard/delete/navigation. */\n slotMap: SlotMap;\n /** Headless IMask-движок. */\n engine: MaskEngine;\n /** Поле в фокусе — влияет на lazy-режим displayValue. */\n focused: boolean;\n /** Текущее raw-значение (источник истины). */\n currentRaw: string;\n /** Колбэк изменения raw от пользовательского ввода или paste. */\n onRawChange: (newRaw: string, source: 'input' | 'paste', cursorPos?: number) => void;\n /** Колбэк отклонённого ввода (невалидный символ или граничное удаление). */\n onUnexpectedInput: () => void;\n onUndo?: () => void;\n onRedo?: () => void;\n /** Ref на нативный `<input>` внутри MaskedCore. */\n coreInputRef: React.RefObject<HTMLInputElement | null>;\n /** Раскрашивать ли символы маски в overlay. @default true */\n colored?: boolean;\n /** Не сбрасывать каретку на mouseup — нужно для selectAllOnFocus. */\n selectAllOnFocus?: boolean;\n /** Намерение выставить каретку или выделение после актуализации maskState. */\n selectionIntent?: MaskedSelectionIntent;\n /** Запрашивает новое намерение выставить каретку или выделение. */\n onSelectionIntentChange?: (intent: MaskedSelectionIntent) => void;\n}\n\n/** Ref, который MaskedCore пробрасывает наружу для совместимости с Input.refInput. */\nexport type MaskedCoreRef = InputElement | null;\n"]}
1
+ {"version":3,"file":"MaskedCore.types.js","sourceRoot":"","sources":["MaskedCore.types.ts"],"names":[],"mappings":"","sourcesContent":["import type React from 'react';\n\nimport type { InputElement } from '../../Input/Input.typings.js';\nimport type { MaskEngine, MaskState, SlotMap } from './types.js';\n\nexport type MaskedSelectionIntent = 'caret-end' | 'select-all' | null;\n\n/**\n * Пропсы headless-слоя {@link MaskedCore}: прозрачный `<input>` + overlay маски.\n */\nexport interface MaskedCoreProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'value' | 'defaultValue'> {\n /** Вычисленное состояние маски для отображения. */\n maskState: MaskState;\n /** Карта слотов для clipboard/delete/navigation. */\n slotMap: SlotMap;\n /** Headless IMask-движок. */\n engine: MaskEngine;\n /** Поле в фокусе — влияет на lazy-режим displayValue. */\n focused: boolean;\n /** Текущее raw-значение (источник истины). */\n currentRaw: string;\n /** Колбэк изменения raw от пользовательского ввода или paste. */\n onRawChange: (newRaw: string, source: 'input' | 'paste', cursorPos?: number) => void;\n /** Колбэк отклонённого ввода (невалидный символ или граничное удаление).\n * `blinkOnly` — только мигнуть рамкой, не сообщая наружу (удаление в пустом поле). */\n onUnexpectedInput: (blinkOnly?: boolean) => void;\n onUndo?: () => void;\n onRedo?: () => void;\n /** Ref на нативный `<input>` внутри MaskedCore. */\n coreInputRef: React.RefObject<HTMLInputElement | null>;\n /** Раскрашивать ли символы маски в overlay. @default true */\n colored?: boolean;\n /** Не сбрасывать каретку на mouseup — нужно для selectAllOnFocus. */\n selectAllOnFocus?: boolean;\n /** Намерение выставить каретку или выделение после актуализации maskState. */\n selectionIntent?: MaskedSelectionIntent;\n /** Запрашивает новое намерение выставить каретку или выделение. */\n onSelectionIntentChange?: (intent: MaskedSelectionIntent) => void;\n}\n\n/** Ref, который MaskedCore пробрасывает наружу для совместимости с Input.refInput. */\nexport type MaskedCoreRef = InputElement | null;\n"]}
@@ -184,7 +184,8 @@ export function useMaskedCoreHandlers(props) {
184
184
  slotMap: slotMap,
185
185
  });
186
186
  if (!result) {
187
- onUnexpectedInput();
187
+ // Удаление в пустом поле пользователь ошибкой не считает — как в Input, только мигаем рамкой.
188
+ onUnexpectedInput(currentRaw === '');
188
189
  return;
189
190
  }
190
191
  pendingCursorRef.current = result.cursorPos;
@@ -1 +1 @@
1
- {"version":3,"file":"useMaskedCoreHandlers.js","sourceRoot":"","sources":["useMaskedCoreHandlers.ts"],"names":[],"mappings":"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","sourcesContent":["import type React from 'react';\nimport { useCallback, useRef, useState } from 'react';\n\nimport {\n isKeyArrow,\n isKeyBackspace,\n isKeyDelete,\n isKeyEnd,\n isKeyHome,\n isShortcutRedo,\n isShortcutSelectAll,\n isShortcutUndo,\n} from '../../../lib/events/keyboard/identifiers.js';\nimport { scrollInputCaretIntoView } from '../../../lib/scrollInputCaretIntoView.js';\nimport { ActionDetails } from '../react-imask/imask/core/action-details.js';\nimport { extractRaw } from './extractRaw.js';\nimport type { MaskedCoreProps, MaskedSelectionIntent } from './MaskedCore.types.js';\nimport { computeMaskedCut, getMaskedCopyText } from './maskedCoreClipboard.js';\nimport { computeMaskedDeletion } from './maskedCoreDeletion.js';\nimport { applyMaskedInputChange } from './maskedCoreInputChange.js';\nimport { calcNavigationSelection } from './maskedCoreNavigation.js';\nimport { setMaskInputSelectionRange } from './setMaskInputSelectionRange.js';\n\ntype MaskedCoreHandlerProps = Pick<\n MaskedCoreProps,\n | 'maskState'\n | 'slotMap'\n | 'engine'\n | 'currentRaw'\n | 'onRawChange'\n | 'onUnexpectedInput'\n | 'onUndo'\n | 'onRedo'\n | 'coreInputRef'\n | 'onKeyDown'\n | 'onMouseUp'\n | 'onInput'\n | 'onSelect'\n | 'onFocus'\n | 'onBlur'\n | 'onPaste'\n | 'selectAllOnFocus'\n> & {\n syncOverlayScroll: () => void;\n requestSelectionIntent: (intent: MaskedSelectionIntent) => void;\n};\n\n/**\n * Собирает обработчики DOM-событий для {@link MaskedCore}.\n * Инкапсулирует логику ввода, навигации, clipboard и undo/redo.\n *\n * @param props — состояние маски, движок и колбэки от MaskedInputV2.\n * @returns refs и обработчики для прямого `<input>`.\n */\nexport function useMaskedCoreHandlers(props: MaskedCoreHandlerProps) {\n const {\n maskState,\n slotMap,\n engine,\n currentRaw,\n onRawChange,\n onUnexpectedInput,\n onUndo,\n onRedo,\n coreInputRef,\n onKeyDown: inputOnKeyDown,\n onMouseUp: inputOnMouseUp,\n onInput: inputOnInput,\n onSelect: inputOnSelect,\n onFocus: inputOnFocus,\n onBlur: inputOnBlur,\n onPaste: inputOnPaste,\n selectAllOnFocus,\n syncOverlayScroll,\n requestSelectionIntent,\n } = props;\n\n const pendingCursorRef = useRef<number | null>(null);\n const resetCaretOnMouseUpRef = useRef(false);\n const pointerFocusRef = useRef(false);\n /** Блокирует нативный change/input после нашего paste (beforeinput/input race в браузере). */\n const ignoreChangeFromPasteRef = useRef(false);\n const lastSelectionRef = useRef<{ start: number; end: number }>({ start: 0, end: 0 });\n const [selectionRange, setSelectionRange] = useState({ start: 0, end: 0 });\n\n const syncSelection = useCallback((el: HTMLInputElement) => {\n const start = el.selectionStart ?? 0;\n const end = el.selectionEnd ?? 0;\n lastSelectionRef.current = { start, end };\n setSelectionRange((prev) => (prev.start === start && prev.end === end ? prev : { start, end }));\n }, []);\n\n function getFocusedInputCaretPos() {\n return engine.compute(currentRaw, true).typedLength;\n }\n\n function scrollCaretIntoView(el: HTMLInputElement) {\n scrollInputCaretIntoView(el);\n syncOverlayScroll();\n }\n\n function resetCaretToInputStart(el: HTMLInputElement) {\n const pos = getFocusedInputCaretPos();\n pendingCursorRef.current = pos;\n setMaskInputSelectionRange(el, pos);\n scrollCaretIntoView(el);\n syncSelection(el);\n }\n\n function setPendingCursor(pos: number) {\n requestSelectionIntent(null);\n pendingCursorRef.current = pos;\n setMaskInputSelectionRange(coreInputRef.current, pos);\n }\n\n function handleChange(e: React.ChangeEvent<HTMLInputElement>) {\n if (ignoreChangeFromPasteRef.current) {\n return;\n }\n\n requestSelectionIntent(null);\n resetCaretOnMouseUpRef.current = false;\n\n const browserDraft = e.target.value;\n const cursorPos = e.target.selectionStart ?? 0;\n const oldSelection = lastSelectionRef.current;\n const inputType = (e.nativeEvent as InputEvent).inputType;\n const details = new ActionDetails({\n value: browserDraft,\n cursorPos,\n oldValue: maskState.typedValue,\n oldSelection: { ...oldSelection },\n });\n\n // Autofill / insertReplacementText / drop: нет clipboard paste-события,\n // но нужна та же нормализация, что и у onBeforePasteValue.\n // Всегда replace-all: повторный change (Яндекс.Браузер и др.) иначе вставляет\n // в позицию курсора поверх уже нормализованного raw → порча значения.\n const isBulkInsert = details.inserted.length > 1 || inputType === 'insertReplacementText';\n if (isBulkInsert) {\n ignoreChangeFromPasteRef.current = true;\n setTimeout(() => {\n ignoreChangeFromPasteRef.current = false;\n }, 0);\n\n if (coreInputRef.current) {\n setMaskInputSelectionRange(coreInputRef.current, 0, maskState.typedLength);\n lastSelectionRef.current = { start: 0, end: maskState.typedLength };\n }\n onRawChange(browserDraft, 'paste');\n return;\n }\n\n const result = applyMaskedInputChange({\n browserDraft,\n cursorPos,\n typedValue: maskState.typedValue,\n currentRaw,\n oldSelection,\n engine,\n });\n\n setPendingCursor(result.cursorPos);\n\n if (result.rejected) {\n onUnexpectedInput();\n return;\n }\n\n onRawChange(result.newRaw, 'input', result.cursorPos);\n }\n\n function handleKeyDown(e: React.KeyboardEvent<HTMLInputElement>) {\n requestSelectionIntent(null);\n resetCaretOnMouseUpRef.current = false;\n\n const el = coreInputRef.current;\n\n if (isShortcutSelectAll(e) || isKeyArrow(e) || isKeyEnd(e) || isKeyHome(e) || isKeyBackspace(e) || isKeyDelete(e)) {\n pendingCursorRef.current = null;\n }\n\n if (isShortcutSelectAll(e)) {\n e.preventDefault();\n setMaskInputSelectionRange(el, 0, maskState.typedLength);\n if (el) {\n scrollCaretIntoView(el);\n syncSelection(el);\n }\n } else if (isKeyArrow(e) || isKeyEnd(e) || isKeyHome(e)) {\n e.preventDefault();\n const [start, end, dir] = calcNavigationSelection(e, maskState.typedLength, el);\n setMaskInputSelectionRange(el, start, end, dir);\n if (el) {\n scrollCaretIntoView(el);\n syncSelection(el);\n }\n } else if (isKeyBackspace(e) || isKeyDelete(e)) {\n e.preventDefault();\n if (el) {\n // Cmd/Ctrl+Backspace — удалить до начала строки; Cmd/Ctrl+Delete — до конца.\n if (e.metaKey || e.ctrlKey) {\n handleLineDeletion(isKeyBackspace(e), el);\n } else {\n handleDeletion(isKeyBackspace(e), el);\n }\n }\n } else if (isShortcutUndo(e)) {\n e.preventDefault();\n onUndo?.();\n } else if (isShortcutRedo(e)) {\n e.preventDefault();\n onRedo?.();\n }\n\n inputOnKeyDown?.(e);\n }\n\n function handleDeletion(isBackspace: boolean, el: HTMLInputElement) {\n applyDeletion(isBackspace, el.selectionStart ?? 0, el.selectionEnd ?? 0);\n }\n\n function handleLineDeletion(isBackspace: boolean, el: HTMLInputElement) {\n const selStart = el.selectionStart ?? 0;\n const selEnd = el.selectionEnd ?? 0;\n\n if (selStart !== selEnd) {\n applyDeletion(isBackspace, selStart, selEnd);\n return;\n }\n\n const start = isBackspace ? 0 : selStart;\n const end = isBackspace ? selStart : maskState.typedLength;\n if (start === end) {\n return;\n }\n\n applyDeletion(isBackspace, start, end);\n }\n\n function applyDeletion(isBackspace: boolean, selStart: number, selEnd: number) {\n const result = computeMaskedDeletion({\n isBackspace,\n selStart,\n selEnd,\n currentRaw,\n slotMap,\n });\n\n if (!result) {\n onUnexpectedInput();\n return;\n }\n\n pendingCursorRef.current = result.cursorPos;\n onRawChange(result.newRaw, 'input', result.cursorPos);\n }\n\n function handleSelect(e?: React.SyntheticEvent<HTMLInputElement>) {\n const el = coreInputRef.current;\n if (!el) {\n return;\n }\n\n const max = maskState.typedLength;\n const start = el.selectionStart ?? 0;\n const end = el.selectionEnd ?? 0;\n lastSelectionRef.current = { start, end };\n\n if (end > max) {\n setMaskInputSelectionRange(el, Math.min(start, max), max, el.selectionDirection ?? 'none');\n }\n\n syncSelection(el);\n syncOverlayScroll();\n\n if (e) {\n inputOnSelect?.(e);\n }\n }\n\n function handlePaste(e: React.ClipboardEvent<HTMLInputElement>) {\n inputOnPaste?.(e);\n e.preventDefault();\n\n if (!e.clipboardData) {\n return;\n }\n\n // Игнорируем последующий input/change от браузера (beforeinput insertFromPaste и т.п.),\n // иначе controlled value перетирается ненормализованным черновиком.\n ignoreChangeFromPasteRef.current = true;\n setTimeout(() => {\n ignoreChangeFromPasteRef.current = false;\n }, 0);\n\n onRawChange(e.clipboardData.getData('text/plain'), 'paste');\n }\n\n function handleBeforeInput(e: React.FormEvent<HTMLInputElement>) {\n const nativeEvent = e.nativeEvent as InputEvent;\n if (nativeEvent.inputType === 'insertFromPaste') {\n e.preventDefault();\n ignoreChangeFromPasteRef.current = true;\n setTimeout(() => {\n ignoreChangeFromPasteRef.current = false;\n }, 0);\n }\n }\n\n function handleCopy(e: React.ClipboardEvent<HTMLInputElement>) {\n const el = coreInputRef.current;\n if (!el) {\n return;\n }\n\n const start = el.selectionStart ?? 0;\n const end = el.selectionEnd ?? 0;\n e.clipboardData.setData('text/plain', getMaskedCopyText(maskState.displayValue, start, end));\n e.preventDefault();\n }\n\n function handleCut(e: React.ClipboardEvent<HTMLInputElement>) {\n handleCopy(e);\n\n const el = coreInputRef.current;\n if (!el) {\n return;\n }\n\n const start = el.selectionStart ?? 0;\n const end = el.selectionEnd ?? 0;\n const { newRaw, cursorPos } = computeMaskedCut(start, end, currentRaw, slotMap);\n\n pendingCursorRef.current = cursorPos;\n onRawChange(newRaw, 'input', cursorPos);\n }\n\n function handleInput(e: React.ChangeEvent<HTMLInputElement>) {\n inputOnInput?.(e);\n }\n\n function handleMouseDown() {\n requestSelectionIntent(null);\n pointerFocusRef.current = true;\n }\n\n function handleMouseUp(e: React.MouseEvent<HTMLInputElement>) {\n const el = e.currentTarget;\n\n if (resetCaretOnMouseUpRef.current && !selectAllOnFocus) {\n resetCaretOnMouseUpRef.current = false;\n resetCaretToInputStart(el);\n } else {\n resetCaretOnMouseUpRef.current = false;\n handleSelect();\n }\n\n inputOnMouseUp?.(e);\n }\n\n function handleFocus(e: React.FocusEvent<HTMLInputElement>) {\n const domValue = e.currentTarget.value;\n if (domValue !== maskState.typedValue) {\n const syncedRaw = extractRaw(domValue, engine);\n if (syncedRaw !== currentRaw) {\n onRawChange(syncedRaw, 'input');\n }\n }\n\n if (selectAllOnFocus) {\n requestSelectionIntent('select-all');\n pointerFocusRef.current = false;\n resetCaretOnMouseUpRef.current = false;\n } else if (pointerFocusRef.current) {\n resetCaretOnMouseUpRef.current = currentRaw.length === 0;\n pointerFocusRef.current = false;\n requestSelectionIntent(null);\n } else {\n // Tab / programmatic focus() (в т.ч. ref.focus()): после актуализации\n // maskState каретка должна оказаться после typed / leading fixed.\n requestSelectionIntent('caret-end');\n pendingCursorRef.current = null;\n }\n\n inputOnFocus?.(e);\n syncSelection(e.currentTarget);\n }\n\n function handleBlur(e: React.FocusEvent<HTMLInputElement>) {\n const pos = e.currentTarget.selectionStart ?? lastSelectionRef.current.start;\n const collapsed = { start: pos, end: pos };\n\n lastSelectionRef.current = collapsed;\n setSelectionRange(collapsed);\n pointerFocusRef.current = false;\n resetCaretOnMouseUpRef.current = false;\n requestSelectionIntent(null);\n\n inputOnBlur?.(e);\n }\n\n return {\n pendingCursorRef,\n selectionRange,\n syncSelection,\n handleChange,\n handleKeyDown,\n handleSelect,\n handlePaste,\n handleBeforeInput,\n handleCopy,\n handleCut,\n handleInput,\n handleMouseDown,\n handleMouseUp,\n handleFocus,\n handleBlur,\n };\n}\n"]}
1
+ {"version":3,"file":"useMaskedCoreHandlers.js","sourceRoot":"","sources":["useMaskedCoreHandlers.ts"],"names":[],"mappings":"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","sourcesContent":["import type React from 'react';\nimport { useCallback, useRef, useState } from 'react';\n\nimport {\n isKeyArrow,\n isKeyBackspace,\n isKeyDelete,\n isKeyEnd,\n isKeyHome,\n isShortcutRedo,\n isShortcutSelectAll,\n isShortcutUndo,\n} from '../../../lib/events/keyboard/identifiers.js';\nimport { scrollInputCaretIntoView } from '../../../lib/scrollInputCaretIntoView.js';\nimport { ActionDetails } from '../react-imask/imask/core/action-details.js';\nimport { extractRaw } from './extractRaw.js';\nimport type { MaskedCoreProps, MaskedSelectionIntent } from './MaskedCore.types.js';\nimport { computeMaskedCut, getMaskedCopyText } from './maskedCoreClipboard.js';\nimport { computeMaskedDeletion } from './maskedCoreDeletion.js';\nimport { applyMaskedInputChange } from './maskedCoreInputChange.js';\nimport { calcNavigationSelection } from './maskedCoreNavigation.js';\nimport { setMaskInputSelectionRange } from './setMaskInputSelectionRange.js';\n\ntype MaskedCoreHandlerProps = Pick<\n MaskedCoreProps,\n | 'maskState'\n | 'slotMap'\n | 'engine'\n | 'currentRaw'\n | 'onRawChange'\n | 'onUnexpectedInput'\n | 'onUndo'\n | 'onRedo'\n | 'coreInputRef'\n | 'onKeyDown'\n | 'onMouseUp'\n | 'onInput'\n | 'onSelect'\n | 'onFocus'\n | 'onBlur'\n | 'onPaste'\n | 'selectAllOnFocus'\n> & {\n syncOverlayScroll: () => void;\n requestSelectionIntent: (intent: MaskedSelectionIntent) => void;\n};\n\n/**\n * Собирает обработчики DOM-событий для {@link MaskedCore}.\n * Инкапсулирует логику ввода, навигации, clipboard и undo/redo.\n *\n * @param props — состояние маски, движок и колбэки от MaskedInputV2.\n * @returns refs и обработчики для прямого `<input>`.\n */\nexport function useMaskedCoreHandlers(props: MaskedCoreHandlerProps) {\n const {\n maskState,\n slotMap,\n engine,\n currentRaw,\n onRawChange,\n onUnexpectedInput,\n onUndo,\n onRedo,\n coreInputRef,\n onKeyDown: inputOnKeyDown,\n onMouseUp: inputOnMouseUp,\n onInput: inputOnInput,\n onSelect: inputOnSelect,\n onFocus: inputOnFocus,\n onBlur: inputOnBlur,\n onPaste: inputOnPaste,\n selectAllOnFocus,\n syncOverlayScroll,\n requestSelectionIntent,\n } = props;\n\n const pendingCursorRef = useRef<number | null>(null);\n const resetCaretOnMouseUpRef = useRef(false);\n const pointerFocusRef = useRef(false);\n /** Блокирует нативный change/input после нашего paste (beforeinput/input race в браузере). */\n const ignoreChangeFromPasteRef = useRef(false);\n const lastSelectionRef = useRef<{ start: number; end: number }>({ start: 0, end: 0 });\n const [selectionRange, setSelectionRange] = useState({ start: 0, end: 0 });\n\n const syncSelection = useCallback((el: HTMLInputElement) => {\n const start = el.selectionStart ?? 0;\n const end = el.selectionEnd ?? 0;\n lastSelectionRef.current = { start, end };\n setSelectionRange((prev) => (prev.start === start && prev.end === end ? prev : { start, end }));\n }, []);\n\n function getFocusedInputCaretPos() {\n return engine.compute(currentRaw, true).typedLength;\n }\n\n function scrollCaretIntoView(el: HTMLInputElement) {\n scrollInputCaretIntoView(el);\n syncOverlayScroll();\n }\n\n function resetCaretToInputStart(el: HTMLInputElement) {\n const pos = getFocusedInputCaretPos();\n pendingCursorRef.current = pos;\n setMaskInputSelectionRange(el, pos);\n scrollCaretIntoView(el);\n syncSelection(el);\n }\n\n function setPendingCursor(pos: number) {\n requestSelectionIntent(null);\n pendingCursorRef.current = pos;\n setMaskInputSelectionRange(coreInputRef.current, pos);\n }\n\n function handleChange(e: React.ChangeEvent<HTMLInputElement>) {\n if (ignoreChangeFromPasteRef.current) {\n return;\n }\n\n requestSelectionIntent(null);\n resetCaretOnMouseUpRef.current = false;\n\n const browserDraft = e.target.value;\n const cursorPos = e.target.selectionStart ?? 0;\n const oldSelection = lastSelectionRef.current;\n const inputType = (e.nativeEvent as InputEvent).inputType;\n const details = new ActionDetails({\n value: browserDraft,\n cursorPos,\n oldValue: maskState.typedValue,\n oldSelection: { ...oldSelection },\n });\n\n // Autofill / insertReplacementText / drop: нет clipboard paste-события,\n // но нужна та же нормализация, что и у onBeforePasteValue.\n // Всегда replace-all: повторный change (Яндекс.Браузер и др.) иначе вставляет\n // в позицию курсора поверх уже нормализованного raw → порча значения.\n const isBulkInsert = details.inserted.length > 1 || inputType === 'insertReplacementText';\n if (isBulkInsert) {\n ignoreChangeFromPasteRef.current = true;\n setTimeout(() => {\n ignoreChangeFromPasteRef.current = false;\n }, 0);\n\n if (coreInputRef.current) {\n setMaskInputSelectionRange(coreInputRef.current, 0, maskState.typedLength);\n lastSelectionRef.current = { start: 0, end: maskState.typedLength };\n }\n onRawChange(browserDraft, 'paste');\n return;\n }\n\n const result = applyMaskedInputChange({\n browserDraft,\n cursorPos,\n typedValue: maskState.typedValue,\n currentRaw,\n oldSelection,\n engine,\n });\n\n setPendingCursor(result.cursorPos);\n\n if (result.rejected) {\n onUnexpectedInput();\n return;\n }\n\n onRawChange(result.newRaw, 'input', result.cursorPos);\n }\n\n function handleKeyDown(e: React.KeyboardEvent<HTMLInputElement>) {\n requestSelectionIntent(null);\n resetCaretOnMouseUpRef.current = false;\n\n const el = coreInputRef.current;\n\n if (isShortcutSelectAll(e) || isKeyArrow(e) || isKeyEnd(e) || isKeyHome(e) || isKeyBackspace(e) || isKeyDelete(e)) {\n pendingCursorRef.current = null;\n }\n\n if (isShortcutSelectAll(e)) {\n e.preventDefault();\n setMaskInputSelectionRange(el, 0, maskState.typedLength);\n if (el) {\n scrollCaretIntoView(el);\n syncSelection(el);\n }\n } else if (isKeyArrow(e) || isKeyEnd(e) || isKeyHome(e)) {\n e.preventDefault();\n const [start, end, dir] = calcNavigationSelection(e, maskState.typedLength, el);\n setMaskInputSelectionRange(el, start, end, dir);\n if (el) {\n scrollCaretIntoView(el);\n syncSelection(el);\n }\n } else if (isKeyBackspace(e) || isKeyDelete(e)) {\n e.preventDefault();\n if (el) {\n // Cmd/Ctrl+Backspace — удалить до начала строки; Cmd/Ctrl+Delete — до конца.\n if (e.metaKey || e.ctrlKey) {\n handleLineDeletion(isKeyBackspace(e), el);\n } else {\n handleDeletion(isKeyBackspace(e), el);\n }\n }\n } else if (isShortcutUndo(e)) {\n e.preventDefault();\n onUndo?.();\n } else if (isShortcutRedo(e)) {\n e.preventDefault();\n onRedo?.();\n }\n\n inputOnKeyDown?.(e);\n }\n\n function handleDeletion(isBackspace: boolean, el: HTMLInputElement) {\n applyDeletion(isBackspace, el.selectionStart ?? 0, el.selectionEnd ?? 0);\n }\n\n function handleLineDeletion(isBackspace: boolean, el: HTMLInputElement) {\n const selStart = el.selectionStart ?? 0;\n const selEnd = el.selectionEnd ?? 0;\n\n if (selStart !== selEnd) {\n applyDeletion(isBackspace, selStart, selEnd);\n return;\n }\n\n const start = isBackspace ? 0 : selStart;\n const end = isBackspace ? selStart : maskState.typedLength;\n if (start === end) {\n return;\n }\n\n applyDeletion(isBackspace, start, end);\n }\n\n function applyDeletion(isBackspace: boolean, selStart: number, selEnd: number) {\n const result = computeMaskedDeletion({\n isBackspace,\n selStart,\n selEnd,\n currentRaw,\n slotMap,\n });\n\n if (!result) {\n // Удаление в пустом поле пользователь ошибкой не считает — как в Input, только мигаем рамкой.\n onUnexpectedInput(currentRaw === '');\n return;\n }\n\n pendingCursorRef.current = result.cursorPos;\n onRawChange(result.newRaw, 'input', result.cursorPos);\n }\n\n function handleSelect(e?: React.SyntheticEvent<HTMLInputElement>) {\n const el = coreInputRef.current;\n if (!el) {\n return;\n }\n\n const max = maskState.typedLength;\n const start = el.selectionStart ?? 0;\n const end = el.selectionEnd ?? 0;\n lastSelectionRef.current = { start, end };\n\n if (end > max) {\n setMaskInputSelectionRange(el, Math.min(start, max), max, el.selectionDirection ?? 'none');\n }\n\n syncSelection(el);\n syncOverlayScroll();\n\n if (e) {\n inputOnSelect?.(e);\n }\n }\n\n function handlePaste(e: React.ClipboardEvent<HTMLInputElement>) {\n inputOnPaste?.(e);\n e.preventDefault();\n\n if (!e.clipboardData) {\n return;\n }\n\n // Игнорируем последующий input/change от браузера (beforeinput insertFromPaste и т.п.),\n // иначе controlled value перетирается ненормализованным черновиком.\n ignoreChangeFromPasteRef.current = true;\n setTimeout(() => {\n ignoreChangeFromPasteRef.current = false;\n }, 0);\n\n onRawChange(e.clipboardData.getData('text/plain'), 'paste');\n }\n\n function handleBeforeInput(e: React.FormEvent<HTMLInputElement>) {\n const nativeEvent = e.nativeEvent as InputEvent;\n if (nativeEvent.inputType === 'insertFromPaste') {\n e.preventDefault();\n ignoreChangeFromPasteRef.current = true;\n setTimeout(() => {\n ignoreChangeFromPasteRef.current = false;\n }, 0);\n }\n }\n\n function handleCopy(e: React.ClipboardEvent<HTMLInputElement>) {\n const el = coreInputRef.current;\n if (!el) {\n return;\n }\n\n const start = el.selectionStart ?? 0;\n const end = el.selectionEnd ?? 0;\n e.clipboardData.setData('text/plain', getMaskedCopyText(maskState.displayValue, start, end));\n e.preventDefault();\n }\n\n function handleCut(e: React.ClipboardEvent<HTMLInputElement>) {\n handleCopy(e);\n\n const el = coreInputRef.current;\n if (!el) {\n return;\n }\n\n const start = el.selectionStart ?? 0;\n const end = el.selectionEnd ?? 0;\n const { newRaw, cursorPos } = computeMaskedCut(start, end, currentRaw, slotMap);\n\n pendingCursorRef.current = cursorPos;\n onRawChange(newRaw, 'input', cursorPos);\n }\n\n function handleInput(e: React.ChangeEvent<HTMLInputElement>) {\n inputOnInput?.(e);\n }\n\n function handleMouseDown() {\n requestSelectionIntent(null);\n pointerFocusRef.current = true;\n }\n\n function handleMouseUp(e: React.MouseEvent<HTMLInputElement>) {\n const el = e.currentTarget;\n\n if (resetCaretOnMouseUpRef.current && !selectAllOnFocus) {\n resetCaretOnMouseUpRef.current = false;\n resetCaretToInputStart(el);\n } else {\n resetCaretOnMouseUpRef.current = false;\n handleSelect();\n }\n\n inputOnMouseUp?.(e);\n }\n\n function handleFocus(e: React.FocusEvent<HTMLInputElement>) {\n const domValue = e.currentTarget.value;\n if (domValue !== maskState.typedValue) {\n const syncedRaw = extractRaw(domValue, engine);\n if (syncedRaw !== currentRaw) {\n onRawChange(syncedRaw, 'input');\n }\n }\n\n if (selectAllOnFocus) {\n requestSelectionIntent('select-all');\n pointerFocusRef.current = false;\n resetCaretOnMouseUpRef.current = false;\n } else if (pointerFocusRef.current) {\n resetCaretOnMouseUpRef.current = currentRaw.length === 0;\n pointerFocusRef.current = false;\n requestSelectionIntent(null);\n } else {\n // Tab / programmatic focus() (в т.ч. ref.focus()): после актуализации\n // maskState каретка должна оказаться после typed / leading fixed.\n requestSelectionIntent('caret-end');\n pendingCursorRef.current = null;\n }\n\n inputOnFocus?.(e);\n syncSelection(e.currentTarget);\n }\n\n function handleBlur(e: React.FocusEvent<HTMLInputElement>) {\n const pos = e.currentTarget.selectionStart ?? lastSelectionRef.current.start;\n const collapsed = { start: pos, end: pos };\n\n lastSelectionRef.current = collapsed;\n setSelectionRange(collapsed);\n pointerFocusRef.current = false;\n resetCaretOnMouseUpRef.current = false;\n requestSelectionIntent(null);\n\n inputOnBlur?.(e);\n }\n\n return {\n pendingCursorRef,\n selectionRange,\n syncSelection,\n handleChange,\n handleKeyDown,\n handleSelect,\n handlePaste,\n handleBeforeInput,\n handleCopy,\n handleCut,\n handleInput,\n handleMouseDown,\n handleMouseUp,\n handleFocus,\n handleBlur,\n };\n}\n"]}