InfoRow
InfoRow показывает одну или две пары “метка - значение” в строке. Компонент подходит для кратких сводок в карточках, сайдбарах и деталках сущностей.
Поддерживаются:
- одна колонка (
column="1"); - две колонки в одной строке (
column="2"); - разделители, скелетон, tooltip к метке;
- действия справа (
rowActions,secondaryRowActions); - обрезка длинных заголовков через
labelTruncate.
Если нужно отрисовать несколько строк по данным, используйте useGetContent и InfoRowFieldItem (пример ниже).
Демо
Очень длинный заголовок первого поля, который должен обрезаться по настройке truncate
Content
Prop
Type
Value
bottomDividerboolean
classNametext
column1 | 2
contenttext
data-test-idtext
labeltext
labelClassNametext
labelTruncatenumber
labelWidthauto | fixed
loadingboolean
maxWidthboolean
positionfirst | inner | last
rowActionsSlottext
rowClassNametext
secondaryContenttext
secondaryLabeltext
secondaryLabelClassNametext
secondaryLabelTruncatenumber
secondaryRowActionsSlottext
topDividerboolean
widthfixed | full
Code
<InfoRow label="Очень длинный заголовок первого поля, который должен обрезаться по настройке truncate" secondaryLabel="Очень длинный заголовок второго поля, который тоже должен обрезаться" content="Content" secondaryContent="Column 2" labelTruncate={1} secondaryLabelTruncate={1} column="1" maxWidth={false} data-test-id="info-row-demo" />Несколько строк по данным
Список полей
Name
Project
Active
Да
tsx
import { PlaceholderSVG } from '@cloud-ru/ds-icons/interface/system';
import { InfoRow, InfoRowFieldItem, useGetContent } from '@cloud-ru/ds-uikit-product-info-row';
type Row = { name: string; active: boolean };
const data: Row = { name: 'Project', active: true };
const items: InfoRowFieldItem<Row>[] = [
{
label: 'Name',
accessorKey: 'name',
rowActions: {
first: {
icon: <PlaceholderSVG />,
'aria-label': 'Изменить',
'data-test-id': 'data-list-action-first',
},
second: {
icon: <PlaceholderSVG />,
'aria-label': 'Копировать',
'data-test-id': 'data-list-action-second',
},
},
},
{ label: 'Active', accessorKey: 'active' },
];
export function DataListExample() {
const getContent = useGetContent();
return (
<div>
{items.map((item, index) => {
const { label, accessorKey, render, ...rowProps } = item;
const content = getContent<Row>({ data, render, accessorKey });
return (
<InfoRow
key={String(accessorKey ?? label)}
label={label}
content={content}
topDivider={index === 0}
bottomDivider
width='full'
column='1'
data-test-id={`data-list-row-${index}`}
{...rowProps}
/>
);
})}
</div>
);
}Когда использовать
- Короткая сводка полей “ключ - значение” в карточке или панели.
- Детальная страница объекта, где важна компактная подача.
- Когда таблица избыточна, а данных немного.
Когда лучше выбрать другой компонент
InfoGroup- когда данные уже описаны схемой полей и нужно вывести список строк по объекту.
InfoRow адаптивен сам по себе — на mobile (раскладка из AdaptiveProvider) он переключается в вертикальный comfort-формат, отдельный компонент для этого не нужен.
Установка
pnpm add @cloud-ru/ds-uikit-product-info-row
import { InfoRow, useGetContent, NO_DATA_PLACEHOLDER } from '@cloud-ru/ds-uikit-product-info-row'
import '@cloud-ru/ds-uikit-product-info-row/style.css'
Базовый пример
<InfoRow
label='Статус'
content='Активен'
column='1'
width='fixed'
/>
Props
Types
Props
InfoRowProps| Prop | Type | Default | Required | Description |
|---|---|---|---|---|
bottomDivider | boolean | — | no | Разделитель под строкой |
className | string | — | no | |
column | "1" | "2" | — | no | Ось Figma `column`: одна или две колонки значений |
content | ReactNode | — | no | Первая колонка значений (ось Figma `column=1` или левая при `column=2`) |
data-test-id | string | — | no | |
label | string | — | yes | Текст метки |
labelClassName | string | — | no | |
labelTooltip | string | Pick<QuestionTooltipProps, "open" | "onOpenChange" | "trigger" | "placement" | "tip" | "disableMaxWidth"> | — | no | Подсказка у метки: строка или пропсы QuestionTooltip |
labelTruncate | number | — | no | Максимальное число строк метки (TruncateString) |
labelWidth | "auto" | "fixed" | — | no | Ширина колонки метки |
loading | boolean | — | no | |
maxWidth | boolean | — | no | Ось Figma `maxWidth` |
position | "first" | "inner" | "last" | — | no | Только mobile: позиция строки в группе (`first`/`inner`/`last`) — задаёт скругление/разделители мобильной карточки. На desktop игнорируется (обычно проставляется `InfoGroup` автоматически). |
rowActions | RowActionsPair | — | no | До двух кнопок `@cloud-ru/ds-button` (tonal neutral, size m) у первой колонки; при `column="2"` в макете — одна (`first`). Игнорируется, если задан `rowActionsSlot` |
rowActionsSlot | ReactNode | — | no | Кастомная область действий у первой колонки; рендерится вместо `rowActions`. |
rowClassName | string | — | no | |
secondaryContent | ReactNode | — | no | Вторая колонка значений (только при `column="2"`, ось Figma) |
secondaryLabel | string | — | no | Вторая метка слева от второго значения (только при `column="2"`) |
secondaryLabelClassName | string | — | no | Класс блока второй метки при `column="2"` |
secondaryLabelTooltip | string | Pick<QuestionTooltipProps, "open" | "onOpenChange" | "trigger" | "placement" | "tip" | "disableMaxWidth"> | — | no | Подсказка у второй метки |
secondaryLabelTruncate | number | — | no | Макс. строк второй метки при `column="2"` |
secondaryRowActions | RowActionsPair | — | no | Кнопки у второй колонки значений; в макете при `column="2"` — одна (`first`) |
secondaryRowActionsSlot | ReactNode | — | no | Кастомные действия у второй колонки; если задано, вместо `secondaryRowActions` |
topDivider | boolean | — | no | Разделитель над строкой |
width | "fixed" | "full" | — | no | Ширина строки относительно контейнера |