import { TextField } from '@megafon/ui-core';
<TextField name="password" type="password"/>
<TextField name="phone" required label="Телефон"/>
<TextField name="name" label="Имя" value="Константин"/>
<TextField name="name" label="Имя" value="Константин" hideIcon/>
При установке фокуса на поле - плейсхолдер не отображается
<TextField hidePlaceholder label="Введите текст" />
<div style={{ display: 'grid', gap: '35px' }}> <TextField placeholder="+7 (999) 999-99-99" mask="+7 (999) 999-99-99" maskChar="_" label="Обычная" id="2" inputMode="numeric" classes={{input: 'parent__inputClass'}} style={{ width: '350px' }} /> <TextField mask="+7 (999) 999-99-99" maskChar="_" type="tel" autoComplete="tel" inputMode="tel" label="С автозаполнением" style={{ width: '350px' }} /> <div> <DemoTextFieldWithBeforeMaskChangeValue> {({ handleBeforeMaskChange }) => <TextField onBeforeMaskChange={handleBeforeMaskChange} mask="+7 (999) 999-99-99" maskChar="_" label="С перехватом вводимого значения" style={{ width: '350px' }} /> } </DemoTextFieldWithBeforeMaskChangeValue> <p> В данном случае, при вставке телефона в формате +79998887766 выведет его сразу в нужном формате, за счет совпадения начальных символов маски и вставляемого значения, в остальных кейсах нужна обработка значения внутри коллбека и его возврат оттуда </p> </div> </div>
Код DemoTextFieldWithBeforeMaskChangeValueexport const DemoTextFieldWithBeforeMaskChangeValue = ({ children }) => {const handleBeforeMaskChange = (value, newState) => {const { value: newMaskedValue } = newState;const isValuePasted = value && value.length > 1;return { ...newState, value: isValuePasted ? value : newMaskedValue };};return <>{children({ handleBeforeMaskChange })}</>;};
<TextField noticeText="Comment" />
Клик по "крестику" очищает поле по умолчанию. Если установлены кастомная иконка или onIconClick
, то очищение перестает работать.
<TextField verification="error" noticeText="Name is required"/> <TextField verification="valid" noticeText="You can write that field value is correct"/>
<TextField verification="error" noticeText="Error notice" customIcon={ <CustomIcon style={{width: "32", height: "32", display: "block", userSelect: "none"}} /> } onIconClick={ () => alert('Custom click handler') } /> <TextField customIcon={ <CustomIcon style={{width: "32", height: "32", display: "block", userSelect: "none"}} /> } onIconClick={ () => alert('Custom click handler') } />
<TextField maxLength={10} />
<TextField disabled={true} />
<TextField value='initial value' isControlled={true} />
В данном состоянии компонент полностью контролируется родительским, в том числе очистка поля ввода путем клика на иконку, для нее следует использовать коллбек onIconClick
<DemoTextFieldWithControlledValue> {({ value, onChange }) => <TextField value={value} onChange={onChange} isControlled={true} />} </DemoTextFieldWithControlledValue>
<div style={{ display: 'flex', gap: '35px' }}> <div style={{ flex: 1, padding: '10px' }}> <TextField verification="valid" noticeText="Тема для светлого фона (по умолчанию)" /> </div> <div style={{ flex: 1, padding: '10px', backgroundColor: '#00B956' }}> <TextField verification="valid" noticeText="Светлая тема для цветного фона" theme="white" /> </div> </div>
Код DemoControlledTextFieldexport const DemoTextFieldWithControlledValue = ({ children }) => {const [inputValue, setInputValue] = useState('');const handleChange = ({ target: { value } }) => {const valueDigits = value.replace(/[^0-9]/g, '');setInputValue(valueDigits);};return <>{children({ value: inputValue, onChange: handleChange })}</>;};
Пропс textarea, выставленный в значение true, изменяет компонент в textarea.
<TextField name="name" textarea placeholder="placeholder"/>
Поле автоматически увеличивается при вводе текста до высоты шести строк. Режим автоматического увеличения высоты отключается при ручном ресайзе поля.
<TextField name="name" textarea="flexible"/>
<TextField textarea="flexible" hideResizeButton />
<TextField label="Required field" textarea required classes={{input: 'parent__inputClass'}} />
<TextField noticeText="Comment" textarea />
<TextField verification="error" noticeText="Name is required" textarea /> <TextField verification="valid" noticeText="Field passed validation" textarea />
<TextField maxLength={10} textarea isControlled={false}/>
При превышении переданного количества поле становится невалидным.
<TextField symbolCounter={10} textarea value="Иванов Ива"/> <TextField symbolCounter={10} textarea value="Иванов Иван Иванович"/>
При превышении переданного количества поле становится невалидным.
<TextField symbolCounter={10} textarea graphemesCounter value="😀👩💻"/> <TextField symbolCounter={10} textarea graphemesCounter value="⏏️ ▶️ ⏸ ⏯ ⏹"/>
По умолчанию минимальная высота равна трем строкам
<TextField textarea minTextareaHeight={24} label="fixed" /> <TextField textarea="flexible" minTextareaHeight={24} label="flexible" />
Остается доступен перевод строки по нажатию комбинации Shift + Enter и автоматический
<TextField textarea label="fixed" disableEnterLineBreak /> <TextField textarea="flexible" label="flexible" disableEnterLineBreak />
<TextField disabled textarea value='disabled' />
Prop name | Type | Default | Description |
---|---|---|---|
textarea | boolean | "fixed" | "flexible" | false | Включить режим textarea. Fixed - это alias для textarea=true. |
label | string | Лейбл | |
type | "text" | "password" | "tel" | "email" | text | Атрибут элемента input. Не работает с textarea=true |
theme | "default" | "white" | default | Цветовая тема |
hideIcon | boolean | false | Запрещает отрисовку иконки |
verification | "valid" | "error" | Отображение валидации | |
noticeText | string | Element | Подпись снизу, меняет цвет в зависимости от аргумента verification | |
disabled | boolean | Отключение поля ввода | |
required | boolean | Показывает обязательность поля | |
inputRef | (node: HTMLInputElement | HTMLTextAreaElement) => void | Ref обработчик | |
name | string | Имя поля | |
hidePlaceholder | boolean | false | Запрещает отображение плейсхолдера |
placeholder | string | Отображаемый текст при отсутствии значения | |
id | string | Атрибут корневого DOM элемента компонента | |
value | string | number | Внешнее значение компонента | |
maxLength | number | Максимальное вводимое количество текста | |
symbolCounter | number | Показывает счетчик с подсчетом введенных символов. Только для textarea. | |
graphemesCounter | boolean | Включает подсчет введенных [графем](https://ru.wikipedia.org/wiki/%D0%93%D1%80%D0%B0%D1%84%D0%B5%D0%BC%D0%B0) и символов при `symbolCounter=true` **Пример**: эмоджи 👩💻 - это одна графема, состоящая из 5 символов. - для `true` Количество символов в строке "hello world👩💻" = 12 - для `false` Количество символов в строке "hello world👩💻" = 16 | |
customIcon | Element | Иконка | |
mask | string | Дополнительную информацию можно найти на https://github.com/sanniassin/react-input-mask | |
maskChar | string | Разделение символов для маски. Не работает textarea=true | |
className | string | Дополнительный класс корневого элемента | |
classes | { label?: string; input?: string; } | {} | Дополнительные классы элементов |
dataAttrs | { root?: Record<string, string>; label?: Record<string, string>; notice?: Record<string, string>; input?: Record<string, string>; iconBox?: Record<string, string>; resizer?: Record<...>; } | Дополнительные data атрибуты к внутренним элементам | |
inputMode | "tel" | "email" | "numeric" | "decimal" | "url" | "search" | "none" | Атрибут элемента input | |
autoComplete | string | Атрибут элемента input. Не работает с textarea=true | |
isControlled | boolean | false | Переводит компонент в контролируемое состояние |
minTextareaHeight | number | ROW_HEIGHT * DEFAULT_ROW_COUNT | Минимальная высота textarea, px |
hideResizeButton | boolean | false | Скрывает кнопку ресайза для textarea="flexible" |
disableEnterLineBreak | boolean | false | Отключает перевод строки по Enter |
onChange | (e: ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => void | Обработчик изменения значения | |
onBeforeMaskChange | (value: string, newState: IMaskState, oldState: IMaskState) => void | Обработчик изменения значения маскированного инпута до обработки маской | |
onBlur | (e: FocusEvent<HTMLInputElement | HTMLTextAreaElement, Element>) => void | Обработчик выхода из фокуса | |
onFocus | (e: FocusEvent<HTMLInputElement | HTMLTextAreaElement, Element>) => void | Обработчик входа в фокус | |
onKeyUp | (e: KeyboardEvent<HTMLInputElement | HTMLTextAreaElement>) => void | Обработчик поднятия клавиши | |
onIconClick | (e: MouseEvent<HTMLDivElement, MouseEvent>) => void | Обработчик клика по иконке |