FieldSecure
Поле для секретов: пароли, токены, API-ключи. Базируется на FieldDecorator и @cloud-ru/ds-input-private. Кнопка «глаз» переключает <input type> между password и text. В режиме readonly дополнительно появляется кнопка копирования.
Когда использовать
- Логин/регистрация: ввод и подтверждение пароля.
- Настройки безопасности: смена пароля, выдача API-ключей.
- Отображение access-token / API key (
readonly+ копирование).
Анатомия
Size (default m)
| Значение | Когда |
|---|---|
s | Inline-поля и плотные формы |
m | Стандартные формы (по умолчанию) |
l | Primary-формы регистрации/логина |
ValidationState (default default)
Через проп error форсится error. Иконка слева от подсказки появляется при showHintIcon.
| Значение | Когда |
|---|---|
default | Нет валидации — нейтральный baseline: подсказка вторичным текстом (textTertiary), фон и иконка нейтральны |
error | Не прошло валидацию |
warning | Слабый пароль, ввод допустим |
success | Пароль соответствует требованиям |
Видимость значения (default hidden)
Кнопка «глаз» переключает <input type> между password и text.
- Uncontrolled —
hiddenне задан, компонент сам хранит состояние маскирования, по умолчанию значение скрыто. - Controlled —
hidden+onHiddenChangeпод управлением потребителя.
После переключения фокус и каретка возвращаются в поле ввода (каретка — в конец значения), чтобы редактирование продолжалось без лишнего клика.
Слоты и кнопки
showHideButton(defaulttrue) — кнопка «глаз». Скрывается, когдаreadonlyи значение пустое.showCopyButton(defaulttrue) — кнопка копирования. Видна только приreadonlyи непустом значении; после копирования иконка кратковременно меняется на галочку.asyncValueGetter— ленивая загрузка секрета. Вызывается перед первым раскрытием или копированием; во время запроса показанSkeleton, результат передаётся черезonChange. После успешной загрузки значение считается полученным и повторно не запрашивается.
Установка
pnpm add @cloud-ru/ds-fields
import { FieldSecure } from '@cloud-ru/ds-fields'
Примеры использования
Базовое поле пароля
*
Не передавайте пароль третьим лицам
tsx
import { FieldSecure } from '@cloud-ru/ds-fields';
import { useState } from 'react';
export function Secure() {
const [value, setValue] = useState('');
return (
<FieldSecure
label='Пароль'
required
placeholder='Минимум 8 символов'
hint='Не передавайте пароль третьим лицам'
showHintIcon
value={value}
onChange={setValue}
/>
);
}Управляемая видимость
Значение скрыто
tsx
import { FieldSecure } from '@cloud-ru/ds-fields';
import { useState } from 'react';
export function SecureControlledVisibility() {
const [value, setValue] = useState('');
const [hidden, setHidden] = useState(true);
return (
<FieldSecure
label='Пароль'
hint={hidden ? 'Значение скрыто' : 'Значение видно'}
value={value}
onChange={setValue}
hidden={hidden}
onHiddenChange={setHidden}
/>
);
}Readonly + копирование
tsx
import { FieldSecure } from '@cloud-ru/ds-fields';
export function SecureReadonly() {
return <FieldSecure label='API Token' readonly defaultValue='sk-XXXXXXXXXXXXXXXXXXXXXXXX' />;
}Async-загрузка значения
Значение подгружается при клике «глаз» или «копировать»
tsx
import { FieldSecure } from '@cloud-ru/ds-fields';
import { useState } from 'react';
const fakeFetch = (): Promise<string> =>
new Promise(resolve => setTimeout(() => resolve('sk-FETCHED-TOKEN-FROM-SERVER'), 800));
export function SecureAsync() {
const [value, setValue] = useState('');
return (
<FieldSecure
label='API Token'
readonly
hint='Значение подгружается при клике «глаз» или «копировать»'
asyncValueGetter={fakeFetch}
value={value}
onChange={setValue}
/>
);
}Props
Types
Props
FieldSecureProps| Prop | Type | Default | Required | Description |
|---|---|---|---|---|
allowMoreThanMaxLength | boolean | false | no | Разрешить ввод свыше `maxLength` символов. |
asyncValueGetter | (() => Promise<string>) | — | no | Async-загрузчик значения. Вызывается перед раскрытием/копированием значения, результат передаётся через `onChange`. Во время запроса показывается Skeleton. После успешного запроса значение считается полученным и больше не запрашивается. |
autoComplete | string | boolean | false | no | Включен ли автокомплит для поля |
autoFocus | boolean | false | no | Включен ли авто-фокус для поля |
background | boolean | true | no | Фон поля (acrylic) |
caption | string | — | no | Вторичная подпись справа |
className | string | — | no | CSS-класс CSS-класс корня `FieldDecorator` |
data-test-id | string | — | no | |
defaultHidden | boolean | true | no | Начальное состояние маскирования (uncontrolled-режим). Кнопка «глаз» переключает маскирование сама; `hidden` для этого передавать не нужно. |
defaultValue | string | — | no | Начальное значение (uncontrolled-режим) |
disabled | boolean | false | no | Поле выключено Является ли поле деактивированным |
error | string | — | no | Ошибка (приоритетнее `hint`; форсит `validationState=error`) |
fieldClassName | string | — | no | CSS-класс оболочки поля ввода |
hidden | boolean | — | no | Скрыто ли значение (controlled). Для uncontrolled-режима используйте `defaultHidden`. |
hint | string | — | no | Подсказка |
id | string | — | no | Значение html-атрибута id |
innerRef | Ref<HTMLDivElement> | — | no | Ref на корневой DOM-элемент |
inputMode | "decimal" | "email" | "none" | "numeric" | "search" | "tel" | "text" | "url" | — | no | Режим работы экранной клавиатуры |
label | string | | no | Заголовок |
labelFor | string | — | no | HTML-атрибут `for` для `<label>` |
labelTooltip | QuestionTooltipProps | — | no | Подсказка (question-tooltip) у заголовка |
length | FieldLength | — | no | Счётчик длины `current/max` |
max | number | — | no | Максимальное значение поля |
maxLength | number | — | no | Максимальная длина вводимого значения |
min | number | — | no | Минимальное значение поля |
name | string | — | no | Значение html-атрибута name |
onBlur | FocusEventHandler<HTMLInputElement> | — | no | Колбек обработки потери фокуса |
onChange | ((value: string) => void) | — | no | Колбек смены значения |
onClick | MouseEventHandler<HTMLInputElement> | — | no | Колбек обработки клика |
onCopyButtonClick | (() => void) | — | no | Колбек после копирования значения в буфер |
onFocus | FocusEventHandler<HTMLInputElement> | — | no | Колбек обработки получения фокуса |
onHiddenChange | ((hidden: boolean) => void) | — | no | Колбек смены маскирования |
onKeyDown | KeyboardEventHandler<HTMLInputElement> | — | no | Колбек обработки начала нажатия клавиши клавиатуры |
onMouseDown | MouseEventHandler<HTMLInputElement> | — | no | Колбек обработки нажатия кнопки мыши |
onPaste | ClipboardEventHandler<HTMLInputElement> | — | no | Колбек обработки вставки значения |
pattern | string | — | no | Регулярное выражение валидного инпута |
placeholder | string | — | no | Значение плейсхолдера |
prefixIcon | ReactNode | — | no | Ведущая иконка. @deprecated Используйте `iconBefore`. |
readonly | boolean | false | no | Только для чтения Является ли поле доступным только для чтения |
required | boolean | — | no | Показать знак обязательности `*` |
showCopyButton | boolean | true | no | Показывать кнопку копирования (только при `readonly = true` и непустом `value`) |
showHideButton | boolean | true | no | Показывать кнопку «глаз» |
showHintIcon | boolean | — | no | Отображение статус-иконки у подсказки (по умолчанию `true`) |
size | "l" | "m" | "s" | m | no | Размер |
spellCheck | boolean | true | no | Значение атрибута spellcheck (проверка орфографии) |
step | string | number | — | no | Максимальное значение поля |
tabIndex | number | 0 | no | Значение атрибута tab-index |
validationState | "default" | "error" | "success" | "warning" | default | no | Состояние валидации |
value | string | — | no | Значение (controlled-режим) |