CopyLine

Контейнер <div> с однострочным truncate-контентом слева и inline-кнопкой копирования справа. Кликабельна вся строка целиком — клик копирует valueToCopy (по умолчанию равно content, если он string или number). Внутри использует TruncateString для усечения длинных значений.

Демо

Preview
Prop
Type
Value
content
text
copyButtonHideStrategy
hover | never
valueToCopy
text
Code
<CopyLine copyButtonHideStrategy="hover" content="example-copy-value-12345" valueToCopy="example-value" />

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

  • Карточки ресурсов: ID, ARN, IP, URL, токены — где значение надо одновременно показать и дать скопировать.
  • Detail view’ы и таблицы с длинными identifier-ами, не помещающимися в одну строку без усечения.
  • Если нужна только кнопка без контента:

Анатомия

CopyButtonHideStrategy (default hover)

Управляет видимостью встроенной кнопки копирования. Значение прокидывается в DOM как data-copy-button-hide-strategy на корневом элементе:

  • hover — кнопка показывается только при наведении на строку.
  • never — кнопка видна всегда.

Content

Слот content принимает ReactNode:

  • string или number — автоматически оборачивается в TruncateString (одна строка, троеточие при переполнении) и используется как valueToCopy по умолчанию.
  • Произвольный JSX — truncate не применяется, valueToCopy нужно задавать явно.

Установка

pnpm add @cloud-ru/ds-uikit-product-copy
import { CopyLine } from '@cloud-ru/ds-uikit-product-copy'

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

Базовый случай

Базовый случайUUID, кнопка появляется по hover
tsx
import { CopyLine } from '@cloud-ru/ds-uikit-product-copy';

export function CopyLineBasic() {
  return <CopyLine content='550e8400-e29b-41d4-a716-446655440000' />;
}

Длинный контент с truncate

Длинный контент с truncateСтрока усекается одной строкой, в буфер уходит полное значение
tsx
import { CopyLine } from '@cloud-ru/ds-uikit-product-copy';

export function CopyLineTruncated() {
  return (
    <div style={{ width: 280 }}>
      <CopyLine content='very-long-identifier-1234567890-abcdefghijklmnop' />
    </div>
  );
}

Кнопка всегда видна

Кнопка всегда виднаcopyButtonHideStrategy='never' для критичных значений — токенов, паролей
tsx
import { CopyLine } from '@cloud-ru/ds-uikit-product-copy';

export function CopyLineAlwaysVisible() {
  return <CopyLine content='persistent-token-9000' copyButtonHideStrategy='never' />;
}

Кастомное значение для копирования

Кастомное значение для копированияcontent — человекочитаемая подпись, valueToCopy — машинный формат
tsx
import { CopyLine } from '@cloud-ru/ds-uikit-product-copy';

export function CopyLineCustomValue() {
  return <CopyLine content='IP: 192.168.0.1 (production)' valueToCopy='192.168.0.1' />;
}

JSX-контент

JSX-контентПроизвольный ReactNode внутри content; valueToCopy задаём явно
tsx
import { CopyLine } from '@cloud-ru/ds-uikit-product-copy';

export function CopyLineRichContent() {
  return (
    <CopyLine
      content={
        <span>
          <strong>Token:</strong> <code>sk-prod-9000</code>
        </span>
      }
      valueToCopy='sk-prod-9000'
    />
  );
}

Props

Types

PropsCopyLineProps
PropTypeDefaultRequiredDescription
classNamestringnoДополнительный класс корневого элемента.
contentReactNodeyesОтображаемое содержимое. Если это строка/число — автоматически truncated и используется как значение для копирования по-умолчанию.
copyButtonHideStrategy"hover" | "never"hovernoСтратегия показа кнопки копирования: hover — только по наведению, never — всегда.
data-test-idstringno
onClickMouseEventHandler<HTMLDivElement>noОбработчик клика по строке.
valueToCopystring | numbernoЗначение, которое попадёт в буфер при клике. По-умолчанию равно content, если он string/number.

Unions

Types

CopyLineProps

Unions

Storybook

Figma

Смотри также

  • CopyButton — только кнопка, без контента.
  • TruncateString — нижележащий примитив усечения.