FieldSecure

Поле для секретов: пароли, токены, API-ключи. Базируется на FieldDecorator и @cloud-ru/ds-input-private. Кнопка «глаз» переключает <input type> между password и text. В режиме readonly дополнительно появляется кнопка копирования.

Когда использовать

  • Логин/регистрация: ввод и подтверждение пароля.
  • Настройки безопасности: смена пароля, выдача API-ключей.
  • Отображение access-token / API key (readonly + копирование).

Анатомия

Size (default m)

ЗначениеКогда
sInline-поля и плотные формы
mСтандартные формы (по умолчанию)
lPrimary-формы регистрации/логина

ValidationState (default default)

Через проп error форсится error. Иконка слева от подсказки появляется при showHintIcon.

ЗначениеКогда
defaultНет валидации — нейтральный baseline: подсказка вторичным текстом (textTertiary), фон и иконка нейтральны
errorНе прошло валидацию
warningСлабый пароль, ввод допустим
successПароль соответствует требованиям

Видимость значения (default hidden)

Кнопка «глаз» переключает <input type> между password и text.

  • Uncontrolled — hidden не задан, компонент сам хранит состояние маскирования, по умолчанию значение скрыто.
  • Controlled — hidden + onHiddenChange под управлением потребителя.

После переключения фокус и каретка возвращаются в поле ввода (каретка — в конец значения), чтобы редактирование продолжалось без лишнего клика.

Слоты и кнопки

  • showHideButton (default true) — кнопка «глаз». Скрывается, когда readonly и значение пустое.
  • showCopyButton (default true) — кнопка копирования. Видна только при readonly и непустом значении; после копирования иконка кратковременно меняется на галочку.
  • asyncValueGetter — ленивая загрузка секрета. Вызывается перед первым раскрытием или копированием; во время запроса показан Skeleton, результат передаётся через onChange. После успешной загрузки значение считается полученным и повторно не запрашивается.

Установка

pnpm add @cloud-ru/ds-fields
import { FieldSecure } from '@cloud-ru/ds-fields'

Примеры использования

Базовое поле пароля

Базовое поле пароляControlled FieldSecure. Переключатель «глаз» меняет видимость значения, по умолчанию скрыто.
*
Не передавайте пароль третьим лицам
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}
    />
  );
}

Управляемая видимость

Управляемая видимостьhidden + onHiddenChange под управлением потребителя — состояние маскирования живёт во внешнем state.
Значение скрыто
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 + копирование

Readonly + копированиеReadonly показывает кнопку копирования значения. «Глаз» остаётся доступен.
tsx
import { FieldSecure } from '@cloud-ru/ds-fields';

export function SecureReadonly() {
  return <FieldSecure label='API Token' readonly defaultValue='sk-XXXXXXXXXXXXXXXXXXXXXXXX' />;
}

Async-загрузка значения

Async-загрузка значенияasyncValueGetter подгружает токен при первом клике «глаз» или «копировать». Во время запроса показан Skeleton.
Значение подгружается при клике «глаз» или «копировать»
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

PropsFieldSecureProps
PropTypeDefaultRequiredDescription
allowMoreThanMaxLengthbooleanfalsenoРазрешить ввод свыше `maxLength` символов.
asyncValueGetter(() => Promise<string>)noAsync-загрузчик значения. Вызывается перед раскрытием/копированием значения, результат передаётся через `onChange`. Во время запроса показывается Skeleton. После успешного запроса значение считается полученным и больше не запрашивается.
autoCompletestring | booleanfalsenoВключен ли автокомплит для поля
autoFocusbooleanfalsenoВключен ли авто-фокус для поля
backgroundbooleantruenoФон поля (acrylic)
captionstringnoВторичная подпись справа
classNamestringnoCSS-класс CSS-класс корня `FieldDecorator`
data-test-idstringno
defaultHiddenbooleantruenoНачальное состояние маскирования (uncontrolled-режим). Кнопка «глаз» переключает маскирование сама; `hidden` для этого передавать не нужно.
defaultValuestringnoНачальное значение (uncontrolled-режим)
disabledbooleanfalsenoПоле выключено Является ли поле деактивированным
errorstringnoОшибка (приоритетнее `hint`; форсит `validationState=error`)
fieldClassNamestringnoCSS-класс оболочки поля ввода
hiddenbooleannoСкрыто ли значение (controlled). Для uncontrolled-режима используйте `defaultHidden`.
hintstringnoПодсказка
idstringnoЗначение html-атрибута id
innerRefRef<HTMLDivElement>noRef на корневой DOM-элемент
inputMode"decimal" | "email" | "none" | "numeric" | "search" | "tel" | "text" | "url"noРежим работы экранной клавиатуры
labelstringnoЗаголовок
labelForstringnoHTML-атрибут `for` для `<label>`
labelTooltipQuestionTooltipPropsnoПодсказка (question-tooltip) у заголовка
lengthFieldLengthnoСчётчик длины `current/max`
maxnumbernoМаксимальное значение поля
maxLengthnumbernoМаксимальная длина вводимого значения
minnumbernoМинимальное значение поля
namestringnoЗначение html-атрибута name
onBlurFocusEventHandler<HTMLInputElement>noКолбек обработки потери фокуса
onChange((value: string) => void)noКолбек смены значения
onClickMouseEventHandler<HTMLInputElement>noКолбек обработки клика
onCopyButtonClick(() => void)noКолбек после копирования значения в буфер
onFocusFocusEventHandler<HTMLInputElement>noКолбек обработки получения фокуса
onHiddenChange((hidden: boolean) => void)noКолбек смены маскирования
onKeyDownKeyboardEventHandler<HTMLInputElement>noКолбек обработки начала нажатия клавиши клавиатуры
onMouseDownMouseEventHandler<HTMLInputElement>noКолбек обработки нажатия кнопки мыши
onPasteClipboardEventHandler<HTMLInputElement>noКолбек обработки вставки значения
patternstringnoРегулярное выражение валидного инпута
placeholderstringnoЗначение плейсхолдера
prefixIconReactNodenoВедущая иконка. @deprecated Используйте `iconBefore`.
readonlybooleanfalsenoТолько для чтения Является ли поле доступным только для чтения
requiredbooleannoПоказать знак обязательности `*`
showCopyButtonbooleantruenoПоказывать кнопку копирования (только при `readonly = true` и непустом `value`)
showHideButtonbooleantruenoПоказывать кнопку «глаз»
showHintIconbooleannoОтображение статус-иконки у подсказки (по умолчанию `true`)
size"l" | "m" | "s"mnoРазмер
spellCheckbooleantruenoЗначение атрибута spellcheck (проверка орфографии)
stepstring | numbernoМаксимальное значение поля
tabIndexnumber0noЗначение атрибута tab-index
validationState"default" | "error" | "success" | "warning"defaultnoСостояние валидации
valuestringnoЗначение (controlled-режим)

Types

FieldSecureProps

Storybook

Figma