QuotaWidgetCard
Карточка одной квоты QuotaItem: название, остаток в единицах измерения, ProgressBar потребления и Tooltip с расшифровкой «лимит / потреблено / остаток». Используется внутри QuotaWidget и QuotaWidgetMini, но доступна и отдельно.
Когда использовать
-
Страница ресурса или дашборд, где нужно показать одну конкретную квоту.
-
Собственная раскладка квот, не покрываемая
QuotaWidget/QuotaWidgetMini. -
Список квот проекта целиком:
- используйте
QuotaWidgetилиQuotaWidgetMini.
- используйте
-
✅ Оборачивайте карточку в
PortalContextProvider— tooltip рендерится в портал. -
❌ Передавать
noDataбезonRefresh— состояние ошибки останется без кнопки восстановления.
Анатомия
Прогресс потребления
Цвет ProgressBar зависит от процента потребления (usage / limit):
< 70%— зелёный.70–90%— жёлтый.>= 90%— красный; приremains <= 0квота считается исчерпанной.
Состояния
loading— skeleton вместо значений.noData—InfoBlockс текстом ошибки и кнопкой «Обновить» (onRefresh).
Установка
pnpm add @cloud-ru/ds-uikit-product-quota
import { QuotaWidgetCard } from '@cloud-ru/ds-uikit-product-quota'
Примеры использования
Уровни потребления
Network
30%Available100 GB
Remaining70 GB
RAM
75%Available100 GB
Remaining25 GB
vCPU
95%Available100 cores
Remaining5 cores
SSD
100%Available100 GB
Remaining0 GB
tsx
import { QuotaWidgetCard } from '@cloud-ru/ds-uikit-product-quota';
export function QuotaCardLevels() {
return (
<div style={{ display: 'flex', gap: 12, flexWrap: 'wrap', alignItems: 'center' }}>
<QuotaWidgetCard quota={{ name: 'Network', limit: 100, usage: 30, remains: 70, unitDisplayName: 'GB' }} />
<QuotaWidgetCard quota={{ name: 'RAM', limit: 100, usage: 75, remains: 25, unitDisplayName: 'GB' }} />
<QuotaWidgetCard quota={{ name: 'vCPU', limit: 100, usage: 95, remains: 5, unitDisplayName: 'cores' }} />
<QuotaWidgetCard quota={{ name: 'SSD', limit: 100, usage: 100, remains: 0, unitDisplayName: 'GB' }} />
</div>
);
}Loading
tsx
import { QuotaWidgetCard } from '@cloud-ru/ds-uikit-product-quota';
export function QuotaCardLoading() {
return (
<QuotaWidgetCard loading quota={{ name: 'Network', limit: 100, usage: 30, remains: 70, unitDisplayName: 'GB' }} />
);
}Нет данных и повтор
Network
Failed to load data
tsx
import { QuotaWidgetCard } from '@cloud-ru/ds-uikit-product-quota';
import { useState } from 'react';
const QUOTA = { name: 'Network', limit: 100, usage: 30, remains: 70, unitDisplayName: 'GB' };
export function QuotaCardNoData() {
const [noData, setNoData] = useState(true);
const [loading, setLoading] = useState(false);
const handleRefresh = () => {
setLoading(true);
setNoData(false);
setTimeout(() => setLoading(false), 800);
};
return <QuotaWidgetCard quota={QUOTA} noData={noData} loading={loading} onRefresh={handleRefresh} />;
}Props
Types
Props
QuotaWidgetCardProps| Prop | Type | Default | Required | Description |
|---|---|---|---|---|
data-test-id | string | — | no | |
loading | boolean | false | no | Состояние загрузки (Figma: loading=true) |
noData | boolean | false | no | Состояние «не удалось загрузить данные» (Figma: noData=true) |
onRefresh | (() => void) | — | no | Колбек кнопки «Обновить» в состоянии noData |
quota | QuotaItem | — | yes | Отобр ажаемая квота |
Types
QuotaWidgetCardProps
QuotaItem
Storybook
Figma
Смотри также
- QuotaWidget — выпадающий список карточек.
- QuotaWidgetMini — аккордеон с карточками.
- ProgressBar — нижележащий индикатор потребления.