@skbkontur/react-ui 6.1.4-6d143.0 → 6.1.4-c0aae.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/components/MaskedInput/MaskedInput.d.ts +1 -1
- package/components/MaskedInput/MaskedInput.js +3 -3
- package/components/MaskedInput/MaskedInput.js.map +1 -1
- package/components/MaskedInputV2/MaskedInputV2.d.ts +1 -1
- package/components/MaskedInputV2/MaskedInputV2.js +2 -2
- package/components/MaskedInputV2/MaskedInputV2.js.map +1 -1
- package/components/MaskedInputV2/internal/showOverlay.js +3 -1
- package/components/MaskedInputV2/internal/showOverlay.js.map +1 -1
- package/components/MaskedInputV2/internal/useInputOverflow.js +5 -1
- package/components/MaskedInputV2/internal/useInputOverflow.js.map +1 -1
- package/internal/themes/BasicTheme.d.ts +162 -0
- package/internal/themes/BasicTheme.js +162 -0
- package/internal/themes/BasicTheme.js.map +1 -1
- package/lib/featureFlagsContext/ReactUIFeatureFlagsContext.d.ts +1 -1
- package/lib/featureFlagsContext/ReactUIFeatureFlagsContext.js +1 -1
- package/lib/featureFlagsContext/ReactUIFeatureFlagsContext.js.map +1 -1
- package/package.json +1 -1
|
@@ -51,6 +51,6 @@ export interface MaskedInputProps extends MaskedProps, Omit<InputProps, 'showCle
|
|
|
51
51
|
}
|
|
52
52
|
/** Поле ввода, которое ограничивает формат вводимого значения по заданной маске. Такое поле облегчает пользователю ввод и снижает количество ошибок.
|
|
53
53
|
*
|
|
54
|
-
* Для исправленной реализации включите фичафлаг `
|
|
54
|
+
* Для исправленной реализации включите фичафлаг `maskedInputUseFixes` в {@link ReactUIFeatureFlagsContext}.
|
|
55
55
|
*/
|
|
56
56
|
export declare const MaskedInput: import("../../lib/forwardRefAndName.js").ReactUIComponentWithRef<Input, MaskedInputProps> & Record<never, never>;
|
|
@@ -30,11 +30,11 @@ export var getSafeMaskInputType = function (type) {
|
|
|
30
30
|
};
|
|
31
31
|
/** Поле ввода, которое ограничивает формат вводимого значения по заданной маске. Такое поле облегчает пользователю ввод и снижает количество ошибок.
|
|
32
32
|
*
|
|
33
|
-
* Для исправленной реализации включите фичафлаг `
|
|
33
|
+
* Для исправленной реализации включите фичафлаг `maskedInputUseFixes` в {@link ReactUIFeatureFlagsContext}.
|
|
34
34
|
*/
|
|
35
35
|
export var MaskedInput = forwardRefAndName('MaskedInput', function MaskedInput(props, ref) {
|
|
36
|
-
var
|
|
37
|
-
if (
|
|
36
|
+
var maskedInputUseFixes = useContext(ReactUIFeatureFlagsContext).maskedInputUseFixes;
|
|
37
|
+
if (maskedInputUseFixes) {
|
|
38
38
|
return React.createElement(MaskedInputV2, __assign({ ref: ref, __fromMaskedInputFacade: true }, props));
|
|
39
39
|
}
|
|
40
40
|
return React.createElement(MaskedInputLegacy, __assign({ ref: ref }, props));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MaskedInput.js","sourceRoot":"","sources":["MaskedInput.tsx"],"names":[],"mappings":";;;;;;;;;;;AACA,OAAO,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAG1C,OAAO,EAAE,0BAA0B,EAAE,MAAM,wCAAwC,CAAC;AACpF,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAEnE,OAAO,EAAE,aAAa,EAA2B,MAAM,2BAA2B,CAAC;AACnF,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AA0D3D,MAAM,CAAC,IAAM,oBAAoB,GAAG,UAAC,IAAgB;IACnD,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,IAAI,CAAC;IACd,CAAC;IAED,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,QAAQ,CAAC;QACd,KAAK,MAAM,CAAC;QACZ,KAAK,MAAM,CAAC;QACZ,KAAK,UAAU;YACb,OAAO,MAAM,CAAC;QAChB;YACE,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC,CAAC;AAYF;;;GAGG;AACH,MAAM,CAAC,IAAM,WAAW,GAAG,iBAAiB,CAC1C,aAAa,EACb,SAAS,WAAW,CAAC,KAAuB,EAAE,GAAsB;IAC1D,IAAA,mBAAmB,GAAK,UAAU,CAAC,0BAA0B,CAAC,oBAA3C,CAA4C;IAEvE,IAAI,mBAAmB,EAAE,CAAC;QACxB,OAAO,oBAAC,aAAa,aAAC,GAAG,EAAE,GAAG,EAAE,uBAAuB,UAAM,KAA4B,EAAI,CAAC;IAChG,CAAC;IAED,OAAO,oBAAC,iBAAiB,aAAC,GAAG,EAAE,GAAG,IAAM,KAAK,EAAI,CAAC;AACpD,CAAC,CACF,CAAC","sourcesContent":["import type { IMaskInputProps } from '@skbkontur/react-imask';\nimport React, { useContext } from 'react';\nimport type { Ref } from 'react';\n\nimport { ReactUIFeatureFlagsContext } from '../../lib/featureFlagsContext/index.js';\nimport { forwardRefAndName } from '../../lib/forwardRefAndName.js';\nimport type { Input, InputProps, InputType } from '../Input/index.js';\nimport { MaskedInputV2, type MaskedInputV2Props } from '../MaskedInputV2/index.js';\nimport { MaskedInputLegacy } from './MaskedInputLegacy.js';\n\nexport type MaskedInputOnBeforePasteValue = (value: string) => string;\n\nexport interface MaskedProps {\n /** Шаблон ввода, определяющий допустимые символы. */\n mask: string;\n\n /** Плейсхолдер, который отображается на месте ещё не введённых пользователем символов.\n * @default _ */\n maskChar?: string;\n\n /** Словарь правил для настройки маски, где:\n * ключ — символ для использования в маске;\n * значение — регулярка-правило.\n * @default { '9': '[0-9]', 'a': '[A-Za-z]', '*': '[A-Za-z0-9]' } */\n formatChars?: Record<string, string>;\n\n /** Всегда показывать символы маски, независимо от фокуса в поле.\n * @default false */\n alwaysShowMask?: boolean;\n\n /** Событие некорректного ввода.\n * Вторым аргументом передаётся метод вспыхивания рамки поля.\n *\n * Если обработчик не задан, то при событии рамка всегда вспыхивает.\n *\n * @param value значение поля\n * @param blink метод вспыхивания рамки поля\n */\n onUnexpectedInput?: (value: string, blink: () => void) => void;\n\n /**\n * Событие перед вставкой текста в поле.\n * Вызывается с аргументом value — текст из буфера.\n *\n * Обработчик должен вернуть текст — он попадёт в поле.\n *\n * @param value значение вставки.\n */\n onBeforePasteValue?: MaskedInputOnBeforePasteValue;\n\n /** Убирает из value символы маски, которые пользователь не вводил.\n * @default false */\n unmask?: boolean;\n\n /** Раскрашивает символы маски.\n * @default true\n * @ignore */\n colored?: boolean;\n\n /** Задает пропсы для компонента `IMaskInput`. Необходимы для юнит-тестов\n * @ignore */\n imaskProps?: IMaskInputProps<HTMLInputElement>;\n}\n\nexport type MaskInputType = Exclude<InputType, 'number' | 'date' | 'time' | 'password'>;\n\nexport const getSafeMaskInputType = (type?: InputType): MaskInputType | undefined => {\n if (!type) {\n return type;\n }\n\n switch (type) {\n case 'number':\n case 'date':\n case 'time':\n case 'password':\n return 'text';\n default:\n return type;\n }\n};\n\nexport interface MaskedInputProps\n extends\n MaskedProps,\n Omit<\n InputProps,\n 'showClearIcon' | 'mask' | 'maxLength' | 'type' | 'alwaysShowMask' | 'onUnexpectedInput' | 'maskChar'\n > {\n type?: MaskInputType;\n}\n\n/** Поле ввода, которое ограничивает формат вводимого значения по заданной маске. Такое поле облегчает пользователю ввод и снижает количество ошибок.\n *\n * Для исправленной реализации включите фичафлаг `
|
|
1
|
+
{"version":3,"file":"MaskedInput.js","sourceRoot":"","sources":["MaskedInput.tsx"],"names":[],"mappings":";;;;;;;;;;;AACA,OAAO,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAG1C,OAAO,EAAE,0BAA0B,EAAE,MAAM,wCAAwC,CAAC;AACpF,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAEnE,OAAO,EAAE,aAAa,EAA2B,MAAM,2BAA2B,CAAC;AACnF,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AA0D3D,MAAM,CAAC,IAAM,oBAAoB,GAAG,UAAC,IAAgB;IACnD,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,IAAI,CAAC;IACd,CAAC;IAED,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,QAAQ,CAAC;QACd,KAAK,MAAM,CAAC;QACZ,KAAK,MAAM,CAAC;QACZ,KAAK,UAAU;YACb,OAAO,MAAM,CAAC;QAChB;YACE,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC,CAAC;AAYF;;;GAGG;AACH,MAAM,CAAC,IAAM,WAAW,GAAG,iBAAiB,CAC1C,aAAa,EACb,SAAS,WAAW,CAAC,KAAuB,EAAE,GAAsB;IAC1D,IAAA,mBAAmB,GAAK,UAAU,CAAC,0BAA0B,CAAC,oBAA3C,CAA4C;IAEvE,IAAI,mBAAmB,EAAE,CAAC;QACxB,OAAO,oBAAC,aAAa,aAAC,GAAG,EAAE,GAAG,EAAE,uBAAuB,UAAM,KAA4B,EAAI,CAAC;IAChG,CAAC;IAED,OAAO,oBAAC,iBAAiB,aAAC,GAAG,EAAE,GAAG,IAAM,KAAK,EAAI,CAAC;AACpD,CAAC,CACF,CAAC","sourcesContent":["import type { IMaskInputProps } from '@skbkontur/react-imask';\nimport React, { useContext } from 'react';\nimport type { Ref } from 'react';\n\nimport { ReactUIFeatureFlagsContext } from '../../lib/featureFlagsContext/index.js';\nimport { forwardRefAndName } from '../../lib/forwardRefAndName.js';\nimport type { Input, InputProps, InputType } from '../Input/index.js';\nimport { MaskedInputV2, type MaskedInputV2Props } from '../MaskedInputV2/index.js';\nimport { MaskedInputLegacy } from './MaskedInputLegacy.js';\n\nexport type MaskedInputOnBeforePasteValue = (value: string) => string;\n\nexport interface MaskedProps {\n /** Шаблон ввода, определяющий допустимые символы. */\n mask: string;\n\n /** Плейсхолдер, который отображается на месте ещё не введённых пользователем символов.\n * @default _ */\n maskChar?: string;\n\n /** Словарь правил для настройки маски, где:\n * ключ — символ для использования в маске;\n * значение — регулярка-правило.\n * @default { '9': '[0-9]', 'a': '[A-Za-z]', '*': '[A-Za-z0-9]' } */\n formatChars?: Record<string, string>;\n\n /** Всегда показывать символы маски, независимо от фокуса в поле.\n * @default false */\n alwaysShowMask?: boolean;\n\n /** Событие некорректного ввода.\n * Вторым аргументом передаётся метод вспыхивания рамки поля.\n *\n * Если обработчик не задан, то при событии рамка всегда вспыхивает.\n *\n * @param value значение поля\n * @param blink метод вспыхивания рамки поля\n */\n onUnexpectedInput?: (value: string, blink: () => void) => void;\n\n /**\n * Событие перед вставкой текста в поле.\n * Вызывается с аргументом value — текст из буфера.\n *\n * Обработчик должен вернуть текст — он попадёт в поле.\n *\n * @param value значение вставки.\n */\n onBeforePasteValue?: MaskedInputOnBeforePasteValue;\n\n /** Убирает из value символы маски, которые пользователь не вводил.\n * @default false */\n unmask?: boolean;\n\n /** Раскрашивает символы маски.\n * @default true\n * @ignore */\n colored?: boolean;\n\n /** Задает пропсы для компонента `IMaskInput`. Необходимы для юнит-тестов\n * @ignore */\n imaskProps?: IMaskInputProps<HTMLInputElement>;\n}\n\nexport type MaskInputType = Exclude<InputType, 'number' | 'date' | 'time' | 'password'>;\n\nexport const getSafeMaskInputType = (type?: InputType): MaskInputType | undefined => {\n if (!type) {\n return type;\n }\n\n switch (type) {\n case 'number':\n case 'date':\n case 'time':\n case 'password':\n return 'text';\n default:\n return type;\n }\n};\n\nexport interface MaskedInputProps\n extends\n MaskedProps,\n Omit<\n InputProps,\n 'showClearIcon' | 'mask' | 'maxLength' | 'type' | 'alwaysShowMask' | 'onUnexpectedInput' | 'maskChar'\n > {\n type?: MaskInputType;\n}\n\n/** Поле ввода, которое ограничивает формат вводимого значения по заданной маске. Такое поле облегчает пользователю ввод и снижает количество ошибок.\n *\n * Для исправленной реализации включите фичафлаг `maskedInputUseFixes` в {@link ReactUIFeatureFlagsContext}.\n */\nexport const MaskedInput = forwardRefAndName(\n 'MaskedInput',\n function MaskedInput(props: MaskedInputProps, ref: Ref<Input | null>) {\n const { maskedInputUseFixes } = useContext(ReactUIFeatureFlagsContext);\n\n if (maskedInputUseFixes) {\n return <MaskedInputV2 ref={ref} __fromMaskedInputFacade {...(props as MaskedInputV2Props)} />;\n }\n\n return <MaskedInputLegacy ref={ref} {...props} />;\n },\n);\n"]}
|
|
@@ -53,6 +53,6 @@ export interface MaskedInputV2Props extends MaskedInputV2MaskedProps, Omit<Input
|
|
|
53
53
|
/** @ignore */
|
|
54
54
|
__fromMaskedInputFacade?: boolean;
|
|
55
55
|
}
|
|
56
|
-
/** @deprecated Используйте {@link MaskedInput} с фичафлагом `
|
|
56
|
+
/** @deprecated Используйте {@link MaskedInput} с фичафлагом `maskedInputUseFixes` в {@link ReactUIFeatureFlagsContext}. */
|
|
57
57
|
export declare const MaskedInputV2: import("../../lib/forwardRefAndName.js").ReactUIComponentWithRef<Input, MaskedInputV2Props> & Record<never, never>;
|
|
58
58
|
export { getDefinitions, getMaskChar };
|
|
@@ -52,7 +52,7 @@ function getMaskInputMode(type, inputMode) {
|
|
|
52
52
|
}
|
|
53
53
|
return undefined;
|
|
54
54
|
}
|
|
55
|
-
/** @deprecated Используйте {@link MaskedInput} с фичафлагом `
|
|
55
|
+
/** @deprecated Используйте {@link MaskedInput} с фичафлагом `maskedInputUseFixes` в {@link ReactUIFeatureFlagsContext}. */
|
|
56
56
|
export var MaskedInputV2 = forwardRefAndName('MaskedInputV2', function MaskedInputV2(props, ref) {
|
|
57
57
|
var mask = props.mask, maskChar = props.maskChar, formatChars = props.formatChars, _a = props.alwaysShowMask, alwaysShowMask = _a === void 0 ? false : _a, _b = props.colored, colored = _b === void 0 ? true : _b, _c = props.imaskProps, customIMaskProps = _c === void 0 ? EMPTY_IMASK_PROPS : _c, _d = props.unmask, unmask = _d === void 0 ? false : _d, onValueChange = props.onValueChange, onUnexpectedInput = props.onUnexpectedInput, onBeforePasteValue = props.onBeforePasteValue, _element = props.element, className = props.className,
|
|
58
58
|
// @ts-expect-error: могут передавать игнорируя ошибку
|
|
@@ -61,7 +61,7 @@ export var MaskedInputV2 = forwardRefAndName('MaskedInputV2', function MaskedInp
|
|
|
61
61
|
_showClearIcon = props.showClearIcon, selectAllOnFocus = props.selectAllOnFocus, type = props.type, __fromMaskedInputFacade = props.__fromMaskedInputFacade, inputProps = __rest(props, ["mask", "maskChar", "formatChars", "alwaysShowMask", "colored", "imaskProps", "unmask", "onValueChange", "onUnexpectedInput", "onBeforePasteValue", "element", "className", "maxLength", "showClearIcon", "selectAllOnFocus", "type", "__fromMaskedInputFacade"]);
|
|
62
62
|
useEffect(function () {
|
|
63
63
|
if (!__fromMaskedInputFacade) {
|
|
64
|
-
warning(false, '[MaskedInputV2]:
|
|
64
|
+
warning(false, '[MaskedInputV2]: This component is for internal use only. Please use MaskedInput with the maskedInputUseFixes feature flag instead.');
|
|
65
65
|
}
|
|
66
66
|
}, [__fromMaskedInputFacade]);
|
|
67
67
|
var theme = useContext(ThemeContext);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MaskedInputV2.js","sourceRoot":"","sources":["MaskedInputV2.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useContext, useEffect, useImperativeHandle, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport type { Ref } from 'react';\nimport warning from 'warning';\n\nimport { forwardRefAndName } from '../../lib/forwardRefAndName.js';\nimport { useEmotion, useStyles } from '../../lib/renderEnvironment/index.js';\nimport { ThemeContext } from '../../lib/theming/ThemeContext.js';\nimport type { InputProps, InputType } from '../Input/index.js';\nimport { Input, selectionAllowedTypes } from '../Input/index.js';\nimport { extractRaw, findNearestRawLeft, computePasteMaskedCursor } from './internal/helpers.js';\nimport { MaskedCore } from './internal/MaskedCore.js';\nimport { setMaskInputSelectionRange } from './internal/setMaskInputSelectionRange.js';\nimport { useMaskEngine } from './internal/useMaskEngine.js';\nimport { getDefinitions, getMaskChar } from './MaskedInputV2.helpers.js';\nimport { getStyles, globalClasses } from './MaskedInputV2.styles.js';\nimport type { IMaskInputProps } from './react-imask/mixin.js';\n\nexport type MaskedInputV2OnBeforePasteValue = (value: string) => string;\n\nexport interface MaskedInputV2MaskedProps {\n /** Шаблон ввода, определяющий допустимые символы. */\n mask: string;\n\n /** Плейсхолдер, который отображается на месте ещё не введённых пользователем символов.\n * @default _ */\n maskChar?: string;\n\n /** Словарь правил для настройки маски, где:\n * ключ — символ для использования в маске;\n * значение — регулярка-правило.\n * @default { '9': '[0-9]', 'a': '[A-Za-z]', '*': '[A-Za-z0-9]' } */\n formatChars?: Record<string, string>;\n\n /** Всегда показывать символы маски, независимо от фокуса в поле.\n * @default false */\n alwaysShowMask?: boolean;\n\n /** Событие некорректного ввода.\n * Вторым аргументом передаётся метод вспыхивания рамки поля.\n *\n * Если обработчик не задан, то при событии рамка всегда вспыхивает.\n *\n * @param value значение поля\n * @param blink метод вспыхивания рамки поля\n */\n onUnexpectedInput?: (value: string, blink: () => void) => void;\n\n /**\n * Событие перед вставкой текста в поле.\n * Вызывается с аргументом value — текст из буфера.\n *\n * Обработчик должен вернуть текст — он попадёт в поле.\n *\n * @param value значение вставки.\n */\n onBeforePasteValue?: MaskedInputV2OnBeforePasteValue;\n\n /** Убирает из value символы маски, которые пользователь не вводил.\n * @default false */\n unmask?: boolean;\n\n /** Раскрашивает символы маски.\n * @default true\n * @ignore */\n colored?: boolean;\n\n /** Задает пропсы для компонента `IMaskInput`. Необходимы для юнит-тестов\n * @ignore */\n imaskProps?: IMaskInputProps<HTMLInputElement>;\n}\n\nexport type MaskInputType = Exclude<InputType, 'number' | 'date' | 'time' | 'password'>;\n\nconst EMPTY_IMASK_PROPS = {};\n\nexport const getSafeMaskInputType = (type?: InputType | string): MaskInputType | undefined => {\n if (!type) {\n return undefined;\n }\n\n const normalizedType = type.trim() as InputType;\n\n if (normalizedType === 'password' || !selectionAllowedTypes.includes(normalizedType)) {\n return 'text';\n }\n\n return normalizedType as MaskInputType;\n};\n\nfunction getMaskInputMode(\n type: InputType | string | undefined,\n inputMode: React.InputHTMLAttributes<HTMLInputElement>['inputMode'],\n): React.InputHTMLAttributes<HTMLInputElement>['inputMode'] {\n if (inputMode) {\n return inputMode;\n }\n\n if (type?.trim() === 'email') {\n return 'email';\n }\n\n return undefined;\n}\n\nexport interface MaskedInputV2Props\n extends\n MaskedInputV2MaskedProps,\n Omit<\n InputProps,\n 'showClearIcon' | 'mask' | 'maxLength' | 'type' | 'alwaysShowMask' | 'onUnexpectedInput' | 'maskChar'\n > {\n type?: MaskInputType;\n\n /** @ignore */\n __fromMaskedInputFacade?: boolean;\n}\n\n/** @deprecated Используйте {@link MaskedInput} с фичафлагом `useFixedMaskedInput` в {@link ReactUIFeatureFlagsContext}. */\nexport const MaskedInputV2 = forwardRefAndName(\n 'MaskedInputV2',\n function MaskedInputV2(props: MaskedInputV2Props, ref: Ref<Input | null>) {\n const {\n mask,\n maskChar,\n formatChars,\n alwaysShowMask = false,\n colored = true,\n imaskProps: customIMaskProps = EMPTY_IMASK_PROPS,\n unmask = false,\n onValueChange,\n onUnexpectedInput,\n onBeforePasteValue,\n element: _element,\n className,\n // @ts-expect-error: могут передавать игнорируя ошибку\n maxLength,\n // @ts-expect-error: могут передавать игнорируя ошибку\n showClearIcon: _showClearIcon,\n selectAllOnFocus,\n type,\n __fromMaskedInputFacade,\n ...inputProps\n } = props;\n\n useEffect(() => {\n if (!__fromMaskedInputFacade) {\n warning(\n false,\n '[MaskedInputV2]: компонент не предназначен для прямого использования. Используйте MaskedInput с фичафлагом useFixedMaskedInput.',\n );\n }\n }, [__fromMaskedInputFacade]);\n\n const theme = useContext(ThemeContext);\n const { cx } = useEmotion();\n const styles = useStyles(getStyles);\n\n const inputRef = useRef<Input>(null);\n const coreInputRef = useRef<HTMLInputElement>(null);\n\n const [focused, setFocused] = useState(false);\n\n const prevMaskRef = useRef(props.mask);\n const pendingCursorRestoreRef = useRef<number | null>(null);\n const pendingSelectionRestoreRef = useRef<{ start: number; end: number } | null>(null);\n const lastCaretRef = useRef(0);\n\n const historyRef = useRef<Array<{ raw: string; cursorPos: number }>>([]);\n const historyIndexRef = useRef(-1);\n\n // Сохраняем позицию курсора перед сменой маски (render-phase read of stable ref).\n // При коммите DOM браузер сбросит курсор в конец из-за изменения value,\n // поэтому восстанавливаем его синхронно в useLayoutEffect ниже.\n if (prevMaskRef.current !== props.mask) {\n pendingCursorRestoreRef.current = lastCaretRef.current;\n prevMaskRef.current = props.mask;\n historyRef.current = [];\n historyIndexRef.current = -1;\n }\n\n // Движок: IMask как чистый калькулятор, не привязанный к DOM\n const engine = useMaskEngine({\n mask,\n maskChar,\n formatChars,\n unmask,\n alwaysShowMask,\n imaskProps: customIMaskProps,\n });\n\n // Единственный источник истины — raw (только то, что ввёл пользователь, без маски)\n const [raw, setRaw] = useState<string>(() =>\n extractRaw((props.value ?? props.defaultValue) as string | number | undefined, engine),\n );\n\n // MaskState вычисляется синхронно из raw — оба визуальных слоя читают из него\n const maskState = useMemo(() => engine.compute(raw, focused), [raw, focused, engine]);\n\n const syncedImaskRef = useRef(engine.imask);\n const prevSyncedValueRef = useRef(props.value);\n\n // Синхронизировать raw при изменении props.value или правил маски\n useEffect(() => {\n const engineChanged = syncedImaskRef.current !== engine.imask;\n const valueChanged = prevSyncedValueRef.current !== props.value;\n syncedImaskRef.current = engine.imask;\n prevSyncedValueRef.current = props.value;\n\n if (props.value !== undefined) {\n if (valueChanged || engineChanged) {\n setRaw(extractRaw(props.value, engine));\n }\n return;\n }\n\n if (engineChanged) {\n setRaw((prev) => {\n engine.imask.unmaskedValue = prev;\n return engine.imask.rawInputValue;\n });\n }\n }, [props.value, engine]);\n\n // Вызывать onValueChange только при реальном изменении outputValue,\n // и НЕ при первом рендере (воспроизводит нативное поведение onChange)\n const isFirstRender = useRef(true);\n const prevOutputValue = useRef<string>(maskState.outputValue);\n useEffect(() => {\n if (isFirstRender.current) {\n isFirstRender.current = false;\n prevOutputValue.current = maskState.outputValue;\n return;\n }\n if (maskState.outputValue !== prevOutputValue.current) {\n prevOutputValue.current = maskState.outputValue;\n onValueChange?.(maskState.outputValue);\n }\n }, [maskState.outputValue]);\n\n useImperativeHandle<Input | null, (Input & { selectAll: () => void }) | null>(ref, () => {\n if (!inputRef.current) {\n return null;\n }\n return Object.assign(inputRef.current, {\n selectAll: () => {\n inputRef.current?.focus();\n pendingSelectionRestoreRef.current = { start: 0, end: maskState.typedLength };\n },\n });\n }, [maskState.typedLength]);\n\n useLayoutEffect(() => {\n if (pendingSelectionRestoreRef.current !== null && coreInputRef.current) {\n const { start, end } = pendingSelectionRestoreRef.current;\n pendingSelectionRestoreRef.current = null;\n setMaskInputSelectionRange(coreInputRef.current, start, end);\n lastCaretRef.current = end;\n return;\n }\n\n if (pendingCursorRestoreRef.current !== null && coreInputRef.current) {\n setMaskInputSelectionRange(coreInputRef.current, pendingCursorRestoreRef.current);\n lastCaretRef.current = pendingCursorRestoreRef.current;\n pendingCursorRestoreRef.current = null;\n }\n });\n\n useEffect(() => {\n if (!focused) {\n return;\n }\n\n const el = coreInputRef.current;\n if (!el) {\n return;\n }\n\n const syncCaret = () => {\n if (document.activeElement === el) {\n lastCaretRef.current = el.selectionStart ?? 0;\n }\n };\n\n document.addEventListener('selectionchange', syncCaret);\n return () => document.removeEventListener('selectionchange', syncCaret);\n }, [focused]);\n\n return (\n <Input\n ref={inputRef}\n {...inputProps}\n type={getSafeMaskInputType(type)}\n inputMode={getMaskInputMode(type, inputProps.inputMode)}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onSelect={handleSelect}\n className={cx(globalClasses.root, className, styles.root(theme))}\n element={\n <MaskedCore\n maskState={maskState}\n slotMap={engine.slotMap}\n engine={engine}\n focused={focused}\n currentRaw={raw}\n onRawChange={handleRawChange}\n onUnexpectedInput={triggerUnexpectedInput}\n onUndo={handleUndo}\n onRedo={handleRedo}\n coreInputRef={coreInputRef}\n colored={colored}\n selectAllOnFocus={selectAllOnFocus}\n />\n }\n />\n );\n\n function handleRawChange(input: string, source: 'input' | 'paste', cursorPos?: number) {\n if (source === 'paste') {\n handlePasteChange(input, cursorPos);\n } else {\n if (input !== raw && cursorPos !== undefined) {\n pushHistory(input, cursorPos);\n }\n setRaw(input);\n }\n }\n\n function handlePasteChange(pasted: string, _cursorPos?: number) {\n const el = coreInputRef.current;\n const selectionStart = el?.selectionStart ?? 0;\n\n // Находим rawPos по maskedPos курсора\n const rawCursorPos =\n engine.slotMap.maskedToRaw[selectionStart] !== null && engine.slotMap.maskedToRaw[selectionStart] !== undefined\n ? (engine.slotMap.maskedToRaw[selectionStart] as number)\n : findNearestRawLeft(selectionStart, engine.slotMap);\n\n const rawBefore = raw.slice(0, rawCursorPos);\n const rawAfter = raw.slice(rawCursorPos);\n const transformed = onBeforePasteValue ? onBeforePasteValue(pasted) : pasted;\n const result = engine.applyPaste(raw, rawCursorPos, transformed);\n\n if (result.overflow) {\n // IF-1157: paste с overflow → onUnexpectedInput\n triggerUnexpectedInput();\n }\n\n const postPasteMaskState = engine.compute(result.raw, true);\n const maskedCursorPos = computePasteMaskedCursor(\n rawBefore,\n rawAfter,\n result.raw,\n rawCursorPos,\n engine.slotMap,\n postPasteMaskState.typedLength,\n );\n\n if (result.raw !== raw) {\n pushHistory(result.raw, maskedCursorPos);\n }\n\n setRaw(result.raw);\n pendingCursorRestoreRef.current = maskedCursorPos;\n\n if (onBeforePasteValue && onValueChange) {\n // Legacy-контракт: при кастомной вставке наружу уходит результат onBeforePasteValue,\n // а не masked/unmasked outputValue (нужно для ComboBox и совместимости с IMaskInput).\n prevOutputValue.current = engine.compute(result.raw, focused).outputValue;\n onValueChange(transformed);\n }\n }\n\n function pushHistory(newRaw: string, cursorPos: number) {\n const MAX_HISTORY_LENGTH = 100;\n\n if (historyRef.current.length === 0) {\n historyRef.current.push({ raw, cursorPos: 0 });\n historyIndexRef.current = 0;\n }\n\n if (historyIndexRef.current < historyRef.current.length - 1) {\n historyRef.current = historyRef.current.slice(0, historyIndexRef.current + 1);\n }\n\n historyRef.current.push({ raw: newRaw, cursorPos });\n if (historyRef.current.length > MAX_HISTORY_LENGTH) {\n historyRef.current.shift();\n }\n historyIndexRef.current = historyRef.current.length - 1;\n }\n\n function handleUndo() {\n if (historyRef.current.length === 0) {\n return;\n }\n const nextIndex = Math.max(0, historyIndexRef.current - 1);\n if (nextIndex !== historyIndexRef.current) {\n historyIndexRef.current = nextIndex;\n const state = historyRef.current[nextIndex];\n setRaw(state.raw);\n pendingCursorRestoreRef.current = state.cursorPos;\n }\n }\n\n function handleRedo() {\n if (historyRef.current.length === 0) {\n return;\n }\n const nextIndex = Math.min(historyRef.current.length - 1, historyIndexRef.current + 1);\n if (nextIndex !== historyIndexRef.current) {\n historyIndexRef.current = nextIndex;\n const state = historyRef.current[nextIndex];\n setRaw(state.raw);\n pendingCursorRestoreRef.current = state.cursorPos;\n }\n }\n\n function triggerUnexpectedInput() {\n const blink = inputRef.current?.blink.bind(inputRef.current) ?? (() => undefined);\n onUnexpectedInput ? onUnexpectedInput(maskState.outputValue, blink) : blink();\n }\n\n function handleFocus(e: React.FocusEvent<HTMLInputElement>) {\n setFocused(true);\n props.onFocus?.(e);\n }\n\n function handleBlur(e: React.FocusEvent<HTMLInputElement>) {\n setFocused(false);\n props.onBlur?.(e);\n }\n\n function handleSelect(e: React.SyntheticEvent<HTMLInputElement>) {\n if (coreInputRef.current) {\n lastCaretRef.current = coreInputRef.current.selectionStart ?? 0;\n }\n inputProps.onSelect?.(e);\n }\n },\n);\n\n// Вспомогательные функции для совместимости (используются в стори и тестах)\nexport { getDefinitions, getMaskChar };\n"]}
|
|
1
|
+
{"version":3,"file":"MaskedInputV2.js","sourceRoot":"","sources":["MaskedInputV2.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useContext, useEffect, useImperativeHandle, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport type { Ref } from 'react';\nimport warning from 'warning';\n\nimport { forwardRefAndName } from '../../lib/forwardRefAndName.js';\nimport { useEmotion, useStyles } from '../../lib/renderEnvironment/index.js';\nimport { ThemeContext } from '../../lib/theming/ThemeContext.js';\nimport type { InputProps, InputType } from '../Input/index.js';\nimport { Input, selectionAllowedTypes } from '../Input/index.js';\nimport { extractRaw, findNearestRawLeft, computePasteMaskedCursor } from './internal/helpers.js';\nimport { MaskedCore } from './internal/MaskedCore.js';\nimport { setMaskInputSelectionRange } from './internal/setMaskInputSelectionRange.js';\nimport { useMaskEngine } from './internal/useMaskEngine.js';\nimport { getDefinitions, getMaskChar } from './MaskedInputV2.helpers.js';\nimport { getStyles, globalClasses } from './MaskedInputV2.styles.js';\nimport type { IMaskInputProps } from './react-imask/mixin.js';\n\nexport type MaskedInputV2OnBeforePasteValue = (value: string) => string;\n\nexport interface MaskedInputV2MaskedProps {\n /** Шаблон ввода, определяющий допустимые символы. */\n mask: string;\n\n /** Плейсхолдер, который отображается на месте ещё не введённых пользователем символов.\n * @default _ */\n maskChar?: string;\n\n /** Словарь правил для настройки маски, где:\n * ключ — символ для использования в маске;\n * значение — регулярка-правило.\n * @default { '9': '[0-9]', 'a': '[A-Za-z]', '*': '[A-Za-z0-9]' } */\n formatChars?: Record<string, string>;\n\n /** Всегда показывать символы маски, независимо от фокуса в поле.\n * @default false */\n alwaysShowMask?: boolean;\n\n /** Событие некорректного ввода.\n * Вторым аргументом передаётся метод вспыхивания рамки поля.\n *\n * Если обработчик не задан, то при событии рамка всегда вспыхивает.\n *\n * @param value значение поля\n * @param blink метод вспыхивания рамки поля\n */\n onUnexpectedInput?: (value: string, blink: () => void) => void;\n\n /**\n * Событие перед вставкой текста в поле.\n * Вызывается с аргументом value — текст из буфера.\n *\n * Обработчик должен вернуть текст — он попадёт в поле.\n *\n * @param value значение вставки.\n */\n onBeforePasteValue?: MaskedInputV2OnBeforePasteValue;\n\n /** Убирает из value символы маски, которые пользователь не вводил.\n * @default false */\n unmask?: boolean;\n\n /** Раскрашивает символы маски.\n * @default true\n * @ignore */\n colored?: boolean;\n\n /** Задает пропсы для компонента `IMaskInput`. Необходимы для юнит-тестов\n * @ignore */\n imaskProps?: IMaskInputProps<HTMLInputElement>;\n}\n\nexport type MaskInputType = Exclude<InputType, 'number' | 'date' | 'time' | 'password'>;\n\nconst EMPTY_IMASK_PROPS = {};\n\nexport const getSafeMaskInputType = (type?: InputType | string): MaskInputType | undefined => {\n if (!type) {\n return undefined;\n }\n\n const normalizedType = type.trim() as InputType;\n\n if (normalizedType === 'password' || !selectionAllowedTypes.includes(normalizedType)) {\n return 'text';\n }\n\n return normalizedType as MaskInputType;\n};\n\nfunction getMaskInputMode(\n type: InputType | string | undefined,\n inputMode: React.InputHTMLAttributes<HTMLInputElement>['inputMode'],\n): React.InputHTMLAttributes<HTMLInputElement>['inputMode'] {\n if (inputMode) {\n return inputMode;\n }\n\n if (type?.trim() === 'email') {\n return 'email';\n }\n\n return undefined;\n}\n\nexport interface MaskedInputV2Props\n extends\n MaskedInputV2MaskedProps,\n Omit<\n InputProps,\n 'showClearIcon' | 'mask' | 'maxLength' | 'type' | 'alwaysShowMask' | 'onUnexpectedInput' | 'maskChar'\n > {\n type?: MaskInputType;\n\n /** @ignore */\n __fromMaskedInputFacade?: boolean;\n}\n\n/** @deprecated Используйте {@link MaskedInput} с фичафлагом `maskedInputUseFixes` в {@link ReactUIFeatureFlagsContext}. */\nexport const MaskedInputV2 = forwardRefAndName(\n 'MaskedInputV2',\n function MaskedInputV2(props: MaskedInputV2Props, ref: Ref<Input | null>) {\n const {\n mask,\n maskChar,\n formatChars,\n alwaysShowMask = false,\n colored = true,\n imaskProps: customIMaskProps = EMPTY_IMASK_PROPS,\n unmask = false,\n onValueChange,\n onUnexpectedInput,\n onBeforePasteValue,\n element: _element,\n className,\n // @ts-expect-error: могут передавать игнорируя ошибку\n maxLength,\n // @ts-expect-error: могут передавать игнорируя ошибку\n showClearIcon: _showClearIcon,\n selectAllOnFocus,\n type,\n __fromMaskedInputFacade,\n ...inputProps\n } = props;\n\n useEffect(() => {\n if (!__fromMaskedInputFacade) {\n warning(\n false,\n '[MaskedInputV2]: This component is for internal use only. Please use MaskedInput with the maskedInputUseFixes feature flag instead.',\n );\n }\n }, [__fromMaskedInputFacade]);\n\n const theme = useContext(ThemeContext);\n const { cx } = useEmotion();\n const styles = useStyles(getStyles);\n\n const inputRef = useRef<Input>(null);\n const coreInputRef = useRef<HTMLInputElement>(null);\n\n const [focused, setFocused] = useState(false);\n\n const prevMaskRef = useRef(props.mask);\n const pendingCursorRestoreRef = useRef<number | null>(null);\n const pendingSelectionRestoreRef = useRef<{ start: number; end: number } | null>(null);\n const lastCaretRef = useRef(0);\n\n const historyRef = useRef<Array<{ raw: string; cursorPos: number }>>([]);\n const historyIndexRef = useRef(-1);\n\n // Сохраняем позицию курсора перед сменой маски (render-phase read of stable ref).\n // При коммите DOM браузер сбросит курсор в конец из-за изменения value,\n // поэтому восстанавливаем его синхронно в useLayoutEffect ниже.\n if (prevMaskRef.current !== props.mask) {\n pendingCursorRestoreRef.current = lastCaretRef.current;\n prevMaskRef.current = props.mask;\n historyRef.current = [];\n historyIndexRef.current = -1;\n }\n\n // Движок: IMask как чистый калькулятор, не привязанный к DOM\n const engine = useMaskEngine({\n mask,\n maskChar,\n formatChars,\n unmask,\n alwaysShowMask,\n imaskProps: customIMaskProps,\n });\n\n // Единственный источник истины — raw (только то, что ввёл пользователь, без маски)\n const [raw, setRaw] = useState<string>(() =>\n extractRaw((props.value ?? props.defaultValue) as string | number | undefined, engine),\n );\n\n // MaskState вычисляется синхронно из raw — оба визуальных слоя читают из него\n const maskState = useMemo(() => engine.compute(raw, focused), [raw, focused, engine]);\n\n const syncedImaskRef = useRef(engine.imask);\n const prevSyncedValueRef = useRef(props.value);\n\n // Синхронизировать raw при изменении props.value или правил маски\n useEffect(() => {\n const engineChanged = syncedImaskRef.current !== engine.imask;\n const valueChanged = prevSyncedValueRef.current !== props.value;\n syncedImaskRef.current = engine.imask;\n prevSyncedValueRef.current = props.value;\n\n if (props.value !== undefined) {\n if (valueChanged || engineChanged) {\n setRaw(extractRaw(props.value, engine));\n }\n return;\n }\n\n if (engineChanged) {\n setRaw((prev) => {\n engine.imask.unmaskedValue = prev;\n return engine.imask.rawInputValue;\n });\n }\n }, [props.value, engine]);\n\n // Вызывать onValueChange только при реальном изменении outputValue,\n // и НЕ при первом рендере (воспроизводит нативное поведение onChange)\n const isFirstRender = useRef(true);\n const prevOutputValue = useRef<string>(maskState.outputValue);\n useEffect(() => {\n if (isFirstRender.current) {\n isFirstRender.current = false;\n prevOutputValue.current = maskState.outputValue;\n return;\n }\n if (maskState.outputValue !== prevOutputValue.current) {\n prevOutputValue.current = maskState.outputValue;\n onValueChange?.(maskState.outputValue);\n }\n }, [maskState.outputValue]);\n\n useImperativeHandle<Input | null, (Input & { selectAll: () => void }) | null>(ref, () => {\n if (!inputRef.current) {\n return null;\n }\n return Object.assign(inputRef.current, {\n selectAll: () => {\n inputRef.current?.focus();\n pendingSelectionRestoreRef.current = { start: 0, end: maskState.typedLength };\n },\n });\n }, [maskState.typedLength]);\n\n useLayoutEffect(() => {\n if (pendingSelectionRestoreRef.current !== null && coreInputRef.current) {\n const { start, end } = pendingSelectionRestoreRef.current;\n pendingSelectionRestoreRef.current = null;\n setMaskInputSelectionRange(coreInputRef.current, start, end);\n lastCaretRef.current = end;\n return;\n }\n\n if (pendingCursorRestoreRef.current !== null && coreInputRef.current) {\n setMaskInputSelectionRange(coreInputRef.current, pendingCursorRestoreRef.current);\n lastCaretRef.current = pendingCursorRestoreRef.current;\n pendingCursorRestoreRef.current = null;\n }\n });\n\n useEffect(() => {\n if (!focused) {\n return;\n }\n\n const el = coreInputRef.current;\n if (!el) {\n return;\n }\n\n const syncCaret = () => {\n if (document.activeElement === el) {\n lastCaretRef.current = el.selectionStart ?? 0;\n }\n };\n\n document.addEventListener('selectionchange', syncCaret);\n return () => document.removeEventListener('selectionchange', syncCaret);\n }, [focused]);\n\n return (\n <Input\n ref={inputRef}\n {...inputProps}\n type={getSafeMaskInputType(type)}\n inputMode={getMaskInputMode(type, inputProps.inputMode)}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onSelect={handleSelect}\n className={cx(globalClasses.root, className, styles.root(theme))}\n element={\n <MaskedCore\n maskState={maskState}\n slotMap={engine.slotMap}\n engine={engine}\n focused={focused}\n currentRaw={raw}\n onRawChange={handleRawChange}\n onUnexpectedInput={triggerUnexpectedInput}\n onUndo={handleUndo}\n onRedo={handleRedo}\n coreInputRef={coreInputRef}\n colored={colored}\n selectAllOnFocus={selectAllOnFocus}\n />\n }\n />\n );\n\n function handleRawChange(input: string, source: 'input' | 'paste', cursorPos?: number) {\n if (source === 'paste') {\n handlePasteChange(input, cursorPos);\n } else {\n if (input !== raw && cursorPos !== undefined) {\n pushHistory(input, cursorPos);\n }\n setRaw(input);\n }\n }\n\n function handlePasteChange(pasted: string, _cursorPos?: number) {\n const el = coreInputRef.current;\n const selectionStart = el?.selectionStart ?? 0;\n\n // Находим rawPos по maskedPos курсора\n const rawCursorPos =\n engine.slotMap.maskedToRaw[selectionStart] !== null && engine.slotMap.maskedToRaw[selectionStart] !== undefined\n ? (engine.slotMap.maskedToRaw[selectionStart] as number)\n : findNearestRawLeft(selectionStart, engine.slotMap);\n\n const rawBefore = raw.slice(0, rawCursorPos);\n const rawAfter = raw.slice(rawCursorPos);\n const transformed = onBeforePasteValue ? onBeforePasteValue(pasted) : pasted;\n const result = engine.applyPaste(raw, rawCursorPos, transformed);\n\n if (result.overflow) {\n // IF-1157: paste с overflow → onUnexpectedInput\n triggerUnexpectedInput();\n }\n\n const postPasteMaskState = engine.compute(result.raw, true);\n const maskedCursorPos = computePasteMaskedCursor(\n rawBefore,\n rawAfter,\n result.raw,\n rawCursorPos,\n engine.slotMap,\n postPasteMaskState.typedLength,\n );\n\n if (result.raw !== raw) {\n pushHistory(result.raw, maskedCursorPos);\n }\n\n setRaw(result.raw);\n pendingCursorRestoreRef.current = maskedCursorPos;\n\n if (onBeforePasteValue && onValueChange) {\n // Legacy-контракт: при кастомной вставке наружу уходит результат onBeforePasteValue,\n // а не masked/unmasked outputValue (нужно для ComboBox и совместимости с IMaskInput).\n prevOutputValue.current = engine.compute(result.raw, focused).outputValue;\n onValueChange(transformed);\n }\n }\n\n function pushHistory(newRaw: string, cursorPos: number) {\n const MAX_HISTORY_LENGTH = 100;\n\n if (historyRef.current.length === 0) {\n historyRef.current.push({ raw, cursorPos: 0 });\n historyIndexRef.current = 0;\n }\n\n if (historyIndexRef.current < historyRef.current.length - 1) {\n historyRef.current = historyRef.current.slice(0, historyIndexRef.current + 1);\n }\n\n historyRef.current.push({ raw: newRaw, cursorPos });\n if (historyRef.current.length > MAX_HISTORY_LENGTH) {\n historyRef.current.shift();\n }\n historyIndexRef.current = historyRef.current.length - 1;\n }\n\n function handleUndo() {\n if (historyRef.current.length === 0) {\n return;\n }\n const nextIndex = Math.max(0, historyIndexRef.current - 1);\n if (nextIndex !== historyIndexRef.current) {\n historyIndexRef.current = nextIndex;\n const state = historyRef.current[nextIndex];\n setRaw(state.raw);\n pendingCursorRestoreRef.current = state.cursorPos;\n }\n }\n\n function handleRedo() {\n if (historyRef.current.length === 0) {\n return;\n }\n const nextIndex = Math.min(historyRef.current.length - 1, historyIndexRef.current + 1);\n if (nextIndex !== historyIndexRef.current) {\n historyIndexRef.current = nextIndex;\n const state = historyRef.current[nextIndex];\n setRaw(state.raw);\n pendingCursorRestoreRef.current = state.cursorPos;\n }\n }\n\n function triggerUnexpectedInput() {\n const blink = inputRef.current?.blink.bind(inputRef.current) ?? (() => undefined);\n onUnexpectedInput ? onUnexpectedInput(maskState.outputValue, blink) : blink();\n }\n\n function handleFocus(e: React.FocusEvent<HTMLInputElement>) {\n setFocused(true);\n props.onFocus?.(e);\n }\n\n function handleBlur(e: React.FocusEvent<HTMLInputElement>) {\n setFocused(false);\n props.onBlur?.(e);\n }\n\n function handleSelect(e: React.SyntheticEvent<HTMLInputElement>) {\n if (coreInputRef.current) {\n lastCaretRef.current = coreInputRef.current.selectionStart ?? 0;\n }\n inputProps.onSelect?.(e);\n }\n },\n);\n\n// Вспомогательные функции для совместимости (используются в стори и тестах)\nexport { getDefinitions, getMaskChar };\n"]}
|
|
@@ -9,6 +9,8 @@ export function getShowOverlay(maskState, focused, overflows) {
|
|
|
9
9
|
// (плейсхолдеры) всегда рисуется через overlay, а не через value input.
|
|
10
10
|
return hasMaskPart(maskState);
|
|
11
11
|
}
|
|
12
|
-
|
|
12
|
+
// Полностью введённое значение (без декоративной части маски) рисуем нативным
|
|
13
|
+
// текстом input — иначе overlay с overflow:hidden обрезает конец при горизонтальном скролле.
|
|
14
|
+
return hasMaskPart(maskState);
|
|
13
15
|
}
|
|
14
16
|
//# sourceMappingURL=showOverlay.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"showOverlay.js","sourceRoot":"","sources":["showOverlay.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,WAAW,CAAC,SAAoB;IAC9C,OAAO,SAAS,CAAC,YAAY,CAAC,MAAM,GAAG,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,SAAoB,EAAE,OAAgB,EAAE,SAAiB;IAAjB,0BAAA,EAAA,iBAAiB;IACtF,IAAI,SAAS,EAAE,CAAC;QACd,8EAA8E;QAC9E,0EAA0E;QAC1E,wEAAwE;QACxE,OAAO,WAAW,CAAC,SAAS,CAAC,CAAC;IAChC,CAAC;IAED,OAAO,WAAW,CAAC,SAAS,CAAC,
|
|
1
|
+
{"version":3,"file":"showOverlay.js","sourceRoot":"","sources":["showOverlay.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,WAAW,CAAC,SAAoB;IAC9C,OAAO,SAAS,CAAC,YAAY,CAAC,MAAM,GAAG,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,SAAoB,EAAE,OAAgB,EAAE,SAAiB;IAAjB,0BAAA,EAAA,iBAAiB;IACtF,IAAI,SAAS,EAAE,CAAC;QACd,8EAA8E;QAC9E,0EAA0E;QAC1E,wEAAwE;QACxE,OAAO,WAAW,CAAC,SAAS,CAAC,CAAC;IAChC,CAAC;IAED,8EAA8E;IAC9E,6FAA6F;IAC7F,OAAO,WAAW,CAAC,SAAS,CAAC,CAAC;AAChC,CAAC","sourcesContent":["import type { MaskState } from './types.js';\n\nexport function hasMaskPart(maskState: MaskState): boolean {\n return maskState.displayValue.length > maskState.typedValue.length;\n}\n\nexport function getShowOverlay(maskState: MaskState, focused: boolean, overflows = false): boolean {\n if (overflows) {\n // При переполнении скрываем overlay только для полностью введённого значения:\n // иначе overlay не совпадает с прокруткой input. Декоративная часть маски\n // (плейсхолдеры) всегда рисуется через overlay, а не через value input.\n return hasMaskPart(maskState);\n }\n\n // Полностью введённое значение (без декоративной части маски) рисуем нативным\n // текстом input — иначе overlay с overflow:hidden обрезает конец при горизонтальном скролле.\n return hasMaskPart(maskState);\n}\n"]}
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
import { useLayoutEffect, useState } from 'react';
|
|
2
2
|
import { measureInputTextWidth } from './measureInputTextWidth.js';
|
|
3
3
|
export function isInputTextOverflowing(input, displayValue) {
|
|
4
|
-
|
|
4
|
+
if (input.scrollWidth > input.clientWidth) {
|
|
5
|
+
return true;
|
|
6
|
+
}
|
|
7
|
+
var text = input.value || displayValue;
|
|
8
|
+
return measureInputTextWidth(input, text) > input.clientWidth;
|
|
5
9
|
}
|
|
6
10
|
/** Горизонтальное переполнение текста внутри input. */
|
|
7
11
|
export function useInputOverflow(inputRef, displayValue, remeasureKey) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useInputOverflow.js","sourceRoot":"","sources":["useInputOverflow.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAElD,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAEnE,MAAM,UAAU,sBAAsB,CAAC,KAAuB,EAAE,YAAoB;IAClF,OAAO,qBAAqB,CAAC,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"useInputOverflow.js","sourceRoot":"","sources":["useInputOverflow.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAElD,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAEnE,MAAM,UAAU,sBAAsB,CAAC,KAAuB,EAAE,YAAoB;IAClF,IAAI,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;QAC1C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAM,IAAI,GAAG,KAAK,CAAC,KAAK,IAAI,YAAY,CAAC;IACzC,OAAO,qBAAqB,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,KAAK,CAAC,WAAW,CAAC;AAChE,CAAC;AAED,uDAAuD;AACvD,MAAM,UAAU,gBAAgB,CAC9B,QAAkD,EAClD,YAAoB,EACpB,YAAqB;IAEf,IAAA,KAA0B,QAAQ,CAAC,KAAK,CAAC,EAAxC,QAAQ,QAAA,EAAE,WAAW,QAAmB,CAAC;IAEhD,eAAe,CAAC;QACd,IAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO;QACT,CAAC;QAED,IAAM,OAAO,GAAG;YACd,WAAW,CAAC,UAAC,IAAI;gBACf,IAAM,IAAI,GAAG,sBAAsB,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;gBACzD,OAAO,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;YACrC,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QAEF,OAAO,EAAE,CAAC;QAEV,IAAI,OAAO,cAAc,KAAK,WAAW,EAAE,CAAC;YAC1C,OAAO;QACT,CAAC;QAED,IAAM,QAAQ,GAAG,IAAI,cAAc,CAAC,OAAO,CAAC,CAAC;QAC7C,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAExB,OAAO,cAAM,OAAA,QAAQ,CAAC,UAAU,EAAE,EAArB,CAAqB,CAAC;IACrC,CAAC,EAAE,CAAC,YAAY,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC;IAE3C,OAAO,QAAQ,CAAC;AAClB,CAAC","sourcesContent":["import type React from 'react';\nimport { useLayoutEffect, useState } from 'react';\n\nimport { measureInputTextWidth } from './measureInputTextWidth.js';\n\nexport function isInputTextOverflowing(input: HTMLInputElement, displayValue: string): boolean {\n if (input.scrollWidth > input.clientWidth) {\n return true;\n }\n\n const text = input.value || displayValue;\n return measureInputTextWidth(input, text) > input.clientWidth;\n}\n\n/** Горизонтальное переполнение текста внутри input. */\nexport function useInputOverflow(\n inputRef: React.RefObject<HTMLInputElement | null>,\n displayValue: string,\n remeasureKey: unknown,\n): boolean {\n const [overflow, setOverflow] = useState(false);\n\n useLayoutEffect(() => {\n const input = inputRef.current;\n if (!input) {\n return;\n }\n\n const measure = () => {\n setOverflow((prev) => {\n const next = isInputTextOverflowing(input, displayValue);\n return prev === next ? prev : next;\n });\n };\n\n measure();\n\n if (typeof ResizeObserver === 'undefined') {\n return;\n }\n\n const observer = new ResizeObserver(measure);\n observer.observe(input);\n\n return () => observer.disconnect();\n }, [displayValue, inputRef, remeasureKey]);\n\n return overflow;\n}\n"]}
|
|
@@ -182,6 +182,9 @@ export declare class BasicThemeClass {
|
|
|
182
182
|
static loaderOpacity: string;
|
|
183
183
|
static loaderBorderRadius: string;
|
|
184
184
|
static btnBackgroundClip: string;
|
|
185
|
+
/**
|
|
186
|
+
* @deprecated Связана с устаревшим `use="link"`. Будет удалена в `7.0`.
|
|
187
|
+
* Используйте компонент `Link`. */
|
|
185
188
|
static btnLinkBorderRadius: string;
|
|
186
189
|
static btnFocusShadowWidth: string;
|
|
187
190
|
static btnBorderColorTransition: string;
|
|
@@ -211,19 +214,61 @@ export declare class BasicThemeClass {
|
|
|
211
214
|
static btnIconSizeSmall: string;
|
|
212
215
|
static btnIconSizeMedium: string;
|
|
213
216
|
static btnIconSizeLarge: string;
|
|
217
|
+
/**
|
|
218
|
+
* @deprecated Связана с устаревшим `use="default"`. Будет удалена в `7.0`.
|
|
219
|
+
* Используйте `use="fill"` и переменные {@link btnFillBg}. */
|
|
214
220
|
static btnDefaultBg: string;
|
|
221
|
+
/**
|
|
222
|
+
* @deprecated Связана с устаревшим `use="default"`. Будет удалена в `7.0`.
|
|
223
|
+
* Используйте `use="fill"` и переменные {@link btnFillBg}. */
|
|
215
224
|
static btnDefaultBgStart: string;
|
|
225
|
+
/**
|
|
226
|
+
* @deprecated Связана с устаревшим `use="default"`. Будет удалена в `7.0`.
|
|
227
|
+
* Используйте `use="fill"` и переменные {@link btnFillBg}. */
|
|
216
228
|
static btnDefaultBgEnd: string;
|
|
229
|
+
/**
|
|
230
|
+
* @deprecated Связана с устаревшим `use="default"`. Будет удалена в `7.0`.
|
|
231
|
+
* Используйте `use="fill"`. */
|
|
217
232
|
static get btnDefaultCheckedBorderColor(): string;
|
|
233
|
+
/**
|
|
234
|
+
* @deprecated Связана с устаревшим `use="default"`. Будет удалена в `7.0`.
|
|
235
|
+
* Используйте `use="fill"`. */
|
|
218
236
|
static get btnDefaultTextColor(): string;
|
|
237
|
+
/**
|
|
238
|
+
* @deprecated Связана с устаревшим `use="default"`. Будет удалена в `7.0`.
|
|
239
|
+
* Используйте `use="fill"` и переменные {@link btnFillHoverBg}. */
|
|
219
240
|
static btnDefaultHoverBg: string;
|
|
241
|
+
/**
|
|
242
|
+
* @deprecated Связана с устаревшим `use="default"`. Будет удалена в `7.0`.
|
|
243
|
+
* Используйте `use="fill"` и переменные {@link btnFillHoverBg}. */
|
|
220
244
|
static btnDefaultHoverBgStart: string;
|
|
245
|
+
/**
|
|
246
|
+
* @deprecated Связана с устаревшим `use="default"`. Будет удалена в `7.0`.
|
|
247
|
+
* Используйте `use="fill"` и переменные {@link btnFillHoverBg}. */
|
|
221
248
|
static btnDefaultHoverBgEnd: string;
|
|
249
|
+
/**
|
|
250
|
+
* @deprecated Связана с устаревшим `use="default"`. Будет удалена в `7.0`.
|
|
251
|
+
* Используйте `use="fill"` и переменные {@link btnFillActiveBg}. */
|
|
222
252
|
static btnDefaultActiveBg: string;
|
|
253
|
+
/**
|
|
254
|
+
* @deprecated Связана с устаревшим `use="default"`. Будет удалена в `7.0`.
|
|
255
|
+
* Используйте `use="fill"`. */
|
|
223
256
|
static get btnDefaultHoverBorderColor(): string;
|
|
257
|
+
/**
|
|
258
|
+
* @deprecated Связана с устаревшим `use="default"`. Будет удалена в `7.0`.
|
|
259
|
+
* Используйте `use="fill"`. */
|
|
224
260
|
static btnDefaultHoverTextColor: string;
|
|
261
|
+
/**
|
|
262
|
+
* @deprecated Связана с устаревшим `use="default"`. Будет удалена в `7.0`.
|
|
263
|
+
* Используйте `use="fill"`. */
|
|
225
264
|
static get btnDefaultActiveBorderColor(): string;
|
|
265
|
+
/**
|
|
266
|
+
* @deprecated Связана с устаревшим `use="default"`. Будет удалена в `7.0`.
|
|
267
|
+
* Используйте `use="outline"` или `use="fill"`. */
|
|
226
268
|
static btnDefaultBorderColor: string;
|
|
269
|
+
/**
|
|
270
|
+
* @deprecated Связана с устаревшим `use="default"`. Будет удалена в `7.0`.
|
|
271
|
+
* Используйте `use="fill"`. */
|
|
227
272
|
static btnDefaultActiveShadow: string;
|
|
228
273
|
static btnSuccessBg: string;
|
|
229
274
|
static get btnSuccessBorderColor(): string;
|
|
@@ -241,18 +286,57 @@ export declare class BasicThemeClass {
|
|
|
241
286
|
static btnFillBg: string;
|
|
242
287
|
static btnFillHoverBg: string;
|
|
243
288
|
static btnFillActiveBg: string;
|
|
289
|
+
/**
|
|
290
|
+
* @deprecated Связана с устаревшим `use="primary"`. Будет удалена в `7.0`.
|
|
291
|
+
* Используйте `use="accent"`. */
|
|
244
292
|
static btnPrimaryBg: string;
|
|
293
|
+
/**
|
|
294
|
+
* @deprecated Связана с устаревшим `use="primary"`. Будет удалена в `7.0`.
|
|
295
|
+
* Используйте `use="accent"`. */
|
|
245
296
|
static btnPrimaryHoverBg: string;
|
|
297
|
+
/**
|
|
298
|
+
* @deprecated Связана с устаревшим `use="primary"`. Будет удалена в `7.0`.
|
|
299
|
+
* Используйте `use="accent"`. */
|
|
246
300
|
static btnPrimaryActiveBg: string;
|
|
301
|
+
/**
|
|
302
|
+
* @deprecated Связана с устаревшим `use="primary"`. Будет удалена в `7.0`.
|
|
303
|
+
* Используйте `use="accent"`. */
|
|
247
304
|
static btnPrimaryHoverTextColor: string;
|
|
305
|
+
/**
|
|
306
|
+
* @deprecated Связана с устаревшим `use="primary"`. Будет удалена в `7.0`.
|
|
307
|
+
* Используйте `use="accent"`. */
|
|
248
308
|
static get btnPrimaryBorderColor(): string;
|
|
309
|
+
/**
|
|
310
|
+
* @deprecated Связана с устаревшим `use="primary"`. Будет удалена в `7.0`.
|
|
311
|
+
* Используйте `use="accent"`. */
|
|
249
312
|
static get btnPrimaryHoverBorderColor(): string;
|
|
313
|
+
/**
|
|
314
|
+
* @deprecated Связана с устаревшим `use="primary"`. Будет удалена в `7.0`.
|
|
315
|
+
* Используйте `use="accent"`. */
|
|
250
316
|
static get btnPrimaryActiveBorderColor(): string;
|
|
317
|
+
/**
|
|
318
|
+
* @deprecated Связана с устаревшим `use="primary"`. Будет удалена в `7.0`.
|
|
319
|
+
* Используйте `use="accent"`. */
|
|
251
320
|
static btnPrimaryBgStart: string;
|
|
321
|
+
/**
|
|
322
|
+
* @deprecated Связана с устаревшим `use="primary"`. Будет удалена в `7.0`.
|
|
323
|
+
* Используйте `use="accent"`. */
|
|
252
324
|
static btnPrimaryBgEnd: string;
|
|
325
|
+
/**
|
|
326
|
+
* @deprecated Связана с устаревшим `use="primary"`. Будет удалена в `7.0`.
|
|
327
|
+
* Используйте `use="accent"`. */
|
|
253
328
|
static btnPrimaryTextColor: string;
|
|
329
|
+
/**
|
|
330
|
+
* @deprecated Связана с устаревшим `use="primary"`. Будет удалена в `7.0`.
|
|
331
|
+
* Используйте `use="accent"`. */
|
|
254
332
|
static btnPrimaryHoverBgStart: string;
|
|
333
|
+
/**
|
|
334
|
+
* @deprecated Связана с устаревшим `use="primary"`. Будет удалена в `7.0`.
|
|
335
|
+
* Используйте `use="accent"`. */
|
|
255
336
|
static btnPrimaryHoverBgEnd: string;
|
|
337
|
+
/**
|
|
338
|
+
* @deprecated Связана с устаревшим `use="primary"`. Будет удалена в `7.0`.
|
|
339
|
+
* Используйте `use="accent"`. */
|
|
256
340
|
static btnPrimaryActiveShadow: string;
|
|
257
341
|
static btnDangerBg: string;
|
|
258
342
|
static btnDangerHoverBg: string;
|
|
@@ -298,35 +382,113 @@ export declare class BasicThemeClass {
|
|
|
298
382
|
static get btnHeightSmall(): string;
|
|
299
383
|
static get btnHeightMedium(): string;
|
|
300
384
|
static get btnHeightLarge(): string;
|
|
385
|
+
/**
|
|
386
|
+
* @deprecated Связана с устаревшим `use="link"`. Будет удалена в `7.0`.
|
|
387
|
+
* Используйте компонент `Link`. */
|
|
301
388
|
static get btnLinkColor(): string;
|
|
389
|
+
/**
|
|
390
|
+
* @deprecated Связана с устаревшим `use="link"`. Будет удалена в `7.0`.
|
|
391
|
+
* Используйте компонент `Link`. */
|
|
302
392
|
static get btnLinkHoverColor(): string;
|
|
393
|
+
/**
|
|
394
|
+
* @deprecated Связана с устаревшим `use="link"`. Будет удалена в `7.0`.
|
|
395
|
+
* Используйте компонент `Link`. */
|
|
303
396
|
static get btnLinkActiveColor(): string;
|
|
397
|
+
/**
|
|
398
|
+
* @deprecated Связана с устаревшим `use="link"`. Будет удалена в `7.0`.
|
|
399
|
+
* Используйте компонент `Link`. */
|
|
304
400
|
static get btnLinkHoverTextDecoration(): string;
|
|
401
|
+
/**
|
|
402
|
+
* @deprecated Связана с устаревшим `use="link"`. Будет удалена в `7.0`.
|
|
403
|
+
* Используйте компонент `Link`. */
|
|
305
404
|
static get btnLinkTextDecorationColor(): string;
|
|
405
|
+
/**
|
|
406
|
+
* @deprecated Связана с устаревшим `use="link"`. Будет удалена в `7.0`.
|
|
407
|
+
* Используйте компонент `Link`. */
|
|
306
408
|
static get btnLinkTextDecorationStyle(): string;
|
|
409
|
+
/**
|
|
410
|
+
* @deprecated Связана с устаревшим `use="link"`. Будет удалена в `7.0`.
|
|
411
|
+
* Используйте компонент `Link`. */
|
|
307
412
|
static get btnLinkHoverTextDecorationStyle(): string;
|
|
413
|
+
/**
|
|
414
|
+
* @deprecated Связана с устаревшим `use="link"`. Будет удалена в `7.0`.
|
|
415
|
+
* Используйте компонент `Link`. */
|
|
308
416
|
static get btnLinkTextUnderlineOffset(): string;
|
|
417
|
+
/**
|
|
418
|
+
* @deprecated Связана с устаревшим `use="link"`. Будет удалена в `7.0`.
|
|
419
|
+
* Используйте компонент `Link`. */
|
|
309
420
|
static get btnLinkTextDecorationThickness(): string;
|
|
421
|
+
/**
|
|
422
|
+
* @deprecated Связана с устаревшим `use="link"`. Будет удалена в `7.0`.
|
|
423
|
+
* Используйте компонент `Link`. */
|
|
310
424
|
static get btnLinkTextUnderlineOpacity(): string;
|
|
425
|
+
/**
|
|
426
|
+
* @deprecated Связана с устаревшим `use="link"`. Будет удалена в `7.0`.
|
|
427
|
+
* Используйте компонент `Link`. */
|
|
311
428
|
static get btnLinkLineBorderBottomStyle(): string;
|
|
429
|
+
/**
|
|
430
|
+
* @deprecated Связана с устаревшим `use="link"`. Будет удалена в `7.0`.
|
|
431
|
+
* Используйте компонент `Link`. */
|
|
312
432
|
static get btnLinkHoverLineBorderBottomStyle(): string;
|
|
433
|
+
/**
|
|
434
|
+
* @deprecated Связана с устаревшим `use="link"`. Будет удалена в `7.0`.
|
|
435
|
+
* Используйте компонент `Link`. */
|
|
313
436
|
static get btnLinkLineBorderBottomWidth(): string;
|
|
437
|
+
/**
|
|
438
|
+
* @deprecated Связана с устаревшим `use="link"`. Будет удалена в `7.0`.
|
|
439
|
+
* Используйте компонент `Link`. */
|
|
314
440
|
static get btnLinkLineBorderBottomOpacity(): string;
|
|
441
|
+
/**
|
|
442
|
+
* @deprecated Связана с устаревшим `use="link"`. Будет удалена в `7.0`.
|
|
443
|
+
* Используйте компонент `Link`. */
|
|
315
444
|
static get btnLinkIconMarginRight(): string;
|
|
445
|
+
/**
|
|
446
|
+
* @deprecated Связана с устаревшим `use="link"`. Будет удалена в `7.0`.
|
|
447
|
+
* Используйте компонент `Link`. */
|
|
316
448
|
static get btnLinkIconMarginLeft(): string;
|
|
317
449
|
static get btnOutlineColorFocus(): string;
|
|
318
450
|
static btnInsetColor: string;
|
|
319
451
|
static get btnBorderColorFocus(): string;
|
|
452
|
+
/**
|
|
453
|
+
* @deprecated Связана с устаревшим `use="link"`. Будет удалена в `7.0`.
|
|
454
|
+
* Используйте компонент `Link`. */
|
|
320
455
|
static get btnLinkDisabledColor(): string;
|
|
321
456
|
static get btnDisabledTextColor(): string;
|
|
457
|
+
/**
|
|
458
|
+
* @deprecated Связана с устаревшим `use="backless"`. Будет удалена в `7.0`.
|
|
459
|
+
* Используйте `use="outline"`. */
|
|
322
460
|
static btnBacklessBg: string;
|
|
461
|
+
/**
|
|
462
|
+
* @deprecated Связана с устаревшим `use="backless"`. Будет удалена в `7.0`.
|
|
463
|
+
* Используйте `use="outline"`. */
|
|
323
464
|
static btnBacklessHoverBg: string;
|
|
465
|
+
/**
|
|
466
|
+
* @deprecated Связана с устаревшим `use="backless"`. Будет удалена в `7.0`.
|
|
467
|
+
* Используйте `use="outline"`. */
|
|
324
468
|
static btnBacklessActiveBg: string;
|
|
469
|
+
/**
|
|
470
|
+
* @deprecated Связана с устаревшим `use="backless"`. Будет удалена в `7.0`.
|
|
471
|
+
* Используйте `use="outline"`. */
|
|
325
472
|
static get btnBacklessActiveBorderColor(): string;
|
|
473
|
+
/**
|
|
474
|
+
* @deprecated Связана с устаревшим `use="backless"`. Будет удалена в `7.0`.
|
|
475
|
+
* Используйте `use="outline"`. */
|
|
326
476
|
static get btnBacklessBorderColor(): string;
|
|
477
|
+
/**
|
|
478
|
+
* @deprecated Связана с устаревшим `use="backless"`. Будет удалена в `7.0`.
|
|
479
|
+
* Используйте `use="outline"`. */
|
|
327
480
|
static get btnBacklessDisabledBorderColor(): string;
|
|
481
|
+
/**
|
|
482
|
+
* @deprecated Связана с устаревшим `use="backless"`. Будет удалена в `7.0`.
|
|
483
|
+
* Используйте `use="outline"`. */
|
|
328
484
|
static get btnBacklessHoverBorderColor(): string;
|
|
485
|
+
/**
|
|
486
|
+
* @deprecated Связана с устаревшим `use="backless"`. Будет удалена в `7.0`.
|
|
487
|
+
* Используйте `use="outline"`. */
|
|
329
488
|
static btnBacklessHoverTextColor: string;
|
|
489
|
+
/**
|
|
490
|
+
* @deprecated Связана с устаревшим `use="backless"`. Будет удалена в `7.0`.
|
|
491
|
+
* Используйте `use="outline"`. */
|
|
330
492
|
static get btnBacklessTextColor(): string;
|
|
331
493
|
static btnTextBg: string;
|
|
332
494
|
static btnTextHoverBg: string;
|