InfoGroup
InfoGroup принимает объект data и массив items и рендерит по строке InfoRow на каждый элемент. Каждый item либо указывает accessorKey для чтения поля из data, либо задаёт render для кастомного вывода.
Демо
Title
Example
Value
42
Prop
Type
Value
classNametext
columnssingle | double
data-test-idtext
loadingboolean
widthfixed | full
Code
<InfoGroup data={"title":"Example","value":42} columns="single" width="fixed" data-test-id="info-group-demo" items=[{"label":"Title","accessorKey":"title"},{"label":"Value","accessorKey":"value"}] />Когда использовать
- Деталка сущности, где набор полей известен заранее: имя, статус, регион, тарифные параметры.
- Карточка объекта в админке/каталоге, где данные меняются, а схема полей — нет.
- Когда нужно единое поведение для пустых значений, булевых и async-загрузки (
loading).
Когда не нужен InfoGroup:
- Если строк одна-две:
- используйте отдельные
InfoRow.
- используйте отдельные
- Если поля разнородные и каждое требует своей разметки:
- соберите композицию из
InfoRowруками.
- соберите композицию из
Анатомия
Columns (default single)
Раскладка строк:
single— одна колонка строк.double— два столбца на ряд, для десктопных деталок с компактной подачей.
Width (default fixed)
Ширина строк:
fixed— фиксированный лейбл-блок.full— лейбл и значение растягиваются на всю доступную ширину контейнера.
При columns='double' ширина строк всегда full.
Items
Элемент items — один из вариантов:
{ accessorKey, label }— прямое чтение поля изdata.{ render, label }— кастомный JSX.
Допускает все остальные пропсы InfoRow (кроме content).
Loading
loading={true} показывает скелетон вместо значений во всех строках. Применяется на время первой загрузки data.
Установка
pnpm add @cloud-ru/ds-uikit-product-info-row
import { InfoGroup } from '@cloud-ru/ds-uikit-product-info-row'
import '@cloud-ru/ds-uikit-product-info-row/style.css'
Примеры использования
Базовый список полей
Имя
Mercury
Статус
Running
Активен
Да
tsx
import { InfoGroup } from '@cloud-ru/ds-uikit-product-info-row';
type Project = { name: string; status: string; active: boolean };
const data: Project = { name: 'Mercury', status: 'Running', active: true };
export function InfoGroupBasic() {
return (
<InfoGroup
data={data}
items={[
{ label: 'Имя', accessorKey: 'name' },
{ label: 'Статус', accessorKey: 'status' },
{ label: 'Активен', accessorKey: 'active' },
]}
/>
);
}Две колонки
Регион
eu-west-1
CPU
4 vCPU
Память
16 GiB
Диск
200 GiB SSD
tsx
import { InfoGroup } from '@cloud-ru/ds-uikit-product-info-row';
type Server = { region: string; cpu: string; memory: string; disk: string };
const data: Server = { region: 'eu-west-1', cpu: '4 vCPU', memory: '16 GiB', disk: '200 GiB SSD' };
export function InfoGroupDoubleColumn() {
return (
<InfoGroup
data={data}
columns='double'
width='full'
items={[
{ label: 'Регион', accessorKey: 'region' },
{ label: 'CPU', accessorKey: 'cpu' },
{ label: 'Память', accessorKey: 'memory' },
{ label: 'Диск', accessorKey: 'disk' },
]}
/>
);
}Кастомный render и формат булевых
Заказ
A-1024
Сумма
12 990 ₽
Оплачен
Да
tsx
import { InfoGroup } from '@cloud-ru/ds-uikit-product-info-row';
type Order = { id: string; total: number; paid: boolean };
const data: Order = { id: 'A-1024', total: 12990, paid: true };
const formatRub = (n: number) => `${n.toLocaleString('ru-RU')} ₽`;
export function InfoGroupCustomRender() {
return (
<InfoGroup
data={data}
items={[
{ label: 'Заказ', accessorKey: 'id' },
{ label: 'Сумма', render: order => <strong>{formatRub(order.total)}</strong> },
{ label: 'Оплачен', accessorKey: 'paid' },
]}
formatBoolean={value => (value ? 'Да' : 'Нет')}
/>
);
}Поведение
- При отсутствии
dataили значения поaccessorKeyпоказывается плейсхолдер—(NO_DATA_PLACEHOLDER). - Булевы по
accessorKeyформатируются черезformatBoolean(по умолчанию «Да»/«Нет»). - При
loading={true}вместо значений рендерятся скелетоны; разметка строк сохраняется.
Props
Types
Props
InfoGroupProps| Prop | Type | Default | Required | Description |
|---|---|---|---|---|
className | string | — | no | |
columns | "double" | "single" | — | no | |
data | DataType | undefined | — | yes | |
data-test-id | string | — | no | |
formatBoolean | ((value: boolean) => string) | — | no | Локализация булевых значений при выводе по `accessorKey` |
items | InfoGroupItem<T>[] | — | yes | |
loading | boolean | — | no | |
width | "fixed" | "full" | — | no |
Types
InfoGroupProps
DesktopInfoRowPropsBase
InfoGroupItem
Storybook
Смотри также
InfoRow— одна строка «метка — значение», основаInfoGroup.
InfoGroup адаптивен: на mobile (раскладка из AdaptiveProvider) рендерит вертикальный comfort-список без отдельной обёртки.