@skbkontur/react-ui 6.4.3 → 6.4.4
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,17 @@
|
|
|
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.4.4](https://github.com/skbkontur/retail-ui/compare/@skbkontur/react-ui@6.4.3...@skbkontur/react-ui@6.4.4) (2026-10-13)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
### Bug Fixes
|
|
10
|
+
|
|
11
|
+
* **Textarea:** add feedback when maxLength is exceeded ([8586ee5](https://github.com/skbkontur/retail-ui/commit/8586ee50b864dc44ebf274435d58916e0b5254da))
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
6
17
|
## [6.4.3](https://github.com/skbkontur/retail-ui/compare/@skbkontur/react-ui@6.4.2...@skbkontur/react-ui@6.4.3) (2026-10-13)
|
|
7
18
|
|
|
8
19
|
|
|
@@ -107,6 +107,10 @@ export declare class Textarea extends React.Component<TextareaProps, TextareaSta
|
|
|
107
107
|
*/
|
|
108
108
|
blur(): void;
|
|
109
109
|
getNode(): Nullable<HTMLTextAreaElement>;
|
|
110
|
+
/** Кратковременно визуально подсвечивает поле ввода, чтобы привлечь внимание пользователя.
|
|
111
|
+
* @public
|
|
112
|
+
*/
|
|
113
|
+
blink(): void;
|
|
110
114
|
/** start - инициирует последовательное изменение числового значения: начинает повторяющееся увеличение/уменьшение, обычно используется при удерживании кнопки «+» или «−» для числового Input. end - останавливает ранее запущенное числоизменение, инициируемое numberStart.
|
|
111
115
|
* [Документация](https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/setSelectionRange)
|
|
112
116
|
* @public
|
|
@@ -121,6 +125,7 @@ export declare class Textarea extends React.Component<TextareaProps, TextareaSta
|
|
|
121
125
|
private renderMain;
|
|
122
126
|
private handleCloseCounterHelp;
|
|
123
127
|
private handleKeyDown;
|
|
128
|
+
private handleBeforeInput;
|
|
124
129
|
private handleChange;
|
|
125
130
|
private ref;
|
|
126
131
|
private refFake;
|
|
@@ -47,6 +47,7 @@ import warning from 'warning';
|
|
|
47
47
|
import { CommonWrapper } from '../../internal/CommonWrapper/index.js';
|
|
48
48
|
import { RenderLayer } from '../../internal/RenderLayer/index.js';
|
|
49
49
|
import { ResizeDetector } from '../../internal/ResizeDetector/index.js';
|
|
50
|
+
import { blink } from '../../lib/blink.js';
|
|
50
51
|
import { isSafariWithTextareaBug } from '../../lib/client.js';
|
|
51
52
|
import { createPropsGetter } from '../../lib/createPropsGetter.js';
|
|
52
53
|
import { isTestEnv } from '../../lib/currentEnvironment.js';
|
|
@@ -169,7 +170,7 @@ var Textarea = /** @class */ (function (_super) {
|
|
|
169
170
|
_b)) }),
|
|
170
171
|
placeholderPolyfill,
|
|
171
172
|
React.createElement(ResizeDetector, { onResize: _this.reflowCounter, alignBaseline: true },
|
|
172
|
-
React.createElement(Component, __assign({}, textareaProps, { className: textareaClassNames, style: textareaStyle, placeholder: !placeholderPolyfill ? placeholder : undefined, ref: _this.ref, onChange: _this.handleChange, onCut: _this.handleCut, onPaste: _this.handlePaste, onFocus: _this.handleFocus, onKeyDown: _this.handleKeyDown, disabled: disabled }), _this.props.children)),
|
|
173
|
+
React.createElement(Component, __assign({}, textareaProps, { className: textareaClassNames, style: textareaStyle, placeholder: !placeholderPolyfill ? placeholder : undefined, ref: _this.ref, onChange: _this.handleChange, onCut: _this.handleCut, onPaste: _this.handlePaste, onFocus: _this.handleFocus, onKeyDown: _this.handleKeyDown, onBeforeInput: _this.handleBeforeInput, disabled: disabled }), _this.props.children)),
|
|
173
174
|
fakeTextarea,
|
|
174
175
|
counter)));
|
|
175
176
|
};
|
|
@@ -181,11 +182,25 @@ var Textarea = /** @class */ (function (_super) {
|
|
|
181
182
|
var isBlockEnter = isKeyEnter(e) && value !== null && value.length === _this.props.maxLength;
|
|
182
183
|
if (isBlockEnter) {
|
|
183
184
|
e.preventDefault();
|
|
185
|
+
var _a = e.currentTarget, selectionStart = _a.selectionStart, selectionEnd = _a.selectionEnd;
|
|
186
|
+
if (!_this.props.readOnly && selectionStart === selectionEnd) {
|
|
187
|
+
_this.blink();
|
|
188
|
+
}
|
|
184
189
|
}
|
|
185
190
|
if (_this.props.onKeyDown) {
|
|
186
191
|
_this.props.onKeyDown(e);
|
|
187
192
|
}
|
|
188
193
|
};
|
|
194
|
+
_this.handleBeforeInput = function (e) {
|
|
195
|
+
if (_this.props.onBeforeInput) {
|
|
196
|
+
_this.props.onBeforeInput(e);
|
|
197
|
+
}
|
|
198
|
+
var _a = e.currentTarget, value = _a.value, selectionStart = _a.selectionStart, selectionEnd = _a.selectionEnd;
|
|
199
|
+
var isMaxLengthReached = _this.props.maxLength === value.length;
|
|
200
|
+
if (isMaxLengthReached && !_this.props.readOnly && selectionStart === selectionEnd) {
|
|
201
|
+
_this.blink();
|
|
202
|
+
}
|
|
203
|
+
};
|
|
189
204
|
_this.handleChange = function (e) {
|
|
190
205
|
if (needsPolyfillPlaceholder) {
|
|
191
206
|
var fieldIsEmpty = e.target.value === '';
|
|
@@ -259,6 +274,12 @@ var Textarea = /** @class */ (function (_super) {
|
|
|
259
274
|
if (_this.props.onPaste) {
|
|
260
275
|
_this.props.onPaste(event);
|
|
261
276
|
}
|
|
277
|
+
var _a = event.currentTarget, value = _a.value, selectionStart = _a.selectionStart, selectionEnd = _a.selectionEnd;
|
|
278
|
+
var pastedText = event.clipboardData.getData('text/plain').replace(/\r\n?/g, '\n');
|
|
279
|
+
var nextLength = value.length - (selectionEnd - selectionStart) + pastedText.length;
|
|
280
|
+
if (!_this.props.readOnly && _this.props.maxLength !== undefined && nextLength > _this.props.maxLength) {
|
|
281
|
+
_this.blink();
|
|
282
|
+
}
|
|
262
283
|
_this.reflowCounter();
|
|
263
284
|
};
|
|
264
285
|
_this.handleFocus = function (event) {
|
|
@@ -365,6 +386,12 @@ var Textarea = /** @class */ (function (_super) {
|
|
|
365
386
|
Textarea.prototype.getNode = function () {
|
|
366
387
|
return this.node;
|
|
367
388
|
};
|
|
389
|
+
/** Кратковременно визуально подсвечивает поле ввода, чтобы привлечь внимание пользователя.
|
|
390
|
+
* @public
|
|
391
|
+
*/
|
|
392
|
+
Textarea.prototype.blink = function () {
|
|
393
|
+
blink({ el: this.node, blinkColor: this.theme.inputBlinkColor });
|
|
394
|
+
};
|
|
368
395
|
var Textarea_1;
|
|
369
396
|
Textarea.__KONTUR_REACT_UI__ = 'Textarea';
|
|
370
397
|
Textarea.displayName = 'Textarea';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Textarea.js","sourceRoot":"","sources":["Textarea.tsx"],"names":[],"mappings":"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","sourcesContent":["import type { Emotion } from '@emotion/css/create-instance';\nimport throttle from 'lodash.throttle';\nimport type { AriaAttributes, ReactNode } from 'react';\nimport React from 'react';\nimport warning from 'warning';\n\nimport type { CommonProps, CommonWrapperRestProps } from '../../internal/CommonWrapper/index.js';\nimport { CommonWrapper } from '../../internal/CommonWrapper/index.js';\nimport { RenderLayer } from '../../internal/RenderLayer/index.js';\nimport { ResizeDetector } from '../../internal/ResizeDetector/index.js';\nimport { isSafariWithTextareaBug } from '../../lib/client.js';\nimport { createPropsGetter } from '../../lib/createPropsGetter.js';\nimport { isTestEnv } from '../../lib/currentEnvironment.js';\nimport { isKeyEnter } from '../../lib/events/keyboard/identifiers.js';\nimport type { GlobalObject } from '../../lib/globalObject.js';\nimport * as LayoutEvents from '../../lib/LayoutEvents.js';\nimport { needsPolyfillPlaceholder } from '../../lib/needsPolyfillPlaceholder.js';\nimport { withRenderEnvironment } from '../../lib/renderEnvironment/index.js';\nimport type { TGetRootNode, TSetRootNode } from '../../lib/rootNode/index.js';\nimport { rootNode } from '../../lib/rootNode/index.js';\nimport { withSize } from '../../lib/size/SizeDecorator.js';\nimport type { Theme } from '../../lib/theming/Theme.js';\nimport { ThemeContext } from '../../lib/theming/ThemeContext.js';\nimport type { SizeProp } from '../../lib/types/props.js';\nimport type { Nullable, Override } from '../../typings/utility-types.js';\nimport type { InputAlign } from '../Input/index.js';\nimport { getStyles } from './Textarea.styles.js';\nimport { TextareaCounter } from './TextareaCounter.js';\nimport type { TextareaCounterRef } from './TextareaCounter.js';\nimport { getTextAreaHeight } from './TextareaHelpers.js';\nimport { TextareaWithSafari17Workaround } from './TextareaWithSafari17Workaround.js';\n\nexport const DEFAULT_WIDTH = 250;\nconst AUTORESIZE_THROTTLE_DEFAULT_WAIT = 100;\n\nexport interface TextareaProps\n extends\n Pick<AriaAttributes, 'aria-controls' | 'aria-label'>,\n CommonProps,\n Override<\n React.TextareaHTMLAttributes<HTMLTextAreaElement>,\n {\n /** Меняет визуальное отображение поля на состояние ошибки. */\n error?: boolean;\n\n /** Меняет визуальное отображение поля на состояние предупреждения. */\n warning?: boolean;\n\n /** Блокирует поле. */\n disabled?: boolean;\n\n /** Размер многострочного поля. */\n size?: SizeProp;\n\n /** Выполняет автоматический ресайз в зависимости от количества текста в поле. Связан с пропом `extraRow`, который всегда добавляет дополнительную пустую строку. */\n autoResize?: boolean;\n\n /** Высота поля — число видимых строк. При превышении этой высоты появляется скролл. */\n rows?: number;\n\n /** Максимальное число видимых строк при автоматическом ресайзе. */\n maxRows?: string | number;\n\n /** Направление ресайза поля.\n * Попадает в `style`. Описание всех значений смотрите [в документации MDN](https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Properties/resize). */\n resize?: React.CSSProperties['resize'];\n\n /** Ширина многострочного поля. */\n width?: React.CSSProperties['width'];\n\n /** Событие изменения `value`. */\n onValueChange?: (value: string) => void;\n\n /** Выделяет введённое значение при фокусе в поле. Работает с типами `text`, `password`, `tel`, `search`, `url`. */\n selectAllOnFocus?: boolean;\n\n /** Отображает счётчик введённых символов. */\n showLengthCounter?: boolean;\n\n /** Допустимое количество символов в поле. Отображается в счётчике символов.\n * @default maxLength */\n lengthCounter?: number;\n\n /** Добавляет подсказку к счётчику символов.\n * По умолчанию - тултип с содержимым из пропа, если передан `ReactNode`.\n * Передав функцию, можно переопределить подсказку целиком, вместе с иконкой.\n * @example\n * ```\n * counterHelp={() => <Tooltip render={...}><HelpIcon /></Tooltip>}\n * ``` */\n counterHelp?: ReactNode | (() => ReactNode);\n\n /** Добавляет дополнительную свободную строку при автоматическом ресайзе.\n * @see https://guides.kontur.ru/components/textarea/#04 */\n extraRow?: boolean;\n\n /** Отключает анимацию при автоматическом ресайзе. Автоматически отключается, когда в `extraRow` передан `false`. */\n disableAnimations?: boolean;\n\n /** Выравнивание текста в поле. */\n align?: InputAlign;\n }\n > {}\n\nexport interface TextareaState {\n needsPolyfillPlaceholder: boolean;\n isCounterVisible: boolean;\n}\n\nexport const TextareaDataTids = {\n root: 'Textarea__root',\n counter: 'TextareaCounter__root',\n helpIcon: 'TextareaCounter__helpIcon',\n} as const;\n\ntype DefaultProps = Required<Pick<TextareaProps, 'rows' | 'maxRows' | 'extraRow' | 'disableAnimations'>>;\n\n/**\n * Многострочное поле — это поле ввода, в котором текст отображается в несколько строк.\n */\n@withRenderEnvironment\n@rootNode\n@withSize\nexport class Textarea extends React.Component<TextareaProps, TextareaState> {\n public static __KONTUR_REACT_UI__ = 'Textarea';\n public static displayName = 'Textarea';\n\n public static defaultProps: DefaultProps = {\n rows: 3,\n maxRows: 15,\n extraRow: true,\n disableAnimations: isTestEnv,\n };\n\n public clear = (): void => {\n if (this.node) {\n this.node.value = '';\n }\n if (this.fakeNode) {\n this.fakeNode.value = '';\n }\n };\n\n private getProps = createPropsGetter(Textarea.defaultProps);\n\n private getRootSizeClassName() {\n switch (this.size) {\n case 'large':\n return this.styles.rootLarge(this.theme);\n case 'medium':\n return this.styles.rootMedium(this.theme);\n case 'small':\n default:\n return this.styles.rootSmall(this.theme);\n }\n }\n\n private getTextareaSizeClassName() {\n switch (this.size) {\n case 'large':\n return this.styles.textareaLarge(this.theme);\n case 'medium':\n return this.styles.textareaMedium(this.theme);\n case 'small':\n default:\n return this.styles.textareaSmall(this.theme);\n }\n }\n\n public state = {\n needsPolyfillPlaceholder,\n isCounterVisible: false,\n };\n private size!: SizeProp;\n\n private reflowCounter = () => {\n if (this.counter) {\n this.counter.reflow();\n }\n };\n\n private styles!: ReturnType<typeof getStyles>;\n private emotion!: Emotion;\n private cx!: Emotion['cx'];\n private globalObject!: GlobalObject;\n private theme!: Theme;\n private selectAllId: number | null = null;\n private node: Nullable<HTMLTextAreaElement>;\n private fakeNode: Nullable<HTMLTextAreaElement>;\n private counter: Nullable<TextareaCounterRef>;\n private layoutEvents: Nullable<{ remove: () => void }>;\n private textareaObserver: Nullable<MutationObserver>;\n public getRootNode!: TGetRootNode;\n private setRootNode!: TSetRootNode;\n private getAutoResizeThrottleWait(props: TextareaProps = this.props): number {\n // NOTE: При отключении анимации остается эффект дергания при авто-ресайзе из-за троттлинга расчета высоты\n // Поэтому выставляем таймаут троттла в ноль. Подробности - https://github.com/skbkontur/retail-ui/issues/2120\n return this.isAnimationsDisabled(props) ? 0 : AUTORESIZE_THROTTLE_DEFAULT_WAIT;\n }\n private isAnimationsDisabled({ disableAnimations, extraRow }: TextareaProps = this.props): boolean {\n return disableAnimations || !extraRow;\n }\n\n public componentDidMount() {\n this.textareaObserver = this.globalObject.MutationObserver\n ? new this.globalObject.MutationObserver(this.reflowCounter)\n : null;\n if (this.props.autoResize) {\n this.autoResize();\n this.layoutEvents = LayoutEvents.addListener(this.autoResize, this.globalObject);\n }\n\n if (this.node && this.props.showLengthCounter && this.textareaObserver) {\n this.textareaObserver.observe(this.node, { attributes: true });\n }\n }\n\n public componentWillUnmount() {\n if (this.layoutEvents) {\n this.layoutEvents.remove();\n }\n if (this.props.showLengthCounter && this.textareaObserver) {\n this.textareaObserver.disconnect();\n }\n this.cancelDelayedSelectAll();\n }\n\n public componentDidUpdate(prevProps: TextareaProps) {\n if (this.getAutoResizeThrottleWait() !== this.getAutoResizeThrottleWait(prevProps)) {\n this.autoResize.cancel();\n this.autoResize = throttle(this.autoResizeHandler, this.getAutoResizeThrottleWait());\n }\n const { rows, maxRows } = this.getProps();\n if (\n this.props.autoResize &&\n (rows !== prevProps.rows || maxRows !== prevProps.maxRows || this.props.value !== prevProps.value)\n ) {\n this.autoResize();\n }\n }\n\n public render(): React.JSX.Element {\n this.styles = getStyles(this.emotion);\n\n return (\n <ThemeContext.Consumer>\n {(theme) => {\n this.theme = theme;\n return (\n <CommonWrapper rootNodeRef={this.setRootNode} {...this.getProps()}>\n {this.renderMain}\n </CommonWrapper>\n );\n }}\n </ThemeContext.Consumer>\n );\n }\n\n /** Программно устанавливает фокус на поле.\n * @public\n */\n public focus(): void {\n if (this.node) {\n this.node.focus();\n }\n }\n\n /** Программно снимает фокус с поля.\n * @public\n */\n public blur(): void {\n if (this.node) {\n this.node.blur();\n }\n }\n\n public getNode(): Nullable<HTMLTextAreaElement> {\n return this.node;\n }\n\n /** start - инициирует последовательное изменение числового значения: начинает повторяющееся увеличение/уменьшение, обычно используется при удерживании кнопки «+» или «−» для числового Input. end - останавливает ранее запущенное числоизменение, инициируемое numberStart.\n * [Документация](https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/setSelectionRange)\n * @public\n */\n public setSelectionRange = (start: number, end: number): void => {\n if (!this.node) {\n warning(false, 'Cannot call \"setSelectionRange\" on unmounted Input');\n return;\n }\n\n if (this.globalObject.document?.activeElement !== this.node) {\n this.focus();\n }\n\n this.node.setSelectionRange(start, end);\n };\n\n /** Переводит фокус в поле (если ещё не в фокусе) и выделяет весь текст в нём.\n * Работает с типами `text`, `password`, `tel`, `search`, `url`.\n * @public\n */\n public selectAll = (): void => {\n if (this.node) {\n this.setSelectionRange(0, this.node.value.length);\n }\n };\n\n private cancelDelayedSelectAll = (): void => {\n if (this.selectAllId) {\n this.globalObject.cancelAnimationFrame?.(this.selectAllId);\n this.selectAllId = null;\n }\n };\n\n private renderMain = (props: CommonWrapperRestProps<TextareaProps>) => {\n const {\n width = DEFAULT_WIDTH,\n error,\n warning,\n size,\n autoResize,\n resize,\n onCut,\n onPaste,\n maxRows,\n onFocus,\n selectAllOnFocus,\n placeholder,\n onValueChange,\n showLengthCounter,\n lengthCounter,\n counterHelp,\n extraRow,\n disableAnimations,\n disabled,\n ...textareaProps\n } = props;\n\n const { isCounterVisible } = this.state;\n\n const rootProps = {\n style: {\n width,\n },\n };\n\n const textareaClassNames = this.cx(this.getTextareaSizeClassName(), {\n [this.styles.textarea(this.theme)]: true,\n [this.styles.hovering(this.theme)]: !error && !warning,\n [this.styles.disabled(this.theme)]: disabled,\n [this.styles.error(this.theme)]: !!error,\n [this.styles.warning(this.theme)]: !!warning,\n [this.styles.disableAnimations()]: this.isAnimationsDisabled(),\n });\n\n const textareaStyle = {\n resize: autoResize ? 'none' : resize,\n textAlign: this.props.align,\n };\n\n let placeholderPolyfill = null;\n\n if (this.state.needsPolyfillPlaceholder && !textareaProps.value && !textareaProps.defaultValue) {\n placeholderPolyfill = <span className={this.styles.placeholder()}>{placeholder}</span>;\n }\n\n let fakeTextarea = null;\n if (autoResize) {\n const fakeProps = {\n value: this.props.value,\n defaultValue: this.props.defaultValue,\n className: this.cx(textareaClassNames, this.styles.fake()),\n readOnly: true,\n };\n fakeTextarea = <textarea {...fakeProps} ref={this.refFake} />;\n }\n\n const counter = showLengthCounter && isCounterVisible && this.node && (\n <TextareaCounter\n textarea={this.node}\n size={this.size}\n help={counterHelp}\n value={textareaProps.value}\n length={textareaProps.maxLength ?? lengthCounter ?? 0}\n onCloseHelp={this.handleCloseCounterHelp}\n ref={this.refCounter}\n />\n );\n\n const Component = isSafariWithTextareaBug ? TextareaWithSafari17Workaround : 'textarea';\n\n return (\n <RenderLayer\n onFocusOutside={this.handleCloseCounterHelp}\n onClickOutside={this.handleCloseCounterHelp}\n active={this.state.isCounterVisible}\n >\n <label\n data-tid={TextareaDataTids.root}\n {...rootProps}\n className={this.cx(this.getRootSizeClassName(), {\n [this.styles.root()]: true,\n })}\n >\n {placeholderPolyfill}\n <ResizeDetector onResize={this.reflowCounter} alignBaseline>\n <Component\n {...textareaProps}\n className={textareaClassNames}\n style={textareaStyle}\n placeholder={!placeholderPolyfill ? placeholder : undefined}\n ref={this.ref}\n onChange={this.handleChange}\n onCut={this.handleCut}\n onPaste={this.handlePaste}\n onFocus={this.handleFocus}\n onKeyDown={this.handleKeyDown}\n disabled={disabled}\n >\n {this.props.children}\n </Component>\n </ResizeDetector>\n {fakeTextarea}\n {counter}\n </label>\n </RenderLayer>\n );\n };\n\n private handleCloseCounterHelp = () => this.setState({ isCounterVisible: false });\n\n private handleKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n // Edge bug: textarea maxlength doesn't work after new line\n // https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/18833616/\n const value = this.props.value !== undefined ? this.props.value.toString() : null;\n const isBlockEnter = isKeyEnter(e) && value !== null && value.length === this.props.maxLength;\n\n if (isBlockEnter) {\n e.preventDefault();\n }\n\n if (this.props.onKeyDown) {\n this.props.onKeyDown(e);\n }\n };\n\n private handleChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n if (needsPolyfillPlaceholder) {\n const fieldIsEmpty = e.target.value === '';\n\n if (this.state.needsPolyfillPlaceholder !== fieldIsEmpty) {\n this.setState({ needsPolyfillPlaceholder: fieldIsEmpty });\n }\n }\n\n if (this.props.onValueChange) {\n this.props.onValueChange(e.target.value);\n }\n\n if (this.props.autoResize) {\n this.autoResize();\n }\n\n if (this.props.onChange) {\n this.props.onChange(e);\n }\n\n this.reflowCounter();\n };\n\n private ref = (element: HTMLTextAreaElement) => {\n this.node = element;\n };\n\n private refFake = (element: HTMLTextAreaElement) => {\n this.fakeNode = element;\n };\n\n private refCounter = (ref: TextareaCounterRef | null) => {\n this.counter = ref;\n };\n\n private autoResizeHandler = () => {\n const fakeNode = this.fakeNode;\n if (!fakeNode) {\n return;\n }\n const node = this.node;\n if (!node) {\n return;\n }\n if (this.props.value === undefined) {\n fakeNode.value = node.value;\n }\n\n const { rows, maxRows } = this.getProps();\n if (rows === undefined || maxRows === undefined) {\n return;\n }\n\n const { height, exceededMaxHeight } =\n getTextAreaHeight(this.globalObject, {\n node: fakeNode,\n minRows: typeof rows === 'number' ? rows : parseInt(rows, 10),\n maxRows: typeof maxRows === 'number' ? maxRows : parseInt(maxRows, 10),\n extraRow: this.getProps().extraRow,\n }) || {};\n\n if (height === undefined || exceededMaxHeight === undefined) {\n return;\n }\n\n node.style.height = height + 'px';\n node.style.overflowY = exceededMaxHeight ? 'scroll' : 'hidden';\n fakeNode.style.overflowY = exceededMaxHeight ? 'scroll' : 'hidden';\n };\n\n private autoResize = throttle(this.autoResizeHandler, this.getAutoResizeThrottleWait());\n\n private handleCut = (event: React.ClipboardEvent<HTMLTextAreaElement>) => {\n if (this.props.autoResize) {\n this.autoResize();\n }\n\n if (this.props.onCut) {\n this.props.onCut(event);\n }\n\n this.reflowCounter();\n };\n\n private handlePaste = (event: React.ClipboardEvent<HTMLTextAreaElement>) => {\n if (this.props.autoResize) {\n this.autoResize();\n }\n\n if (this.props.onPaste) {\n this.props.onPaste(event);\n }\n\n this.reflowCounter();\n };\n\n private handleFocus = (event: React.FocusEvent<HTMLTextAreaElement>) => {\n this.setState({ isCounterVisible: true });\n\n if (this.props.selectAllOnFocus) {\n // https://github.com/facebook/react/issues/7769\n this.node && this.selectAll();\n }\n\n if (this.props.onFocus) {\n this.props.onFocus(event);\n }\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"Textarea.js","sourceRoot":"","sources":["Textarea.tsx"],"names":[],"mappings":"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","sourcesContent":["import type { Emotion } from '@emotion/css/create-instance';\nimport throttle from 'lodash.throttle';\nimport type { AriaAttributes, ReactNode } from 'react';\nimport React from 'react';\nimport warning from 'warning';\n\nimport type { CommonProps, CommonWrapperRestProps } from '../../internal/CommonWrapper/index.js';\nimport { CommonWrapper } from '../../internal/CommonWrapper/index.js';\nimport { RenderLayer } from '../../internal/RenderLayer/index.js';\nimport { ResizeDetector } from '../../internal/ResizeDetector/index.js';\nimport { blink } from '../../lib/blink.js';\nimport { isSafariWithTextareaBug } from '../../lib/client.js';\nimport { createPropsGetter } from '../../lib/createPropsGetter.js';\nimport { isTestEnv } from '../../lib/currentEnvironment.js';\nimport { isKeyEnter } from '../../lib/events/keyboard/identifiers.js';\nimport type { GlobalObject } from '../../lib/globalObject.js';\nimport * as LayoutEvents from '../../lib/LayoutEvents.js';\nimport { needsPolyfillPlaceholder } from '../../lib/needsPolyfillPlaceholder.js';\nimport { withRenderEnvironment } from '../../lib/renderEnvironment/index.js';\nimport type { TGetRootNode, TSetRootNode } from '../../lib/rootNode/index.js';\nimport { rootNode } from '../../lib/rootNode/index.js';\nimport { withSize } from '../../lib/size/SizeDecorator.js';\nimport type { Theme } from '../../lib/theming/Theme.js';\nimport { ThemeContext } from '../../lib/theming/ThemeContext.js';\nimport type { SizeProp } from '../../lib/types/props.js';\nimport type { Nullable, Override } from '../../typings/utility-types.js';\nimport type { InputAlign } from '../Input/index.js';\nimport { getStyles } from './Textarea.styles.js';\nimport { TextareaCounter } from './TextareaCounter.js';\nimport type { TextareaCounterRef } from './TextareaCounter.js';\nimport { getTextAreaHeight } from './TextareaHelpers.js';\nimport { TextareaWithSafari17Workaround } from './TextareaWithSafari17Workaround.js';\n\nexport const DEFAULT_WIDTH = 250;\nconst AUTORESIZE_THROTTLE_DEFAULT_WAIT = 100;\n\nexport interface TextareaProps\n extends\n Pick<AriaAttributes, 'aria-controls' | 'aria-label'>,\n CommonProps,\n Override<\n React.TextareaHTMLAttributes<HTMLTextAreaElement>,\n {\n /** Меняет визуальное отображение поля на состояние ошибки. */\n error?: boolean;\n\n /** Меняет визуальное отображение поля на состояние предупреждения. */\n warning?: boolean;\n\n /** Блокирует поле. */\n disabled?: boolean;\n\n /** Размер многострочного поля. */\n size?: SizeProp;\n\n /** Выполняет автоматический ресайз в зависимости от количества текста в поле. Связан с пропом `extraRow`, который всегда добавляет дополнительную пустую строку. */\n autoResize?: boolean;\n\n /** Высота поля — число видимых строк. При превышении этой высоты появляется скролл. */\n rows?: number;\n\n /** Максимальное число видимых строк при автоматическом ресайзе. */\n maxRows?: string | number;\n\n /** Направление ресайза поля.\n * Попадает в `style`. Описание всех значений смотрите [в документации MDN](https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Properties/resize). */\n resize?: React.CSSProperties['resize'];\n\n /** Ширина многострочного поля. */\n width?: React.CSSProperties['width'];\n\n /** Событие изменения `value`. */\n onValueChange?: (value: string) => void;\n\n /** Выделяет введённое значение при фокусе в поле. Работает с типами `text`, `password`, `tel`, `search`, `url`. */\n selectAllOnFocus?: boolean;\n\n /** Отображает счётчик введённых символов. */\n showLengthCounter?: boolean;\n\n /** Допустимое количество символов в поле. Отображается в счётчике символов.\n * @default maxLength */\n lengthCounter?: number;\n\n /** Добавляет подсказку к счётчику символов.\n * По умолчанию - тултип с содержимым из пропа, если передан `ReactNode`.\n * Передав функцию, можно переопределить подсказку целиком, вместе с иконкой.\n * @example\n * ```\n * counterHelp={() => <Tooltip render={...}><HelpIcon /></Tooltip>}\n * ``` */\n counterHelp?: ReactNode | (() => ReactNode);\n\n /** Добавляет дополнительную свободную строку при автоматическом ресайзе.\n * @see https://guides.kontur.ru/components/textarea/#04 */\n extraRow?: boolean;\n\n /** Отключает анимацию при автоматическом ресайзе. Автоматически отключается, когда в `extraRow` передан `false`. */\n disableAnimations?: boolean;\n\n /** Выравнивание текста в поле. */\n align?: InputAlign;\n }\n > {}\n\nexport interface TextareaState {\n needsPolyfillPlaceholder: boolean;\n isCounterVisible: boolean;\n}\n\nexport const TextareaDataTids = {\n root: 'Textarea__root',\n counter: 'TextareaCounter__root',\n helpIcon: 'TextareaCounter__helpIcon',\n} as const;\n\ntype DefaultProps = Required<Pick<TextareaProps, 'rows' | 'maxRows' | 'extraRow' | 'disableAnimations'>>;\n\n/**\n * Многострочное поле — это поле ввода, в котором текст отображается в несколько строк.\n */\n@withRenderEnvironment\n@rootNode\n@withSize\nexport class Textarea extends React.Component<TextareaProps, TextareaState> {\n public static __KONTUR_REACT_UI__ = 'Textarea';\n public static displayName = 'Textarea';\n\n public static defaultProps: DefaultProps = {\n rows: 3,\n maxRows: 15,\n extraRow: true,\n disableAnimations: isTestEnv,\n };\n\n public clear = (): void => {\n if (this.node) {\n this.node.value = '';\n }\n if (this.fakeNode) {\n this.fakeNode.value = '';\n }\n };\n\n private getProps = createPropsGetter(Textarea.defaultProps);\n\n private getRootSizeClassName() {\n switch (this.size) {\n case 'large':\n return this.styles.rootLarge(this.theme);\n case 'medium':\n return this.styles.rootMedium(this.theme);\n case 'small':\n default:\n return this.styles.rootSmall(this.theme);\n }\n }\n\n private getTextareaSizeClassName() {\n switch (this.size) {\n case 'large':\n return this.styles.textareaLarge(this.theme);\n case 'medium':\n return this.styles.textareaMedium(this.theme);\n case 'small':\n default:\n return this.styles.textareaSmall(this.theme);\n }\n }\n\n public state = {\n needsPolyfillPlaceholder,\n isCounterVisible: false,\n };\n private size!: SizeProp;\n\n private reflowCounter = () => {\n if (this.counter) {\n this.counter.reflow();\n }\n };\n\n private styles!: ReturnType<typeof getStyles>;\n private emotion!: Emotion;\n private cx!: Emotion['cx'];\n private globalObject!: GlobalObject;\n private theme!: Theme;\n private selectAllId: number | null = null;\n private node: Nullable<HTMLTextAreaElement>;\n private fakeNode: Nullable<HTMLTextAreaElement>;\n private counter: Nullable<TextareaCounterRef>;\n private layoutEvents: Nullable<{ remove: () => void }>;\n private textareaObserver: Nullable<MutationObserver>;\n public getRootNode!: TGetRootNode;\n private setRootNode!: TSetRootNode;\n private getAutoResizeThrottleWait(props: TextareaProps = this.props): number {\n // NOTE: При отключении анимации остается эффект дергания при авто-ресайзе из-за троттлинга расчета высоты\n // Поэтому выставляем таймаут троттла в ноль. Подробности - https://github.com/skbkontur/retail-ui/issues/2120\n return this.isAnimationsDisabled(props) ? 0 : AUTORESIZE_THROTTLE_DEFAULT_WAIT;\n }\n private isAnimationsDisabled({ disableAnimations, extraRow }: TextareaProps = this.props): boolean {\n return disableAnimations || !extraRow;\n }\n\n public componentDidMount() {\n this.textareaObserver = this.globalObject.MutationObserver\n ? new this.globalObject.MutationObserver(this.reflowCounter)\n : null;\n if (this.props.autoResize) {\n this.autoResize();\n this.layoutEvents = LayoutEvents.addListener(this.autoResize, this.globalObject);\n }\n\n if (this.node && this.props.showLengthCounter && this.textareaObserver) {\n this.textareaObserver.observe(this.node, { attributes: true });\n }\n }\n\n public componentWillUnmount() {\n if (this.layoutEvents) {\n this.layoutEvents.remove();\n }\n if (this.props.showLengthCounter && this.textareaObserver) {\n this.textareaObserver.disconnect();\n }\n this.cancelDelayedSelectAll();\n }\n\n public componentDidUpdate(prevProps: TextareaProps) {\n if (this.getAutoResizeThrottleWait() !== this.getAutoResizeThrottleWait(prevProps)) {\n this.autoResize.cancel();\n this.autoResize = throttle(this.autoResizeHandler, this.getAutoResizeThrottleWait());\n }\n const { rows, maxRows } = this.getProps();\n if (\n this.props.autoResize &&\n (rows !== prevProps.rows || maxRows !== prevProps.maxRows || this.props.value !== prevProps.value)\n ) {\n this.autoResize();\n }\n }\n\n public render(): React.JSX.Element {\n this.styles = getStyles(this.emotion);\n\n return (\n <ThemeContext.Consumer>\n {(theme) => {\n this.theme = theme;\n return (\n <CommonWrapper rootNodeRef={this.setRootNode} {...this.getProps()}>\n {this.renderMain}\n </CommonWrapper>\n );\n }}\n </ThemeContext.Consumer>\n );\n }\n\n /** Программно устанавливает фокус на поле.\n * @public\n */\n public focus(): void {\n if (this.node) {\n this.node.focus();\n }\n }\n\n /** Программно снимает фокус с поля.\n * @public\n */\n public blur(): void {\n if (this.node) {\n this.node.blur();\n }\n }\n\n public getNode(): Nullable<HTMLTextAreaElement> {\n return this.node;\n }\n\n /** Кратковременно визуально подсвечивает поле ввода, чтобы привлечь внимание пользователя.\n * @public\n */\n public blink(): void {\n blink({ el: this.node, blinkColor: this.theme.inputBlinkColor });\n }\n\n /** start - инициирует последовательное изменение числового значения: начинает повторяющееся увеличение/уменьшение, обычно используется при удерживании кнопки «+» или «−» для числового Input. end - останавливает ранее запущенное числоизменение, инициируемое numberStart.\n * [Документация](https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/setSelectionRange)\n * @public\n */\n public setSelectionRange = (start: number, end: number): void => {\n if (!this.node) {\n warning(false, 'Cannot call \"setSelectionRange\" on unmounted Input');\n return;\n }\n\n if (this.globalObject.document?.activeElement !== this.node) {\n this.focus();\n }\n\n this.node.setSelectionRange(start, end);\n };\n\n /** Переводит фокус в поле (если ещё не в фокусе) и выделяет весь текст в нём.\n * Работает с типами `text`, `password`, `tel`, `search`, `url`.\n * @public\n */\n public selectAll = (): void => {\n if (this.node) {\n this.setSelectionRange(0, this.node.value.length);\n }\n };\n\n private cancelDelayedSelectAll = (): void => {\n if (this.selectAllId) {\n this.globalObject.cancelAnimationFrame?.(this.selectAllId);\n this.selectAllId = null;\n }\n };\n\n private renderMain = (props: CommonWrapperRestProps<TextareaProps>) => {\n const {\n width = DEFAULT_WIDTH,\n error,\n warning,\n size,\n autoResize,\n resize,\n onCut,\n onPaste,\n maxRows,\n onFocus,\n selectAllOnFocus,\n placeholder,\n onValueChange,\n showLengthCounter,\n lengthCounter,\n counterHelp,\n extraRow,\n disableAnimations,\n disabled,\n ...textareaProps\n } = props;\n\n const { isCounterVisible } = this.state;\n\n const rootProps = {\n style: {\n width,\n },\n };\n\n const textareaClassNames = this.cx(this.getTextareaSizeClassName(), {\n [this.styles.textarea(this.theme)]: true,\n [this.styles.hovering(this.theme)]: !error && !warning,\n [this.styles.disabled(this.theme)]: disabled,\n [this.styles.error(this.theme)]: !!error,\n [this.styles.warning(this.theme)]: !!warning,\n [this.styles.disableAnimations()]: this.isAnimationsDisabled(),\n });\n\n const textareaStyle = {\n resize: autoResize ? 'none' : resize,\n textAlign: this.props.align,\n };\n\n let placeholderPolyfill = null;\n\n if (this.state.needsPolyfillPlaceholder && !textareaProps.value && !textareaProps.defaultValue) {\n placeholderPolyfill = <span className={this.styles.placeholder()}>{placeholder}</span>;\n }\n\n let fakeTextarea = null;\n if (autoResize) {\n const fakeProps = {\n value: this.props.value,\n defaultValue: this.props.defaultValue,\n className: this.cx(textareaClassNames, this.styles.fake()),\n readOnly: true,\n };\n fakeTextarea = <textarea {...fakeProps} ref={this.refFake} />;\n }\n\n const counter = showLengthCounter && isCounterVisible && this.node && (\n <TextareaCounter\n textarea={this.node}\n size={this.size}\n help={counterHelp}\n value={textareaProps.value}\n length={textareaProps.maxLength ?? lengthCounter ?? 0}\n onCloseHelp={this.handleCloseCounterHelp}\n ref={this.refCounter}\n />\n );\n\n const Component = isSafariWithTextareaBug ? TextareaWithSafari17Workaround : 'textarea';\n\n return (\n <RenderLayer\n onFocusOutside={this.handleCloseCounterHelp}\n onClickOutside={this.handleCloseCounterHelp}\n active={this.state.isCounterVisible}\n >\n <label\n data-tid={TextareaDataTids.root}\n {...rootProps}\n className={this.cx(this.getRootSizeClassName(), {\n [this.styles.root()]: true,\n })}\n >\n {placeholderPolyfill}\n <ResizeDetector onResize={this.reflowCounter} alignBaseline>\n <Component\n {...textareaProps}\n className={textareaClassNames}\n style={textareaStyle}\n placeholder={!placeholderPolyfill ? placeholder : undefined}\n ref={this.ref}\n onChange={this.handleChange}\n onCut={this.handleCut}\n onPaste={this.handlePaste}\n onFocus={this.handleFocus}\n onKeyDown={this.handleKeyDown}\n onBeforeInput={this.handleBeforeInput}\n disabled={disabled}\n >\n {this.props.children}\n </Component>\n </ResizeDetector>\n {fakeTextarea}\n {counter}\n </label>\n </RenderLayer>\n );\n };\n\n private handleCloseCounterHelp = () => this.setState({ isCounterVisible: false });\n\n private handleKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n // Edge bug: textarea maxlength doesn't work after new line\n // https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/18833616/\n const value = this.props.value !== undefined ? this.props.value.toString() : null;\n const isBlockEnter = isKeyEnter(e) && value !== null && value.length === this.props.maxLength;\n\n if (isBlockEnter) {\n e.preventDefault();\n\n const { selectionStart, selectionEnd } = e.currentTarget;\n\n if (!this.props.readOnly && selectionStart === selectionEnd) {\n this.blink();\n }\n }\n\n if (this.props.onKeyDown) {\n this.props.onKeyDown(e);\n }\n };\n\n private handleBeforeInput = (e: React.InputEvent<HTMLTextAreaElement>) => {\n if (this.props.onBeforeInput) {\n this.props.onBeforeInput(e);\n }\n\n const { value, selectionStart, selectionEnd } = e.currentTarget;\n const isMaxLengthReached = this.props.maxLength === value.length;\n\n if (isMaxLengthReached && !this.props.readOnly && selectionStart === selectionEnd) {\n this.blink();\n }\n };\n\n private handleChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n if (needsPolyfillPlaceholder) {\n const fieldIsEmpty = e.target.value === '';\n\n if (this.state.needsPolyfillPlaceholder !== fieldIsEmpty) {\n this.setState({ needsPolyfillPlaceholder: fieldIsEmpty });\n }\n }\n\n if (this.props.onValueChange) {\n this.props.onValueChange(e.target.value);\n }\n\n if (this.props.autoResize) {\n this.autoResize();\n }\n\n if (this.props.onChange) {\n this.props.onChange(e);\n }\n\n this.reflowCounter();\n };\n\n private ref = (element: HTMLTextAreaElement) => {\n this.node = element;\n };\n\n private refFake = (element: HTMLTextAreaElement) => {\n this.fakeNode = element;\n };\n\n private refCounter = (ref: TextareaCounterRef | null) => {\n this.counter = ref;\n };\n\n private autoResizeHandler = () => {\n const fakeNode = this.fakeNode;\n if (!fakeNode) {\n return;\n }\n const node = this.node;\n if (!node) {\n return;\n }\n if (this.props.value === undefined) {\n fakeNode.value = node.value;\n }\n\n const { rows, maxRows } = this.getProps();\n if (rows === undefined || maxRows === undefined) {\n return;\n }\n\n const { height, exceededMaxHeight } =\n getTextAreaHeight(this.globalObject, {\n node: fakeNode,\n minRows: typeof rows === 'number' ? rows : parseInt(rows, 10),\n maxRows: typeof maxRows === 'number' ? maxRows : parseInt(maxRows, 10),\n extraRow: this.getProps().extraRow,\n }) || {};\n\n if (height === undefined || exceededMaxHeight === undefined) {\n return;\n }\n\n node.style.height = height + 'px';\n node.style.overflowY = exceededMaxHeight ? 'scroll' : 'hidden';\n fakeNode.style.overflowY = exceededMaxHeight ? 'scroll' : 'hidden';\n };\n\n private autoResize = throttle(this.autoResizeHandler, this.getAutoResizeThrottleWait());\n\n private handleCut = (event: React.ClipboardEvent<HTMLTextAreaElement>) => {\n if (this.props.autoResize) {\n this.autoResize();\n }\n\n if (this.props.onCut) {\n this.props.onCut(event);\n }\n\n this.reflowCounter();\n };\n\n private handlePaste = (event: React.ClipboardEvent<HTMLTextAreaElement>) => {\n if (this.props.autoResize) {\n this.autoResize();\n }\n\n if (this.props.onPaste) {\n this.props.onPaste(event);\n }\n\n const { value, selectionStart, selectionEnd } = event.currentTarget;\n const pastedText = event.clipboardData.getData('text/plain').replace(/\\r\\n?/g, '\\n');\n const nextLength = value.length - (selectionEnd - selectionStart) + pastedText.length;\n\n if (!this.props.readOnly && this.props.maxLength !== undefined && nextLength > this.props.maxLength) {\n this.blink();\n }\n\n this.reflowCounter();\n };\n\n private handleFocus = (event: React.FocusEvent<HTMLTextAreaElement>) => {\n this.setState({ isCounterVisible: true });\n\n if (this.props.selectAllOnFocus) {\n // https://github.com/facebook/react/issues/7769\n this.node && this.selectAll();\n }\n\n if (this.props.onFocus) {\n this.props.onFocus(event);\n }\n };\n}\n"]}
|