KPIs y métricas
Tarjetas, tiras y filas de indicadores para montar dashboards: cifras destacadas, tendencias con color, comparativas de tiempo y resúmenes de informe.
Para un cuadro de mando lo que manda es la cifra: número grande, etiqueta corta y, si puedes, una tendencia que diga si va bien o mal. Esta familia te da las piezas para montar ese panel sin pelearte con HTML. La tarjeta destacada la pones con DnzKpiCard. Cuando quieres una tira compacta de varios números (cabeceras, pies de ficha) tiras de DnzKpiInline. Para agrupar varias tarjetas en rejilla responsive usas DnzKpiRow. Para grupos de estadísticas dentro de una card, DnzStatsDisplay o DnzStatItem. Y para comparar tiempo planificado contra real, DnzTimeComparisonDisplay.
Qué componente uso
| Quieres... | Componente |
|---|---|
| Una cifra destacada, con icono, color y tendencia | DnzKpiCard |
| Varias tarjetas KPI en rejilla que se adapta sola | DnzKpiRow (envuelve DnzKpiCard) |
| Una tira horizontal compacta de números (estilo GitHub) | DnzKpiInline |
| Un grupo de estadísticas valor + etiqueta dentro de una card | DnzStatsDisplay |
| Un stat suelto con icono y contenido libre como valor | DnzStatItem |
| Comparar tiempo previsto contra tiempo real (semáforo) | DnzTimeComparisonDisplay |
| Resumir totales de un informe Flex automáticamente | DnzSummaryBar |
Casi todos reciben la cifra ya formateada como texto ("1.250 €", "42"). El separador de miles, el símbolo de moneda y los decimales los pones tú antes. La excepción son los deltas (DeltaPercent), que entran como decimal para que el componente elija color y flecha solo.
Regla rápida: si vas a poner más de una tarjeta, mete los DnzKpiCard dentro de un DnzKpiRow y olvídate del grid. La rejilla se ajusta al ancho disponible con MinCardWidth.
DnzKpiCard
La tarjeta de un KPI: título, cifra grande, icono opcional, color, badge de comparativa porcentual y mini-gráfico de tendencia. Tiene tres modos según cómo la configures.
Cifra, título, delta y descripción en una card sobria.
<DnzKpiCard Title="Ventas del mes" Value=@($"€ {ventasMes:N0}") Icon="payments" Color="#1565c0" DeltaPercent=@variacionPct DeltaLabel="vs mes anterior" Tooltip="Facturacion del mes en curso" />Con IsCompact=true, una versión mini de una sola línea, para meter muchas en poco espacio.
<DnzKpiCard IsCompact=true Title="Activas" Value=@activas.STR() Icon="check_circle" Color="#16a34a" />Con HighlightColor, la card se pinta entera con un degradado y texto en blanco.
<DnzKpiCard Title="MRR" Value=@($"€ {mrr:N0}") Icon="trending_up" HighlightColor="DnzKpiCard.HighlightColorType.Green" Tooltip="Monthly Recurring Revenue" />El delta se colorea solo: positivo en verde, negativo en rojo, cero en gris, con su flecha. Si tu métrica es "cuanto menos mejor" (gastos, tiempos), pon DeltaInvertColors=true para que bajar salga en verde.
Parámetros
| Parámetro | Tipo | Default | Qué hace |
|---|---|---|---|
Title | string | "" | Etiqueta de la cifra. |
Value | string | "" | La cifra en sí, ya formateada. |
Icon | string | "" | Icono Material. Vacío = sin icono. |
Color | string | "black" | Color del texto y del icono (modo estándar/compacto). |
Description | string | "" | Texto pequeño bajo la cifra (modo estándar). |
IsCompact | bool | false | Variante compacta de una línea. |
HighlightColor | HighlightColorType | Undefined | Degradado de fondo. Auto deduce verde/rojo según el valor. |
DeltaPercent | decimal? | Porcentaje de cambio. Pinta badge con flecha y signo. | |
DeltaLabel | string | "" | Texto junto al delta, ej. "vs mes anterior". |
DeltaInvertColors | bool | false | Invierte verde/rojo (útil cuando subir es malo, ej. gastos). |
TrendContent | RenderFragment | Contenido libre para un mini-gráfico de tendencia (sparkline). | |
ButtonText | string | "" | Si lo rellenas, pinta un botón de acción al pie (modo estándar). |
ButtonIcon | string | "" | Icono de ese botón. |
OnClick | EventCallback | Se dispara al pulsar el botón. | |
Tooltip | string | "" | Tooltip al pasar el ratón por la card. |
Variant | Radzen.Variant | Filled | Variante de la card base (modo estándar/compacto). |
Class | string | "" | Clases CSS extra de la card. |
Style | string | "" | Estilo inline extra de la card. |
HighlightColorType admite: Undefined, Auto, Red, Blue, Green, Yellow, Orange, Purple, Black, White, Gray.
HighlightColorType.Auto mira los dígitos del Value: si hay un número distinto de cero lo pinta verde, y rojo si además hay un signo menos. Si tu cifra lleva formato raro (separadores, símbolos), mejor fija el color a mano.
DnzKpiRow
Contenedor en rejilla responsive para tus DnzKpiCard. Mete dentro cuantas tarjetas quieras y el grid se reparte solo según el ancho mínimo que le digas. No tienes que tocar el grid: las columnas se ajustan al ancho disponible y bajan de línea cuando no caben.
<DnzKpiRow MinCardWidth="260">
<DnzKpiCard Title="Ventas del mes" Value=@($"€ {ventasMes:N0}") Icon="payments" Color="#1565c0" DeltaPercent=@variacionPct DeltaLabel="vs mes anterior" />
<DnzKpiCard Title="Tickets emitidos" Value=@ticketsHoy.STR() Icon="receipt_long" Color="#6a1b9a" />
<DnzKpiCard Title="Stock bajo mínimo" Value=@stockBajo.STR() Icon="warning" Color="#e65100" />
</DnzKpiRow>Parámetros
| Parámetro | Tipo | Default | Qué hace |
|---|---|---|---|
ChildContent | RenderFragment | Las tarjetas KPI que van dentro de la rejilla. | |
MinCardWidth | int | 220 | Ancho mínimo (px) de cada tarjeta. Define cuántas caben por fila. |
Class | string | "" | Clases CSS extra del contenedor. |
Style | string | "" | Estilo inline extra (se concatena con la variable de ancho mínimo). |
DnzKpiInline
Tira horizontal compacta de varios números, separados por punto, barra o pipe (estilo GitHub). Ideal para cabeceras de ficha, pies de card o líneas de meta-información. Los items se pasan como lista, no como markup hijo.
<DnzKpiInline Items=@KpiItems Separator="DnzKpiInline.SeparatorType.Pipe" />
@code {
List<DnzKpiInline.ItemModel> KpiItems = new()
{
new("Horas oficiales", "40h 00m", Icon: "calendar_month"),
new("Realizado", "38h 30m", Icon: "work", ValueColor: "#d97706"),
new("Horas extra", "2h 15m", Icon: "more_time"),
};
}Parámetros
| Parámetro | Tipo | Default | Qué hace |
|---|---|---|---|
Items | List<ItemModel> | new() | Los números a pintar. Ver ItemModel abajo. |
Separator | SeparatorType | MiddleDot | Separador entre items: None, MiddleDot (·), Pipe (|), Slash (/). |
Class | string | "" | Clases CSS extra del contenedor. |
Style | string | "" | Estilo inline extra del contenedor. |
ItemModel es un record con estos campos (todos menos los dos primeros son opcionales): Label, Value, Icon, ValueColor, IconColor, Tooltip. Si IconColor va vacío, el icono hereda el color del valor.
DnzStatItem
Un stat suelto: icono a la izquierda, valor grande y etiqueta debajo. A diferencia de DnzKpiCard, el valor es contenido libre (ChildContent), así que puedes meter un DnzSpanMoney, un badge o lo que necesites.
<div class="d-flex flex-wrap gap-4">
<DnzStatItem Label="Clientes activos" Icon="people"><span>1.234</span></DnzStatItem>
<DnzStatItem Label="Facturado" Icon="payments"><DnzSpanMoney Amount=@totalFacturado /></DnzStatItem>
<DnzStatItem Label="Pedidos" Icon="shopping_cart"><span>89</span></DnzStatItem>
</div>El Icon acepta tanto un nombre de icono Material como una ruta de imagen: si empieza por / o http, lo pinta como <img>.
Parámetros
| Parámetro | Tipo | Default | Qué hace |
|---|---|---|---|
ChildContent | RenderFragment | El valor, como contenido libre. Obligatorio. | |
Label | string | "" | Etiqueta bajo el valor. |
Icon | string | "" | Icono Material, o una URL (/... o http...) para imagen. |
IconColor | string | "var(--rz-primary)" | Color del icono Material. |
IconSize | string | "40px" | Tamaño del icono (CSS). |
ValueColor | string | "" | Color del valor. Vacío = color del tema. |
ValueSize | string | "fs-3" | Clase Bootstrap de tamaño del valor (fs-1, fs-3, fs-5...). |
Visible | bool | true | Si es false, no se renderiza nada. |
Class | string | "" | Clases CSS extra del contenedor. |
DnzStatsDisplay
Grupo de estadísticas valor + etiqueta + unidad dentro de una card, repartidas en horizontal. Le pasas una lista de StatisticModel como datos (no como hijos) y él se encarga del layout, pintando una celda por cada métrica.
<RadzenCard>
<DnzCardTitle Title="Resumen" Icon="analytics" Compact=true />
<DnzStatsDisplay Statistics=@stats Variant="Variant.Text" />
</RadzenCard>
@code {
private List<DnzStatsDisplay.StatisticModel> stats = new()
{
new() { Value = "12", Label = "Usuarios" },
new() { Value = "45,3", Label = "Base de datos", Unit = "GB" },
new() { Value = "8,1", Label = "Archivos", Unit = "GB" },
};
}Parámetros
| Parámetro | Tipo | Default | Qué hace |
|---|---|---|---|
Statistics | List<StatisticModel> | new() | Las estadísticas a pintar. Requerido (EditorRequired). |
Variant | Variant | Variante de la card base (Text, Filled, Outlined...). |
StatisticModel tiene tres campos: Value (string), Label (string) y Unit (string).
DnzStatsDisplay.Item (subcomponente)
Es la celda que pinta cada cifra individual: valor grande, unidad más pequeña al lado y etiqueta debajo. No lo usas directamente: DnzStatsDisplay lo instancia por ti, uno por cada elemento de Statistics. Lo documentamos para que veas qué recibe cada celda.
Patrón padre/hijo: el padre (DnzStatsDisplay) recorre la lista Statistics y, por cada métrica, renderiza un hijo (DnzStatsDisplay.Item) con @key=@stat para que Blazor reutilice bien las celdas. Tú solo tocas el padre y le das la lista; el hijo es detalle interno.
Parámetros
| Parámetro | Tipo | Default | Qué hace |
|---|---|---|---|
Value | string | "" | El número grande de la celda. |
Label | string | "" | Etiqueta debajo del valor. |
Unit | string | "" | Unidad pequeña junto al valor. Vacía = sin unidad. |
DnzTimeComparisonDisplay
Compara tiempo planificado contra tiempo real y lo pinta con color de semáforo: verde si vas holgado, amarillo si te acercas al límite, rojo si te pasas. Pensado para tareas, partes de trabajo y presupuestos de horas. Los tiempos entran en minutos y se formatean solos a h/m.
<DnzTimeComparisonDisplay PlannedTime="480" ActualTime="510" Label="Reparacion 1042" />Eso pinta "8h 30m / 8h" con badge "+30m" en rojo (te has pasado) y barra de progreso. Variantes:
Con barra de progreso, badge de diferencia e icono de estado. El modo por defecto.
<DnzTimeComparisonDisplay PlannedTime="120" ActualTime="90" Label="Montaje" />Con Compact=true, todo en una línea para meterlo en una fila de tabla o un pie de card.
<DnzTimeComparisonDisplay PlannedTime="120" ActualTime="90" Compact=true />Si no pasas PlannedTime (queda en 0), pinta solo el tiempo real sin comparativa ni barra.
<DnzTimeComparisonDisplay ActualTime="135" Label="Tiempo invertido" />El color y el icono de estado salen solos del porcentaje: verde hasta el 80%, amarillo entre 80% y 100%, rojo al pasarse o si el tiempo real es negativo.
Parámetros
| Parámetro | Tipo | Default | Qué hace |
|---|---|---|---|
PlannedTime | decimal | 0 | Tiempo planificado, en minutos. En 0 desactiva la comparativa. |
ActualTime | decimal | 0 | Tiempo real consumido, en minutos. |
ShowProgressBar | bool | true | Pinta la barra de progreso (solo si hay tiempo planificado). |
ShowDiff | bool | true | Muestra el badge con la diferencia (+30m, -1h 10m, =). |
Compact | bool | false | Modo de una sola línea. |
Label | string | "" | Etiqueta encima de la comparativa. También aparece en el tooltip. |
Si tanto PlannedTime como ActualTime son 0, el componente no pinta nada. Es deliberado: una tarea sin tiempo ni estimación no aporta a un panel.
DnzSummaryBar
Barra de totales para informes Flex. No le pasas datos a mano: lee el ReportContext de la cascada y suma las columnas de dinero, numéricas, minutos, booleanas (cuenta los true, ej. 5 / 20) y el rango de la fecha principal. La pones dentro de un informe y se rellena sola.
<CascadingValue Value=@reportContext>
<DnzSummaryBar />
</CascadingValue>Parámetros
| Parámetro | Tipo | Default | Qué hace |
|---|---|---|---|
Context | ReportContext | Llega por [CascadingParameter]. No se pasa como atributo: lo aporta el informe que envuelve la barra. |
DnzSummaryBar solo aparece si el contexto trae filas. Si el informe está vacío no pinta nada, así que no tienes que esconderlo tú. Más sobre informes en Informes (Flex).
Relacionado
Ver tambien: Índice de componentes · Intro DinaZen · Cookbook de patrones · Badges y estados · Tarjetas y layout · Tablas e informes · Informes (Flex) · Cliente Dinaup