Skeleton
Пакет @cloud-ru/ds-skeleton предоставляет примитивы для индикации загрузки: блочный Skeleton, многострочный SkeletonText и контейнер-переключатель WithSkeleton, который сам выбирает, что показывать — скелетон или реальный контент.
Демо
borderRadiusdata-test-idheightloadingwidth<Skeleton loading width={240} height={24} borderRadius={4} />Когда использовать
- Когда данные подгружаются асинхронно и отображение контента задерживается более 200 мс.
- Чтобы зарезервировать место под контент и избежать layout shift при появлении данных.
- Для списков, карточек и текстовых блоков — как визуальная подсказка «идёт загрузка».
Когда не нужен скелетон: для мгновенных переходов (< 200 мс), для обычных спиннеров поверх модальных окон (используйте Loader), для пустых состояний (используйте EmptyState).
Секция описывает семантику и поведение скелетонов в макетах.
Анатомия
Variant
Типографическая роль строки для SkeletonText: display, headline, title, label, body — совпадают с осями Typography и задают высоту/межстрочник плейсхолдера.
Size
Размер текста: s, m, l — подбирается под размер реального контента, который заменяет скелетон.
Align
Выравнивание хвостовой (неполной) строки в SkeletonText: left — хвост слева, right — справа.
Установка
pnpm add @cloud-ru/ds-skeleton
import { Skeleton, SkeletonText, WithSkeleton } from '@cloud-ru/ds-skeleton'
Примеры использования
1. Блок фиксированного размера
import { Skeleton } from '@cloud-ru/ds-skeleton';
export function Block() {
return <Skeleton loading width={240} height={24} borderRadius={4} />;
}2. Круглый блок
import { Skeleton } from '@cloud-ru/ds-skeleton';
export function Circle() {
return <Skeleton loading width={48} height={48} borderRadius='50%' />;
}3. Текстовые строки
import { SkeletonText } from '@cloud-ru/ds-skeleton';
export function TextLines() {
return <SkeletonText loading lines={3} variant='body' size='m' />;
}4. Переключение loading → content
import { SkeletonText, WithSkeleton } from '@cloud-ru/ds-skeleton';
export function WithToggle() {
const loading = true;
return (
<WithSkeleton loading={loading} skeleton={<SkeletonText loading lines={2} variant='body' size='m' />}>
<p>Реальный контент после загрузки.</p>
</WithSkeleton>
);
}Props
Skeleton
Types
SkeletonProps| Prop | Type | Default | Required | Description |
|---|---|---|---|---|
borderRadius | BorderRadius<string | number> | — | no | Радиус скругления. Можно указать значение допустимое для CSSProperty.borderRadius (пример `'10px'`, `'50%'` и т.д) |
children | string | number | boolean | ReactElement<any, string | JSXElementConstructor<any>> | Iterable<ReactNode> | ReactPortal | null | undefined | — | no | |
className | string | — | no | |
data-test-id | string | — | no | |
height | Height<string | number> | — | no | Высота блока. Можно указать значение допустимое для CSSProperty.height (пример `'60%'`, `'400px'` и т.д) |
loading | boolean | — | no | Флаг состояния загрузки. Если значение true, будет отрисован блок скелетона, если false - children. |
width | Width<string | number> | — | no | Ширина блока. Можно указать значение допустимое для CSSProperty.width (пример `'60%'`, `'400px'` и т.д) |
Types
SkeletonProps
SkeletonText
Types
SkeletonTextProps| Prop | Type | Default | Required | Description |
|---|---|---|---|---|
align | "left" | "right" | left | no | Выравнивание: left, right |
children | string | number | boolean | ReactElement<any, string | JSXElementConstructor<any>> | Iterable<ReactNode> | ReactPortal | null | undefined | — | no | |
className | string | — | no | |
data-test-id | string | — | no | |
lineClassName | string | — | no | CSS-класс линии |
lines | number | 3 | no | Количество строк. |
loading | boolean | — | no | Флаг состояния загрузки. Если значение true, будет отрисован блок скелетона, если false - children. |
rowClassName | string | — | no | CSS-класс строки |
size | "l" | "m" | "s" | m | no | Масштаб: s, m, l |
variant | "body" | "display" | "headline" | "label" | "title" | body | no | Роль типографики (размер по anatomy) |
width | Width<string | number> | — | no | Ширина блока. Можно указать значение допустимое для CSSProperty.width (пример `'60%'`, `'400px'` и т.д) |
Unions
Types
SkeletonTextProps
Unions
Align
Size
Variant
WithSkeleton
Types
WithSkeletonProps| Prop | Type | Default | Required | Description |
|---|---|---|---|---|
children | string | number | boolean | ReactElement<any, string | JSXElementConstructor<any>> | Iterable<ReactNode> | ReactPortal | null | undefined | — | no | |
loading | boolean | — | no | Флаг состояния загрузки. Если значение true, будет отрисован блок скелетона, если false - children. |
skeleton | ReactNode | — | yes | JSX скелетон |